MIPS: FW: malta: Use new common FW library variable processing.

Remove old YAMON prom code and use common firmware library code.

Signed-off-by: Steven J. Hill <Steven.Hill@imgtec.com>
This commit is contained in:
Steven J. Hill 2013-03-25 14:47:05 -05:00 committed by Ralf Baechle
parent 0be2abbcee
commit b431f09d55
5 changed files with 28 additions and 199 deletions

View File

@ -5,9 +5,8 @@
# Copyright (C) 2008 Wind River Systems, Inc. # Copyright (C) 2008 Wind River Systems, Inc.
# written by Ralf Baechle <ralf@linux-mips.org> # written by Ralf Baechle <ralf@linux-mips.org>
# #
obj-y := malta-amon.o malta-cmdline.o \ obj-y := malta-amon.o malta-display.o malta-init.o \
malta-display.o malta-init.o malta-int.o \ malta-int.o malta-memory.o malta-platform.o \
malta-memory.o malta-platform.o \
malta-reset.o malta-setup.o malta-time.o malta-reset.o malta-setup.o malta-time.o
obj-$(CONFIG_EARLY_PRINTK) += malta-console.o obj-$(CONFIG_EARLY_PRINTK) += malta-console.o

View File

@ -1,59 +0,0 @@
/*
* Carsten Langgaard, carstenl@mips.com
* Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved.
*
* This program is free software; you can distribute it and/or modify it
* under the terms of the GNU General Public License (Version 2) as
* published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
*
* Kernel command line creation using the prom monitor (YAMON) argc/argv.
*/
#include <linux/init.h>
#include <linux/string.h>
#include <asm/bootinfo.h>
extern int prom_argc;
extern int *_prom_argv;
/*
* YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
* This macro take care of sign extension.
*/
#define prom_argv(index) ((char *)(long)_prom_argv[(index)])
char * __init prom_getcmdline(void)
{
return &(arcs_cmdline[0]);
}
void __init prom_init_cmdline(void)
{
char *cp;
int actr;
actr = 1; /* Always ignore argv[0] */
cp = &(arcs_cmdline[0]);
while(actr < prom_argc) {
strcpy(cp, prom_argv(actr));
cp += strlen(prom_argv(actr));
*cp++ = ' ';
actr++;
}
if (cp != &(arcs_cmdline[0])) {
/* get rid of trailing space */
--cp;
*cp = '\0';
}
}

View File

@ -23,13 +23,12 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/bootinfo.h>
#include <asm/gt64120.h> #include <asm/gt64120.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/smp-ops.h> #include <asm/smp-ops.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/fw/fw.h>
#include <asm/gcmpregs.h> #include <asm/gcmpregs.h>
#include <asm/mips-boards/prom.h> #include <asm/mips-boards/prom.h>
#include <asm/mips-boards/generic.h> #include <asm/mips-boards/generic.h>
@ -38,15 +37,6 @@
#include <asm/mips-boards/malta.h> #include <asm/mips-boards/malta.h>
int prom_argc;
int *_prom_argv, *_prom_envp;
/*
* YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
* This macro take care of sign extension, if running in 64-bit mode.
*/
#define prom_envp(index) ((char *)(long)_prom_envp[(index)])
int init_debug; int init_debug;
static int mips_revision_corid; static int mips_revision_corid;
@ -62,74 +52,6 @@ unsigned long _pcictrl_gt64120;
/* MIPS System controller register base */ /* MIPS System controller register base */
unsigned long _pcictrl_msc; unsigned long _pcictrl_msc;
char *prom_getenv(char *envname)
{
/*
* Return a pointer to the given environment variable.
* In 64-bit mode: we're using 64-bit pointers, but all pointers
* in the PROM structures are only 32-bit, so we need some
* workarounds, if we are running in 64-bit mode.
*/
int i, index=0;
i = strlen(envname);
while (prom_envp(index)) {
if(strncmp(envname, prom_envp(index), i) == 0) {
return(prom_envp(index+1));
}
index += 2;
}
return NULL;
}
static inline unsigned char str2hexnum(unsigned char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return 0; /* foo */
}
static inline void str2eaddr(unsigned char *ea, unsigned char *str)
{
int i;
for (i = 0; i < 6; i++) {
unsigned char num;
if((*str == '.') || (*str == ':'))
str++;
num = str2hexnum(*str++) << 4;
num |= (str2hexnum(*str++));
ea[i] = num;
}
}
int get_ethernet_addr(char *ethernet_addr)
{
char *ethaddr_str;
ethaddr_str = prom_getenv("ethaddr");
if (!ethaddr_str) {
printk("ethaddr not set in boot prom\n");
return -1;
}
str2eaddr(ethernet_addr, ethaddr_str);
if (init_debug > 1) {
int i;
printk("get_ethernet_addr: ");
for (i=0; i<5; i++)
printk("%02x:", (unsigned char)*(ethernet_addr+i));
printk("%02x\n", *(ethernet_addr+i));
}
return 0;
}
#ifdef CONFIG_SERIAL_8250_CONSOLE #ifdef CONFIG_SERIAL_8250_CONSOLE
static void __init console_config(void) static void __init console_config(void)
{ {
@ -138,8 +60,8 @@ static void __init console_config(void)
char parity = '\0', bits = '\0', flow = '\0'; char parity = '\0', bits = '\0', flow = '\0';
char *s; char *s;
if ((strstr(prom_getcmdline(), "console=")) == NULL) { if ((strstr(fw_getcmdline(), "console=")) == NULL) {
s = prom_getenv("modetty0"); s = fw_getenv("modetty0");
if (s) { if (s) {
while (*s >= '0' && *s <= '9') while (*s >= '0' && *s <= '9')
baud = baud*10 + *s++ - '0'; baud = baud*10 + *s++ - '0';
@ -159,7 +81,7 @@ static void __init console_config(void)
if (flow == '\0') if (flow == '\0')
flow = 'r'; flow = 'r';
sprintf(console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow); sprintf(console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow);
strcat(prom_getcmdline(), console_string); strcat(fw_getcmdline(), console_string);
pr_info("Config serial console:%s\n", console_string); pr_info("Config serial console:%s\n", console_string);
} }
} }
@ -193,10 +115,6 @@ extern struct plat_smp_ops msmtc_smp_ops;
void __init prom_init(void) void __init prom_init(void)
{ {
prom_argc = fw_arg0;
_prom_argv = (int *) fw_arg1;
_prom_envp = (int *) fw_arg2;
mips_display_message("LINUX"); mips_display_message("LINUX");
/* /*
@ -353,8 +271,8 @@ void __init prom_init(void)
board_nmi_handler_setup = mips_nmi_setup; board_nmi_handler_setup = mips_nmi_setup;
board_ejtag_handler_setup = mips_ejtag_setup; board_ejtag_handler_setup = mips_ejtag_setup;
prom_init_cmdline(); fw_init_cmdline();
prom_meminit(); fw_meminit();
#ifdef CONFIG_SERIAL_8250_CONSOLE #ifdef CONFIG_SERIAL_8250_CONSOLE
console_config(); console_config();
#endif #endif

View File

@ -27,30 +27,16 @@
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/fw/fw.h>
#include <asm/mips-boards/prom.h> #include <asm/mips-boards/prom.h>
/*#define DEBUG*/ static fw_memblock_t mdesc[FW_MAX_MEMBLOCKS];
enum yamon_memtypes {
yamon_dontuse,
yamon_prom,
yamon_free,
};
static struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
#ifdef DEBUG
static char *mtypes[3] = {
"Dont use memory",
"YAMON PROM memory",
"Free memory",
};
#endif
/* determined physical memory size, not overridden by command line args */ /* determined physical memory size, not overridden by command line args */
unsigned long physical_memsize = 0L; unsigned long physical_memsize = 0L;
static struct prom_pmemblock * __init prom_getmdesc(void) fw_memblock_t * __init fw_getmdesc(void)
{ {
char *memsize_str; char *memsize_str;
unsigned int memsize; unsigned int memsize;
@ -58,15 +44,12 @@ static struct prom_pmemblock * __init prom_getmdesc(void)
static char cmdline[COMMAND_LINE_SIZE] __initdata; static char cmdline[COMMAND_LINE_SIZE] __initdata;
/* otherwise look in the environment */ /* otherwise look in the environment */
memsize_str = prom_getenv("memsize"); memsize_str = fw_getenv("memsize");
if (!memsize_str) { if (!memsize_str) {
printk(KERN_WARNING printk(KERN_WARNING
"memsize not set in boot prom, set to default (32Mb)\n"); "memsize not set in boot prom, set to default (32Mb)\n");
physical_memsize = 0x02000000; physical_memsize = 0x02000000;
} else { } else {
#ifdef DEBUG
pr_debug("prom_memsize = %s\n", memsize_str);
#endif
physical_memsize = simple_strtol(memsize_str, NULL, 0); physical_memsize = simple_strtol(memsize_str, NULL, 0);
} }
@ -90,11 +73,11 @@ static struct prom_pmemblock * __init prom_getmdesc(void)
memset(mdesc, 0, sizeof(mdesc)); memset(mdesc, 0, sizeof(mdesc));
mdesc[0].type = yamon_dontuse; mdesc[0].type = fw_dontuse;
mdesc[0].base = 0x00000000; mdesc[0].base = 0x00000000;
mdesc[0].size = 0x00001000; mdesc[0].size = 0x00001000;
mdesc[1].type = yamon_prom; mdesc[1].type = fw_code;
mdesc[1].base = 0x00001000; mdesc[1].base = 0x00001000;
mdesc[1].size = 0x000ef000; mdesc[1].size = 0x000ef000;
@ -105,55 +88,44 @@ static struct prom_pmemblock * __init prom_getmdesc(void)
* This mean that this area can't be used as DMA memory for PCI * This mean that this area can't be used as DMA memory for PCI
* devices. * devices.
*/ */
mdesc[2].type = yamon_dontuse; mdesc[2].type = fw_dontuse;
mdesc[2].base = 0x000f0000; mdesc[2].base = 0x000f0000;
mdesc[2].size = 0x00010000; mdesc[2].size = 0x00010000;
mdesc[3].type = yamon_dontuse; mdesc[3].type = fw_dontuse;
mdesc[3].base = 0x00100000; mdesc[3].base = 0x00100000;
mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - mdesc[3].base; mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - mdesc[3].base;
mdesc[4].type = yamon_free; mdesc[4].type = fw_free;
mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end)); mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end));
mdesc[4].size = memsize - mdesc[4].base; mdesc[4].size = memsize - mdesc[4].base;
return &mdesc[0]; return &mdesc[0];
} }
static int __init prom_memtype_classify(unsigned int type) static int __init fw_memtype_classify(unsigned int type)
{ {
switch (type) { switch (type) {
case yamon_free: case fw_free:
return BOOT_MEM_RAM; return BOOT_MEM_RAM;
case yamon_prom: case fw_code:
return BOOT_MEM_ROM_DATA; return BOOT_MEM_ROM_DATA;
default: default:
return BOOT_MEM_RESERVED; return BOOT_MEM_RESERVED;
} }
} }
void __init prom_meminit(void) void __init fw_meminit(void)
{ {
struct prom_pmemblock *p; fw_memblock_t *p;
#ifdef DEBUG p = fw_getmdesc();
pr_debug("YAMON MEMORY DESCRIPTOR dump:\n");
p = prom_getmdesc();
while (p->size) {
int i = 0;
pr_debug("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n",
i, p, p->base, p->size, mtypes[p->type]);
p++;
i++;
}
#endif
p = prom_getmdesc();
while (p->size) { while (p->size) {
long type; long type;
unsigned long base, size; unsigned long base, size;
type = prom_memtype_classify(p->type); type = fw_memtype_classify(p->type);
base = p->base; base = p->base;
size = p->size; size = p->size;

View File

@ -25,9 +25,8 @@
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/time.h> #include <linux/time.h>
#include <asm/bootinfo.h> #include <asm/fw/fw.h>
#include <asm/mips-boards/generic.h> #include <asm/mips-boards/generic.h>
#include <asm/mips-boards/prom.h>
#include <asm/mips-boards/malta.h> #include <asm/mips-boards/malta.h>
#include <asm/mips-boards/maltaint.h> #include <asm/mips-boards/maltaint.h>
#include <asm/dma.h> #include <asm/dma.h>
@ -176,7 +175,7 @@ static void __init pci_clock_check(void)
33, 20, 25, 30, 12, 16, 37, 10 33, 20, 25, 30, 12, 16, 37, 10
}; };
int pciclock = pciclocks[jmpr]; int pciclock = pciclocks[jmpr];
char *argptr = prom_getcmdline(); char *argptr = fw_getcmdline();
if (pciclock != 33 && !strstr(argptr, "idebus=")) { if (pciclock != 33 && !strstr(argptr, "idebus=")) {
printk(KERN_WARNING "WARNING: PCI clock is %dMHz, " printk(KERN_WARNING "WARNING: PCI clock is %dMHz, "
@ -214,7 +213,7 @@ static void __init bonito_quirks_setup(void)
{ {
char *argptr; char *argptr;
argptr = prom_getcmdline(); argptr = fw_getcmdline();
if (strstr(argptr, "debug")) { if (strstr(argptr, "debug")) {
BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE; BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE;
printk(KERN_INFO "Enabled Bonito debug mode\n"); printk(KERN_INFO "Enabled Bonito debug mode\n");
@ -226,7 +225,7 @@ static void __init bonito_quirks_setup(void)
BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN; BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
printk(KERN_INFO "Enabled Bonito CPU coherency\n"); printk(KERN_INFO "Enabled Bonito CPU coherency\n");
argptr = prom_getcmdline(); argptr = fw_getcmdline();
if (strstr(argptr, "iobcuncached")) { if (strstr(argptr, "iobcuncached")) {
BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN; BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN;
BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG & BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG &