From 1e470c10f3af3503154c271dbd8ba6109a5c5fd0 Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Mon, 15 Jun 2009 07:11:22 +0000 Subject: [PATCH] sibyte cleanups SVN-Revision: 16470 --- target/linux/sibyte/base-files/etc/inittab | 3 +- target/linux/sibyte/config-default | 6 +- .../001-sibyte_remove_simulation.patch | 37 + ...002-sibyte_remove_standalone_support.patch | 1076 +++++++++++++++++ .../patches/100-honuor_config_cmdline.patch | 9 +- .../patches/104-sibyte_rtc_cleanup.patch | 6 +- .../sibyte/patches/105-sibyte_hwmon.patch | 23 + 7 files changed, 1150 insertions(+), 10 deletions(-) create mode 100644 target/linux/sibyte/patches/001-sibyte_remove_simulation.patch create mode 100644 target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch create mode 100644 target/linux/sibyte/patches/105-sibyte_hwmon.patch diff --git a/target/linux/sibyte/base-files/etc/inittab b/target/linux/sibyte/base-files/etc/inittab index 4409b3974d..fa7937df42 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 36aa3d1391..6f8e4e57e4 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 0000000000..c3208a4f7a --- /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 + +--- 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 0000000000..e9d63113fd --- /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 + +--- 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 +-#include +-#include +- +-#include +- +-#include +-#include +- +-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 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 "@" +- * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++/* 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 "@" ++ * 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 ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++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 +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +- +-#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 b2af916442..1c3545f74f 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 + +--- 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 ca755f3e28..e4bd8bc7e7 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 0000000000..a5657b97b9 --- /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 + #include + ++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)