Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 77b2555b52a894a2e39a42e43d993df875c46a6a 143 lines 3.4 kB view raw
1/* 2 * PROM interface routines. 3 */ 4#include <linux/types.h> 5#include <linux/init.h> 6#include <linux/string.h> 7#include <linux/ctype.h> 8#include <linux/kernel.h> 9#include <linux/mm.h> 10#include <linux/bootmem.h> 11#include <linux/ioport.h> 12#include <asm/bootinfo.h> 13#include <asm/lasat/lasat.h> 14#include <asm/cpu.h> 15 16#include "at93c.h" 17#include <asm/lasat/eeprom.h> 18#include "prom.h" 19 20#define RESET_VECTOR 0xbfc00000 21#define PROM_JUMP_TABLE_ENTRY(n) (*((u32 *)(RESET_VECTOR + 0x20) + n)) 22#define PROM_DISPLAY_ADDR PROM_JUMP_TABLE_ENTRY(0) 23#define PROM_PUTC_ADDR PROM_JUMP_TABLE_ENTRY(1) 24#define PROM_MONITOR_ADDR PROM_JUMP_TABLE_ENTRY(2) 25 26static void null_prom_printf(const char * fmt, ...) 27{ 28} 29 30static void null_prom_display(const char *string, int pos, int clear) 31{ 32} 33 34static void null_prom_monitor(void) 35{ 36} 37 38static void null_prom_putc(char c) 39{ 40} 41 42/* these are functions provided by the bootloader */ 43static void (* prom_putc)(char c) = null_prom_putc; 44void (* prom_printf)(const char * fmt, ...) = null_prom_printf; 45void (* prom_display)(const char *string, int pos, int clear) = 46 null_prom_display; 47void (* prom_monitor)(void) = null_prom_monitor; 48 49unsigned int lasat_ndelay_divider; 50 51#define PROM_PRINTFBUF_SIZE 256 52static char prom_printfbuf[PROM_PRINTFBUF_SIZE]; 53 54static void real_prom_printf(const char * fmt, ...) 55{ 56 va_list ap; 57 int len; 58 char *c = prom_printfbuf; 59 int i; 60 61 va_start(ap, fmt); 62 len = vsnprintf(prom_printfbuf, PROM_PRINTFBUF_SIZE, fmt, ap); 63 va_end(ap); 64 65 /* output overflowed the buffer */ 66 if (len < 0 || len > PROM_PRINTFBUF_SIZE) 67 len = PROM_PRINTFBUF_SIZE; 68 69 for (i=0; i < len; i++) { 70 if (*c == '\n') 71 prom_putc('\r'); 72 prom_putc(*c++); 73 } 74} 75 76static void setup_prom_vectors(void) 77{ 78 u32 version = *(u32 *)(RESET_VECTOR + 0x90); 79 80 if (version >= 307) { 81 prom_display = (void *)PROM_DISPLAY_ADDR; 82 prom_putc = (void *)PROM_PUTC_ADDR; 83 prom_printf = real_prom_printf; 84 prom_monitor = (void *)PROM_MONITOR_ADDR; 85 } 86 prom_printf("prom vectors set up\n"); 87} 88 89static struct at93c_defs at93c_defs[N_MACHTYPES] = { 90 {(void *)AT93C_REG_100, (void *)AT93C_RDATA_REG_100, AT93C_RDATA_SHIFT_100, 91 AT93C_WDATA_SHIFT_100, AT93C_CS_M_100, AT93C_CLK_M_100}, 92 {(void *)AT93C_REG_200, (void *)AT93C_RDATA_REG_200, AT93C_RDATA_SHIFT_200, 93 AT93C_WDATA_SHIFT_200, AT93C_CS_M_200, AT93C_CLK_M_200}, 94}; 95 96void __init prom_init(void) 97{ 98 int argc = fw_arg0; 99 char **argv = (char **) fw_arg1; 100 101 setup_prom_vectors(); 102 103 if (current_cpu_data.cputype == CPU_R5000) { 104 prom_printf("LASAT 200 board\n"); 105 mips_machtype = MACH_LASAT_200; 106 lasat_ndelay_divider = LASAT_200_DIVIDER; 107 } else { 108 prom_printf("LASAT 100 board\n"); 109 mips_machtype = MACH_LASAT_100; 110 lasat_ndelay_divider = LASAT_100_DIVIDER; 111 } 112 113 at93c = &at93c_defs[mips_machtype]; 114 115 lasat_init_board_info(); /* Read info from EEPROM */ 116 117 mips_machgroup = MACH_GROUP_LASAT; 118 119 /* Get the command line */ 120 if (argc > 0) { 121 strncpy(arcs_cmdline, argv[0], CL_SIZE-1); 122 arcs_cmdline[CL_SIZE-1] = '\0'; 123 } 124 125 /* Set the I/O base address */ 126 set_io_port_base(KSEG1); 127 128 /* Set memory regions */ 129 ioport_resource.start = 0; 130 ioport_resource.end = 0xffffffff; /* Wrong, fixme. */ 131 132 add_memory_region(0, lasat_board_info.li_memsize, BOOT_MEM_RAM); 133} 134 135unsigned long __init prom_free_prom_memory(void) 136{ 137 return 0; 138} 139 140const char *get_system_type(void) 141{ 142 return lasat_board_info.li_bmstr; 143}