linux/arch/mips/lasat/prom.c
<<
>>
Prefs
   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_display(const char *string, int pos, int clear)
  27{
  28}
  29
  30static void null_prom_monitor(void)
  31{
  32}
  33
  34static void null_prom_putc(char c)
  35{
  36}
  37
  38/* these are functions provided by the bootloader */
  39static void (*__prom_putc)(char c) = null_prom_putc;
  40
  41void prom_putchar(char c)
  42{
  43        __prom_putc(c);
  44}
  45
  46void (*prom_display)(const char *string, int pos, int clear) =
  47                null_prom_display;
  48void (*prom_monitor)(void) = null_prom_monitor;
  49
  50unsigned int lasat_ndelay_divider;
  51
  52static void setup_prom_vectors(void)
  53{
  54        u32 version = *(u32 *)(RESET_VECTOR + 0x90);
  55
  56        if (version >= 307) {
  57                prom_display = (void *)PROM_DISPLAY_ADDR;
  58                __prom_putc = (void *)PROM_PUTC_ADDR;
  59                prom_monitor = (void *)PROM_MONITOR_ADDR;
  60        }
  61        printk(KERN_DEBUG "prom vectors set up\n");
  62}
  63
  64static struct at93c_defs at93c_defs[N_MACHTYPES] = {
  65        {
  66                .reg            = (void *)AT93C_REG_100,
  67                .rdata_reg      = (void *)AT93C_RDATA_REG_100,
  68                .rdata_shift    = AT93C_RDATA_SHIFT_100,
  69                .wdata_shift    = AT93C_WDATA_SHIFT_100,
  70                .cs             = AT93C_CS_M_100,
  71                .clk            = AT93C_CLK_M_100
  72        }, {
  73                .reg            = (void *)AT93C_REG_200,
  74                .rdata_reg      = (void *)AT93C_RDATA_REG_200,
  75                .rdata_shift    = AT93C_RDATA_SHIFT_200,
  76                .wdata_shift    = AT93C_WDATA_SHIFT_200,
  77                .cs             = AT93C_CS_M_200,
  78                .clk            = AT93C_CLK_M_200
  79        },
  80};
  81
  82void __init prom_init(void)
  83{
  84        int argc = fw_arg0;
  85        char **argv = (char **) fw_arg1;
  86
  87        setup_prom_vectors();
  88
  89        if (IS_LASAT_200()) {
  90                printk(KERN_INFO "LASAT 200 board\n");
  91                lasat_ndelay_divider = LASAT_200_DIVIDER;
  92                at93c = &at93c_defs[1];
  93        } else {
  94                printk(KERN_INFO "LASAT 100 board\n");
  95                lasat_ndelay_divider = LASAT_100_DIVIDER;
  96                at93c = &at93c_defs[0];
  97        }
  98
  99        lasat_init_board_info();                /* Read info from EEPROM */
 100
 101        /* Get the command line */
 102        if (argc > 0) {
 103                strncpy(arcs_cmdline, argv[0], CL_SIZE-1);
 104                arcs_cmdline[CL_SIZE-1] = '\0';
 105        }
 106
 107        /* Set the I/O base address */
 108        set_io_port_base(KSEG1);
 109
 110        /* Set memory regions */
 111        ioport_resource.start = 0;
 112        ioport_resource.end = 0xffffffff;       /* Wrong, fixme.  */
 113
 114        add_memory_region(0, lasat_board_info.li_memsize, BOOT_MEM_RAM);
 115}
 116
 117void __init prom_free_prom_memory(void)
 118{
 119}
 120
 121const char *get_system_type(void)
 122{
 123        return lasat_board_info.li_bmstr;
 124}
 125