Eleminate mips_cpu and move it into cpu_data.
[linux-2.6/linux-mips.git] / arch / mips / lasat / prom.c
blob984a7afe0e7c44b822eb24e4866fdcb5ec4baccb
1 /*
2 * PROM interface routines.
3 */
4 #include <linux/types.h>
5 #include <linux/config.h>
6 #include <linux/init.h>
7 #include <linux/string.h>
8 #include <linux/ctype.h>
9 #include <linux/kernel.h>
10 #include <linux/mm.h>
11 #include <linux/bootmem.h>
12 #include <linux/ioport.h>
13 #include <asm/bootinfo.h>
14 #include <asm/lasat/lasat.h>
15 #include <asm/cpu.h>
17 #include "at93c.h"
18 #include <asm/lasat/eeprom.h>
19 #include "prom.h"
21 #define RESET_VECTOR 0xbfc00000
22 #define PROM_JUMP_TABLE_ENTRY(n) (*((u32 *)(RESET_VECTOR + 0x20) + n))
23 #define PROM_DISPLAY_ADDR PROM_JUMP_TABLE_ENTRY(0)
24 #define PROM_PUTC_ADDR PROM_JUMP_TABLE_ENTRY(1)
25 #define PROM_MONITOR_ADDR PROM_JUMP_TABLE_ENTRY(2)
27 static void null_prom_printf(const char * fmt, ...)
31 static void null_prom_display(const char *string, int pos, int clear)
35 static void null_prom_monitor(void)
39 static void null_prom_putc(char c)
43 /* these are functions provided by the bootloader */
44 static void (* prom_putc)(char c) = null_prom_putc;
45 void (* prom_printf)(const char * fmt, ...) = null_prom_printf;
46 void (* prom_display)(const char *string, int pos, int clear) =
47 null_prom_display;
48 void (* prom_monitor)(void) = null_prom_monitor;
50 #define PROM_PRINTFBUF_SIZE 256
51 static char prom_printfbuf[PROM_PRINTFBUF_SIZE];
53 static void real_prom_printf(const char * fmt, ...)
55 va_list ap;
56 int len;
57 char *c = prom_printfbuf;
58 int i;
60 va_start(ap, fmt);
61 len = vsnprintf(prom_printfbuf, PROM_PRINTFBUF_SIZE, fmt, ap);
62 va_end(ap);
64 /* output overflowed the buffer */
65 if (len < 0 || len > PROM_PRINTFBUF_SIZE)
66 len = PROM_PRINTFBUF_SIZE;
68 for (i=0; i < len; i++) {
69 if (*c == '\n')
70 prom_putc('\r');
71 prom_putc(*c++);
75 static void setup_prom_vectors(void)
77 u32 version = *(u32 *)(RESET_VECTOR + 0x90);
79 if (version == 306) {
80 prom_display = (void *)PROM_DISPLAY_ADDR;
81 prom_putc = (void *)PROM_PUTC_ADDR;
82 prom_printf = real_prom_printf;
83 prom_monitor = (void *)PROM_MONITOR_ADDR;
85 prom_printf("prom vectors set up\n");
88 char arcs_cmdline[CL_SIZE];
90 static struct at93c_defs at93c_defs[N_MACHTYPES] = {
91 {(void *)AT93C_REG_100, (void *)AT93C_RDATA_REG_100, AT93C_RDATA_SHIFT_100,
92 AT93C_WDATA_SHIFT_100, AT93C_CS_M_100, AT93C_CLK_M_100},
93 {(void *)AT93C_REG_200, (void *)AT93C_RDATA_REG_200, AT93C_RDATA_SHIFT_200,
94 AT93C_WDATA_SHIFT_200, AT93C_CS_M_200, AT93C_CLK_M_200},
97 void __init prom_init(int argc, char **argv, char **envp, int *prom_vec)
99 setup_prom_vectors();
101 if (current_cpu_data.cputype == CPU_R5000)
102 mips_machtype = MACH_LASAT_200;
103 else
104 mips_machtype = MACH_LASAT_100;
106 at93c = &at93c_defs[mips_machtype];
108 lasat_init_board_info(); /* Read info from EEPROM */
110 mips_machgroup = MACH_GROUP_LASAT;
112 /* Get the command line */
113 if (argc>0) {
114 strncpy(arcs_cmdline, argv[0], CL_SIZE-1);
115 arcs_cmdline[CL_SIZE-1] = '\0';
118 /* Set the I/O base address */
119 set_io_port_base(KSEG1);
121 /* Set memory regions */
122 ioport_resource.start = 0; /* Should be KSEGx ??? */
123 ioport_resource.end = 0xffffffff; /* Should be ??? */
125 add_memory_region(0, lasat_board_info.li_memsize, BOOT_MEM_RAM);
128 void prom_free_prom_memory(void)
132 const char *get_system_type(void)
134 return lasat_board_info.li_bmstr;