linux/arch/mips/powertv/init.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1999, 2000, 2004, 2005  MIPS Technologies, Inc.
   3 *      All rights reserved.
   4 *      Authors: Carsten Langgaard <carstenl@mips.com>
   5 *               Maciej W. Rozycki <macro@mips.com>
   6 * Portions copyright (C) 2009 Cisco Systems, Inc.
   7 *
   8 *  This program is free software; you can distribute it and/or modify it
   9 *  under the terms of the GNU General Public License (Version 2) as
  10 *  published by the Free Software Foundation.
  11 *
  12 *  This program is distributed in the hope it will be useful, but WITHOUT
  13 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15 *  for more details.
  16 *
  17 *  You should have received a copy of the GNU General Public License along
  18 *  with this program; if not, write to the Free Software Foundation, Inc.,
  19 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  20 *
  21 * PROM library initialisation code.
  22 */
  23#include <linux/init.h>
  24#include <linux/string.h>
  25#include <linux/kernel.h>
  26
  27#include <asm/bootinfo.h>
  28#include <linux/io.h>
  29#include <asm/system.h>
  30#include <asm/cacheflush.h>
  31#include <asm/traps.h>
  32
  33#include <asm/mips-boards/prom.h>
  34#include <asm/mips-boards/generic.h>
  35#include <asm/mach-powertv/asic.h>
  36
  37static int *_prom_envp;
  38unsigned long _prom_memsize;
  39
  40/*
  41 * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
  42 * This macro take care of sign extension, if running in 64-bit mode.
  43 */
  44#define prom_envp(index) ((char *)(long)_prom_envp[(index)])
  45
  46char *prom_getenv(char *envname)
  47{
  48        char *result = NULL;
  49
  50        if (_prom_envp != NULL) {
  51                /*
  52                 * Return a pointer to the given environment variable.
  53                 * In 64-bit mode: we're using 64-bit pointers, but all pointers
  54                 * in the PROM structures are only 32-bit, so we need some
  55                 * workarounds, if we are running in 64-bit mode.
  56                 */
  57                int i, index = 0;
  58
  59                i = strlen(envname);
  60
  61                while (prom_envp(index)) {
  62                        if (strncmp(envname, prom_envp(index), i) == 0) {
  63                                result = prom_envp(index + 1);
  64                                break;
  65                        }
  66                        index += 2;
  67                }
  68        }
  69
  70        return result;
  71}
  72
  73/* TODO: Verify on linux-mips mailing list that the following two  */
  74/* functions are correct                                           */
  75/* TODO: Copy NMI and EJTAG exception vectors to memory from the   */
  76/* BootROM exception vectors. Flush their cache entries. test it.  */
  77
  78static void __init mips_nmi_setup(void)
  79{
  80        void *base;
  81#if defined(CONFIG_CPU_MIPS32_R1)
  82        base = cpu_has_veic ?
  83                (void *)(CAC_BASE + 0xa80) :
  84                (void *)(CAC_BASE + 0x380);
  85#elif defined(CONFIG_CPU_MIPS32_R2)
  86        base = (void *)0xbfc00000;
  87#else
  88#error NMI exception handler address not defined
  89#endif
  90}
  91
  92static void __init mips_ejtag_setup(void)
  93{
  94        void *base;
  95
  96#if defined(CONFIG_CPU_MIPS32_R1)
  97        base = cpu_has_veic ?
  98                (void *)(CAC_BASE + 0xa00) :
  99                (void *)(CAC_BASE + 0x300);
 100#elif defined(CONFIG_CPU_MIPS32_R2)
 101        base = (void *)0xbfc00480;
 102#else
 103#error EJTAG exception handler address not defined
 104#endif
 105}
 106
 107void __init prom_init(void)
 108{
 109        int prom_argc;
 110        char *prom_argv;
 111
 112        prom_argc = fw_arg0;
 113        prom_argv = (char *) fw_arg1;
 114        _prom_envp = (int *) fw_arg2;
 115        _prom_memsize = (unsigned long) fw_arg3;
 116
 117        board_nmi_handler_setup = mips_nmi_setup;
 118        board_ejtag_handler_setup = mips_ejtag_setup;
 119
 120        if (prom_argc == 1) {
 121                strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
 122                strlcat(arcs_cmdline, prom_argv, COMMAND_LINE_SIZE);
 123        }
 124
 125        configure_platform();
 126        prom_meminit();
 127
 128#ifndef CONFIG_BOOTLOADER_DRIVER
 129        pr_info("\nBootloader driver isn't loaded...\n");
 130#endif
 131}
 132