diff options
7 files changed, 1150 insertions, 10 deletions
diff --git a/target/linux/sibyte/base-files/etc/inittab b/target/linux/sibyte/base-files/etc/inittab index 4409b3974..fa7937df4 100644 --- a/target/linux/sibyte/base-files/etc/inittab +++ b/target/linux/sibyte/base-files/etc/inittab @@ -1,5 +1,4 @@ -# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2006-2009 OpenWrt.org  ::sysinit:/etc/init.d/rcS  duart0::askfirst:/bin/ash --login -#tts/1::askfirst:/bin/ash --login diff --git a/target/linux/sibyte/config-default b/target/linux/sibyte/config-default index 36aa3d139..6f8e4e57e 100644 --- a/target/linux/sibyte/config-default +++ b/target/linux/sibyte/config-default @@ -1,3 +1,6 @@ +CONFIG_HWMON=y +CONFIG_SENSORS_LM90=y +CONFIG_HWMON_DEBUG_CHIP=y  # CONFIG_32BIT is not set  CONFIG_64BIT=y  # CONFIG_ARCH_HAS_ILOG2_U32 is not set @@ -164,7 +167,6 @@ CONFIG_PHYLIB=y  # CONFIG_PROBE_INITRD_HEADER is not set  # CONFIG_PROC_KCORE is not set  CONFIG_RESOURCES_64BIT=y -# CONFIG_RFKILL is not set  # CONFIG_RIO is not set  # CONFIG_RISCOM8 is not set  CONFIG_RTC_CLASS=y @@ -192,7 +194,6 @@ CONFIG_SIBYTE_BCM112X=y  # CONFIG_SIBYTE_BUS_WATCHER is not set  # CONFIG_SIBYTE_CARMEL is not set  # CONFIG_SIBYTE_CFE_CONSOLE is not set -CONFIG_SIBYTE_CFE=y  # CONFIG_SIBYTE_CRHINE is not set  # CONFIG_SIBYTE_CRHONE is not set  # CONFIG_SIBYTE_DMA_PAGEOPS is not set @@ -204,7 +205,6 @@ CONFIG_SIBYTE_SB1xxx_SOC=y  # CONFIG_SIBYTE_SENTOSA is not set  # CONFIG_SIBYTE_SWARM is not set  # CONFIG_SIBYTE_TBPROF is not set -# CONFIG_SIMULATION is not set  # CONFIG_SOUND is not set  # CONFIG_SPECIALIX is not set  # CONFIG_STALDRV is not set diff --git a/target/linux/sibyte/patches/001-sibyte_remove_simulation.patch b/target/linux/sibyte/patches/001-sibyte_remove_simulation.patch new file mode 100644 index 000000000..c3208a4f7 --- /dev/null +++ b/target/linux/sibyte/patches/001-sibyte_remove_simulation.patch @@ -0,0 +1,37 @@ +[PATCH] Remove SiByte simulator option + +This patch removes the SiByte simulation Kconfig option, which only +modified a printk. + +Signed-off-by: Imre Kaloz <kaloz@openwrt.org> + +--- a/arch/mips/sibyte/Kconfig ++++ b/arch/mips/sibyte/Kconfig +@@ -128,13 +128,6 @@ config SIBYTE_ENABLE_LDT_IF_PCI + 	bool + 	select SIBYTE_HAS_LDT if PCI +  +-config SIMULATION +-	bool "Running under simulation" +-	depends on SIBYTE_SB1xxx_SOC +-	help +-	  Build a kernel suitable for running under the GDB simulator. +-	  Primarily adjusts the kernel's notion of time. +- + config SB1_CEX_ALWAYS_FATAL + 	bool "All cache exceptions considered fatal (no recovery attempted)" + 	depends on SIBYTE_SB1xxx_SOC +--- a/arch/mips/sibyte/swarm/setup.c ++++ b/arch/mips/sibyte/swarm/setup.c +@@ -137,11 +137,7 @@ void __init plat_mem_setup(void) + 		swarm_rtc_type = RTC_M4LT81; +  + 	printk("This kernel optimized for " +-#ifdef CONFIG_SIMULATION +-	       "simulation" +-#else + 	       "board" +-#endif + 	       " runs " + #ifdef CONFIG_SIBYTE_CFE + 	       "with" diff --git a/target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch b/target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch new file mode 100644 index 000000000..e9d63113f --- /dev/null +++ b/target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch @@ -0,0 +1,1076 @@ +CFE is the only supported and used bootloader on the SiByte boards, +the standalone kernel support has been never used outside Broadcom. +Remove it and make the kernel use CFE by default. + +Signed-off-by: Imre Kaloz <kaloz@openwrt.org> + +--- a/arch/mips/Makefile ++++ b/arch/mips/Makefile +@@ -167,7 +167,6 @@ libs-$(CONFIG_ARC)		+= arch/mips/fw/arc/ + libs-$(CONFIG_CFE)		+= arch/mips/fw/cfe/ + libs-$(CONFIG_SNIPROM)		+= arch/mips/fw/sni/ + libs-y				+= arch/mips/fw/lib/ +-libs-$(CONFIG_SIBYTE_CFE)	+= arch/mips/sibyte/cfe/ +  + # + # Board-dependent options and extra files +--- a/arch/mips/sibyte/cfe/console.c ++++ /dev/null +@@ -1,79 +0,0 @@ +-#include <linux/init.h> +-#include <linux/errno.h> +-#include <linux/console.h> +- +-#include <asm/sibyte/board.h> +- +-#include <asm/fw/cfe/cfe_api.h> +-#include <asm/fw/cfe/cfe_error.h> +- +-extern int cfe_cons_handle; +- +-static void cfe_console_write(struct console *cons, const char *str, +-		       unsigned int count) +-{ +-	int i, last, written; +- +-	for (i=0, last=0; i<count; i++) { +-		if (!str[i]) +-			/* XXXKW can/should this ever happen? */ +-			return; +-		if (str[i] == '\n') { +-			do { +-				written = cfe_write(cfe_cons_handle, &str[last], i-last); +-				if (written < 0) +-					; +-				last += written; +-			} while (last < i); +-			while (cfe_write(cfe_cons_handle, "\r", 1) <= 0) +-				; +-		} +-	} +-	if (last != count) { +-		do { +-			written = cfe_write(cfe_cons_handle, &str[last], count-last); +-			if (written < 0) +-				; +-			last += written; +-		} while (last < count); +-	} +- +-} +- +-static int cfe_console_setup(struct console *cons, char *str) +-{ +-	char consdev[32]; +-	/* XXXKW think about interaction with 'console=' cmdline arg */ +-	/* If none of the console options are configured, the build will break. */ +-	if (cfe_getenv("BOOT_CONSOLE", consdev, 32) >= 0) { +-#ifdef CONFIG_SERIAL_SB1250_DUART +-		if (!strcmp(consdev, "uart0")) { +-			setleds("u0cn"); +-		} else if (!strcmp(consdev, "uart1")) { +-			setleds("u1cn"); +-#endif +-#ifdef CONFIG_VGA_CONSOLE +-		} else if (!strcmp(consdev, "pcconsole0")) { +-			setleds("pccn"); +-#endif +-		} else +-			return -ENODEV; +-	} +-	return 0; +-} +- +-static struct console sb1250_cfe_cons = { +-	.name		= "cfe", +-	.write		= cfe_console_write, +-	.setup		= cfe_console_setup, +-	.flags		= CON_PRINTBUFFER, +-	.index		= -1, +-}; +- +-static int __init sb1250_cfe_console_init(void) +-{ +-	register_console(&sb1250_cfe_cons); +-	return 0; +-} +- +-console_initcall(sb1250_cfe_console_init); +--- a/arch/mips/sibyte/cfe/Makefile ++++ /dev/null +@@ -1,2 +0,0 @@ +-lib-y					= setup.o +-lib-$(CONFIG_SIBYTE_CFE_CONSOLE)	+= console.o +--- a/arch/mips/sibyte/cfe/setup.c ++++ /dev/null +@@ -1,350 +0,0 @@ +-/* +- * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * as published by the Free Software Foundation; either version 2 +- * of the License, or (at your option) any later version. +- * +- * This program is distributed in the hope that 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. +- */ +- +-#include <linux/init.h> +-#include <linux/kernel.h> +-#include <linux/linkage.h> +-#include <linux/mm.h> +-#include <linux/blkdev.h> +-#include <linux/bootmem.h> +-#include <linux/pm.h> +-#include <linux/smp.h> +- +-#include <asm/bootinfo.h> +-#include <asm/reboot.h> +-#include <asm/sibyte/board.h> +-#include <asm/smp-ops.h> +- +-#include <asm/fw/cfe/cfe_api.h> +-#include <asm/fw/cfe/cfe_error.h> +- +-/* Max ram addressable in 32-bit segments */ +-#ifdef CONFIG_64BIT +-#define MAX_RAM_SIZE (~0ULL) +-#else +-#ifdef CONFIG_HIGHMEM +-#ifdef CONFIG_64BIT_PHYS_ADDR +-#define MAX_RAM_SIZE (~0ULL) +-#else +-#define MAX_RAM_SIZE (0xffffffffULL) +-#endif +-#else +-#define MAX_RAM_SIZE (0x1fffffffULL) +-#endif +-#endif +- +-#define SIBYTE_MAX_MEM_REGIONS 8 +-phys_t board_mem_region_addrs[SIBYTE_MAX_MEM_REGIONS]; +-phys_t board_mem_region_sizes[SIBYTE_MAX_MEM_REGIONS]; +-unsigned int board_mem_region_count; +- +-int cfe_cons_handle; +- +-#ifdef CONFIG_BLK_DEV_INITRD +-extern unsigned long initrd_start, initrd_end; +-#endif +- +-static void __noreturn cfe_linux_exit(void *arg) +-{ +-	int warm = *(int *)arg; +- +-	if (smp_processor_id()) { +-		static int reboot_smp; +- +-		/* Don't repeat the process from another CPU */ +-		if (!reboot_smp) { +-			/* Get CPU 0 to do the cfe_exit */ +-			reboot_smp = 1; +-			smp_call_function(cfe_linux_exit, arg, 0); +-		} +-	} else { +-		printk("Passing control back to CFE...\n"); +-		cfe_exit(warm, 0); +-		printk("cfe_exit returned??\n"); +-	} +-	while (1); +-} +- +-static void __noreturn cfe_linux_restart(char *command) +-{ +-	static const int zero; +- +-	cfe_linux_exit((void *)&zero); +-} +- +-static void __noreturn cfe_linux_halt(void) +-{ +-	static const int one = 1; +- +-	cfe_linux_exit((void *)&one); +-} +- +-static __init void prom_meminit(void) +-{ +-	u64 addr, size, type; /* regardless of 64BIT_PHYS_ADDR */ +-	int mem_flags = 0; +-	unsigned int idx; +-	int rd_flag; +-#ifdef CONFIG_BLK_DEV_INITRD +-	unsigned long initrd_pstart; +-	unsigned long initrd_pend; +- +-	initrd_pstart = CPHYSADDR(initrd_start); +-	initrd_pend = CPHYSADDR(initrd_end); +-	if (initrd_start && +-	    ((initrd_pstart > MAX_RAM_SIZE) +-	     || (initrd_pend > MAX_RAM_SIZE))) { +-		panic("initrd out of addressable memory"); +-	} +- +-#endif /* INITRD */ +- +-	for (idx = 0; cfe_enummem(idx, mem_flags, &addr, &size, &type) != CFE_ERR_NOMORE; +-	     idx++) { +-		rd_flag = 0; +-		if (type == CFE_MI_AVAILABLE) { +-			/* +-			 * See if this block contains (any portion of) the +-			 * ramdisk +-			 */ +-#ifdef CONFIG_BLK_DEV_INITRD +-			if (initrd_start) { +-				if ((initrd_pstart > addr) && +-				    (initrd_pstart < (addr + size))) { +-					add_memory_region(addr, +-					                  initrd_pstart - addr, +-					                  BOOT_MEM_RAM); +-					rd_flag = 1; +-				} +-				if ((initrd_pend > addr) && +-				    (initrd_pend < (addr + size))) { +-					add_memory_region(initrd_pend, +-						(addr + size) - initrd_pend, +-						 BOOT_MEM_RAM); +-					rd_flag = 1; +-				} +-			} +-#endif +-			if (!rd_flag) { +-				if (addr > MAX_RAM_SIZE) +-					continue; +-				if (addr+size > MAX_RAM_SIZE) +-					size = MAX_RAM_SIZE - (addr+size) + 1; +-				/* +-				 * memcpy/__copy_user prefetch, which +-				 * will cause a bus error for +-				 * KSEG/KUSEG addrs not backed by RAM. +-				 * Hence, reserve some padding for the +-				 * prefetch distance. +-				 */ +-				if (size > 512) +-					size -= 512; +-				add_memory_region(addr, size, BOOT_MEM_RAM); +-			} +-			board_mem_region_addrs[board_mem_region_count] = addr; +-			board_mem_region_sizes[board_mem_region_count] = size; +-			board_mem_region_count++; +-			if (board_mem_region_count == +-			    SIBYTE_MAX_MEM_REGIONS) { +-				/* +-				 * Too many regions.  Need to configure more +-				 */ +-				while(1); +-			} +-		} +-	} +-#ifdef CONFIG_BLK_DEV_INITRD +-	if (initrd_start) { +-		add_memory_region(initrd_pstart, initrd_pend - initrd_pstart, +-				  BOOT_MEM_RESERVED); +-	} +-#endif +-} +- +-#ifdef CONFIG_BLK_DEV_INITRD +-static int __init initrd_setup(char *str) +-{ +-	char rdarg[64]; +-	int idx; +-	char *tmp, *endptr; +-	unsigned long initrd_size; +- +-	/* Make a copy of the initrd argument so we can smash it up here */ +-	for (idx = 0; idx < sizeof(rdarg)-1; idx++) { +-		if (!str[idx] || (str[idx] == ' ')) break; +-		rdarg[idx] = str[idx]; +-	} +- +-	rdarg[idx] = 0; +-	str = rdarg; +- +-	/* +-	 *Initrd location comes in the form "<hex size of ramdisk in bytes>@<location in memory>" +-	 *  e.g. initrd=3abfd@80010000.  This is set up by the loader. +-	 */ +-	for (tmp = str; *tmp != '@'; tmp++) { +-		if (!*tmp) { +-			goto fail; +-		} +-	} +-	*tmp = 0; +-	tmp++; +-	if (!*tmp) { +-		goto fail; +-	} +-	initrd_size = simple_strtoul(str, &endptr, 16); +-	if (*endptr) { +-		*(tmp-1) = '@'; +-		goto fail; +-	} +-	*(tmp-1) = '@'; +-	initrd_start = simple_strtoul(tmp, &endptr, 16); +-	if (*endptr) { +-		goto fail; +-	} +-	initrd_end = initrd_start + initrd_size; +-	printk("Found initrd of %lx@%lx\n", initrd_size, initrd_start); +-	return 1; +- fail: +-	printk("Bad initrd argument.  Disabling initrd\n"); +-	initrd_start = 0; +-	initrd_end = 0; +-	return 1; +-} +- +-#endif +- +-extern struct plat_smp_ops sb_smp_ops; +-extern struct plat_smp_ops bcm1480_smp_ops; +- +-/* +- * prom_init is called just after the cpu type is determined, from setup_arch() +- */ +-void __init prom_init(void) +-{ +-	uint64_t cfe_ept, cfe_handle; +-	unsigned int cfe_eptseal; +-	int argc = fw_arg0; +-	char **envp = (char **) fw_arg2; +-	int *prom_vec = (int *) fw_arg3; +- +-	_machine_restart   = cfe_linux_restart; +-	_machine_halt      = cfe_linux_halt; +-	pm_power_off = cfe_linux_halt; +- +-	/* +-	 * Check if a loader was used; if NOT, the 4 arguments are +-	 * what CFE gives us (handle, 0, EPT and EPTSEAL) +-	 */ +-	if (argc < 0) { +-		cfe_handle = (uint64_t)(long)argc; +-		cfe_ept = (long)envp; +-		cfe_eptseal = (uint32_t)(unsigned long)prom_vec; +-	} else { +-		if ((int32_t)(long)prom_vec < 0) { +-			/* +-			 * Old loader; all it gives us is the handle, +-			 * so use the "known" entrypoint and assume +-			 * the seal. +-			 */ +-			cfe_handle = (uint64_t)(long)prom_vec; +-			cfe_ept = (uint64_t)((int32_t)0x9fc00500); +-			cfe_eptseal = CFE_EPTSEAL; +-		} else { +-			/* +-			 * Newer loaders bundle the handle/ept/eptseal +-			 * Note: prom_vec is in the loader's useg +-			 * which is still alive in the TLB. +-			 */ +-			cfe_handle = (uint64_t)((int32_t *)prom_vec)[0]; +-			cfe_ept = (uint64_t)((int32_t *)prom_vec)[2]; +-			cfe_eptseal = (unsigned int)((uint32_t *)prom_vec)[3]; +-		} +-	} +-	if (cfe_eptseal != CFE_EPTSEAL) { +-		/* too early for panic to do any good */ +-		printk("CFE's entrypoint seal doesn't match. Spinning."); +-		while (1) ; +-	} +-	cfe_init(cfe_handle, cfe_ept); +-	/* +-	 * Get the handle for (at least) prom_putchar, possibly for +-	 * boot console +-	 */ +-	cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); +-	if (cfe_getenv("LINUX_CMDLINE", arcs_cmdline, CL_SIZE) < 0) { +-		if (argc < 0) { +-			/* +-			 * It's OK for direct boot to not provide a +-			 *  command line +-			 */ +-			strcpy(arcs_cmdline, "root=/dev/ram0 "); +-		} else { +-			/* The loader should have set the command line */ +-			/* too early for panic to do any good */ +-			printk("LINUX_CMDLINE not defined in cfe."); +-			while (1) ; +-		} +-	} +- +-#ifdef CONFIG_BLK_DEV_INITRD +-	{ +-		char *ptr; +-		/* Need to find out early whether we've got an initrd.  So scan +-		   the list looking now */ +-		for (ptr = arcs_cmdline; *ptr; ptr++) { +-			while (*ptr == ' ') { +-				ptr++; +-			} +-			if (!strncmp(ptr, "initrd=", 7)) { +-				initrd_setup(ptr+7); +-				break; +-			} else { +-				while (*ptr && (*ptr != ' ')) { +-					ptr++; +-				} +-			} +-		} +-	} +-#endif /* CONFIG_BLK_DEV_INITRD */ +- +-	/* Not sure this is needed, but it's the safe way. */ +-	arcs_cmdline[CL_SIZE-1] = 0; +- +-	prom_meminit(); +- +-#if defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) +-	register_smp_ops(&sb_smp_ops); +-#endif +-#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) +-	register_smp_ops(&bcm1480_smp_ops); +-#endif +-} +- +-void __init prom_free_prom_memory(void) +-{ +-	/* Not sure what I'm supposed to do here.  Nothing, I think */ +-} +- +-void prom_putchar(char c) +-{ +-	int ret; +- +-	while ((ret = cfe_write(cfe_cons_handle, &c, 1)) == 0) +-		; +-} +--- /dev/null ++++ b/arch/mips/sibyte/common/cfe.c +@@ -0,0 +1,350 @@ ++/* ++ * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2 ++ * of the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that 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. ++ */ ++ ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/linkage.h> ++#include <linux/mm.h> ++#include <linux/blkdev.h> ++#include <linux/bootmem.h> ++#include <linux/pm.h> ++#include <linux/smp.h> ++ ++#include <asm/bootinfo.h> ++#include <asm/reboot.h> ++#include <asm/sibyte/board.h> ++#include <asm/smp-ops.h> ++ ++#include <asm/fw/cfe/cfe_api.h> ++#include <asm/fw/cfe/cfe_error.h> ++ ++/* Max ram addressable in 32-bit segments */ ++#ifdef CONFIG_64BIT ++#define MAX_RAM_SIZE (~0ULL) ++#else ++#ifdef CONFIG_HIGHMEM ++#ifdef CONFIG_64BIT_PHYS_ADDR ++#define MAX_RAM_SIZE (~0ULL) ++#else ++#define MAX_RAM_SIZE (0xffffffffULL) ++#endif ++#else ++#define MAX_RAM_SIZE (0x1fffffffULL) ++#endif ++#endif ++ ++#define SIBYTE_MAX_MEM_REGIONS 8 ++phys_t board_mem_region_addrs[SIBYTE_MAX_MEM_REGIONS]; ++phys_t board_mem_region_sizes[SIBYTE_MAX_MEM_REGIONS]; ++unsigned int board_mem_region_count; ++ ++int cfe_cons_handle; ++ ++#ifdef CONFIG_BLK_DEV_INITRD ++extern unsigned long initrd_start, initrd_end; ++#endif ++ ++static void __noreturn cfe_linux_exit(void *arg) ++{ ++	int warm = *(int *)arg; ++ ++	if (smp_processor_id()) { ++		static int reboot_smp; ++ ++		/* Don't repeat the process from another CPU */ ++		if (!reboot_smp) { ++			/* Get CPU 0 to do the cfe_exit */ ++			reboot_smp = 1; ++			smp_call_function(cfe_linux_exit, arg, 0); ++		} ++	} else { ++		printk("Passing control back to CFE...\n"); ++		cfe_exit(warm, 0); ++		printk("cfe_exit returned??\n"); ++	} ++	while (1); ++} ++ ++static void __noreturn cfe_linux_restart(char *command) ++{ ++	static const int zero; ++ ++	cfe_linux_exit((void *)&zero); ++} ++ ++static void __noreturn cfe_linux_halt(void) ++{ ++	static const int one = 1; ++ ++	cfe_linux_exit((void *)&one); ++} ++ ++static __init void prom_meminit(void) ++{ ++	u64 addr, size, type; /* regardless of 64BIT_PHYS_ADDR */ ++	int mem_flags = 0; ++	unsigned int idx; ++	int rd_flag; ++#ifdef CONFIG_BLK_DEV_INITRD ++	unsigned long initrd_pstart; ++	unsigned long initrd_pend; ++ ++	initrd_pstart = CPHYSADDR(initrd_start); ++	initrd_pend = CPHYSADDR(initrd_end); ++	if (initrd_start && ++	    ((initrd_pstart > MAX_RAM_SIZE) ++	     || (initrd_pend > MAX_RAM_SIZE))) { ++		panic("initrd out of addressable memory"); ++	} ++ ++#endif /* INITRD */ ++ ++	for (idx = 0; cfe_enummem(idx, mem_flags, &addr, &size, &type) != CFE_ERR_NOMORE; ++	     idx++) { ++		rd_flag = 0; ++		if (type == CFE_MI_AVAILABLE) { ++			/* ++			 * See if this block contains (any portion of) the ++			 * ramdisk ++			 */ ++#ifdef CONFIG_BLK_DEV_INITRD ++			if (initrd_start) { ++				if ((initrd_pstart > addr) && ++				    (initrd_pstart < (addr + size))) { ++					add_memory_region(addr, ++					                  initrd_pstart - addr, ++					                  BOOT_MEM_RAM); ++					rd_flag = 1; ++				} ++				if ((initrd_pend > addr) && ++				    (initrd_pend < (addr + size))) { ++					add_memory_region(initrd_pend, ++						(addr + size) - initrd_pend, ++						 BOOT_MEM_RAM); ++					rd_flag = 1; ++				} ++			} ++#endif ++			if (!rd_flag) { ++				if (addr > MAX_RAM_SIZE) ++					continue; ++				if (addr+size > MAX_RAM_SIZE) ++					size = MAX_RAM_SIZE - (addr+size) + 1; ++				/* ++				 * memcpy/__copy_user prefetch, which ++				 * will cause a bus error for ++				 * KSEG/KUSEG addrs not backed by RAM. ++				 * Hence, reserve some padding for the ++				 * prefetch distance. ++				 */ ++				if (size > 512) ++					size -= 512; ++				add_memory_region(addr, size, BOOT_MEM_RAM); ++			} ++			board_mem_region_addrs[board_mem_region_count] = addr; ++			board_mem_region_sizes[board_mem_region_count] = size; ++			board_mem_region_count++; ++			if (board_mem_region_count == ++			    SIBYTE_MAX_MEM_REGIONS) { ++				/* ++				 * Too many regions.  Need to configure more ++				 */ ++				while(1); ++			} ++		} ++	} ++#ifdef CONFIG_BLK_DEV_INITRD ++	if (initrd_start) { ++		add_memory_region(initrd_pstart, initrd_pend - initrd_pstart, ++				  BOOT_MEM_RESERVED); ++	} ++#endif ++} ++ ++#ifdef CONFIG_BLK_DEV_INITRD ++static int __init initrd_setup(char *str) ++{ ++	char rdarg[64]; ++	int idx; ++	char *tmp, *endptr; ++	unsigned long initrd_size; ++ ++	/* Make a copy of the initrd argument so we can smash it up here */ ++	for (idx = 0; idx < sizeof(rdarg)-1; idx++) { ++		if (!str[idx] || (str[idx] == ' ')) break; ++		rdarg[idx] = str[idx]; ++	} ++ ++	rdarg[idx] = 0; ++	str = rdarg; ++ ++	/* ++	 *Initrd location comes in the form "<hex size of ramdisk in bytes>@<location in memory>" ++	 *  e.g. initrd=3abfd@80010000.  This is set up by the loader. ++	 */ ++	for (tmp = str; *tmp != '@'; tmp++) { ++		if (!*tmp) { ++			goto fail; ++		} ++	} ++	*tmp = 0; ++	tmp++; ++	if (!*tmp) { ++		goto fail; ++	} ++	initrd_size = simple_strtoul(str, &endptr, 16); ++	if (*endptr) { ++		*(tmp-1) = '@'; ++		goto fail; ++	} ++	*(tmp-1) = '@'; ++	initrd_start = simple_strtoul(tmp, &endptr, 16); ++	if (*endptr) { ++		goto fail; ++	} ++	initrd_end = initrd_start + initrd_size; ++	printk("Found initrd of %lx@%lx\n", initrd_size, initrd_start); ++	return 1; ++ fail: ++	printk("Bad initrd argument.  Disabling initrd\n"); ++	initrd_start = 0; ++	initrd_end = 0; ++	return 1; ++} ++ ++#endif ++ ++extern struct plat_smp_ops sb_smp_ops; ++extern struct plat_smp_ops bcm1480_smp_ops; ++ ++/* ++ * prom_init is called just after the cpu type is determined, from setup_arch() ++ */ ++void __init prom_init(void) ++{ ++	uint64_t cfe_ept, cfe_handle; ++	unsigned int cfe_eptseal; ++	int argc = fw_arg0; ++	char **envp = (char **) fw_arg2; ++	int *prom_vec = (int *) fw_arg3; ++ ++	_machine_restart   = cfe_linux_restart; ++	_machine_halt      = cfe_linux_halt; ++	pm_power_off = cfe_linux_halt; ++ ++	/* ++	 * Check if a loader was used; if NOT, the 4 arguments are ++	 * what CFE gives us (handle, 0, EPT and EPTSEAL) ++	 */ ++	if (argc < 0) { ++		cfe_handle = (uint64_t)(long)argc; ++		cfe_ept = (long)envp; ++		cfe_eptseal = (uint32_t)(unsigned long)prom_vec; ++	} else { ++		if ((int32_t)(long)prom_vec < 0) { ++			/* ++			 * Old loader; all it gives us is the handle, ++			 * so use the "known" entrypoint and assume ++			 * the seal. ++			 */ ++			cfe_handle = (uint64_t)(long)prom_vec; ++			cfe_ept = (uint64_t)((int32_t)0x9fc00500); ++			cfe_eptseal = CFE_EPTSEAL; ++		} else { ++			/* ++			 * Newer loaders bundle the handle/ept/eptseal ++			 * Note: prom_vec is in the loader's useg ++			 * which is still alive in the TLB. ++			 */ ++			cfe_handle = (uint64_t)((int32_t *)prom_vec)[0]; ++			cfe_ept = (uint64_t)((int32_t *)prom_vec)[2]; ++			cfe_eptseal = (unsigned int)((uint32_t *)prom_vec)[3]; ++		} ++	} ++	if (cfe_eptseal != CFE_EPTSEAL) { ++		/* too early for panic to do any good */ ++		printk("CFE's entrypoint seal doesn't match. Spinning."); ++		while (1) ; ++	} ++	cfe_init(cfe_handle, cfe_ept); ++	/* ++	 * Get the handle for (at least) prom_putchar, possibly for ++	 * boot console ++	 */ ++	cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); ++	if (cfe_getenv("LINUX_CMDLINE", arcs_cmdline, CL_SIZE) < 0) { ++		if (argc < 0) { ++			/* ++			 * It's OK for direct boot to not provide a ++			 *  command line ++			 */ ++			strcpy(arcs_cmdline, "root=/dev/ram0 "); ++		} else { ++			/* The loader should have set the command line */ ++			/* too early for panic to do any good */ ++			printk("LINUX_CMDLINE not defined in cfe."); ++			while (1) ; ++		} ++	} ++ ++#ifdef CONFIG_BLK_DEV_INITRD ++	{ ++		char *ptr; ++		/* Need to find out early whether we've got an initrd.  So scan ++		   the list looking now */ ++		for (ptr = arcs_cmdline; *ptr; ptr++) { ++			while (*ptr == ' ') { ++				ptr++; ++			} ++			if (!strncmp(ptr, "initrd=", 7)) { ++				initrd_setup(ptr+7); ++				break; ++			} else { ++				while (*ptr && (*ptr != ' ')) { ++					ptr++; ++				} ++			} ++		} ++	} ++#endif /* CONFIG_BLK_DEV_INITRD */ ++ ++	/* Not sure this is needed, but it's the safe way. */ ++	arcs_cmdline[CL_SIZE-1] = 0; ++ ++	prom_meminit(); ++ ++#if defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) ++	register_smp_ops(&sb_smp_ops); ++#endif ++#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) ++	register_smp_ops(&bcm1480_smp_ops); ++#endif ++} ++ ++void __init prom_free_prom_memory(void) ++{ ++	/* Not sure what I'm supposed to do here.  Nothing, I think */ ++} ++ ++void prom_putchar(char c) ++{ ++	int ret; ++ ++	while ((ret = cfe_write(cfe_cons_handle, &c, 1)) == 0) ++		; ++} +--- /dev/null ++++ b/arch/mips/sibyte/common/cfe_console.c +@@ -0,0 +1,79 @@ ++#include <linux/init.h> ++#include <linux/errno.h> ++#include <linux/console.h> ++ ++#include <asm/sibyte/board.h> ++ ++#include <asm/fw/cfe/cfe_api.h> ++#include <asm/fw/cfe/cfe_error.h> ++ ++extern int cfe_cons_handle; ++ ++static void cfe_console_write(struct console *cons, const char *str, ++		       unsigned int count) ++{ ++	int i, last, written; ++ ++	for (i=0, last=0; i<count; i++) { ++		if (!str[i]) ++			/* XXXKW can/should this ever happen? */ ++			return; ++		if (str[i] == '\n') { ++			do { ++				written = cfe_write(cfe_cons_handle, &str[last], i-last); ++				if (written < 0) ++					; ++				last += written; ++			} while (last < i); ++			while (cfe_write(cfe_cons_handle, "\r", 1) <= 0) ++				; ++		} ++	} ++	if (last != count) { ++		do { ++			written = cfe_write(cfe_cons_handle, &str[last], count-last); ++			if (written < 0) ++				; ++			last += written; ++		} while (last < count); ++	} ++ ++} ++ ++static int cfe_console_setup(struct console *cons, char *str) ++{ ++	char consdev[32]; ++	/* XXXKW think about interaction with 'console=' cmdline arg */ ++	/* If none of the console options are configured, the build will break. */ ++	if (cfe_getenv("BOOT_CONSOLE", consdev, 32) >= 0) { ++#ifdef CONFIG_SERIAL_SB1250_DUART ++		if (!strcmp(consdev, "uart0")) { ++			setleds("u0cn"); ++		} else if (!strcmp(consdev, "uart1")) { ++			setleds("u1cn"); ++#endif ++#ifdef CONFIG_VGA_CONSOLE ++		} else if (!strcmp(consdev, "pcconsole0")) { ++			setleds("pccn"); ++#endif ++		} else ++			return -ENODEV; ++	} ++	return 0; ++} ++ ++static struct console sb1250_cfe_cons = { ++	.name		= "cfe", ++	.write		= cfe_console_write, ++	.setup		= cfe_console_setup, ++	.flags		= CON_PRINTBUFFER, ++	.index		= -1, ++}; ++ ++static int __init sb1250_cfe_console_init(void) ++{ ++	register_console(&sb1250_cfe_cons); ++	return 0; ++} ++ ++console_initcall(sb1250_cfe_console_init); +--- a/arch/mips/sibyte/common/Makefile ++++ b/arch/mips/sibyte/common/Makefile +@@ -1,5 +1,5 @@ +-obj-y := +- ++obj-y := cfe.o ++obj-$(CONFIG_SIBYTE_CFE_CONSOLE)	+= cfe_console.o + obj-$(CONFIG_SIBYTE_TBPROF)		+= sb_tbprof.o +  + EXTRA_CFLAGS += -Werror +--- a/arch/mips/sibyte/Kconfig ++++ b/arch/mips/sibyte/Kconfig +@@ -75,6 +75,8 @@ config SIBYTE_SB1xxx_SOC + 	select SWAP_IO_SPACE + 	select SYS_SUPPORTS_32BIT_KERNEL + 	select SYS_SUPPORTS_64BIT_KERNEL ++	select CFE ++	select SYS_HAS_EARLY_PRINTK +  + choice + 	prompt "SiByte SOC Stepping" +@@ -136,34 +138,14 @@ config SB1_CERR_STALL + 	bool "Stall (rather than panic) on fatal cache error" + 	depends on SIBYTE_SB1xxx_SOC +  +-config SIBYTE_CFE +-	bool "Booting from CFE" +-	depends on SIBYTE_SB1xxx_SOC +-	select CFE +-	select SYS_HAS_EARLY_PRINTK +-	help +-	  Make use of the CFE API for enumerating available memory, +-	  controlling secondary CPUs, and possibly console output. +- + config SIBYTE_CFE_CONSOLE + 	bool "Use firmware console" +-	depends on SIBYTE_CFE ++	depends on SIBYTE_SB1xxx_SOC + 	help + 	  Use the CFE API's console write routines during boot.  Other console + 	  options (VT console, sb1250 duart console, etc.) should not be + 	  configured. +  +-config SIBYTE_STANDALONE +-	bool +-	depends on SIBYTE_SB1xxx_SOC && !SIBYTE_CFE +-	select SYS_HAS_EARLY_PRINTK +-	default y +- +-config SIBYTE_STANDALONE_RAM_SIZE +-	int "Memory size (in megabytes)" +-	depends on SIBYTE_STANDALONE +-	default "32" +- + config SIBYTE_BUS_WATCHER + 	bool "Support for Bus Watcher statistics" + 	depends on SIBYTE_SB1xxx_SOC +--- a/arch/mips/sibyte/sb1250/Makefile ++++ b/arch/mips/sibyte/sb1250/Makefile +@@ -1,7 +1,6 @@ + obj-y := setup.o irq.o time.o +  + obj-$(CONFIG_SMP)			+= smp.o +-obj-$(CONFIG_SIBYTE_STANDALONE)		+= prom.o + obj-$(CONFIG_SIBYTE_BUS_WATCHER)	+= bus_watcher.o +  + EXTRA_CFLAGS += -Werror +--- a/arch/mips/sibyte/sb1250/prom.c ++++ /dev/null +@@ -1,96 +0,0 @@ +-/* +- * Copyright (C) 2000, 2001 Broadcom Corporation +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * as published by the Free Software Foundation; either version 2 +- * of the License, or (at your option) any later version. +- * +- * This program is distributed in the hope that 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. +- */ +- +-#include <linux/init.h> +-#include <linux/kernel.h> +-#include <linux/mm.h> +-#include <linux/blkdev.h> +-#include <linux/bootmem.h> +-#include <linux/smp.h> +-#include <linux/initrd.h> +-#include <linux/pm.h> +- +-#include <asm/bootinfo.h> +-#include <asm/reboot.h> +- +-#define MAX_RAM_SIZE ((CONFIG_SIBYTE_STANDALONE_RAM_SIZE * 1024 * 1024) - 1) +- +-static __init void prom_meminit(void) +-{ +-#ifdef CONFIG_BLK_DEV_INITRD +-	unsigned long initrd_pstart; +-	unsigned long initrd_pend; +- +-	initrd_pstart = __pa(initrd_start); +-	initrd_pend = __pa(initrd_end); +-	if (initrd_start && +-	    ((initrd_pstart > MAX_RAM_SIZE) +-	     || (initrd_pend > MAX_RAM_SIZE))) { +-		panic("initrd out of addressable memory"); +-	} +- +-	add_memory_region(0, initrd_pstart, +-			  BOOT_MEM_RAM); +-	add_memory_region(initrd_pstart, initrd_pend - initrd_pstart, +-			  BOOT_MEM_RESERVED); +-	add_memory_region(initrd_pend, +-			  (CONFIG_SIBYTE_STANDALONE_RAM_SIZE * 1024 * 1024) - initrd_pend, +-			  BOOT_MEM_RAM); +-#else +-	add_memory_region(0, CONFIG_SIBYTE_STANDALONE_RAM_SIZE * 1024 * 1024, +-			  BOOT_MEM_RAM); +-#endif +-} +- +-void prom_cpu0_exit(void *unused) +-{ +-        while (1) ; +-} +- +-static void prom_linux_exit(void) +-{ +-#ifdef CONFIG_SMP +-	if (smp_processor_id()) { +-		smp_call_function(prom_cpu0_exit, NULL, 1); +-	} +-#endif +-	while(1); +-} +- +-/* +- * prom_init is called just after the cpu type is determined, from setup_arch() +- */ +-void __init prom_init(void) +-{ +-	_machine_restart   = (void (*)(char *))prom_linux_exit; +-	_machine_halt      = prom_linux_exit; +-	pm_power_off = prom_linux_exit; +- +-	strcpy(arcs_cmdline, "root=/dev/ram0 "); +- +-	prom_meminit(); +-} +- +-void __init prom_free_prom_memory(void) +-{ +-	/* Not sure what I'm supposed to do here.  Nothing, I think */ +-} +- +-void prom_putchar(char c) +-{ +-} +--- a/arch/mips/sibyte/swarm/setup.c ++++ b/arch/mips/sibyte/swarm/setup.c +@@ -136,16 +136,6 @@ void __init plat_mem_setup(void) + 	if (m41t81_probe()) + 		swarm_rtc_type = RTC_M4LT81; +  +-	printk("This kernel optimized for " +-	       "board" +-	       " runs " +-#ifdef CONFIG_SIBYTE_CFE +-	       "with" +-#else +-	       "without" +-#endif +-	       " CFE\n"); +- + #ifdef CONFIG_VT + 	screen_info = (struct screen_info) { + 		0, 0,           /* orig-x, orig-y */ diff --git a/target/linux/sibyte/patches/100-honuor_config_cmdline.patch b/target/linux/sibyte/patches/100-honuor_config_cmdline.patch index b2af91644..1c3545f74 100644 --- a/target/linux/sibyte/patches/100-honuor_config_cmdline.patch +++ b/target/linux/sibyte/patches/100-honuor_config_cmdline.patch @@ -1,5 +1,10 @@ ---- a/arch/mips/sibyte/cfe/setup.c -+++ b/arch/mips/sibyte/cfe/setup.c +The SiByte platform code doesn't honor the CONFIG_CMDLINE kernel +option. This patch fixes this issue. + +Signed-off-by: Imre Kaloz <kaloz@openwrt.org> + +--- a/arch/mips/sibyte/common/cfe.c ++++ b/arch/mips/sibyte/common/cfe.c  @@ -293,7 +293,11 @@ void __init prom_init(void)   			 * It's OK for direct boot to not provide a   			 *  command line diff --git a/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch b/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch index ca755f3e2..e4bd8bc7e 100644 --- a/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch +++ b/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch @@ -526,6 +526,6 @@  -	if (m41t81_probe())  -		swarm_rtc_type = RTC_M4LT81;  - - 	printk("This kernel optimized for " - #ifdef CONFIG_SIMULATION - 	       "simulation" + #ifdef CONFIG_VT + 	screen_info = (struct screen_info) { + 		0, 0,           /* orig-x, orig-y */ diff --git a/target/linux/sibyte/patches/105-sibyte_hwmon.patch b/target/linux/sibyte/patches/105-sibyte_hwmon.patch new file mode 100644 index 000000000..a5657b97b --- /dev/null +++ b/target/linux/sibyte/patches/105-sibyte_hwmon.patch @@ -0,0 +1,23 @@ +--- a/arch/mips/sibyte/swarm/swarm-i2c.c ++++ b/arch/mips/sibyte/swarm/swarm-i2c.c +@@ -15,6 +15,11 @@ + #include <linux/init.h> + #include <linux/kernel.h> +  ++static struct i2c_board_info swarm_i2c_info0[] __initdata = { ++	{ ++		I2C_BOARD_INFO("lm90", 0x2a), ++	}, ++}; +  + static struct i2c_board_info swarm_i2c_info1[] __initdata = { + 	{ +@@ -26,6 +31,8 @@ static int __init swarm_i2c_init(void) + { + 	int err; +  ++	err = i2c_register_board_info(0, swarm_i2c_info0, ++				      ARRAY_SIZE(swarm_i2c_info0)); + 	err = i2c_register_board_info(1, swarm_i2c_info1, + 				      ARRAY_SIZE(swarm_i2c_info1)); + 	if (err < 0)  | 
