rpms/kernel/devel linux-2.6-cell-idle-pmgt.patch, NONE, 1.1 linux-2.6-cell-mambo-drivers.patch, NONE, 1.1 linux-2.6-cell-no-legacy-io.patch, NONE, 1.1 linux-2.6-cell-nvram-kmalloc.patch, NONE, 1.1 linux-2.6-cell-platform-detect.patch, NONE, 1.1 linux-2.6-cell-spidernet.patch, NONE, 1.1 linux-2.6-cell-spiderpic-no-devtree.patch, NONE, 1.1 linux-2.6-hvc-console.patch, NONE, 1.1 linux-2.6-hvc-rtas-console.patch, NONE, 1.1 linux-2.6-ppc-rtas-check.patch, NONE, 1.1 kernel-2.6.spec, 1.1748, 1.1749 linux-2.6.15-cell-bogus-console-fix.patch, 1.3, NONE linux-2.6.15-ppc-cell-basics.patch, 1.1, NONE linux-2.6.15-rc1-ppc-vdso-2.patch, 1.1, NONE

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Thu Dec 8 22:50:09 UTC 2005


Author: dwmw2

Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv4053

Modified Files:
	kernel-2.6.spec 
Added Files:
	linux-2.6-cell-idle-pmgt.patch 
	linux-2.6-cell-mambo-drivers.patch 
	linux-2.6-cell-no-legacy-io.patch 
	linux-2.6-cell-nvram-kmalloc.patch 
	linux-2.6-cell-platform-detect.patch 
	linux-2.6-cell-spidernet.patch 
	linux-2.6-cell-spiderpic-no-devtree.patch 
	linux-2.6-hvc-console.patch linux-2.6-hvc-rtas-console.patch 
	linux-2.6-ppc-rtas-check.patch 
Removed Files:
	linux-2.6.15-cell-bogus-console-fix.patch 
	linux-2.6.15-ppc-cell-basics.patch 
	linux-2.6.15-rc1-ppc-vdso-2.patch 
Log Message:
make it run on Cell hardware, patches split up as they should go upstream

linux-2.6-cell-idle-pmgt.patch:
 arch/powerpc/kernel/head_64.S           |   27 +++++
 arch/powerpc/kernel/idle_64.c           |    3 
 arch/powerpc/platforms/cell/Makefile    |    2 
 arch/powerpc/platforms/cell/pervasive.c |  147 ++++++++++++++++++++++++++++++++
 arch/powerpc/platforms/cell/pervasive.h |   64 +++++++++++++
 arch/powerpc/platforms/cell/setup.c     |    2 
 include/asm-powerpc/cputable.h          |    4 
 include/asm-powerpc/processor.h         |    8 +
 include/asm-powerpc/reg.h               |   16 ++-
 9 files changed, 267 insertions(+), 6 deletions(-)

--- NEW FILE linux-2.6-cell-idle-pmgt.patch ---
Subject: cell: enable pause(0) in cpu_idle

This patch enables support for pause(0) power management state
for the Cell Broadband Processor, which is import for power efficient
operation. The pervasive infrastructure will in the future enable
us to introduce more functionality specific to the Cell's
pervasive unit.

From: Maximino Aguilar <maguilar at us.ibm.com>
Signed-off-by: Arnd Bergmann <arndb at de.ibm.com>

Index: linux-2.6.15-rc/arch/powerpc/platforms/cell/Makefile
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/platforms/cell/Makefile
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/Makefile
@@ -1,4 +1,6 @@
 obj-y			+= interrupt.o iommu.o setup.o spider-pic.o
+obj-y			+= pervasive.o
+
 obj-$(CONFIG_SMP)	+= smp.o
 obj-$(CONFIG_SPU_FS)	+= spufs/ spu_base.o
 builtin-spufs-$(CONFIG_SPU_FS)	+= spu_syscalls.o
Index: linux-2.6.15-rc/arch/powerpc/platforms/cell/pervasive.c
===================================================================
--- /dev/null
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/pervasive.c
@@ -0,0 +1,147 @@
+/*
+ * CBE Pervasive Monitor and Debug
+ *
+ * (C) Copyright IBM Corporation 2005
+ *
+ * Authors: Maximino Aguilar (maguilar at us.ibm.com)
+ *          Michael N. Day (mnday at us.ibm.com)
+ *
+ * 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/config.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/percpu.h>
+#include <linux/types.h>
+
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/pgtable.h>
+#include <asm/reg.h>
+
+#include "pervasive.h"
+
+struct pmd {
+	struct pmd_regs __iomem *regs;
+	int power_management_enable;
+};
+
+static DEFINE_PER_CPU(struct pmd, pmd);
+
+void pause_zero(void)
+{
+	unsigned int multi_threading_control;
+	unsigned long long machine_state;
+
+	/* Reset Thread Run Latch (latch is set in idle.c) */
+	ppc64_runlatch_off();
+
+	if (__get_cpu_var(pmd).power_management_enable)
+	{
+		/* Disable EE during check for pause */
+		machine_state=mfmsr();
+		machine_state &= ~MSR_EE;
+		mtmsrd(machine_state);
+		/* Pause the PU */
+		HMT_low();
+		multi_threading_control = 0;
+		mtspr(SPRN_CTRLT,multi_threading_control);
+
+		/* Re-enable EE after resuming */
+		machine_state=mfmsr();
+		machine_state |= MSR_EE;
+		mtmsrd(machine_state);
+	}
+}
+
+void enable_pause_zero(void * data)
+{
+	unsigned long thread_switch_control;
+	unsigned long temp_register;
+	struct pmd *pmd;
+
+	pmd = &get_cpu_var(pmd);
+
+	if (!pmd->regs)
+		return;
+
+	pr_debug("Power Management: CPU %d\n", smp_processor_id());
+
+	 /* Enable Pause(0) control bit */
+	temp_register = in_be64(&pmd->regs->pm_control);
+
+	out_be64(&pmd->regs->pm_control, temp_register|PMD_PAUSE_ZERO_CONTROL);
+
+	/* Enable DEC and EE interrupt request */
+	thread_switch_control  = mfspr(SPRN_TSC_CELL);
+	thread_switch_control |= TSCR_EE_ENABLE | TSCR_EE_BOOST;
+
+	if (smp_processor_id()%2)
+		thread_switch_control |= TSC_DEC_ENABLE_1;
+	else
+		thread_switch_control |= TSC_DEC_ENABLE_0;
+
+	mtspr(SPRN_TSC_CELL, thread_switch_control);
+
+	pmd->power_management_enable = 1;
+	put_cpu_var(pmd);
+}
+
+static struct pmd_regs __iomem *find_pmd_mmio(int cpu)
+{
+	struct device_node *node;
+	int node_number = cpu / 2;
+	struct pmd_regs __iomem *pmd_mmio_area;
+	unsigned long real_address;
+
+	for (node = of_find_node_by_type(NULL, "cpu"); node;
+		node = of_find_node_by_type(node, "cpu")) {
+			if (node_number == *(int *)get_property(node, "node-id", NULL))
+			break;
+	}
+
+	if (!node) {
+		printk(KERN_WARNING "PMD: CPU %d not found\n", cpu);
+		pmd_mmio_area = NULL;
+	} else {
+		real_address = *(long *)get_property(node, "pervasive", NULL);
+		pr_debug("PMD for CPU %d at %lx\n", cpu, real_address);
+		pmd_mmio_area = __ioremap(real_address, 0x1000, _PAGE_NO_CACHE);
+	}
+	return pmd_mmio_area;
+}
+
+void __init cell_pervasive_init(void)
+{
+	struct pmd *pmd;
+	int cpu;
+
+	if (!cpu_has_feature(CPU_FTR_PAUSE_ZERO) && __onsim())
+		return;
+
+	for_each_cpu(cpu) {
+		pmd = &per_cpu(pmd, cpu);
+		pmd->regs = find_pmd_mmio(cpu);
+	}
+}
+
+int __init enable_pause_zero_init(void)
+{
+	on_each_cpu(enable_pause_zero, NULL, 0, 1);
+	return 0;
+}
+
+arch_initcall(enable_pause_zero_init);
Index: linux-2.6.15-rc/arch/powerpc/platforms/cell/pervasive.h
===================================================================
--- /dev/null
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/pervasive.h
@@ -0,0 +1,64 @@
+/*
+ * Cell Pervasive Monitor and Debug interface and HW structures
+ *
+ * (C) Copyright IBM Corporation 2005
+ *
+ * Authors: Maximino Aguilar (maguilar at us.ibm.com)
+ *          David J. Erb (djerb at us.ibm.com)
+ *
+ * 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef PERVASIVE_H
+#define PERVASIVE_H
+
+struct pmd_regs {
+	u8 pad_0x0000_0x0800[0x0800 - 0x0000];			/* 0x0000 */
+
+	/* Thermal Sensor Registers */
+	u64  ts_ctsr1;						/* 0x0800 */
+	u64  ts_ctsr2;						/* 0x0808 */
+	u64  ts_mtsr1;						/* 0x0810 */
+	u64  ts_mtsr2;						/* 0x0818 */
+	u64  ts_itr1;						/* 0x0820 */
+	u64  ts_itr2;						/* 0x0828 */
+	u64  ts_gitr;						/* 0x0830 */
+	u64  ts_isr;						/* 0x0838 */
+	u64  ts_imr;						/* 0x0840 */
+	u64  tm_cr1;						/* 0x0848 */
+	u64  tm_cr2;						/* 0x0850 */
+	u64  tm_simr;						/* 0x0858 */
+	u64  tm_tpr;						/* 0x0860 */
+	u64  tm_str1;						/* 0x0868 */
+	u64  tm_str2;						/* 0x0870 */
+	u64  tm_tsr;						/* 0x0878 */
+
+	/* Power Management */
+	u64  pm_control;					/* 0x0880 */
+#define PMD_PAUSE_ZERO_CONTROL		0x10000
+	u64  pm_status;						/* 0x0888 */
+
+	/* Time Base Register */
+	u64  tbr;						/* 0x0890 */
+
+	u8   pad_0x0898_0x1000 [0x1000 - 0x0898];		/* 0x0898 */
+};
+
+void __init cell_pervasive_init(void);
+void enable_pause_zero(void *);
+void _pause_zero(void);
+
+#endif
Index: linux-2.6.15-rc/arch/powerpc/platforms/cell/setup.c
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/platforms/cell/setup.c
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/setup.c
@@ -49,6 +49,7 @@
 
 #include "interrupt.h"
 #include "iommu.h"
+#include "pervasive.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -165,6 +166,7 @@ static void __init cell_setup_arch(void)
 	init_pci_config_tokens();
 	find_and_init_phbs();
 	spider_init_IRQ();
+	cell_pervasive_init();
 #ifdef CONFIG_DUMMY_CONSOLE
 	conswitchp = &dummy_con;
 #endif
Index: linux-2.6.15-rc/arch/powerpc/kernel/head_64.S
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/kernel/head_64.S
+++ linux-2.6.15-rc/arch/powerpc/kernel/head_64.S
@@ -383,7 +383,7 @@ label##_common:						\
 	.globl __start_interrupts
 __start_interrupts:
 
-	STD_EXCEPTION_PSERIES(0x100, system_reset)
+	STD_EXCEPTION_PSERIES(0x100, system_reset_check)
 
 	. = 0x200
 _machine_check_pSeries:
@@ -860,6 +860,31 @@ unrecov_fer:
 	bl	.unrecoverable_exception
 	b	1b
 
+/* This is a new system reset handler for the BE processor.
+ * SRR1 stores wake information that must be decoded to determine why
+ * the processor was at the system reset handler.
+ */
+
+	.align 7
+	.globl system_reset_check_common
+system_reset_check_common:
+BEGIN_FTR_SECTION
+	mr	r22,r12    /* r12 has SRR1 saved */
+	srwi	r22,r22,16
+	andi.	r22,r22,MSR_WAKEMASK
+	cmpwi	r22,MSR_WAKEEE
+	beq	40f
+	cmpwi	r22,MSR_WAKEDEC
+	beq	42f
+	cmpwi	r22,MSR_WAKEMT
+	beq	43f
+END_FTR_SECTION_IFSET(CPU_FTR_PAUSE_ZERO)
+	b	system_reset_common
+40:	b	hardware_interrupt_common
+42:	b	decrementer_common
+43: 	EXCEPTION_PROLOG_COMMON(0x100, PACA_EXGEN);
+	b	fast_exception_return
+
 /*
  * Here r13 points to the paca, r9 contains the saved CR,
  * SRR0 and SRR1 are saved in r11 and r12,
Index: linux-2.6.15-rc/arch/powerpc/kernel/idle_64.c
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/kernel/idle_64.c
+++ linux-2.6.15-rc/arch/powerpc/kernel/idle_64.c
@@ -40,7 +40,8 @@ void default_idle(void)
 		if (!need_resched()) {
 			while (!need_resched() && !cpu_is_offline(cpu)) {
 				ppc64_runlatch_off();
-
+				if (cpu_has_feature(CPU_FTR_PAUSE_ZERO))
+					pause_zero();
 				/*
 				 * Go into low thread priority and possibly
 				 * low power mode.
Index: linux-2.6.15-rc/include/asm-powerpc/cputable.h
===================================================================
--- linux-2.6.15-rc.orig/include/asm-powerpc/cputable.h
+++ linux-2.6.15-rc/include/asm-powerpc/cputable.h
@@ -106,6 +106,7 @@ extern void do_cpu_ftr_fixups(unsigned l
 #define CPU_FTR_LOCKLESS_TLBIE		ASM_CONST(0x0000040000000000)
 #define CPU_FTR_MMCRA_SIHV		ASM_CONST(0x0000080000000000)
 #define CPU_FTR_CI_LARGE_PAGE		ASM_CONST(0x0000100000000000)
+#define CPU_FTR_PAUSE_ZERO		ASM_CONST(0x0000200000000000)
 #else
 /* ensure on 32b processors the flags are available for compiling but
  * don't do anything */
@@ -305,7 +306,8 @@ enum {
 	    CPU_FTR_MMCRA_SIHV,
 	CPU_FTRS_CELL = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
 	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 |
-	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT,
+	    CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT |
+	    CPU_FTR_CTRL | CPU_FTR_PAUSE_ZERO,
 	CPU_FTRS_COMPATIBLE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
 	    CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2,
 #endif
Index: linux-2.6.15-rc/include/asm-powerpc/processor.h
===================================================================
--- linux-2.6.15-rc.orig/include/asm-powerpc/processor.h
+++ linux-2.6.15-rc/include/asm-powerpc/processor.h
@@ -281,6 +281,14 @@ static inline void prefetchw(const void 
 #define HAVE_ARCH_PICK_MMAP_LAYOUT
 #endif
 
+#ifdef CONFIG_PPC_CELL
+extern void pause_zero(void);
+#else
+static inline void pause_zero(void)
+{
+}
+#endif
+
 #endif /* __KERNEL__ */
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_POWERPC_PROCESSOR_H */
Index: linux-2.6.15-rc/include/asm-powerpc/reg.h
===================================================================
--- linux-2.6.15-rc.orig/include/asm-powerpc/reg.h
+++ linux-2.6.15-rc/include/asm-powerpc/reg.h
@@ -92,6 +92,15 @@
 #define MSR_RI		__MASK(MSR_RI_LG)	/* Recoverable Exception */
 #define MSR_LE		__MASK(MSR_LE_LG)	/* Little Endian */
 
+/* Wake Events */
+#define MSR_WAKEMASK	0x0038
+#define MSR_WAKERESET	0x0038
+#define MSR_WAKESYSERR	0x0030
+#define MSR_WAKEEE	0x0020
+#define MSR_WAKEMT	0x0028
+#define MSR_WAKEDEC	0x0018
+#define MSR_WAKETHERM	0x0010
+
 #ifdef CONFIG_PPC64
 #define MSR_		MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF
 #define MSR_KERNEL      MSR_ | MSR_SF | MSR_HV
@@ -257,9 +266,10 @@
 #define	SPRN_HID6	0x3F9	/* BE HID 6 */
 #define	  HID6_LB	(0x0F<<12) /* Concurrent Large Page Modes */
 #define	  HID6_DLP	(1<<20)	/* Disable all large page modes (4K only) */
-#define	SPRN_TSCR	0x399   /* Thread switch control on BE */
-#define	SPRN_TTR	0x39A   /* Thread switch timeout on BE */
-#define	  TSCR_DEC_ENABLE	0x200000 /* Decrementer Interrupt */
+#define	SPRN_TSC_CELL	0x399	/* Thread switch control on Cell */
+#define	SPRN_TTR	0x39A	/* Thread switch timeout on Cell */
+#define	  TSC_DEC_ENABLE_0	0x400000 /* Decrementer Interrupt */
+#define	  TSC_DEC_ENABLE_1	0x200000 /* Decrementer Interrupt */
 #define	  TSCR_EE_ENABLE	0x100000 /* External Interrupt */
 #define	  TSCR_EE_BOOST		0x080000 /* External Interrupt Boost */
 #define	SPRN_TSC 	0x3FD	/* Thread switch control on others */

linux-2.6-cell-mambo-drivers.patch:
 arch/powerpc/Kconfig                |   21 +
 arch/powerpc/platforms/cell/iommu.c |    6 
 b/drivers/block/mambo_bd.c          |  288 ++++++++++++++++++++++++++
 b/drivers/net/mambonet.c            |  392 ++++++++++++++++++++++++++++++++++++
 b/include/asm-powerpc/systemsim.h   |  130 +++++++++++
 drivers/block/Makefile              |    1 
 drivers/net/Makefile                |    1 
 include/asm-powerpc/processor.h     |   17 +
 include/linux/root_dev.h            |    3 
 9 files changed, 858 insertions(+), 1 deletion(-)

--- NEW FILE linux-2.6-cell-mambo-drivers.patch ---
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -332,6 +332,27 @@ config PPC_OF
 	depends on PPC_MULTIPLATFORM	# for now
 	default y
 
+# Systemsim configuration
+config MAMBO
+        bool "  IBM Full System Simulator (systemsim) support"
+        default n
+        ---help---
+           Support booting resulting image under IBMs Full System Simulator.
+config MAMBO_DISK
+        depends on MAMBO
+        tristate "    IBM Full System Simulator Bogus Disk Support"
+        default y
+        ---help---
+           Provides quick access to disk images in the simulator without
+           simulating a full IDE or SCSI device.
+config MAMBO_NET
+        depends on MAMBO
+        tristate "    IBM Full System Simulator Bogus Network Support"
+        default y
+        ---help---
+           Provides quick access to a raw ethernet device in the simulator
+           without simulating any specific network device hardware.
+
 config XICS
 	depends on PPC_PSERIES
 	bool
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_BLK_DEV_UMEM)	+= umem.o
 obj-$(CONFIG_BLK_DEV_NBD)	+= nbd.o
 obj-$(CONFIG_BLK_DEV_CRYPTOLOOP) += cryptoloop.o
 
+obj-$(CONFIG_MAMBO_DISK)	+= mambo_bd.o
 obj-$(CONFIG_VIODASD)		+= viodasd.o
 obj-$(CONFIG_BLK_DEV_SX8)	+= sx8.o
 obj-$(CONFIG_BLK_DEV_UB)	+= ub.o
--- /dev/null
+++ b/drivers/block/mambo_bd.c
@@ -0,0 +1,288 @@
+/*
+ *  Bogus Block Driver for PowerPC Full System Simulator
+ *
+ *  (C) Copyright IBM Corporation 2003-2005
+ *
+ *  Bogus Disk Driver
+ *
+ *  Author: Eric Van Hensbegren <ericvh at gmail.com>
+ *
+ *    inspired by drivers/block/nbd.c
+ *    written by Pavel Machek and Steven Whitehouse
+ *
+ *  Some code is from the IBM Full System Simulator Group in ARL
+ *  Author: PAtrick Bohrer <IBM Austin Research Lab>
+ *
+ * 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, 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:
+ * Free Software Foundation
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02111-1301  USA
+ *
+ */
+
+#include <linux/major.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <linux/errno.h>
+#include <linux/file.h>
+#include <linux/ioctl.h>
+#include <linux/blkdev.h>
+#include <net/sock.h>
+
+#include <asm/systemsim.h>
+
+#include <linux/devfs_fs_kernel.h>
+
+#include <asm/uaccess.h>
+#include <asm/types.h>
+
+#define MAJOR_NR 112
+#define MAX_MBD 128
+
+#define MBD_SET_BLKSIZE _IO( 0xab, 1 )
+#define MBD_SET_SIZE    _IO( 0xab, 2 )
+#define MBD_SET_SIZE_BLOCKS     _IO( 0xab, 7 )
+#define MBD_DISCONNECT  _IO( 0xab, 8 )
+
+struct mbd_device {
+	int initialized;
+	int refcnt;
+	int flags;
+	struct gendisk *disk;
+};
+
+static struct mbd_device mbd_dev[MAX_MBD];
+
+#define BD_INFO_SYNC   0
+#define BD_INFO_STATUS 1
+#define BD_INFO_BLKSZ  2
+#define BD_INFO_DEVSZ  3
+#define BD_INFO_CHANGE 4
+
+#define BOGUS_DISK_READ  116
+#define BOGUS_DISK_WRITE 117
+#define BOGUS_DISK_INFO  118
+
+static inline int
+MamboBogusDiskRead(int devno, void *buf, ulong sect, ulong nrsect)
+{
+	return callthru3(BOGUS_DISK_READ, (unsigned long)buf,
+			 (unsigned long)sect,
+			 (unsigned long)((nrsect << 16) | devno));
+}
+
+static inline int
+MamboBogusDiskWrite(int devno, void *buf, ulong sect, ulong nrsect)
+{
+	return callthru3(BOGUS_DISK_WRITE, (unsigned long)buf,
+			 (unsigned long)sect,
+			 (unsigned long)((nrsect << 16) | devno));
+}
+
+static inline int MamboBogusDiskInfo(int op, int devno)
+{
+	return callthru2(BOGUS_DISK_INFO, (unsigned long)op,
+			 (unsigned long)devno);
+}
+
+static int mbd_init_disk(int devno)
+{
+	struct gendisk *disk = mbd_dev[devno].disk;
+	unsigned int sz;
+
+	/* check disk configured */
+	if (!MamboBogusDiskInfo(BD_INFO_STATUS, devno)) {
+		printk(KERN_ERR
+		       "Attempting to open bogus disk before initializaiton\n");
+		return 0;
+	}
+
+	mbd_dev[devno].initialized++;
+
+	sz = MamboBogusDiskInfo(BD_INFO_DEVSZ, devno);
+
+	if (sz == -1)
+		return 0;
+
+	printk("Initializing disk %d with devsz %u\n", devno, sz);
+
+	set_capacity(disk, sz << 1);
+
+	return 1;
+}
+
+static void do_mbd_request(request_queue_t * q)
+{
+	int result = 0;
+	struct request *req;
+
+	while ((req = elv_next_request(q)) != NULL) {
+		int minor = req->rq_disk->first_minor;
+
+		switch (rq_data_dir(req)) {
+		case READ:
+			result = MamboBogusDiskRead(minor,
+						    req->buffer, req->sector,
+						    req->current_nr_sectors);
+			break;
+		case WRITE:
+			result = MamboBogusDiskWrite(minor,
+						     req->buffer, req->sector,
+						     req->current_nr_sectors);
+		};
+
+		if (result)
+			end_request(req, 0);	/* failure */
+		else
+			end_request(req, 1);	/* success */
+	}
+}
+
+static int mbd_release(struct inode *inode, struct file *file)
+{
+	struct mbd_device *lo;
+	int dev;
+
+	if (!inode)
+		return -ENODEV;
+	dev = inode->i_bdev->bd_disk->first_minor;
+	if (dev >= MAX_MBD)
+		return -ENODEV;
+	if (MamboBogusDiskInfo(BD_INFO_SYNC, dev) < 0) {
+		printk(KERN_ALERT "mbd_release: unable to sync\n");
+	}
+	lo = &mbd_dev[dev];
+	if (lo->refcnt <= 0)
+		printk(KERN_ALERT "mbd_release: refcount(%d) <= 0\n",
+		       lo->refcnt);
+	lo->refcnt--;
+	return 0;
+}
+
+static int mbd_revalidate(struct gendisk *disk)
+{
+	int devno = disk->first_minor;
+
+	mbd_init_disk(devno);
+
+	return 0;
+}
+
+static int mbd_open(struct inode *inode, struct file *file)
+{
+	int dev;
+
+	if (!inode)
+		return -EINVAL;
+	dev = inode->i_bdev->bd_disk->first_minor;
+	if (dev >= MAX_MBD)
+		return -ENODEV;
+
+	check_disk_change(inode->i_bdev);
+
+	if (!mbd_dev[dev].initialized)
+		if (!mbd_init_disk(dev))
+			return -ENODEV;
+
+	mbd_dev[dev].refcnt++;
+	return 0;
+}
+
+static struct block_device_operations mbd_fops = {
+      owner:THIS_MODULE,
+      open:mbd_open,
+      release:mbd_release,
+	/* media_changed:      mbd_check_change, */
+      revalidate_disk:mbd_revalidate,
+};
+
+static spinlock_t mbd_lock = SPIN_LOCK_UNLOCKED;
+
+static int __init mbd_init(void)
+{
+	int err = -ENOMEM;
+	int i;
+
+	for (i = 0; i < MAX_MBD; i++) {
+		struct gendisk *disk = alloc_disk(1);
+		if (!disk)
+			goto out;
+		mbd_dev[i].disk = disk;
+		/*
+		 * The new linux 2.5 block layer implementation requires
+		 * every gendisk to have its very own request_queue struct.
+		 * These structs are big so we dynamically allocate them.
+		 */
+		disk->queue = blk_init_queue(do_mbd_request, &mbd_lock);
+		if (!disk->queue) {
+			put_disk(disk);
+			goto out;
+		}
+	}
+
+	if (register_blkdev(MAJOR_NR, "mbd")) {
+		err = -EIO;
+		goto out;
+	}
+#ifdef MODULE
+	printk("mambo bogus disk: registered device at major %d\n", MAJOR_NR);
+#else
+	printk("mambo bogus disk: compiled in with kernel\n");
+#endif
+
+	devfs_mk_dir("mambobd");
+	for (i = 0; i < MAX_MBD; i++) {	/* load defaults */
+		struct gendisk *disk = mbd_dev[i].disk;
+		mbd_dev[i].initialized = 0;
+		mbd_dev[i].refcnt = 0;
+		mbd_dev[i].flags = 0;
+		disk->major = MAJOR_NR;
+		disk->first_minor = i;
+		disk->fops = &mbd_fops;
+		disk->private_data = &mbd_dev[i];
+		sprintf(disk->disk_name, "mambobd%d", i);
+		sprintf(disk->devfs_name, "mambobd%d", i);
+		set_capacity(disk, 0x7ffffc00ULL << 1);	/* 2 TB */
+		add_disk(disk);
+	}
+
+	return 0;
+      out:
+	while (i--) {
+		if (mbd_dev[i].disk->queue)
+			blk_cleanup_queue(mbd_dev[i].disk->queue);
+		put_disk(mbd_dev[i].disk);
+	}
+	return -EIO;
+}
+
+static void __exit mbd_cleanup(void)
+{
+	devfs_remove("mambobd");
+
+	if (unregister_blkdev(MAJOR_NR, "mbd") != 0)
+		printk("mbd: cleanup_module failed\n");
+	else
+		printk("mbd: module cleaned up.\n");
+}
+
+module_init(mbd_init);
+module_exit(mbd_cleanup);
+
+MODULE_DESCRIPTION("Mambo Block Device");
+MODULE_LICENSE("GPL");
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -140,6 +140,7 @@ obj-$(CONFIG_EL3) += 3c509.o
 obj-$(CONFIG_3C515) += 3c515.o
 obj-$(CONFIG_EEXPRESS) += eexpress.o
 obj-$(CONFIG_EEXPRESS_PRO) += eepro.o
+obj-$(CONFIG_MAMBO_NET) += mambonet.o
 obj-$(CONFIG_8139CP) += 8139cp.o
 obj-$(CONFIG_8139TOO) += 8139too.o
 obj-$(CONFIG_ZNET) += znet.o
--- /dev/null
+++ b/drivers/net/mambonet.c
@@ -0,0 +1,392 @@
+/*
+ *  Bogus Network Driver for PowerPC Full System Simulator
+ *
+ *  (C) Copyright IBM Corporation 2003-2005
+ *
+ *  Bogus Network Driver
+ * 
+ *  Author: JimiX <jimix at watson.ibm.com>
+ *  Maintained By: Eric Van Hensbergen <ericvh at gmail.com>
+ *
+ * 	inspired by drivers/net/ibmveth.c
+ *	written by Dave Larson 
+ *
+ *  Some code is from the IBM Full System Simulator Group in ARL
+ *  Author: Patrick Bohrer <IBM Austin Research Lab>
+ *
+ *  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, 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:
+ *  Free Software Foundation
+ *  51 Franklin Street, Fifth Floor
+ *  Boston, MA  02111-1301  USA
+ *  
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/fs.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/socket.h>
+#include <linux/errno.h>
+#include <linux/fcntl.h>
+#include <linux/in.h>
+#include <linux/init.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+
+#include <linux/inet.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <net/sock.h>
+#include <linux/if_ether.h>	/* For the statistics structure. */
+#include <linux/if_arp.h>	/* For ARPHRD_ETHER */
+#include <linux/workqueue.h>
+#include <asm/prom.h>
+#include <linux/version.h>
+#include <asm/systemsim.h>
+
+#define MAMBO_BOGUS_NET_PROBE   119
+#define MAMBO_BOGUS_NET_SEND    120
+#define MAMBO_BOGUS_NET_RECV    121
+
+static inline int MamboBogusNetProbe(int devno, void *buf)
+{
+	return callthru2(MAMBO_BOGUS_NET_PROBE,
+			 (unsigned long)devno, (unsigned long)buf);
+}
+
+static inline int MamboBogusNetSend(int devno, void *buf, ulong size)
+{
+	return callthru3(MAMBO_BOGUS_NET_SEND,
+			 (unsigned long)devno,
+			 (unsigned long)buf, (unsigned long)size);
+}
+
+static inline int MamboBogusNetRecv(int devno, void *buf, ulong size)
+{
+	return callthru3(MAMBO_BOGUS_NET_RECV,
+			 (unsigned long)devno,
+			 (unsigned long)buf, (unsigned long)size);
+}
+
+static irqreturn_t
+mambonet_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+
+#define INIT_BOTTOM_HALF(x,y,z) INIT_WORK(x, y, (void*)z)
+#define SCHEDULE_BOTTOM_HALF(x) schedule_delayed_work(x, 1)
+#define KILL_BOTTOM_HALF(x) cancel_delayed_work(x); flush_scheduled_work()
+
+#define MAMBO_MTU 1500
+
+struct netdev_private {
+	int devno;
+	int closing;
+	struct work_struct poll_task;
+	struct net_device_stats stats;
+};
+
+static int mambonet_probedev(int devno, void *buf)
+{
+	struct device_node *mambo;
+	struct device_node *net;
+	unsigned int *reg;
+
+	mambo = find_path_device("/mambo");
+
+	if (mambo == NULL) {
+		return -1;
+	}
+	net = find_path_device("/mambo/bogus-net at 0");
+	if (net == NULL) {
+		return -1;
+	}
+	reg = (unsigned int *)get_property(net, "reg", 0);
+
+	if (*reg != devno) {
+		return -1;
+	}
+
+	return MamboBogusNetProbe(devno, buf);
+}
+
+static int mambonet_send(int devno, void *buf, ulong size)
+{
+	return MamboBogusNetSend(devno, buf, size);
+}
+
+static int mambonet_recv(int devno, void *buf, ulong size)
+{
+	return MamboBogusNetRecv(devno, buf, size);
+}
+
+static int mambonet_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	struct netdev_private *priv = (struct netdev_private *)dev->priv;
+	int devno = priv->devno;
+
+	skb->dev = dev;
+
+	/* we might need to checksum or something */
+	mambonet_send(devno, skb->data, skb->len);
+
+	dev->last_rx = jiffies;
+	priv->stats.rx_bytes += skb->len;
+	priv->stats.tx_bytes += skb->len;
+	priv->stats.rx_packets++;
+	priv->stats.tx_packets++;
+
+	dev_kfree_skb(skb);
+
+	return (0);
+}
+
+static int mambonet_poll(struct net_device *dev, int *budget)
+{
+	struct netdev_private *np = dev->priv;
+	int devno = np->devno;
+	char buffer[1600];
+	int ns;
+	struct sk_buff *skb;
+	int frames = 0;
+	int max_frames = min(*budget, dev->quota);
+	int ret = 0;
+
+	while ((ns = mambonet_recv(devno, buffer, 1600)) > 0) {
+		if ((skb = dev_alloc_skb(ns + 2)) != NULL) {
+			skb->dev = dev;
+			skb_reserve(skb, 2);	/* 16 byte align the IP
+						 * header */
+#ifdef HAS_IP_COPYSUM
+			eth_copy_and_sum(skb, buffer, ns, 0);
+			skb_put(skb, ns);
+#else
+			memcpy(skb_put(skb, ns), buffer, ns);
+#endif
+			skb->protocol = eth_type_trans(skb, dev);
+
+			if (dev->irq)
+				netif_receive_skb(skb);
+			else
+				netif_rx(skb);
+
+			dev->last_rx = jiffies;
+			np->stats.rx_packets++;
+			np->stats.rx_bytes += ns;
+		} else {
+			printk("Failed to allocated skbuff, "
+			       "dropping packet\n");
+			np->stats.rx_dropped++;
+			/* wait for another cycle */
+			return 1;
+		}
+		++frames;
+		if (frames > max_frames) {
+			ret = 1;
+			break;
+		}
+	}
+	*budget -= frames;
+	dev->quota -= frames;
+
+	if ((!ret) && (dev->irq))
+		netif_rx_complete(dev);
+
+	return ret;
+}
+
+static void mambonet_timer(struct net_device *dev)
+{
+	int budget = 16;
+	struct netdev_private *priv = (struct netdev_private *)dev->priv;
+
+	mambonet_poll(dev, &budget);
+
+	if (!priv->closing) {
+		SCHEDULE_BOTTOM_HALF(&priv->poll_task);
+	}
+}
+
+static struct net_device_stats *get_stats(struct net_device *dev)
+{
+	struct netdev_private *priv = (struct netdev_private *)dev->priv;
+	return (struct net_device_stats *)&(priv->stats);
+}
+
+static irqreturn_t
+mambonet_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
+{
+	struct net_device *dev = dev_instance;
+	if (netif_rx_schedule_prep(dev)) {
+		__netif_rx_schedule(dev);
+	}
+	return IRQ_HANDLED;
+}
+
+static int mambonet_open(struct net_device *dev)
+{
+	struct netdev_private *priv;
+	int ret = 0;
+
+	priv = dev->priv;
+
+	/*
+	 * we can't start polling in mambonet_init, because I don't think
+	 * workqueues are usable that early. so start polling now.
+	 */
+
+	if (dev->irq) {
+		ret = request_irq(dev->irq, &mambonet_interrupt, 0,
+				  dev->name, dev);
+
+		if (ret == 0) {
+			netif_start_queue(dev);
+		} else {
+			printk(KERN_ERR "mambonet: request irq failed\n");
+		}
+
+		MamboBogusNetProbe(priv->devno, NULL);	/* probe with NULL to activate interrupts */
+	} else {
+		mambonet_timer(dev);
+	}
+
+	return ret;
+}
+
+static int mambonet_close(struct net_device *dev)
+{
+	struct netdev_private *priv;
+
+	netif_stop_queue(dev);
+
+	if (dev->irq)
+		free_irq(dev->irq, dev);
+
+	priv = dev->priv;
+	priv->closing = 1;
+	if (dev->irq == 0) {
+		KILL_BOTTOM_HALF(&priv->poll_task);
+	}
+
+	kfree(priv);
+
+	return 0;
+}
+
+static struct net_device_stats mambonet_stats;
+
+static struct net_device_stats *mambonet_get_stats(struct net_device *dev)
+{
+	return &mambonet_stats;
+}
+
+static int mambonet_set_mac_address(struct net_device *dev, void *p)
+{
+	return -EOPNOTSUPP;
+}
+static int mambonet_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+	return -EOPNOTSUPP;
+}
+static int nextdevno = 0;	/* running count of device numbers */
+
+/* Initialize the rest of the device. */
+int __init do_mambonet_probe(struct net_device *dev)
+{
+	struct netdev_private *priv;
+	int devno = nextdevno++;
+	int irq;
+
+	printk("eth%d: bogus network driver initialization\n", devno);
+
+	irq = mambonet_probedev(devno, dev->dev_addr);
+
+	if (irq < 0) {
+		printk("No IRQ retreived\n");
+		return (-ENODEV);
+	}
+
+	printk("%s: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", dev->name,
+	       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+	       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+
+	SET_MODULE_OWNER(dev);
+
+	dev->irq = irq;
+	dev->mtu = MAMBO_MTU;
+	dev->open = mambonet_open;
+	dev->poll = mambonet_poll;
+	dev->weight = 16;
+	dev->stop = mambonet_close;
+	dev->hard_start_xmit = mambonet_start_xmit;
+	dev->get_stats = mambonet_get_stats;
+	dev->set_mac_address = mambonet_set_mac_address;
+	dev->do_ioctl = mambonet_ioctl;
+
+	dev->priv = kmalloc(sizeof(struct netdev_private), GFP_KERNEL);
+	if (dev->priv == NULL)
+		return -ENOMEM;
+	memset(dev->priv, 0, sizeof(struct netdev_private));
+
+	priv = dev->priv;
+	priv->devno = devno;
+	priv->closing = 0;
+	dev->get_stats = get_stats;
+
+	if (dev->irq == 0) {
+		INIT_BOTTOM_HALF(&priv->poll_task, (void *)mambonet_timer,
+				 (void *)dev);
+	}
+
+	return (0);
+};
+
+struct net_device *__init mambonet_probe(int unit)
+{
+	struct net_device *dev = alloc_etherdev(0);
+	int err;
+
+	if (!dev)
+		return ERR_PTR(-ENODEV);
+
+	sprintf(dev->name, "eth%d", unit);
+	netdev_boot_setup_check(dev);
+
+	err = do_mambonet_probe(dev);
+
+	if (err)
+		goto out;
+
+	err = register_netdev(dev);
+	if (err)
+		goto out;
+
+	return dev;
+
+      out:
+	free_netdev(dev);
+	return ERR_PTR(err);
+}
+
+int __init init_mambonet(void)
+{
+	mambonet_probe(0);
+	return 0;
+}
+
+module_init(init_mambonet);
+MODULE_LICENSE("GPL");
--- /dev/null
+++ b/include/asm-powerpc/systemsim.h
@@ -0,0 +1,130 @@
+/*********************************************************
+ *
+ * Copyright (C) 2001, 2005 IBM
+ * 
+ * Filename	: systemsim.h
+ *
+ * Originator	: Patrick Bohrer and Charles Lefurgy
+ * Modified By	: Eric Van Hensbegren <ericvh at gmail.com>
+ *
+ * Purpose	: 
+ *
+ *   This file is compiled with programs that are run under the 
+ *   PowerPC Full System simulator.  For example, stand-alone programs 
+ *   or operating systems.  The programs call the callthru wrapper 
+ *   functions which use an illegal PowerPC instruction to signal the 
+ *   simulator to emulate special support.
+ *
+ *********************************************************/
+
+#ifndef _SYSTEMSIM_CONFIG_H_
+#define _SYSTEMSIM_CONFIG_H_
+
+/* The functions callthru0 to callthru5 setup up the arguments for the
+ * simulator callthru and then use the callthru instruction.  Note that
+ * 0-5 specify the number of arguments after the command */
+
+/* Note: Arguments are cast as void* to prevent casting by the
+   compiler.  This way, you can pass pointers, integers, etc. in
+   machine register and have the simulator interpret what the
+   register is supposed to be.  To help with typing errors when using
+   callthrus, we provide wrapper functions for each callthru.  The
+   wrappers cast all arguments to void*.  Unfortunately, this results
+   in a lot of compiler warnings that I do not know how to remove.  If
+   you modify this code, be aware that we are trying to pick a type
+   that is the size of the registers (32-bit or 64-bit) and that is
+   why are choosing to cast to a void* (it should be the size of a
+   machine register) */
+
+static inline int callthru0(int command)
+{
+	register int c asm("r3") = command;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c));
+	return (c);
+}
+static inline int callthru1(int command, unsigned long arg1)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1));
+	return (c);
+}
+static inline int callthru2(int command, unsigned long arg1, unsigned long arg2)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2));
+	return (c);
+}
+static inline int callthru3(int command, unsigned long arg1, unsigned long arg2,
+			    unsigned long arg3)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	register unsigned long a3 asm("r6") = arg3;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2),
+		      "r"(a3));
+	return (c);
+}
+static inline int callthru4(int command, unsigned long arg1, unsigned long arg2,
+			    unsigned long arg3, unsigned long arg4)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	register unsigned long a3 asm("r6") = arg3;
+	register unsigned long a4 asm("r7") = arg4;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2),
+		      "r"(a3), "r"(a4));
+	return (c);
+}
+static inline int callthru5(int command, unsigned long arg1, unsigned long arg2,
+			    unsigned long arg3, unsigned long arg4,
+			    unsigned long arg5)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	register unsigned long a3 asm("r6") = arg3;
+	register unsigned long a4 asm("r7") = arg4;
+	register unsigned long a5 asm("r8") = arg5;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2),
+		      "r"(a3), "r"(a4), "r"(a5));
+	return (c);
+}
+static inline int callthru6(int command, unsigned long arg1, unsigned long arg2,
+			    unsigned long arg3, unsigned long arg4,
+			    unsigned long arg5, unsigned long arg6)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	register unsigned long a3 asm("r6") = arg3;
+	register unsigned long a4 asm("r7") = arg4;
+	register unsigned long a5 asm("r8") = arg5;
+	register unsigned long a6 asm("r9") = arg6;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2),
+		      "r"(a3), "r"(a4), "r"(a5), "r"(a6));
+	return (c);
+}
+static inline int callthru7(int command, unsigned long arg1, unsigned long arg2,
+			    unsigned long arg3, unsigned long arg4,
+			    unsigned long arg5, unsigned long arg6,
+			    unsigned long arg7)
+{
+	register int c asm("r3") = command;
+	register unsigned long a1 asm("r4") = arg1;
+	register unsigned long a2 asm("r5") = arg2;
+	register unsigned long a3 asm("r6") = arg3;
+	register unsigned long a4 asm("r7") = arg4;
+	register unsigned long a5 asm("r8") = arg5;
+	register unsigned long a6 asm("r9") = arg6;
+	register unsigned long a7 asm("r10") = arg7;
+	asm volatile (".long 0x000eaeb0":"=r" (c):"r"(c), "r"(a1), "r"(a2),
+		      "r"(a3), "r"(a4), "r"(a5), "r"(a6), "r"(a7));
+	return (c);
+}
+
+#endif/* _SYSTEMSIM_CONFIG_H_ */
--- a/include/linux/root_dev.h
+++ b/include/linux/root_dev.h
@@ -14,6 +14,9 @@ enum {
 	Root_SDA2 = MKDEV(SCSI_DISK0_MAJOR, 2),
 	Root_HDC1 = MKDEV(IDE1_MAJOR, 1),
 	Root_SR0 = MKDEV(SCSI_CDROM_MAJOR, 0),
+#ifdef CONFIG_MAMBO_DISK
+	Root_Mambo = MKDEV(112, 0),
+#endif
 };
 
 extern dev_t ROOT_DEV;
--- linux-2.6.15-rc.orig/include/asm-powerpc/processor.h
+++ linux-2.6.15-rc/include/asm-powerpc/processor.h
@@ -284,6 +284,23 @@ static inline void pause_zero(void)
 }
 #endif
 
+#ifdef CONFIG_PPC_CELL /* MAMBO SIMULATION code */
+#define MSR_SIM_LG      29
+#define MSR_SIM         __MASK(MSR_SIM_LG)
+
+static __inline__ int __onsim(void)
+{
+        unsigned long msr;
+        __asm__ __volatile__ ("mfmsr    %0" : "=&r" (msr));
+        return ((msr & MSR_SIM) ? 1 : 0);
+}
+#endif /* CONFIG_PPC_CELL */
+
 #endif /* __KERNEL__ */
+#else
+/* must be given a register to perform the compare, set cr0 = 1
+ * Usage: __onsim(r0); bne _if_onsim
+ */
+#define __onsim(r) mfmsr        r; rldicl. r,r,35,63
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_POWERPC_PROCESSOR_H */
--- linux-2.6.15-rc.orig/arch/powerpc/platforms/cell/iommu.c
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/iommu.c
@@ -374,7 +374,11 @@ static int cell_dma_supported(struct dev
 
 void cell_init_iommu(void)
 {
-	cell_map_iommu();
+	if (__onsim()) {
+		printk(KERN_INFO "Not using iommu on mambo\n");
+	} else {
+		cell_map_iommu();
+	}
 
 	/* Direct I/O, IOMMU off */
 	ppc_md.iommu_dev_setup = iommu_dev_setup_null;

linux-2.6-cell-no-legacy-io.patch:
 setup.c |   10 ++++++++++
 1 files changed, 10 insertions(+)

--- NEW FILE linux-2.6-cell-no-legacy-io.patch ---
--- linux-2.6.14/arch/powerpc/platforms/cell/setup.c~	2005-12-07 17:37:48.000000000 +0100
+++ linux-2.6.14/arch/powerpc/platforms/cell/setup.c	2005-12-07 17:41:21.000000000 +0100
@@ -127,6 +127,15 @@
 	return 1;
 }
 
+/*
+ * Cell has no legacy IO; anything calling this function has to
+ * fail or bad things will happen
+ */
+static int cell_check_legacy_ioport(unsigned int baseport)
+{
+	return -ENODEV;
+}
+
 struct machdep_calls __initdata cell_md = {
 	.probe			= cell_probe,
 	.setup_arch		= cell_setup_arch,
@@ -139,5 +148,6 @@
 	.get_rtc_time		= rtas_get_rtc_time,
 	.set_rtc_time		= rtas_set_rtc_time,
 	.calibrate_decr		= generic_calibrate_decr,
+	.check_legacy_ioport	= cell_check_legacy_ioport,
 	.progress		= cell_progress,
 };

linux-2.6-cell-nvram-kmalloc.patch:
 nvram_64.c |  114 ++++++++++++++++++++++++++++---------------------------------
 1 files changed, 54 insertions(+), 60 deletions(-)

--- NEW FILE linux-2.6-cell-nvram-kmalloc.patch ---
Index: linux-2.6.15-rc/arch/powerpc/kernel/nvram_64.c
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/kernel/nvram_64.c
+++ linux-2.6.15-rc/arch/powerpc/kernel/nvram_64.c
@@ -80,80 +80,74 @@ static loff_t dev_nvram_llseek(struct fi
 static ssize_t dev_nvram_read(struct file *file, char __user *buf,
 			  size_t count, loff_t *ppos)
 {
-	ssize_t len;
-	char *tmp_buffer;
-	int size;
+	ssize_t ret;
+	char *tmp = NULL;
+	ssize_t size;
+
+	ret = -ENODEV;
+	if (!ppc_md.nvram_size)
+		goto out;
 
-	if (ppc_md.nvram_size == NULL)
-		return -ENODEV;
+	ret = 0;
 	size = ppc_md.nvram_size();
+	if (*ppos >= size || size < 0)
+		goto out;
 
-	if (!access_ok(VERIFY_WRITE, buf, count))
-		return -EFAULT;
-	if (*ppos >= size)
-		return 0;
-	if (count > size) 
-		count = size;
-
-	tmp_buffer = (char *) kmalloc(count, GFP_KERNEL);
-	if (!tmp_buffer) {
-		printk(KERN_ERR "dev_read_nvram: kmalloc failed\n");
-		return -ENOMEM;
-	}
-
-	len = ppc_md.nvram_read(tmp_buffer, count, ppos);
-	if ((long)len <= 0) {
-		kfree(tmp_buffer);
-		return len;
-	}
-
-	if (copy_to_user(buf, tmp_buffer, len)) {
-		kfree(tmp_buffer);
-		return -EFAULT;
-	}
+	count = min_t(size_t, count, size - *ppos);
+	count = min(count, PAGE_SIZE);
 
-	kfree(tmp_buffer);
-	return len;
+	ret = -ENOMEM;
+	tmp = kmalloc(count, GFP_KERNEL);
+	if (!tmp)
+		goto out;
+
+	ret = ppc_md.nvram_read(tmp, count, ppos);
+	if (ret <= 0)
+		goto out;
+
+	if (copy_to_user(buf, tmp, ret))
+		ret = -EFAULT;
+
+out:
+	kfree(tmp);
+	return ret;
 
 }
 
 static ssize_t dev_nvram_write(struct file *file, const char __user *buf,
-			   size_t count, loff_t *ppos)
+			  size_t count, loff_t *ppos)
 {
-	ssize_t len;
-	char * tmp_buffer;
-	int size;
+	ssize_t ret;
+	char *tmp = NULL;
+	ssize_t size;
+
+	ret = -ENODEV;
+	if (!ppc_md.nvram_size)
+		goto out;
 
-	if (ppc_md.nvram_size == NULL)
-		return -ENODEV;
+	ret = 0;
 	size = ppc_md.nvram_size();
+	if (*ppos >= size || size < 0)
+		goto out;
 
-	if (!access_ok(VERIFY_READ, buf, count))
-		return -EFAULT;
-	if (*ppos >= size)
-		return 0;
-	if (count > size)
-		count = size;
-
-	tmp_buffer = (char *) kmalloc(count, GFP_KERNEL);
-	if (!tmp_buffer) {
-		printk(KERN_ERR "dev_nvram_write: kmalloc failed\n");
-		return -ENOMEM;
-	}
-	
-	if (copy_from_user(tmp_buffer, buf, count)) {
-		kfree(tmp_buffer);
-		return -EFAULT;
-	}
+	count = min_t(size_t, count, size - *ppos);
+	count = min(count, PAGE_SIZE);
 
-	len = ppc_md.nvram_write(tmp_buffer, count, ppos);
-	if ((long)len <= 0) {
-		kfree(tmp_buffer);
-		return len;
-	}
+	ret = -ENOMEM;
+	tmp = kmalloc(count, GFP_KERNEL);
+	if (!tmp)
+		goto out;
+
+	ret = -EFAULT;
+	if (copy_from_user(tmp, buf, count))
+		goto out;
+
+	ret = ppc_md.nvram_write(tmp, count, ppos);
+
+out:
+	kfree(tmp);
+	return ret;
 
-	kfree(tmp_buffer);
-	return len;
 }
 
 static int dev_nvram_ioctl(struct inode *inode, struct file *file,

linux-2.6-cell-platform-detect.patch:
 prom_init.c |    2 ++
 1 files changed, 2 insertions(+)

--- NEW FILE linux-2.6-cell-platform-detect.patch ---
Subject: cell: add platform detection code

I can't really get a conclusive answer from the firmware
people what to check for, so I just try scanning for
anything that starts with "IBM,CPB", which should be
correct for all hardware produced so far and for
systemsim.

Signed-off-by: Arnd Bergmann <arndb at de.ibm.com>

Index: powerpc-2.6/arch/powerpc/kernel/prom_init.c
===================================================================
--- powerpc-2.6.orig/arch/powerpc/kernel/prom_init.c
+++ powerpc-2.6/arch/powerpc/kernel/prom_init.c
@@ -1500,6 +1500,8 @@ static int __init prom_find_machine_type
 #ifdef CONFIG_PPC64
 			if (strstr(p, RELOC("Momentum,Maple")))
 				return PLATFORM_MAPLE;
+			if (strstr(p, RELOC("IBM,CPB")))
+				return PLATFORM_CELL;
 #endif
 			i += sl + 1;
 		}

linux-2.6-cell-spidernet.patch:
 drivers/net/Kconfig                   |    2 -
 drivers/net/spider_net.h              |    6 +--
 linux-2.6.14/drivers/net/spider_net.c |   53 +++++++++++++++++++++++++---------
 3 files changed, 44 insertions(+), 17 deletions(-)

--- NEW FILE linux-2.6-cell-spidernet.patch ---
unchanged:
--- linux-2.6.14.spidernet/drivers/net/Kconfig	2005-12-07 16:12:40.000000000 +0100
+++ linux-2.6.14/drivers/net/Kconfig	2005-12-07 17:27:37.000000000 +0100
@@ -2120,7 +2120,7 @@
 
 config SPIDER_NET
 	tristate "Spider Gigabit Ethernet driver"
-	depends on PCI && PPC_BPA
+	depends on PCI && PPC_CELL
 	help
 	  This driver supports the Gigabit Ethernet chips present on the
 	  Cell Processor-Based Blades from IBM.
diff -u linux-2.6.14/drivers/net/spider_net.c linux-2.6.14/drivers/net/spider_net.c
--- linux-2.6.14/drivers/net/spider_net.c	2005-12-07 17:27:33.000000000 +0100
+++ linux-2.6.14/drivers/net/spider_net.c	2005-12-08 13:49:32.000000000 +0100
@@ -41,6 +41,7 @@
 #include <linux/pci.h>
 #include <linux/skbuff.h>
 #include <linux/slab.h>
+#include <linux/vmalloc.h>
 #include <linux/tcp.h>
 #include <linux/types.h>
 #include <linux/wait.h>
@@ -480,6 +481,7 @@
 spider_net_prepare_rx_descr(struct spider_net_card *card,
 			    struct spider_net_descr *descr)
 {
+	dma_addr_t buf;
 	int error = 0;
 	int offset;
 	int bufsize;
@@ -510,10 +512,11 @@
 	if (offset)
 		skb_reserve(descr->skb, SPIDER_NET_RXBUF_ALIGN - offset);
 	/* io-mmu-map the skb */
-	descr->buf_addr = pci_map_single(card->pdev, descr->skb->data,
+	buf = pci_map_single(card->pdev, descr->skb->data,
 					 SPIDER_NET_MAX_MTU,
 					 PCI_DMA_BIDIRECTIONAL);
-	if (descr->buf_addr == DMA_ERROR_CODE) {
+	descr->buf_addr = buf;
+	if (buf == DMA_ERROR_CODE) {
 		dev_kfree_skb_any(descr->skb);
 		if (netif_msg_rx_err(card))
 			pr_err("Could not iommu-map rx buffer\n");
@@ -914,15 +917,16 @@
 			    struct spider_net_descr *descr,
 			    struct sk_buff *skb)
 {
-	descr->buf_addr = pci_map_single(card->pdev, skb->data,
-					 skb->len, PCI_DMA_BIDIRECTIONAL);
-	if (descr->buf_addr == DMA_ERROR_CODE) {
+	dma_addr_t buf = pci_map_single(card->pdev, skb->data,
+					skb->len, PCI_DMA_BIDIRECTIONAL);
+	if (buf == DMA_ERROR_CODE) {
 		if (netif_msg_tx_err(card))
 			pr_err("could not iommu-map packet (%p, %i). "
 				  "Dropping packet\n", skb->data, skb->len);
 		return -ENOMEM;
 	}
 
+	descr->buf_addr = buf;
 	descr->buf_size = skb->len;
 	descr->skb = skb;
 	descr->data_status = 0;
@@ -1836,7 +1840,7 @@
  * spider_net_download_firmware loads the firmware opened by
  * spider_net_init_firmware into the adapter.
  */
-static void
+static int 
 spider_net_download_firmware(struct spider_net_card *card,
 			     const struct firmware *firmware)
 {
@@ -1857,8 +1861,13 @@
 		}
 	}
 
+	if (spider_net_read_reg(card, SPIDER_NET_GSINIT))
+		return -EIO;
+	
 	spider_net_write_reg(card, SPIDER_NET_GSINIT,
 			     SPIDER_NET_RUN_SEQ_VALUE);
+
+	return 0;
 }
 
 /**
@@ -1890,15 +1899,34 @@
 static int
 spider_net_init_firmware(struct spider_net_card *card)
 {
-	const struct firmware *firmware;
+	struct firmware *firmware = NULL;
+	struct device_node *dn;
+	u8 *fw_prop = NULL;
 	int err = -EIO;
+	int size;
 
-	if (request_firmware(&firmware,
-			     SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) < 0) {
+	dn = pci_device_to_OF_node(card->pdev);
+	if (dn)
+		fw_prop = (u8 *)get_property(dn, "firmware", &size);
+	if (fw_prop) {
+		/* Found firmware in device tree */
+		firmware = kmalloc(sizeof(*firmware), GFP_KERNEL);
+		if (!firmware)
+			goto out;
+		firmware->size = size;
+		firmware->data = vmalloc(size);
+		if (!firmware->data) {
+			kfree(firmware);
+			firmware = NULL;
+			goto out;
+		}
+		memcpy(firmware->data, fw_prop, size);
+	} else if (request_firmware((const struct firmware **)&firmware,
+				    SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) < 0) {
 		if (netif_msg_probe(card))
 			pr_err("Couldn't read in sequencer data file %s.\n",
 			       SPIDER_NET_FIRMWARE_NAME);
-		firmware = NULL;
+
 		goto out;
 	}
 
@@ -1909,9 +1937,8 @@
 		goto out;
 	}
 
-	spider_net_download_firmware(card, firmware);
-
-	err = 0;
+	if (!spider_net_download_firmware(card, firmware))
+		err = 0;
 out:
 	release_firmware(firmware);
 
unchanged:
--- linux-2.6.14.spidernet/drivers/net/spider_net.h	2005-10-28 02:02:08.000000000 +0200
+++ linux-2.6.14/drivers/net/spider_net.h	2005-12-07 17:27:33.000000000 +0100
@@ -155,7 +155,7 @@
 /* set this first, then the FRAMENUM_VALUE */
 #define SPIDER_NET_GFXFRAMES_VALUE	0x00000000
 
-#define SPIDER_NET_STOP_SEQ_VALUE	0x00000000
+#define SPIDER_NET_STOP_SEQ_VALUE	0x007e0000
 #define SPIDER_NET_RUN_SEQ_VALUE	0x0000007e
 
 #define SPIDER_NET_PHY_CTRL_VALUE	0x00040040
@@ -373,9 +373,9 @@
 
 struct spider_net_descr {
 	/* as defined by the hardware */
-	dma_addr_t buf_addr;
+	u32 buf_addr;
 	u32 buf_size;
-	dma_addr_t next_descr_addr;
+	u32 next_descr_addr;
 	u32 dmac_cmd_status;
 	u32 result_size;
 	u32 valid_size;	/* all zeroes for tx */

linux-2.6-cell-spiderpic-no-devtree.patch:
 spider-pic.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

--- NEW FILE linux-2.6-cell-spiderpic-no-devtree.patch ---
Index: linux-2.6.15-rc/arch/powerpc/platforms/cell/spider-pic.c
===================================================================
--- linux-2.6.15-rc.orig/arch/powerpc/platforms/cell/spider-pic.c
+++ linux-2.6.15-rc/arch/powerpc/platforms/cell/spider-pic.c
@@ -84,10 +84,11 @@ static void __iomem *spider_get_irq_conf
 
 static void spider_enable_irq(unsigned int irq)
 {
+	int nodeid = (irq / IIC_NODE_STRIDE) * 0x10;
 	void __iomem *cfg = spider_get_irq_config(irq);
 	irq = spider_get_nr(irq);
 
-	out_be32(cfg, in_be32(cfg) | 0x3107000eu);
+	out_be32(cfg, in_be32(cfg) | 0x3107000eu | nodeid);
 	out_be32(cfg + 4, in_be32(cfg + 4) | 0x00020000u | irq);
 }
 
@@ -150,13 +151,21 @@ int spider_get_irq(unsigned long int_pen
 void spider_init_IRQ(void)
 {
 	int node;
+#if 0
 	struct device_node *dn;
 	unsigned int *property;
+#endif
 	long spiderpic;
+	long pics[] = { 0x24000008000, 0x34000008000 };
 	int n;
 
+       if (__onsim()) {
+               return;
+       }
+
 /* FIXME: detect multiple PICs as soon as the device tree has them */
-	for (node = 0; node < 1; node++) {
+	for (node = 0; node < num_present_cpus()/2; node++) {
+#if 0
 		dn = of_find_node_by_path("/");
 		n = prom_n_addr_cells(dn);
 		property = (unsigned int *) get_property(dn,
@@ -166,11 +171,14 @@ void spider_init_IRQ(void)
 			continue;
 		for (spiderpic = 0; n > 0; --n)
 			spiderpic = (spiderpic << 32) + *property++;
+#endif
+		spiderpic = pics[node];
 		printk(KERN_DEBUG "SPIDER addr: %lx\n", spiderpic);
 		spider_pics[node] = __ioremap(spiderpic, 0x800, _PAGE_NO_CACHE);
 		for (n = 0; n < IIC_NUM_EXT; n++) {
 			int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE;
 			get_irq_desc(irq)->handler = &spider_pic;
+		}
 
  		/* do not mask any interrupts because of level */
  		out_be32(spider_pics[node] + TIR_MSK, 0x0);
@@ -184,8 +192,6 @@ void spider_init_IRQ(void)
  		
  		/* Enable the interrupt detection enable bit. Do this last! */
  		out_be32(spider_pics[node] + TIR_DEN,
-			in_be32(spider_pics[node] +TIR_DEN) | 0x1);
-
-		}
+			in_be32(spider_pics[node] + TIR_DEN) | 0x1);
 	}
 }

linux-2.6-hvc-console.patch:
 arch/powerpc/kernel/setup-common.c |   10 ++
 drivers/char/Kconfig               |   13 +++
 drivers/char/Makefile              |    6 -
 drivers/char/hvc_console.c         |   25 ------
 drivers/char/hvc_console.h         |   83 ++++++++++++++++++++
 drivers/char/hvc_fss.c             |  149 +++++++++++++++++++++++++++++++++++++
 drivers/char/hvc_vio.c             |    1 
 include/asm-powerpc/hvconsole.h    |   21 -----
 8 files changed, 261 insertions(+), 47 deletions(-)

--- NEW FILE linux-2.6-hvc-console.patch ---
diff -uNr --exclude '*.orig' linux-2.6.14.cons/arch/powerpc/kernel/setup-common.c linux-2.6.14/arch/powerpc/kernel/setup-common.c
--- linux-2.6.14.cons/arch/powerpc/kernel/setup-common.c	2005-12-07 16:33:31.000000000 +0100
+++ linux-2.6.14/arch/powerpc/kernel/setup-common.c	2005-12-07 16:34:00.000000000 +0100
@@ -304,6 +304,14 @@
 
 	DBG(" -> set_preferred_console()\n");
 
+	/* if we're on the full system simulator just circumvent the whole
+	 * picking process because there is no device tree in which we'll
+	 * find the console device. */
+	if(__onsim()) {
+		DBG("Found hvc_fss console\n");
+		return add_preferred_console("hvc", 0, NULL);
+	}
+
 	/* The user has requested a console so this is already set up. */
 	if (strstr(saved_command_line, "console=")) {
 		DBG(" console was specified !\n");
@@ -385,7 +393,7 @@
  		} else {
  			/* pSeries LPAR virtual console */
 			of_node_put(prom_stdout);
-			DBG("Found hvc console\n");
+			DBG("Found hvc_vio console\n");
  			return add_preferred_console("hvc", 0, NULL);
  		}
 	}
diff -uNr --exclude '*.orig' linux-2.6.14.cons/drivers/char/hvc_console.c linux-2.6.14/drivers/char/hvc_console.c
--- linux-2.6.14.cons/drivers/char/hvc_console.c	2005-12-07 16:33:35.000000000 +0100
+++ linux-2.6.14/drivers/char/hvc_console.c	2005-12-07 16:33:56.000000000 +0100
@@ -40,7 +40,7 @@
 #include <linux/spinlock.h>
 #include <linux/delay.h>
 #include <asm/uaccess.h>
-#include <asm/hvconsole.h>
+#include "hvc_console.h"
 
 #define HVC_MAJOR	229
 #define HVC_MINOR	0
@@ -61,11 +61,6 @@
  */
 #define HVC_ALLOC_TTY_ADAPTERS	8
 
-#define N_OUTBUF	16
-#define N_INBUF		16
-
-#define __ALIGNED__	__attribute__((__aligned__(8)))
-
 static struct tty_driver *hvc_driver;
 static struct task_struct *hvc_task;
 
@@ -76,22 +71,6 @@
 static int sysrq_pressed;
 #endif
 
-struct hvc_struct {
-	spinlock_t lock;
-	int index;
-	struct tty_struct *tty;
-	unsigned int count;
-	int do_wakeup;
-	char outbuf[N_OUTBUF] __ALIGNED__;
-	int n_outbuf;
-	uint32_t vtermno;
-	struct hv_ops *ops;
-	int irq_requested;
-	int irq;
-	struct list_head next;
-	struct kobject kobj; /* ref count & hvc_struct lifetime */
-};
-
 /* dynamic list of hvc_struct instances */
 static struct list_head hvc_structs = LIST_HEAD_INIT(hvc_structs);
 
@@ -136,7 +115,6 @@
 	return hp;
 }
 
-
 /*
  * Initial console vtermnos for console API usage prior to full console
  * initialization.  Any vty adapter outside this range will not have usable
@@ -154,6 +132,7 @@
 
 void hvc_console_print(struct console *co, const char *b, unsigned count)
 {
+	/* This [16] should probably use a #define */
 	char c[16] __ALIGNED__;
 	unsigned i = 0, n = 0;
 	int r, donecr = 0, index = co->index;
diff -uNr --exclude '*.orig' linux-2.6.14.cons/drivers/char/hvc_console.h linux-2.6.14/drivers/char/hvc_console.h
--- linux-2.6.14.cons/drivers/char/hvc_console.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.14/drivers/char/hvc_console.h	2005-12-07 16:33:56.000000000 +0100
@@ -0,0 +1,83 @@
+/*
+ * hvc_console.h
+ * Copyright (C) 2005 IBM Corporation
+ *
+ * Author(s):
+ * 	Ryan S. Arnold <rsa at us.ibm.com>
+ *
+ * hvc_console header information:
+ *      moved here from include/asm-ppc64/hvconsole.h
+ *      and drivers/char/hvc_console.c
+ *
+ * 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
+ */
+
+#ifndef HVC_CONSOLE_H
+#define HVC_CONSOLE_H
+
+#include <linux/spinlock.h>
+#include <linux/list.h>
+#include <linux/kobject.h>
+
+/*
+ * This is the max number of console adapters that can/will be found as
+ * console devices on first stage console init.  Any number beyond this range
+ * can't be used as a console device but is still a valid tty device.
+ */
+#define MAX_NR_HVC_CONSOLES	16
+
+/*
+ * This is a design shortcoming, the number '16' is a vio required buffer
+ * size.  This should be changeable per architecture, but hvc_struct relies
+ * upon it and that struct is used by all hvc_console backend drivers.  This
+ * needs to be fixed.
+ */
+#define N_OUTBUF	16
+#define N_INBUF		16
+
+#define __ALIGNED__ __attribute__((__aligned__(sizeof(long))))
+
+/* implemented by a low level driver */
+struct hv_ops {
+	int (*get_chars)(uint32_t vtermno, char *buf, int count);
+	int (*put_chars)(uint32_t vtermno, const char *buf, int count);
+};
+
+struct hvc_struct {
+	spinlock_t lock;
+	int index;
+	struct tty_struct *tty;
+	unsigned int count;
+	int do_wakeup;
+	char outbuf[N_OUTBUF] __ALIGNED__;
+	int n_outbuf;
+	uint32_t vtermno;
+	struct hv_ops *ops;
+	int irq_requested;
+	int irq;
+	struct list_head next;
+	struct kobject kobj; /* ref count & hvc_struct lifetime */
+};
+
+/* Register a vterm and a slot index for use as a console (console_init) */
+extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops);
+
+/* register a vterm for hvc tty operation (module_init or hotplug add) */
+extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int irq,
+						 struct hv_ops *ops);
+/* remove a vterm from hvc tty operation (modele_exit or hotplug remove) */
+extern int __devexit hvc_remove(struct hvc_struct *hp);
+
+#endif // HVC_CONSOLE_H
diff -uNr --exclude '*.orig' linux-2.6.14.cons/drivers/char/hvc_fss.c linux-2.6.14/drivers/char/hvc_fss.c
--- linux-2.6.14.cons/drivers/char/hvc_fss.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.14/drivers/char/hvc_fss.c	2005-12-07 16:34:02.000000000 +0100
@@ -0,0 +1,149 @@
+/*
+ * IBM Full System Simulator driver interface to hvc_console.c
+ *
+ * (C) Copyright IBM Corporation 2001-2005
+ * Author(s): Maximino Augilar <IBM STI Design Center>
+ *          : Ryan S. Arnold <rsa at us.ibm.com>
+ *
+ *    inspired by drivers/char/hvc_console.c
+ *    written by Anton Blanchard and Paul Mackerras
+ *
+ * Some code is from the IBM Full System Simulator Group in ARL.
+ * Author: Patrick Bohrer <IBM Austin Research Lab>
+ *
+ * Much of this code was moved here from the IBM Full System Simulator
+ * Bogus console driver in order to reuse the framework provided by the hvc
+ * console driver. Ryan S. Arnold <rsa at us.ibm.com>
+ *
+ * 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/types.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <asm/irq.h>
+#include "hvc_console.h"
+
+static uint32_t hvc_fss_vtermno = 0;
+struct hvc_struct *hvc_fss_dev;
+
+static inline int callthru0(int command)
+{
+	register int c asm ("r3") = command;
+
+	asm volatile (".long 0x000EAEB0" : "=r" (c): "r" (c));
+	return((c));
+}
+
+static inline int callthru3(int command, unsigned long arg1, unsigned long arg2, unsigned long arg3)
+{
+	register int c asm ("r3") = command;
+	register unsigned long a1 asm ("r4") = arg1;
+	register unsigned long a2 asm ("r5") = arg2;
+	register unsigned long a3 asm ("r6") = arg3;
+
+	asm volatile (".long 0x000EAEB0" : "=r" (c): "r" (c), "r" (a1), "r" (a2), "r" (a3));
+	return((c));
+}
+
+static inline int hvc_fss_write_console(uint32_t vtermno, const char *buf, int count)
+{
+	int ret = 0;
+	ret = callthru3(0, (unsigned long)buf,
+		(unsigned long)count, (unsigned long)1);
+	if (ret != 0) {
+		return (count - ret); /* is this right? */
+	}
+
+	/* the calling routine expects to receive the number of bytes sent */
+	return count;
+}
+
+static inline int hvc_fss_read_console(uint32_t vtermno, char *buf, int count)
+{
+	unsigned long got;
+	int c;	
+	int i;
+
+	for (got = 0, i = 0; i < count; i++) {
+	
+		if (( c = callthru0(60) ) != -1) {
+			buf[i] = c;
+			++got;
+		}
+		else
+			break;
+	}
+	return got;
+}
+
+static struct hv_ops hvc_fss_get_put_ops = {
+	.get_chars = hvc_fss_read_console,
+	.put_chars = hvc_fss_write_console,
+};
+
+static int hvc_fss_init(void)
+{
+	/* Register a single device with the driver */
+	struct hvc_struct *hp;
+
+	if(!__onsim()) {
+		return -1;
+	}
+
+	if(hvc_fss_dev) {
+		return -1; /* This shouldn't happen */
+	}
+
+	/* Allocate an hvc_struct for the console device we instantiated
+	 * earlier.  Save off hp so that we can return it on exit */
+	hp = hvc_alloc(hvc_fss_vtermno, NO_IRQ, &hvc_fss_get_put_ops);
+	if (IS_ERR(hp))
+		return PTR_ERR(hp);
+	hvc_fss_dev = hp;
+	return 0;
+}
+module_init(hvc_fss_init);
+
+/* This will tear down the tty portion of the driver */
+static void __exit hvc_fss_exit(void)
+{
+	struct hvc_struct *hp_safe;
+	/* Hopefully this isn't premature */
+	if (!hvc_fss_dev)
+		return;
+
+	hp_safe = hvc_fss_dev;
+	hvc_fss_dev = NULL;
+
+	/* Really the fun isn't over until the worker thread breaks down and the
+	 * tty cleans up */
+	hvc_remove(hp_safe);
+}
+module_exit(hvc_fss_exit); /* before drivers/char/hvc_console.c */
+
+/* This will happen prior to module init.  There is no tty at this time? */
+static int hvc_fss_console_init(void)
+{
+	/* Don't register if we aren't running on the simulator */
+	if (__onsim()) {
+		/* Tell the driver we know of one console device.  We
+		 * shouldn't get a collision on the index as long as no-one
+		 * else instantiates on hardware they don't have. */
+		hvc_instantiate(hvc_fss_vtermno, 0, &hvc_fss_get_put_ops );
+	}
+	return 0;
+}
+console_initcall(hvc_fss_console_init);
diff -uNr --exclude '*.orig' linux-2.6.14.cons/drivers/char/Kconfig linux-2.6.14/drivers/char/Kconfig
--- linux-2.6.14.cons/drivers/char/Kconfig	2005-12-07 16:33:33.000000000 +0100
+++ linux-2.6.14/drivers/char/Kconfig	2005-12-07 16:33:58.000000000 +0100
@@ -552,14 +552,27 @@
 
 	  If unsure, say N.
 
+config HVC_DRIVER
+	bool
+	depends on PPC_PSERIES || PPC_CELL || PPC_RTAS
+
 config HVC_CONSOLE
 	bool "pSeries Hypervisor Virtual Console support"
 	depends on PPC_PSERIES
+	select HVC_DRIVER
 	help
 	  pSeries machines when partitioned support a hypervisor virtual
 	  console. This driver allows each pSeries partition to have a console
 	  which is accessed via the HMC.
 
+config HVC_FSS
+	bool "IBM Full System Simulator Console support"
+	depends on MAMBO
+	select HVC_DRIVER
+	help
+	  IBM Full System Simulator Console device driver which makes use of
+	  the HVC_DRIVER front end.
+
 config HVCS
 	tristate "IBM Hypervisor Virtual Console Server support"
 	depends on PPC_PSERIES
diff -uNr --exclude '*.orig' linux-2.6.14.cons/drivers/char/Makefile linux-2.6.14/drivers/char/Makefile
--- linux-2.6.14.cons/drivers/char/Makefile	2005-12-07 16:33:33.000000000 +0100
+++ linux-2.6.14/drivers/char/Makefile	2005-12-07 16:33:58.000000000 +0100
@@ -40,11 +40,13 @@
 obj-$(CONFIG_AMIGA_BUILTIN_SERIAL) += amiserial.o
 obj-$(CONFIG_SX)		+= sx.o generic_serial.o
 obj-$(CONFIG_RIO)		+= rio/ generic_serial.o
-obj-$(CONFIG_HVC_CONSOLE)	+= hvc_console.o hvc_vio.o hvsi.o
+obj-$(CONFIG_HVC_DRIVER)	+= hvc_console.o
+obj-$(CONFIG_HVC_CONSOLE)	+= hvc_vio.o hvsi.o
+obj-$(CONFIG_HVC_FSS)		+= hvc_fss.o
 obj-$(CONFIG_RAW_DRIVER)	+= raw.o
 obj-$(CONFIG_SGI_SNSC)		+= snsc.o snsc_event.o
 obj-$(CONFIG_MMTIMER)		+= mmtimer.o
-obj-$(CONFIG_VIOCONS) += viocons.o
+obj-$(CONFIG_VIOCONS)		+= viocons.o
 obj-$(CONFIG_VIOTAPE)		+= viotape.o
 obj-$(CONFIG_HVCS)		+= hvcs.o
 obj-$(CONFIG_SGI_MBCS)		+= mbcs.o
diff -uNr --exclude '*.orig' linux-2.6.14.cons/include/asm-powerpc/hvconsole.h linux-2.6.14/include/asm-powerpc/hvconsole.h
--- linux-2.6.14.cons/include/asm-powerpc/hvconsole.h	2005-12-07 16:33:35.000000000 +0100
+++ linux-2.6.14/include/asm-powerpc/hvconsole.h	2005-12-07 16:33:56.000000000 +0100
@@ -22,28 +22,7 @@
 #ifndef _PPC64_HVCONSOLE_H
 #define _PPC64_HVCONSOLE_H
 
-/*
- * This is the max number of console adapters that can/will be found as
- * console devices on first stage console init.  Any number beyond this range
- * can't be used as a console device but is still a valid tty device.
- */
-#define MAX_NR_HVC_CONSOLES	16
-
-/* implemented by a low level driver */
-struct hv_ops {
-	int (*get_chars)(uint32_t vtermno, char *buf, int count);
-	int (*put_chars)(uint32_t vtermno, const char *buf, int count);
-};
 extern int hvc_get_chars(uint32_t vtermno, char *buf, int count);
 extern int hvc_put_chars(uint32_t vtermno, const char *buf, int count);
 
-struct hvc_struct;
-
-/* Register a vterm and a slot index for use as a console (console_init) */
-extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops);
-/* register a vterm for hvc tty operation (module_init or hotplug add) */
-extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int irq,
-						 struct hv_ops *ops);
-/* remove a vterm from hvc tty operation (modele_exit or hotplug remove) */
-extern int __devexit hvc_remove(struct hvc_struct *hp);
 #endif /* _PPC64_HVCONSOLE_H */
--- linux-2.6.14/drivers/char/hvc_vio.c~	2005-12-07 17:46:48.000000000 +0100
+++ linux-2.6.14/drivers/char/hvc_vio.c	2005-12-07 18:03:23.000000000 +0100
@@ -34,6 +34,7 @@
 #include <asm/hvconsole.h>
 #include <asm/vio.h>
 #include <asm/prom.h>
+#include "hvc_console.h"
 
 char hvc_driver_name[] = "hvc_console";
 

linux-2.6-hvc-rtas-console.patch:
 Kconfig    |    7 ++
 Makefile   |    1 
 hvc_rtas.c |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 169 insertions(+)

--- NEW FILE linux-2.6-hvc-rtas-console.patch ---
--- linux-2.6.14/drivers/char/hvc_rtas.c~	2005-12-07 18:12:59.000000000 +0100
+++ linux-2.6.14/drivers/char/hvc_rtas.c	2005-12-07 18:15:39.000000000 +0100
@@ -0,0 +1,161 @@
+/*
+ * IBM RTAS driver interface to hvc_console.c
+ *
+ * (C) Copyright IBM Corporation 2001-2005
+ * (C) Copyright Red Hat, Inc. 2005
+ *
+ * Author(s): Maximino Augilar <IBM STI Design Center>
+ *          : Ryan S. Arnold <rsa at us.ibm.com>
+ *          : Utz Bacher <utz.bacher at de.ibm.com>
+ *          : David Woodhouse <dwmw2 at infradead.org>
+ *
+ *    inspired by drivers/char/hvc_console.c
+ *    written by Anton Blanchard and Paul Mackerras
+ *
+ * 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/types.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <asm/rtas.h>
+#include <asm/irq.h>
+#include "hvc_console.h"
+
+static uint32_t hvc_rtas_vtermno = 0;
+struct hvc_struct *hvc_rtas_dev;
+
+#define RTASCONS_PUT_ATTEMPTS  16
+
+static int rtascons_put_char_token = -1;
+static int rtascons_get_char_token = -1;
+static int rtascons_put_delay;
+
+static inline int hvc_rtas_write_console(uint32_t vtermno, const char *buf, int count)
+{
+       int result = 0;
+       int attempts = RTASCONS_PUT_ATTEMPTS;
+       int done = 0;
+
+       /* if there is more than one character to be displayed, wait a bit */
+       for (; done < count && attempts; udelay(rtascons_put_delay)) {
+               attempts--;
+               result = rtas_call(rtascons_put_char_token, 1, 1, NULL, buf[done]);
+
+               if (!result) {
+			attempts = RTASCONS_PUT_ATTEMPTS;
+			done++;
+		}
+       }
+	/* the calling routine expects to receive the number of bytes sent */
+	return done?:result;
+}
+
+static inline int rtascons_get_char(void)
+{
+       int result;
+
+       if (rtas_call(rtascons_get_char_token, 0, 2, &result))
+               result = -1;
+
+       return result;
+}
+
+static int hvc_rtas_read_console(uint32_t vtermno, char *buf, int count)
+{
+	unsigned long got;
+	int c;	
+	int i;
+
+	for (got = 0, i = 0; i < count; i++) {
+	
+		if (( c = rtascons_get_char() ) != -1) {
+			buf[i] = c;
+			++got;
+		}
+		else
+			break;
+	}
+	return got;
+}
+
+static struct hv_ops hvc_rtas_get_put_ops = {
+	.get_chars = hvc_rtas_read_console,
+	.put_chars = hvc_rtas_write_console,
+};
+
+static int hvc_rtas_init(void)
+{
+	struct hvc_struct *hp;
+
+	if (rtascons_put_char_token == -1)
+		rtascons_put_char_token = rtas_token("put-term-char");
+	if (rtascons_put_char_token == -1)
+		return -EIO;
+
+	if (rtascons_get_char_token == -1)
+		rtascons_get_char_token = rtas_token("get-term-char");
+	if (rtascons_get_char_token == -1)
+		return -EIO;
+
+	if (__onsim())
+		rtascons_put_delay = 0;
+	else
+		rtascons_put_delay = 100;
+
+	BUG_ON(hvc_rtas_dev);
+
+	/* Allocate an hvc_struct for the console device we instantiated
+	 * earlier.  Save off hp so that we can return it on exit */
+	hp = hvc_alloc(hvc_rtas_vtermno, NO_IRQ, &hvc_rtas_get_put_ops);
+	if (IS_ERR(hp))
+		return PTR_ERR(hp);
+	hvc_rtas_dev = hp;
+	return 0;
+}
+module_init(hvc_rtas_init);
+
+/* This will tear down the tty portion of the driver */
+static void __exit hvc_rtas_exit(void)
+{
+	struct hvc_struct *hp_safe;
+	/* Hopefully this isn't premature */
+	if (!hvc_rtas_dev)
+		return;
+
+	hp_safe = hvc_rtas_dev;
+	hvc_rtas_dev = NULL;
+
+	/* Really the fun isn't over until the worker thread breaks down and the
+	 * tty cleans up */
+	hvc_remove(hp_safe);
+}
+module_exit(hvc_rtas_exit); /* before drivers/char/hvc_console.c */
+
+/* This will happen prior to module init.  There is no tty at this time? */
+static int hvc_rtas_console_init(void)
+{
+	rtascons_put_char_token = rtas_token("put-term-char");
+	if (rtascons_put_char_token == -1)
+		return -EIO;
+	rtascons_get_char_token = rtas_token("get-term-char");
+	if (rtascons_get_char_token == -1)
+		return -EIO;
+
+	hvc_instantiate(hvc_rtas_vtermno, 0, &hvc_rtas_get_put_ops );
+	return 0;
+}
+console_initcall(hvc_rtas_console_init);
--- linux-2.6.14/drivers/char/Makefile~	2005-12-07 17:47:05.000000000 +0100
+++ linux-2.6.14/drivers/char/Makefile	2005-12-07 18:12:07.000000000 +0100
@@ -43,6 +43,7 @@ obj-$(CONFIG_RIO)		+= rio/ generic_seria
 obj-$(CONFIG_HVC_DRIVER)	+= hvc_console.o
 obj-$(CONFIG_HVC_CONSOLE)	+= hvc_vio.o hvsi.o
 obj-$(CONFIG_HVC_FSS)		+= hvc_fss.o
+obj-$(CONFIG_HVC_RTAS)		+= hvc_rtas.o
 obj-$(CONFIG_RAW_DRIVER)	+= raw.o
 obj-$(CONFIG_SGI_SNSC)		+= snsc.o snsc_event.o
 obj-$(CONFIG_MMTIMER)		+= mmtimer.o
--- linux-2.6.14/drivers/char/Kconfig~	2005-12-07 17:47:05.000000000 +0100
+++ linux-2.6.14/drivers/char/Kconfig	2005-12-07 18:17:14.000000000 +0100
@@ -575,6 +575,13 @@ config HVC_FSS
 	  IBM Full System Simulator Console device driver which makes use of
 	  the HVC_DRIVER front end.
 
+config HVC_RTAS
+	bool "IBM RTAS Console support"
+	depends on PPC_RTAS
+	select HVC_DRIVER
+	help
+	  IBM Console device driver which makes use of RTAS
+
 config HVCS
 	tristate "IBM Hypervisor Virtual Console Server support"
 	depends on PPC_PSERIES

linux-2.6-ppc-rtas-check.patch:
 prom_init.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE linux-2.6-ppc-rtas-check.patch ---
--- linux-2.6.14/arch/powerpc/kernel/prom_init.c~	2005-12-07 23:33:20.000000000 +0100
+++ linux-2.6.14/arch/powerpc/kernel/prom_init.c	2005-12-07 23:33:38.000000000 +0100
@@ -1051,7 +1051,7 @@ static void __init prom_instantiate_rtas
 
 	if (call_prom_ret("call-method", 3, 2, &entry,
 			  ADDR("instantiate-rtas"),
-			  rtas_inst, base) != 0
+			  rtas_inst, base) == PROM_ERROR
 	    || entry == 0) {
 		prom_printf(" failed\n");
 		return;


Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.1748
retrieving revision 1.1749
diff -u -r1.1748 -r1.1749
--- kernel-2.6.spec	8 Dec 2005 06:41:46 -0000	1.1748
+++ kernel-2.6.spec	8 Dec 2005 22:50:06 -0000	1.1749
@@ -221,11 +221,18 @@
 # 300 - 399   ppc(64)
 Patch300: linux-2.6.15-default-powerpc.patch
 Patch302: linux-2.6-serial-of.patch
-#Patch303: linux-2.6.15-rc1-ppc-vdso-2.patch
-Patch304: linux-2.6.15-rc1-ppc64-syscallpath.patch
-Patch306: linux-2.6.15-ppc-cell-basics.patch
-Patch309: linux-2.6.15-cell-bogus-console-fix.patch
-Patch310: linux-2.6.15-mv643xx-fixes.patch
+Patch303: linux-2.6.15-rc1-ppc64-syscallpath.patch
+Patch304: linux-2.6.15-mv643xx-fixes.patch
+Patch305: linux-2.6-cell-mambo-drivers.patch
+Patch306: linux-2.6-hvc-console.patch
+Patch307: linux-2.6-cell-platform-detect.patch
+Patch308: linux-2.6-cell-idle-pmgt.patch
+Patch309: linux-2.6-cell-nvram-kmalloc.patch
+Patch310: linux-2.6-cell-spiderpic-no-devtree.patch
+Patch311: linux-2.6-cell-spidernet.patch
+Patch312: linux-2.6-cell-no-legacy-io.patch
+Patch313: linux-2.6-hvc-rtas-console.patch
+Patch314: linux-2.6-ppc-rtas-check.patch
 
 # 400 - 499   ia64
 # 500 - 599   s390(x)
@@ -608,11 +615,30 @@
 %patch300 -p1
 # Don't probe serial ports if they don't exist
 %patch302 -p1
-#%patch303 -p1
+# Updated ppc/ppc64 system call entry/exit path
+%patch303 -p1
+# Fix the MV643xx Gigabit Ethernet driver
 %patch304 -p1
-%patch306 -p1 
+# Support the IBM Mambo simulator; core as well as disk and network drivers.
+%patch305 -p1
+# Make HVC console generic; support simulator console device using it.
+%patch306 -p1
+# Detect Cell platforms appropriately
+%patch307 -p1
+# Use PAUSE_ZERO on Cell as appropriate
+%patch308 -p1
+# Fix nvram driver to not kmalloc the entire size of a read() call
 %patch309 -p1
+# Hardcode PIC addresses for Cell spiderpic
 %patch310 -p1
+# Cell spidernet fixes; mostly to use firmware from devicetree.
+%patch311 -p1
+# Cell has no legacy I/O
+%patch312 -p1
+# RTAS console support
+%patch313 -p1
+# Check properly for successful RTAS instantiation
+%patch314 -p1
 
 #
 # Xen
@@ -1312,6 +1338,9 @@
 %endif
 
 %changelog
+* Thu Dec  8 2005 David Woodhouse <dwmw2 at redhat.com>
+- Clean up Cell patches, make it boot on real hardware
+
 * Wed Dec  7 2005 Dave Jones <davej at redhat.com>
 - Merge slab leak detector.
 - Suppress APIC errors on UP x86-64. (#175193)


--- linux-2.6.15-cell-bogus-console-fix.patch DELETED ---


--- linux-2.6.15-ppc-cell-basics.patch DELETED ---


--- linux-2.6.15-rc1-ppc-vdso-2.patch DELETED ---




More information about the fedora-cvs-commits mailing list