diff options
Diffstat (limited to 'target/linux/sibyte')
9 files changed, 44 insertions, 1671 deletions
| diff --git a/target/linux/sibyte/Makefile b/target/linux/sibyte/Makefile index bfcd648cc..9146be55e 100644 --- a/target/linux/sibyte/Makefile +++ b/target/linux/sibyte/Makefile @@ -1,5 +1,5 @@  # -# Copyright (C) 2006-2009 OpenWrt.org +# Copyright (C) 2006-2010 OpenWrt.org  #  # This is free software, licensed under the GNU General Public License v2.  # See /LICENSE for more information. @@ -12,7 +12,7 @@ BOARDNAME:=Broadcom/SiByte SB-1  FEATURES:=fpu  CFLAGS:=-Os -pipe -march=sb1 -funit-at-a-time -LINUX_VERSION:=2.6.30.10 +LINUX_VERSION:=2.6.32.8  include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/sibyte/config-default b/target/linux/sibyte/config-default index 7d572d958..22dcb126c 100644 --- a/target/linux/sibyte/config-default +++ b/target/linux/sibyte/config-default @@ -1,5 +1,6 @@  # CONFIG_32BIT is not set  CONFIG_64BIT=y +# CONFIG_AR7 is not set  # CONFIG_ARCH_HAS_ILOG2_U32 is not set  # CONFIG_ARCH_HAS_ILOG2_U64 is not set  CONFIG_ARCH_POPULATES_NODE_MAP=y @@ -8,6 +9,7 @@ CONFIG_ARCH_SUPPORTS_OPROFILE=y  CONFIG_ARCH_SUSPEND_POSSIBLE=y  # CONFIG_ARPD is not set  # CONFIG_BCM47XX is not set +# CONFIG_BCM63XX is not set  # CONFIG_BINARY_PRINTF is not set  CONFIG_BINFMT_ELF32=y  CONFIG_BITREVERSE=y @@ -107,6 +109,7 @@ CONFIG_LOG_BUF_SHIFT=15  # CONFIG_MACH_ALCHEMY is not set  # CONFIG_MACH_DECSTATION is not set  # CONFIG_MACH_JAZZ is not set +# CONFIG_MACH_LOONGSON is not set  # CONFIG_MACH_TX39XX is not set  # CONFIG_MACH_TX49XX is not set  # CONFIG_MACH_VR41XX 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 deleted file mode 100644 index c3208a4f7..000000000 --- a/target/linux/sibyte/patches/001-sibyte_remove_simulation.patch +++ /dev/null @@ -1,37 +0,0 @@ -[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 deleted file mode 100644 index 2c46ccf66..000000000 --- a/target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch +++ /dev/null @@ -1,1070 +0,0 @@ -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,344 +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) { --			/* 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 deleted file mode 100644 index 1c3545f74..000000000 --- a/target/linux/sibyte/patches/100-honuor_config_cmdline.patch +++ /dev/null @@ -1,19 +0,0 @@ -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 - 			 */ -+#ifdef CONFIG_CMDLINE -+			strlcpy(arcs_cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE); -+#else - 			strcpy(arcs_cmdline, "root=/dev/ram0 "); -+#endif - 		} else { - 			/* The loader should have set the command line */ - 			/* too early for panic to do any good */ diff --git a/target/linux/sibyte/patches/102-sbmac_net_device_opts.patch b/target/linux/sibyte/patches/102-sbmac_net_device_opts.patch deleted file mode 100644 index 8171ef367..000000000 --- a/target/linux/sibyte/patches/102-sbmac_net_device_opts.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- a/drivers/net/sb1250-mac.c -+++ b/drivers/net/sb1250-mac.c -@@ -2271,6 +2271,22 @@ static int sb1250_change_mtu(struct net_ - 	return 0; - } -  -+static const struct net_device_ops sbmac_netdev_ops = { -+	.ndo_open		= sbmac_open, -+	.ndo_stop		= sbmac_close, -+	.ndo_start_xmit		= sbmac_start_tx, -+	.ndo_tx_timeout		= sbmac_tx_timeout, -+	.ndo_do_ioctl		= sbmac_mii_ioctl, -+	.ndo_set_multicast_list	= sbmac_set_rx_mode, -+	.ndo_change_mtu		= sb1250_change_mtu, -+	.ndo_validate_addr	= eth_validate_addr, -+	.ndo_set_mac_address	= eth_mac_addr, -+ -+#ifdef CONFIG_NET_POLL_CONTROLLER -+	.ndo_poll_controller	= sbmac_netpoll, -+#endif -+}; -+ - /********************************************************************** -  *  SBMAC_INIT(dev) -  * -@@ -2327,21 +2343,12 @@ static int sbmac_init(struct platform_de -  - 	spin_lock_init(&(sc->sbm_lock)); -  --	dev->open               = sbmac_open; --	dev->hard_start_xmit    = sbmac_start_tx; --	dev->stop               = sbmac_close; --	dev->set_multicast_list = sbmac_set_rx_mode; --	dev->do_ioctl           = sbmac_mii_ioctl; --	dev->tx_timeout         = sbmac_tx_timeout; -+	dev->netdev_ops = &sbmac_netdev_ops; -+ - 	dev->watchdog_timeo     = TX_TIMEOUT; -  - 	netif_napi_add(dev, &sc->napi, sbmac_poll, 16); -  --	dev->change_mtu         = sb1250_change_mtu; --#ifdef CONFIG_NET_POLL_CONTROLLER --	dev->poll_controller = sbmac_netpoll; --#endif -- - 	dev->irq		= UNIT_INT(idx); -  - 	/* This is needed for PASS2 for Rx H/W checksum feature */ diff --git a/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch b/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch index e4bd8bc7e..f789dada9 100644 --- a/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch +++ b/target/linux/sibyte/patches/104-sibyte_rtc_cleanup.patch @@ -1,460 +1,3 @@ ---- a/arch/mips/sibyte/swarm/Makefile -+++ b/arch/mips/sibyte/swarm/Makefile -@@ -1,4 +1,3 @@ --obj-y				:= platform.o setup.o rtc_xicor1241.o \ --				   rtc_m41t81.o -+obj-y				:= platform.o setup.o -  - obj-$(CONFIG_I2C_BOARDINFO)	+= swarm-i2c.o ---- a/arch/mips/sibyte/swarm/rtc_m41t81.c -+++ /dev/null -@@ -1,233 +0,0 @@ --/* -- * Copyright (C) 2000, 2001 Broadcom Corporation -- * -- * Copyright (C) 2002 MontaVista Software Inc. -- * Author: jsun@mvista.com or jsun@junsun.net -- * -- * 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. -- * -- */ --#include <linux/bcd.h> --#include <linux/types.h> --#include <linux/time.h> -- --#include <asm/time.h> --#include <asm/addrspace.h> --#include <asm/io.h> -- --#include <asm/sibyte/sb1250.h> --#include <asm/sibyte/sb1250_regs.h> --#include <asm/sibyte/sb1250_smbus.h> -- -- --/* M41T81 definitions */ -- --/* -- * Register bits -- */ -- --#define M41T81REG_SC_ST		0x80		/* stop bit */ --#define M41T81REG_HR_CB		0x40		/* century bit */ --#define M41T81REG_HR_CEB	0x80		/* century enable bit */ --#define M41T81REG_CTL_S		0x20		/* sign bit */ --#define M41T81REG_CTL_FT	0x40		/* frequency test bit */ --#define M41T81REG_CTL_OUT	0x80		/* output level */ --#define M41T81REG_WD_RB0	0x01		/* watchdog resolution bit 0 */ --#define M41T81REG_WD_RB1	0x02		/* watchdog resolution bit 1 */ --#define M41T81REG_WD_BMB0	0x04		/* watchdog multiplier bit 0 */ --#define M41T81REG_WD_BMB1	0x08		/* watchdog multiplier bit 1 */ --#define M41T81REG_WD_BMB2	0x10		/* watchdog multiplier bit 2 */ --#define M41T81REG_WD_BMB3	0x20		/* watchdog multiplier bit 3 */ --#define M41T81REG_WD_BMB4	0x40		/* watchdog multiplier bit 4 */ --#define M41T81REG_AMO_ABE	0x20		/* alarm in "battery back-up mode" enable bit */ --#define M41T81REG_AMO_SQWE	0x40		/* square wave enable */ --#define M41T81REG_AMO_AFE	0x80		/* alarm flag enable flag */ --#define M41T81REG_ADT_RPT5	0x40		/* alarm repeat mode bit 5 */ --#define M41T81REG_ADT_RPT4	0x80		/* alarm repeat mode bit 4 */ --#define M41T81REG_AHR_RPT3	0x80		/* alarm repeat mode bit 3 */ --#define M41T81REG_AHR_HT	0x40		/* halt update bit */ --#define M41T81REG_AMN_RPT2	0x80		/* alarm repeat mode bit 2 */ --#define M41T81REG_ASC_RPT1	0x80		/* alarm repeat mode bit 1 */ --#define M41T81REG_FLG_AF	0x40		/* alarm flag (read only) */ --#define M41T81REG_FLG_WDF	0x80		/* watchdog flag (read only) */ --#define M41T81REG_SQW_RS0	0x10		/* sqw frequency bit 0 */ --#define M41T81REG_SQW_RS1	0x20		/* sqw frequency bit 1 */ --#define M41T81REG_SQW_RS2	0x40		/* sqw frequency bit 2 */ --#define M41T81REG_SQW_RS3	0x80		/* sqw frequency bit 3 */ -- -- --/* -- * Register numbers -- */ -- --#define M41T81REG_TSC	0x00		/* tenths/hundredths of second */ --#define M41T81REG_SC	0x01		/* seconds */ --#define M41T81REG_MN	0x02		/* minute */ --#define M41T81REG_HR	0x03		/* hour/century */ --#define M41T81REG_DY	0x04		/* day of week */ --#define M41T81REG_DT	0x05		/* date of month */ --#define M41T81REG_MO	0x06		/* month */ --#define M41T81REG_YR	0x07		/* year */ --#define M41T81REG_CTL	0x08		/* control */ --#define M41T81REG_WD	0x09		/* watchdog */ --#define M41T81REG_AMO	0x0A		/* alarm: month */ --#define M41T81REG_ADT	0x0B		/* alarm: date */ --#define M41T81REG_AHR	0x0C		/* alarm: hour */ --#define M41T81REG_AMN	0x0D		/* alarm: minute */ --#define M41T81REG_ASC	0x0E		/* alarm: second */ --#define M41T81REG_FLG	0x0F		/* flags */ --#define M41T81REG_SQW	0x13		/* square wave register */ -- --#define M41T81_CCR_ADDRESS	0x68 -- --#define SMB_CSR(reg)	IOADDR(A_SMB_REGISTER(1, reg)) -- --static int m41t81_read(uint8_t addr) --{ --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	__raw_writeq(addr & 0xff, SMB_CSR(R_SMB_CMD)); --	__raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR1BYTE, --		     SMB_CSR(R_SMB_START)); -- --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	__raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE, --		     SMB_CSR(R_SMB_START)); -- --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) { --		/* Clear error bit by writing a 1 */ --		__raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS)); --		return -1; --	} -- --	return (__raw_readq(SMB_CSR(R_SMB_DATA)) & 0xff); --} -- --static int m41t81_write(uint8_t addr, int b) --{ --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	__raw_writeq(addr & 0xff, SMB_CSR(R_SMB_CMD)); --	__raw_writeq(b & 0xff, SMB_CSR(R_SMB_DATA)); --	__raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR2BYTE, --		     SMB_CSR(R_SMB_START)); -- --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) { --		/* Clear error bit by writing a 1 */ --		__raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS)); --		return -1; --	} -- --	/* read the same byte again to make sure it is written */ --	__raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE, --		     SMB_CSR(R_SMB_START)); -- --	while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --		; -- --	return 0; --} -- --int m41t81_set_time(unsigned long t) --{ --	struct rtc_time tm; --	unsigned long flags; -- --	/* Note we don't care about the century */ --	rtc_time_to_tm(t, &tm); -- --	/* --	 * Note the write order matters as it ensures the correctness. --	 * When we write sec, 10th sec is clear.  It is reasonable to --	 * believe we should finish writing min within a second. --	 */ -- --	spin_lock_irqsave(&rtc_lock, flags); --	tm.tm_sec = bin2bcd(tm.tm_sec); --	m41t81_write(M41T81REG_SC, tm.tm_sec); -- --	tm.tm_min = bin2bcd(tm.tm_min); --	m41t81_write(M41T81REG_MN, tm.tm_min); -- --	tm.tm_hour = bin2bcd(tm.tm_hour); --	tm.tm_hour = (tm.tm_hour & 0x3f) | (m41t81_read(M41T81REG_HR) & 0xc0); --	m41t81_write(M41T81REG_HR, tm.tm_hour); -- --	/* tm_wday starts from 0 to 6 */ --	if (tm.tm_wday == 0) tm.tm_wday = 7; --	tm.tm_wday = bin2bcd(tm.tm_wday); --	m41t81_write(M41T81REG_DY, tm.tm_wday); -- --	tm.tm_mday = bin2bcd(tm.tm_mday); --	m41t81_write(M41T81REG_DT, tm.tm_mday); -- --	/* tm_mon starts from 0, *ick* */ --	tm.tm_mon ++; --	tm.tm_mon = bin2bcd(tm.tm_mon); --	m41t81_write(M41T81REG_MO, tm.tm_mon); -- --	/* we don't do century, everything is beyond 2000 */ --	tm.tm_year %= 100; --	tm.tm_year = bin2bcd(tm.tm_year); --	m41t81_write(M41T81REG_YR, tm.tm_year); --	spin_unlock_irqrestore(&rtc_lock, flags); -- --	return 0; --} -- --unsigned long m41t81_get_time(void) --{ --	unsigned int year, mon, day, hour, min, sec; --	unsigned long flags; -- --	/* --	 * min is valid if two reads of sec are the same. --	 */ --	for (;;) { --		spin_lock_irqsave(&rtc_lock, flags); --		sec = m41t81_read(M41T81REG_SC); --		min = m41t81_read(M41T81REG_MN); --		if (sec == m41t81_read(M41T81REG_SC)) break; --		spin_unlock_irqrestore(&rtc_lock, flags); --	} --	hour = m41t81_read(M41T81REG_HR) & 0x3f; --	day = m41t81_read(M41T81REG_DT); --	mon = m41t81_read(M41T81REG_MO); --	year = m41t81_read(M41T81REG_YR); --	spin_unlock_irqrestore(&rtc_lock, flags); -- --	sec = bcd2bin(sec); --	min = bcd2bin(min); --	hour = bcd2bin(hour); --	day = bcd2bin(day); --	mon = bcd2bin(mon); --	year = bcd2bin(year); -- --	year += 2000; -- --	return mktime(year, mon, day, hour, min, sec); --} -- --int m41t81_probe(void) --{ --	unsigned int tmp; -- --	/* enable chip if it is not enabled yet */ --	tmp = m41t81_read(M41T81REG_SC); --	m41t81_write(M41T81REG_SC, tmp & 0x7f); -- --	return (m41t81_read(M41T81REG_SC) != -1); --} ---- a/arch/mips/sibyte/swarm/rtc_xicor1241.c -+++ /dev/null -@@ -1,210 +0,0 @@ --/* -- * Copyright (C) 2000, 2001 Broadcom Corporation -- * -- * Copyright (C) 2002 MontaVista Software Inc. -- * Author: jsun@mvista.com or jsun@junsun.net -- * -- * 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. -- */ --#include <linux/bcd.h> --#include <linux/types.h> --#include <linux/time.h> -- --#include <asm/time.h> --#include <asm/addrspace.h> --#include <asm/io.h> -- --#include <asm/sibyte/sb1250.h> --#include <asm/sibyte/sb1250_regs.h> --#include <asm/sibyte/sb1250_smbus.h> -- -- --/* Xicor 1241 definitions */ -- --/* -- * Register bits -- */ -- --#define X1241REG_SR_BAT	0x80		/* currently on battery power */ --#define X1241REG_SR_RWEL 0x04		/* r/w latch is enabled, can write RTC */ --#define X1241REG_SR_WEL 0x02		/* r/w latch is unlocked, can enable r/w now */ --#define X1241REG_SR_RTCF 0x01		/* clock failed */ --#define X1241REG_BL_BP2 0x80		/* block protect 2 */ --#define X1241REG_BL_BP1 0x40		/* block protect 1 */ --#define X1241REG_BL_BP0 0x20		/* block protect 0 */ --#define X1241REG_BL_WD1	0x10 --#define X1241REG_BL_WD0	0x08 --#define X1241REG_HR_MIL 0x80		/* military time format */ -- --/* -- * Register numbers -- */ -- --#define X1241REG_BL	0x10		/* block protect bits */ --#define X1241REG_INT	0x11		/*  */ --#define X1241REG_SC	0x30		/* Seconds */ --#define X1241REG_MN	0x31		/* Minutes */ --#define X1241REG_HR	0x32		/* Hours */ --#define X1241REG_DT	0x33		/* Day of month */ --#define X1241REG_MO	0x34		/* Month */ --#define X1241REG_YR	0x35		/* Year */ --#define X1241REG_DW	0x36		/* Day of Week */ --#define X1241REG_Y2K	0x37		/* Year 2K */ --#define X1241REG_SR	0x3F		/* Status register */ -- --#define X1241_CCR_ADDRESS	0x6F -- --#define SMB_CSR(reg)	IOADDR(A_SMB_REGISTER(1, reg)) -- --static int xicor_read(uint8_t addr) --{ --        while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --                ; -- --	__raw_writeq((addr >> 8) & 0x7, SMB_CSR(R_SMB_CMD)); --	__raw_writeq(addr & 0xff, SMB_CSR(R_SMB_DATA)); --	__raw_writeq(V_SMB_ADDR(X1241_CCR_ADDRESS) | V_SMB_TT_WR2BYTE, --		     SMB_CSR(R_SMB_START)); -- --        while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --                ; -- --	__raw_writeq(V_SMB_ADDR(X1241_CCR_ADDRESS) | V_SMB_TT_RD1BYTE, --		     SMB_CSR(R_SMB_START)); -- --        while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --                ; -- --        if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) { --                /* Clear error bit by writing a 1 */ --                __raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS)); --                return -1; --        } -- --	return (__raw_readq(SMB_CSR(R_SMB_DATA)) & 0xff); --} -- --static int xicor_write(uint8_t addr, int b) --{ --        while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --                ; -- --	__raw_writeq(addr, SMB_CSR(R_SMB_CMD)); --	__raw_writeq((addr & 0xff) | ((b & 0xff) << 8), SMB_CSR(R_SMB_DATA)); --	__raw_writeq(V_SMB_ADDR(X1241_CCR_ADDRESS) | V_SMB_TT_WR3BYTE, --		     SMB_CSR(R_SMB_START)); -- --        while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY) --                ; -- --        if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) { --                /* Clear error bit by writing a 1 */ --                __raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS)); --                return -1; --        } else { --		return 0; --	} --} -- --int xicor_set_time(unsigned long t) --{ --	struct rtc_time tm; --	int tmp; --	unsigned long flags; -- --	rtc_time_to_tm(t, &tm); --	tm.tm_year += 1900; -- --	spin_lock_irqsave(&rtc_lock, flags); --	/* unlock writes to the CCR */ --	xicor_write(X1241REG_SR, X1241REG_SR_WEL); --	xicor_write(X1241REG_SR, X1241REG_SR_WEL | X1241REG_SR_RWEL); -- --	/* trivial ones */ --	tm.tm_sec = bin2bcd(tm.tm_sec); --	xicor_write(X1241REG_SC, tm.tm_sec); -- --	tm.tm_min = bin2bcd(tm.tm_min); --	xicor_write(X1241REG_MN, tm.tm_min); -- --	tm.tm_mday = bin2bcd(tm.tm_mday); --	xicor_write(X1241REG_DT, tm.tm_mday); -- --	/* tm_mon starts from 0, *ick* */ --	tm.tm_mon ++; --	tm.tm_mon = bin2bcd(tm.tm_mon); --	xicor_write(X1241REG_MO, tm.tm_mon); -- --	/* year is split */ --	tmp = tm.tm_year / 100; --	tm.tm_year %= 100; --	xicor_write(X1241REG_YR, tm.tm_year); --	xicor_write(X1241REG_Y2K, tmp); -- --	/* hour is the most tricky one */ --	tmp = xicor_read(X1241REG_HR); --	if (tmp & X1241REG_HR_MIL) { --		/* 24 hour format */ --		tm.tm_hour = bin2bcd(tm.tm_hour); --		tmp = (tmp & ~0x3f) | (tm.tm_hour & 0x3f); --	} else { --		/* 12 hour format, with 0x2 for pm */ --		tmp = tmp & ~0x3f; --		if (tm.tm_hour >= 12) { --			tmp |= 0x20; --			tm.tm_hour -= 12; --		} --		tm.tm_hour = bin2bcd(tm.tm_hour); --		tmp |= tm.tm_hour; --	} --	xicor_write(X1241REG_HR, tmp); -- --	xicor_write(X1241REG_SR, 0); --	spin_unlock_irqrestore(&rtc_lock, flags); -- --	return 0; --} -- --unsigned long xicor_get_time(void) --{ --	unsigned int year, mon, day, hour, min, sec, y2k; --	unsigned long flags; -- --	spin_lock_irqsave(&rtc_lock, flags); --	sec = xicor_read(X1241REG_SC); --	min = xicor_read(X1241REG_MN); --	hour = xicor_read(X1241REG_HR); -- --	if (hour & X1241REG_HR_MIL) { --		hour &= 0x3f; --	} else { --		if (hour & 0x20) --			hour = (hour & 0xf) + 0x12; --	} -- --	day = xicor_read(X1241REG_DT); --	mon = xicor_read(X1241REG_MO); --	year = xicor_read(X1241REG_YR); --	y2k = xicor_read(X1241REG_Y2K); --	spin_unlock_irqrestore(&rtc_lock, flags); -- --	sec = bcd2bin(sec); --	min = bcd2bin(min); --	hour = bcd2bin(hour); --	day = bcd2bin(day); --	mon = bcd2bin(mon); --	year = bcd2bin(year); --	y2k = bcd2bin(y2k); -- --	year += (y2k * 100); -- --	return mktime(year, mon, day, hour, min, sec); --} -- --int xicor_probe(void) --{ --	return (xicor_read(X1241REG_SC) != -1); --}  --- a/arch/mips/sibyte/swarm/setup.c  +++ b/arch/mips/sibyte/swarm/setup.c  @@ -56,14 +56,6 @@ extern void sb1250_setup(void); @@ -472,7 +15,7 @@   const char *get_system_type(void)   {   	return "SiByte " SIBYTE_BOARD_NAME; -@@ -79,42 +71,14 @@ int swarm_be_handler(struct pt_regs *reg +@@ -79,49 +71,18 @@ int swarm_be_handler(struct pt_regs *reg   	return (is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL);   } @@ -484,20 +27,27 @@  -  -enum swarm_rtc_type swarm_rtc_type;  - - unsigned long read_persistent_clock(void) + void read_persistent_clock(struct timespec *ts)   { + 	unsigned long sec; +   -	switch (swarm_rtc_type) {  -	case RTC_XICOR: --		return xicor_get_time(); +-		sec = xicor_get_time(); +-		break;  -  -	case RTC_M4LT81: --		return m41t81_get_time(); +-		sec = m41t81_get_time(); +-		break;  -  -	case RTC_NONE:  -	default: --		return mktime(2000, 1, 1, 0, 0, 0); +-		sec = mktime(2000, 1, 1, 0, 0, 0); +-		break;  -	} -+	return mktime(2000, 1, 1, 0, 0, 0); ++	sec = mktime(2000, 1, 1, 0, 0, 0); + 	ts->tv_sec = sec; + 	ts->tv_nsec = 0;   }   int rtc_mips_set_time(unsigned long sec) @@ -511,13 +61,12 @@  -  -	case RTC_NONE:  -	default: --		return -1; + 		return -1;  -	} -+	return -1;   }   void __init plat_mem_setup(void) -@@ -131,11 +95,6 @@ void __init plat_mem_setup(void) +@@ -138,11 +99,6 @@ void __init plat_mem_setup(void)   	board_be_handler = swarm_be_handler; diff --git a/target/linux/sibyte/patches/105-sibyte_hwmon.patch b/target/linux/sibyte/patches/105-sibyte_hwmon.patch index a5657b97b..93dd4230d 100644 --- a/target/linux/sibyte/patches/105-sibyte_hwmon.patch +++ b/target/linux/sibyte/patches/105-sibyte_hwmon.patch @@ -1,6 +1,6 @@  --- a/arch/mips/sibyte/swarm/swarm-i2c.c  +++ b/arch/mips/sibyte/swarm/swarm-i2c.c -@@ -15,6 +15,11 @@ +@@ -13,6 +13,11 @@   #include <linux/init.h>   #include <linux/kernel.h> @@ -12,7 +12,7 @@   static struct i2c_board_info swarm_i2c_info1[] __initdata = {   	{ -@@ -26,6 +31,8 @@ static int __init swarm_i2c_init(void) +@@ -24,6 +29,8 @@ static int __init swarm_i2c_init(void)   {   	int err; diff --git a/target/linux/sibyte/patches/106-no_module_reloc.patch b/target/linux/sibyte/patches/106-no_module_reloc.patch index 449bda756..20b707e25 100644 --- a/target/linux/sibyte/patches/106-no_module_reloc.patch +++ b/target/linux/sibyte/patches/106-no_module_reloc.patch @@ -1,7 +1,6 @@ -diff -urN linux-2.6.30.10/arch/mips/Makefile linux-2.6.30.10.new//arch/mips/Makefile ---- linux-2.6.30.10/arch/mips/Makefile	2010-01-29 16:12:01.000000000 +0100 -+++ linux-2.6.30.10.new//arch/mips/Makefile	2009-12-04 07:00:07.000000000 +0100 -@@ -83,7 +83,7 @@ +--- a/arch/mips/Makefile ++++ b/arch/mips/Makefile +@@ -83,7 +83,7 @@ all-$(CONFIG_BOOT_ELF64)	:= $(vmlinux-64   cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe   cflags-y			+= -msoft-float   LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib @@ -10,10 +9,9 @@ diff -urN linux-2.6.30.10/arch/mips/Makefile linux-2.6.30.10.new//arch/mips/Make   cflags-y += -ffreestanding -diff -urN linux-2.6.30.10/arch/mips/include/asm/module.h linux-2.6.30.10.new//arch/mips/include/asm/module.h ---- linux-2.6.30.10/arch/mips/include/asm/module.h	2010-01-29 16:12:01.000000000 +0100 -+++ linux-2.6.30.10.new//arch/mips/include/asm/module.h	2009-12-04 07:00:07.000000000 +0100 -@@ -9,11 +9,6 @@ +--- a/arch/mips/include/asm/module.h ++++ b/arch/mips/include/asm/module.h +@@ -9,11 +9,6 @@ struct mod_arch_specific {   	struct list_head dbe_list;   	const struct exception_table_entry *dbe_start;   	const struct exception_table_entry *dbe_end; @@ -25,10 +23,9 @@ diff -urN linux-2.6.30.10/arch/mips/include/asm/module.h linux-2.6.30.10.new//ar   };   typedef uint8_t Elf64_Byte;		/* Type for a 8-bit quantity.  */ -diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mips/kernel/module.c ---- linux-2.6.30.10/arch/mips/kernel/module.c	2010-01-29 16:12:01.000000000 +0100 -+++ linux-2.6.30.10.new//arch/mips/kernel/module.c	2009-12-04 07:00:07.000000000 +0100 -@@ -43,116 +43,6 @@ +--- a/arch/mips/kernel/module.c ++++ b/arch/mips/kernel/module.c +@@ -43,117 +43,6 @@ static struct mips_hi16 *mips_hi16_list;   static LIST_HEAD(dbe_list);   static DEFINE_SPINLOCK(dbe_lock); @@ -142,10 +139,11 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  -		__free_page(page);  -}  - +-   void *module_alloc(unsigned long size)   {   #ifdef MODULE_START -@@ -168,101 +58,23 @@ +@@ -169,99 +58,21 @@ void *module_alloc(unsigned long size)   	return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);   #else @@ -189,11 +187,8 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  -	} else {  -		vfree(module_region);  -	} -+	vfree(module_region); - 	/* FIXME: If module_region == mod->init_region, trim exception -            table entries. */ - } -  +-} +-  -static void *__module_alloc(int size, bool phys)  -{  -	void *ptr; @@ -211,8 +206,9 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  -		kfree(ptr);  -	else  -		vfree(ptr); --} -- ++	vfree(module_region); + } +    int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,   			      char *secstrings, struct module *mod)   { @@ -249,7 +245,7 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi   	return 0;   } -@@ -285,37 +97,27 @@ +@@ -284,36 +95,28 @@ static int apply_r_mips_32_rela(struct m   	return 0;   } @@ -258,7 +254,6 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  +static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)   {  -	unsigned *tramp = start + *plt_offset; --  -	*plt_offset += 4 * sizeof(int);  -  -	/* adjust carry for addiu */ @@ -270,7 +265,8 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  -	tramp[2] = 0x03200008;                  /* jr t9 */  -	tramp[3] = 0x00000000;                  /* nop */  +	if (v % 4) { -+		printk(KERN_ERR "module %s: dangerous relocation\n", me->name); ++		pr_err("module %s: dangerous R_MIPS_26 REL relocation\n", ++		       me->name);  +		return -ENOEXEC;  +	} @@ -301,8 +297,8 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi  +static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)   {   	if (v % 4) { - 		printk(KERN_ERR "module %s: dangerous relocation\n", me->name); -@@ -323,31 +125,17 @@ + 		pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n", +@@ -322,31 +125,17 @@ static int set_r_mips_26(struct module *   	}   	if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { @@ -337,7 +333,7 @@ diff -urN linux-2.6.30.10/arch/mips/kernel/module.c linux-2.6.30.10.new//arch/mi   static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)   {   	struct mips_hi16 *n; -@@ -612,32 +400,11 @@ +@@ -611,32 +400,11 @@ int module_finalize(const Elf_Ehdr *hdr,   		list_add(&me->arch.dbe_list, &dbe_list);   		spin_unlock_irq(&dbe_lock);   	} | 
