summaryrefslogtreecommitdiffstats
path: root/target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch')
-rw-r--r--target/linux/sibyte/patches/002-sibyte_remove_standalone_support.patch1070
1 files changed, 0 insertions, 1070 deletions
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 */