linux/arch/mips/basler/excite/excite_prom.c
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 2004, 2005 by Thomas Koeller (thomas.koeller@baslerweb.com)
   3 *  Based on the PMC-Sierra Yosemite board support by Ralf Baechle and
   4 *  Manish Lachwani.
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; either version 2 of the License, or
   9 *  (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *  GNU General Public License for more details.
  15 *
  16 *  You should have received a copy of the GNU General Public License
  17 *  along with this program; if not, write to the Free Software
  18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19 */
  20
  21#include <linux/init.h>
  22#include <linux/sched.h>
  23#include <linux/mm.h>
  24#include <linux/delay.h>
  25#include <linux/smp.h>
  26#include <linux/module.h>
  27#include <asm/io.h>
  28#include <asm/pgtable.h>
  29#include <asm/processor.h>
  30#include <asm/reboot.h>
  31#include <asm/system.h>
  32#include <asm/bootinfo.h>
  33#include <asm/string.h>
  34
  35#include <excite.h>
  36
  37/* This struct is used by Redboot to pass arguments to the kernel */
  38typedef struct
  39{
  40        char *name;
  41        char *val;
  42} t_env_var;
  43
  44struct parmblock {
  45        t_env_var memsize;
  46        t_env_var modetty0;
  47        t_env_var ethaddr;
  48        t_env_var env_end;
  49        char *argv[2];
  50        char text[0];
  51};
  52
  53static unsigned int prom_argc;
  54static const char ** prom_argv;
  55static const t_env_var * prom_env;
  56
  57static void prom_halt(void) __attribute__((noreturn));
  58static void prom_exit(void) __attribute__((noreturn));
  59
  60
  61
  62const char *get_system_type(void)
  63{
  64        return "Basler eXcite";
  65}
  66
  67/*
  68 * Halt the system
  69 */
  70static void prom_halt(void)
  71{
  72        printk(KERN_NOTICE "\n** System halted.\n");
  73        while (1)
  74                asm volatile (
  75                        "\t.set\tmips3\n"
  76                        "\twait\n"
  77                        "\t.set\tmips0\n"
  78                );
  79}
  80
  81/*
  82 * Reset the CPU and re-enter Redboot
  83 */
  84static void prom_exit(void)
  85{
  86        unsigned int i;
  87        volatile unsigned char * const flg =
  88                (volatile unsigned char *) (EXCITE_ADDR_FPGA + EXCITE_FPGA_DPR);
  89
  90        /* Clear the watchdog reset flag, set the reboot flag */
  91        *flg &= ~0x01;
  92        *flg |= 0x80;
  93
  94        for (i = 0; i < 10; i++) {
  95                *(volatile unsigned char *)  (EXCITE_ADDR_FPGA + EXCITE_FPGA_SYSCTL) = 0x02;
  96                iob();
  97                mdelay(1000);
  98        }
  99
 100        printk(KERN_NOTICE "Reset failed\n");
 101        prom_halt();
 102}
 103
 104static const char __init *prom_getenv(char *name)
 105{
 106        const t_env_var * p;
 107        for (p = prom_env; p->name != NULL; p++)
 108                if(strcmp(name, p->name) == 0)
 109                        break;
 110        return p->val;
 111}
 112
 113/*
 114 * Init routine which accepts the variables from Redboot
 115 */
 116void __init prom_init(void)
 117{
 118        const struct parmblock * const pb = (struct parmblock *) fw_arg2;
 119
 120        prom_argc = fw_arg0;
 121        prom_argv = (const char **) fw_arg1;
 122        prom_env = &pb->memsize;
 123
 124        /* Callbacks for halt, restart */
 125        _machine_restart = (void (*)(char *)) prom_exit;
 126        _machine_halt = prom_halt;
 127
 128#ifdef CONFIG_32BIT
 129        /* copy command line */
 130        strcpy(arcs_cmdline, prom_argv[1]);
 131        memsize = simple_strtol(prom_getenv("memsize"), NULL, 16);
 132        strcpy(modetty, prom_getenv("modetty0"));
 133#endif /* CONFIG_32BIT */
 134
 135#ifdef CONFIG_64BIT
 136#       error 64 bit support not implemented
 137#endif /* CONFIG_64BIT */
 138}
 139
 140/* This is called from free_initmem(), so we need to provide it */
 141void __init prom_free_prom_memory(void)
 142{
 143        /* Nothing to do */
 144}
 145
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.