Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.10.11.
  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/cacheflush.h>
 30#include <asm/traps.h>
 31
 32#include <asm/mips-boards/prom.h>
 33#include <asm/mips-boards/generic.h>
 34#include <asm/mach-powertv/asic.h>
 35
 36static int *_prom_envp;
 37unsigned long _prom_memsize;
 38
 39/*
 40 * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
 41 * This macro take care of sign extension, if running in 64-bit mode.
 42 */
 43#define prom_envp(index) ((char *)(long)_prom_envp[(index)])
 44
 45char *prom_getenv(char *envname)
 46{
 47	char *result = NULL;
 48
 49	if (_prom_envp != NULL) {
 50		/*
 51		 * Return a pointer to the given environment variable.
 52		 * In 64-bit mode: we're using 64-bit pointers, but all pointers
 53		 * in the PROM structures are only 32-bit, so we need some
 54		 * workarounds, if we are running in 64-bit mode.
 55		 */
 56		int i, index = 0;
 57
 58		i = strlen(envname);
 59
 60		while (prom_envp(index)) {
 61			if (strncmp(envname, prom_envp(index), i) == 0) {
 62				result = prom_envp(index + 1);
 63				break;
 64			}
 65			index += 2;
 66		}
 67	}
 68
 69	return result;
 70}
 71
 72/* TODO: Verify on linux-mips mailing list that the following two  */
 73/* functions are correct                                           */
 74/* TODO: Copy NMI and EJTAG exception vectors to memory from the   */
 75/* BootROM exception vectors. Flush their cache entries. test it.  */
 76
 77static void __init mips_nmi_setup(void)
 78{
 79	void *base;
 80#if defined(CONFIG_CPU_MIPS32_R1)
 81	base = cpu_has_veic ?
 82		(void *)(CAC_BASE + 0xa80) :
 83		(void *)(CAC_BASE + 0x380);
 84#elif defined(CONFIG_CPU_MIPS32_R2)
 85	base = (void *)0xbfc00000;
 86#else
 87#error NMI exception handler address not defined
 88#endif
 89}
 90
 91static void __init mips_ejtag_setup(void)
 92{
 93	void *base;
 94
 95#if defined(CONFIG_CPU_MIPS32_R1)
 96	base = cpu_has_veic ?
 97		(void *)(CAC_BASE + 0xa00) :
 98		(void *)(CAC_BASE + 0x300);
 99#elif defined(CONFIG_CPU_MIPS32_R2)
100	base = (void *)0xbfc00480;
101#else
102#error EJTAG exception handler address not defined
103#endif
104}
105
106void __init prom_init(void)
107{
108	int prom_argc;
109	char *prom_argv;
110
111	prom_argc = fw_arg0;
112	prom_argv = (char *) fw_arg1;
113	_prom_envp = (int *) fw_arg2;
114	_prom_memsize = (unsigned long) fw_arg3;
115
116	board_nmi_handler_setup = mips_nmi_setup;
117	board_ejtag_handler_setup = mips_ejtag_setup;
118
119	if (prom_argc == 1) {
120		strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
121		strlcat(arcs_cmdline, prom_argv, COMMAND_LINE_SIZE);
122	}
123
124	configure_platform();
125	prom_meminit();
126
127#ifndef CONFIG_BOOTLOADER_DRIVER
128	pr_info("\nBootloader driver isn't loaded...\n");
129#endif
130}