Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  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}