Mercurial > hg > aboriginal
changeset 200:8d9bab8fcb3a
Make powerpc build to completion. (yay!)
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 22 Aug 2007 19:33:39 -0500 |
parents | 4d55eff218e9 |
children | 27c4e92b27ca |
files | download.sh sources/configs/powerpc sources/patches/linux-prep-support |
diffstat | 3 files changed, 4043 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/download.sh Mon Aug 13 16:20:02 2007 -0500 +++ b/download.sh Wed Aug 22 19:33:39 2007 -0500 @@ -16,8 +16,8 @@ echo "=== Download source code." && # Required for cross compile toolchain -URL=http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.tar.bz2 \ -SHA1=39401f195a618f397312d6d84ff9aebe28d99381 \ +URL=http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.23-rc3.tar.bz2 \ +SHA1=3732e8db9faf8c6b8fe540957a27fea0741f6fc1 \ download && URL=http://www.uclibc.org/downloads/uClibc-0.9.29.tar.bz2 \
--- a/sources/configs/powerpc Mon Aug 13 16:20:02 2007 -0500 +++ b/sources/configs/powerpc Wed Aug 22 19:33:39 2007 -0500 @@ -1,3 +1,4 @@ +CLEANUP=echo KARCH=powerpc KERNEL_PATH=arch/${KARCH}/boot/zImage GCC_FLAGS= @@ -12,7 +13,7 @@ # Write out Linux kernel .config file cat > "${WORK}"/miniconfig-linux << 'EOF' -CONFIG_PPC_CHRP=y +CONFIG_PPC_PREP=y CONFIG_SWAP=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/patches/linux-prep-support Wed Aug 22 19:33:39 2007 -0500 @@ -0,0 +1,4039 @@ +First cut at PReP support for arch/powerpc + +Here is an implementation to allow PReP systems to boot under the +arch/powerpc codebase, one of the few remaining platforms supported in +arch/ppc but not so far in arch/powerpc. + +This support is still fairly incomplete - it needs to obtain a lot +more device information from the residual data and put it into the +device tree, rather than relying on hardcoded values (both in the code +and in prep.dts). Likewise many peripherals will not be supported - +in particular the RTC is not yet supported, so the time will generally +be wrong. + +Still, it should do enough to boot on a number of PReP machines, and +makes a reasonable start. + +Signed-off-by: David Gibson <david@gibson.dropbear.id.au> + +Index: working-2.6/arch/powerpc/Kconfig.debug +=================================================================== +--- working-2.6.orig/arch/powerpc/Kconfig.debug 2007-08-06 13:48:10.000000000 +1000 ++++ working-2.6/arch/powerpc/Kconfig.debug 2007-08-06 14:01:48.000000000 +1000 +@@ -211,6 +211,13 @@ config PPC_EARLY_DEBUG_44x + Select this to enable early debugging for IBM 44x chips via the + inbuilt serial port. + ++config PPC_EARLY_DEBUG_PREP ++ bool "PReP serial port" ++ depends on PPC_PREP ++ help ++ Select this to enable early debugging for PReP, assuming an ++ 8250-style serial port at address 0x800003f8. ++ + endchoice + + config PPC_EARLY_DEBUG_44x_PHYSLOW +Index: working-2.6/arch/powerpc/boot/Makefile +=================================================================== +--- working-2.6.orig/arch/powerpc/boot/Makefile 2007-08-06 14:01:48.000000000 +1000 ++++ working-2.6/arch/powerpc/boot/Makefile 2007-08-06 14:01:48.000000000 +1000 +@@ -48,7 +48,7 @@ src-wlib := string.S crt0.S stdio.c main + 44x.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c + src-plat := of.c cuboot-83xx.c cuboot-85xx.c holly.c \ + cuboot-ebony.c treeboot-ebony.c prpmc2800.c \ +- ps3-head.S ps3-hvcall.S ps3.c ++ ps3-head.S ps3-hvcall.S ps3.c prep.c + src-boot := $(src-wlib) $(src-plat) empty.c + + src-boot := $(addprefix $(obj)/, $(src-boot)) +@@ -100,14 +100,14 @@ $(patsubst %.S,%.o, $(filter %.S, $(src- + $(obj)/wrapper.a: $(obj-wlib) FORCE + $(call if_changed,bootar) + +-hostprogs-y := addnote addRamDisk hack-coff mktree ++hostprogs-y := addnote addRamDisk hack-coff mktree mkprep + + targets += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a) + extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \ + $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds + + wrapper :=$(srctree)/$(src)/wrapper +-wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \ ++wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree mkprep) \ + $(wrapper) FORCE + + ############# +@@ -137,6 +137,7 @@ image-$(CONFIG_PPC_PMAC) += zImage.pmac + image-$(CONFIG_PPC_HOLLY) += zImage.holly + image-$(CONFIG_PPC_PRPMC2800) += zImage.prpmc2800 + image-$(CONFIG_PPC_ISERIES) += zImage.iseries ++image-$(CONFIG_PPC_PREP) += zImage.dts.prep + image-$(CONFIG_DEFAULT_UIMAGE) += uImage + + ifneq ($(CONFIG_DEVICE_TREE),"") +Index: working-2.6/arch/powerpc/boot/dts/prep.dts +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/boot/dts/prep.dts 2007-08-06 14:02:13.000000000 +1000 +@@ -0,0 +1,129 @@ ++/* ++ * PReP skeleton device tree ++ * ++ * Paul Mackerras <paulus@samba.org> ++ */ ++ ++/ { ++ device_type = "prep"; ++ model = "IBM,PReP"; ++ compatible = "prep"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ cpu@0 { ++ device_type = "cpu"; ++ reg = <0>; ++ clock-frequency = <0>; // filled in by bootwrapper ++ bus-frequency = <0>; // filled in by bootwrapper ++ timebase-frequency = <0>; // filled in by bootwrapper ++ i-cache-line-size = <0>; // filled in by bootwrapper ++ d-cache-line-size = <0>; // filled in by bootwrapper ++ d-cache-size = <0>; // filled in by bootwrapper ++ i-cache-size = <0>; // filled in by bootwrapper ++ ++ l2-cache { ++ device_type = "cache"; ++ i-cache-size = <00100000>; ++ d-cache-size = <00100000>; ++ i-cache-sets = <00008000>; ++ d-cache-sets = <00008000>; ++ i-cache-line-size = <00000020>; ++ d-cache-line-size = <00000020>; ++ cache-unified; ++ }; ++ }; ++ }; ++ ++ memory { ++ device_type = "memory"; ++ // dummy range here, zImage wrapper will fill in the actual ++ // amount of memory from the residual data ++ reg = <00000000 00000000>; ++ }; ++ ++ pci@80000000 { ++ device_type = "pci"; ++ compatible = "prep-pci"; ++ clock-frequency = <01fca055>; ++ reg = <80000000 7effffff>; ++ 8259-interrupt-acknowledge = <bffffff0>; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges=<01000000 00000000 00000000 80000000 00000000 00800000 ++ 01000000 00000000 00800000 81000000 00000000 3e800000 ++ 02000000 00000000 00000000 c0000000 00000000 01000000 ++ 02000000 00000000 01000000 c1000000 00000000 3e000000>; ++ interrupt-map-mask = <f800 0 0 7>; ++ interrupt-map = <6000 0 0 1 &MPIC 6 0 ++ 8000 0 0 1 &MPIC 7 0 ++ 9000 0 0 1 &MPIC 2 0 ++ b000 0 0 1 &MPIC 1 0>; ++ ++ isa { ++ device_type = "isa"; ++ #address-cells = <2>; ++ #size-cells = <1>; ++ #interrupt-cells = <2>; ++ ranges = <00000001 00000000 ++ 01005800 00000000 00000000 00010000 ++ 00000000 00000000 ++ 02005800 00000000 00000000 01000000>; ++ ++ parallel { ++ device_type = "parallel"; ++ compatible = "pnpPNP,401", "pnpPNP,400"; ++ reg = <00000001 000003bc 00000008 ++ 00000001 000007bc 00000006>; ++ interrupts = <00000007 00000003>; ++ interrupt-parent = <&PIC8259>; ++ }; ++ ++ serial@3f8 { ++ device_type = "serial"; ++ compatible = "pnpPNP,501", "pnpPNP,500"; ++ clock-frequency = <001c2000>; ++ reg = <00000001 000003f8 00000008>; ++ interrupts = <00000004 00000003>; ++ interrupt-parent = <&PIC8259>; ++ }; ++ serial@2f8 { ++ device_type = "serial"; ++ compatible = "pnpPNP,501"; ++ clock-frequency = <001c2000>; ++ reg = <00000001 000002f8 00000008>; ++ interrupts = <00000003 00000003>; ++ interrupt-parent = <&PIC8259>; ++ }; ++ PIC8259: interrupt-controller { ++ device_type = "i8259"; ++ compatible = "prep,iic"; ++ interrupt-controller; ++ reg = < 00000001 00000020 00000002 ++ 00000001 000000a0 00000002 ++ 00000001 000004d0 00000002>; ++ interrupts = <00000000 00000003 ++ 00000002 00000003>; ++ interrupt-parent = <&MPIC>; ++ }; ++ }; ++ ++ MPIC: interrupt-controller@d { ++ device_type = "open-pic"; ++ compatible = "mpic"; ++ interrupt-controller; ++ reg = < 00006800 00000000 00000000 00000000 00000000 ++ 02006810 00000000 00000000 00000000 00040000>; ++ assigned-addresses = < ++ 82006810 00000000 3afc0000 00000000 00040000>; ++ }; ++ }; ++ ++ chosen { ++ linux,stdout-path = "/pci/isa/serial@3f8"; ++ }; ++}; +Index: working-2.6/arch/powerpc/boot/mkprep.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/boot/mkprep.c 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,178 @@ ++/* ++ * Makes a prep bootable image which can be dd-ed onto a disk device ++ * to make a bootdisk. Will take as input an ELF executable, strip ++ * off the header and write out a boot image. ++ * ++ * Modified for x86 hosted builds by Matt Porter <porter@neta.com> ++ * Modified for Sparc hosted builds by Peter Wahl <PeterWahl@web.de> ++ * ++ * Largely rewritten by David Gibson <david@gibson.dropbear.id.au> ++ * Copyright (C) 2007 IBM Corporation. ++ */ ++ ++#include <stdio.h> ++#include <string.h> ++#include <stdarg.h> ++#include <stddef.h> ++#include <stdlib.h> ++#include <stdint.h> ++#include <endian.h> ++#include <byteswap.h> ++#include <elf.h> ++#include <errno.h> ++ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++#define cpu_to_le16(x) (x) ++#define cpu_to_le32(x) (x) ++#define be16_to_cpu(x) (bswap_16(x)) ++#define be32_to_cpu(x) (bswap_32(x)) ++#else ++#define cpu_to_le16(x) (bswap_16(x)) ++#define cpu_to_le32(x) (bswap_32(x)) ++#define be16_to_cpu(x) (x) ++#define be32_to_cpu(x) (x) ++#endif ++ ++/* The PReP image header resembles a DOS-style floppy disk boot sector ++ * including a partition table with a type 0x41 partition */ ++struct prep_header { ++ uint32_t entry1, length1; ++ ++ uint8_t _pad0[438]; ++ ++ /* Partition table entry - offset 0x1be*/ ++ uint8_t active; ++ uint8_t start_head, start_sector, start_cylinder; ++ uint8_t partition_type; ++ uint8_t end_head, end_sector, end_cylinder; ++ uint32_t beginning_sector; ++ uint32_t number_of_sectors; ++ ++ uint8_t _pad1[48]; ++ ++ /* DOS boot sector magic number - offset 510 */ ++ uint16_t magic; ++ ++ /* For some reason the header has 2 copies of the entry point ++ * and length - offset 512*/ ++ uint32_t entry2, length2; ++ ++ uint8_t _pad2[504]; ++} __attribute__((packed)); ++ ++#define PREP_HEADER_SIZE sizeof(struct prep_header) ++#define DOS_PARTITION_MAGIC (cpu_to_le16(0xaa55)) ++ ++struct image_info { ++ unsigned int size; ++ unsigned int entryoffset; ++}; ++ ++static void die(const char *str, ...) ++{ ++ va_list ap; ++ ++ va_start(ap, str); ++ vfprintf(stderr, str, ap); ++ exit(1); ++} ++ ++static void parse_image(FILE *in, struct image_info *ii) ++{ ++ char elfheader[256]; ++ Elf32_Ehdr *elf32 = (Elf32_Ehdr *)elfheader; ++ Elf32_Phdr *elf32ph; ++ unsigned int i; ++ ++ if (fread(elfheader, sizeof(elfheader), 1, in) != 1) ++ die("Unable to read image's ELF header\n"); ++ ++ if (!(elf32->e_ident[EI_MAG0] == ELFMAG0 && ++ elf32->e_ident[EI_MAG1] == ELFMAG1 && ++ elf32->e_ident[EI_MAG2] == ELFMAG2 && ++ elf32->e_ident[EI_MAG3] == ELFMAG3 && ++ elf32->e_ident[EI_CLASS] == ELFCLASS32 && ++ elf32->e_ident[EI_DATA] == ELFDATA2MSB && ++ be16_to_cpu(elf32->e_type) == ET_EXEC && ++ be16_to_cpu(elf32->e_machine) == EM_PPC)) ++ die("Input doesn't appear to be a PowerPC ELF image\n"); ++ ++ elf32ph = (Elf32_Phdr *) (elfheader + elf32->e_phoff); ++ for (i = 0; i < elf32->e_phnum; i++, elf32ph++) ++ if (be32_to_cpu(elf32ph->p_type) == PT_LOAD) ++ break; ++ if (i >= be16_to_cpu(elf32->e_phnum)) ++ die("Couldn't find image's PT_LOAD program header\n"); ++ ++ ii->size = be32_to_cpu(elf32ph->p_filesz); ++ ii->entryoffset = be32_to_cpu(elf32->e_entry) ++ - be32_to_cpu(elf32ph->p_vaddr); ++ ++ /* skip elf header in input file */ ++ fseek(in, be32_to_cpu(elf32ph->p_offset), SEEK_SET); ++} ++ ++static void write_prep_header(FILE *out, const struct image_info *ii) ++{ ++ struct prep_header hdr = { ++ /* ++ * The first block of the diskette is used by this ++ * "boot record" which actually contains the partition ++ * table. (The first block of the partition contains ++ * the boot image, but I digress...) We'll set up one ++ * partition on the diskette and it shall contain the ++ * rest of the diskette. ++ */ ++ .active = 0x80, /* partition bootable flag */ ++ .start_head = 0, /* zero-based */ ++ .start_sector = 2, /* one-based */ ++ .start_cylinder = 0, /* zero-based */ ++ .partition_type = 0x41, /* PReP boot partition type */ ++ .end_head = 1, /* assumes two heads */ ++ .end_sector = 18, /* assumes 18 sectors/track */ ++ .end_cylinder = 79, /* assumes 80 cylinders/diskette */ ++ /* ++ * The "PReP" software ignores the above fields and ++ * just looks at the next two. ++ */ ++ .beginning_sector = cpu_to_le32(0), /* Has to be 0 on the PowerStack? */ ++ .number_of_sectors = cpu_to_le32(2*18*80-1), ++ ++ .magic = DOS_PARTITION_MAGIC, ++ }; ++ ++ hdr.entry1 = hdr.entry2 = cpu_to_le32(PREP_HEADER_SIZE + ii->entryoffset); ++ hdr.length1 = hdr.length2 = cpu_to_le32(ii->size + PREP_HEADER_SIZE); ++ ++ fwrite(&hdr, PREP_HEADER_SIZE, 1, out); ++} ++ ++int main(int argc, char *argv[]) ++{ ++ FILE *in, *out; ++ char buf[0x1000]; ++ int n; ++ struct image_info ii; ++ ++ if (argc != 3) ++ die("usage: %s <input image (ELF)> <output image>\n", argv[0]); ++ ++ if (strcmp(argv[1], "-") == 0) ++ in = stdin; ++ else if (!(in = fopen(argv[1], "r"))) ++ die("Couldn't open input %s: %s\n", argv[1], strerror(errno)); ++ ++ if (strcmp(argv[2], "-") == 0) ++ out = stdout; ++ else if (!(out = fopen(argv[2], "w"))) ++ exit(1); ++ ++ parse_image(in, &ii); ++ write_prep_header(out, &ii); ++ ++ /* write input image to bootimage */ ++ while ( (n = fread(buf, 1, sizeof(buf), in)) > 0 ) ++ fwrite(buf, 1, n, out); ++ ++ exit(0); ++} +Index: working-2.6/arch/powerpc/boot/prep.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/boot/prep.c 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,150 @@ ++/* ++ * PReP-specific stuff for the zImage boot wrapper. ++ * ++ * Copyright (C) 2006 Paul Mackerras, IBM Corp. <paulus@samba.org> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of version 2 of the GNU General Public License. ++ */ ++#include <stddef.h> ++#include "string.h" ++#include "stdio.h" ++#include "of.h" ++#include "ops.h" ++#include "page.h" ++#include "residual.h" ++ ++extern char _end[]; ++extern char _dtb_start[], _dtb_end[]; ++ ++static RESIDUAL *residual_data; ++ ++static unsigned long claim_base; ++ ++#define ONE_MB 0x100000 ++ ++static void *of_claim_malloc(unsigned long size) ++{ ++ unsigned long addr = 0; ++ u32 xsize = size + sizeof(size); ++ ++ /* Make space to store the block's size */ ++ size = size + sizeof(size); ++ ++ if (! claim_base) ++ /* First call, initialize claim_base */ ++ claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); ++ ++ for(; claim_base < residual_data->GoodMemory; claim_base += ONE_MB) { ++#ifdef DEBUG ++ printf(" trying: 0x%08lx\n\r", claim_base); ++#endif ++ addr = (unsigned long)of_claim(claim_base, xsize, 0); ++ if ((void *)addr != (void *)-1) ++ break; ++ } ++ if (addr == 0) ++ return NULL; ++ claim_base = PAGE_ALIGN(claim_base + xsize); ++ /* store the block's size */ ++ *((u32 *)addr) = size; ++ return (void *)(addr + sizeof(size)); ++} ++ ++static void *of_claim_realloc(void *ptr, unsigned long size) ++{ ++ u32 oldsize = 0; ++ void *new; ++ ++ if (ptr) ++ oldsize = *((u32 *)(ptr - sizeof(u32))); ++ if (size <= oldsize) ++ return ptr; ++ ++ new = of_claim_malloc(size); ++ if (! new) ++ return NULL; ++ ++ memcpy(new + sizeof(u32), ptr + sizeof(u32), oldsize); ++ return new; ++} ++ ++extern unsigned int __div64_32(unsigned long long *dividend, ++ unsigned int divisor); ++ ++static void prep_fixup_cpu(void *cpu) ++{ ++ VPD *vpd = &residual_data->VitalProductData; ++ ++ printf("PReP: I-Cache size <- 0x%lx\n\r", vpd->I_CacheSize * 1024); ++ setprop_val(cpu, "i-cache-size", vpd->I_CacheSize * 1024); ++ printf("PReP: D-Cache size <- 0x%lx\n\r", vpd->D_CacheSize * 1024); ++ setprop_val(cpu, "d-cache-size", vpd->D_CacheSize * 1024); ++ ++ printf("PReP: I-Cache line size <- 0x%lx\n\r", vpd->I_CacheLineSize); ++ setprop_val(cpu, "i-cache-line-size", vpd->I_CacheLineSize); ++ printf("PReP: D-Cache line size <- 0x%lx\n\r", vpd->D_CacheLineSize); ++ setprop_val(cpu, "d-cache-line-size", vpd->D_CacheLineSize); ++} ++ ++static void prep_fixups(void) ++{ ++ VPD *vpd = &residual_data->VitalProductData; ++ void *devp; ++ u64 tb; ++ int ret; ++ ++ if (!residual_data) ++ /* FIXME: we should be able to cope, somehow, without residual data */ ++ fatal("PReP: no residual data\n\r"); ++ ++ /* Store a copy of residual data in the flat device tree */ ++ devp = finddevice("/chosen"); ++ if (! devp) ++ fatal("Couldn't find /chosen in device tree\n\r"); ++ ++ printf("PReP: %ld bytes of residual data\n\r", ++ residual_data->ResidualLength); ++ ret = setprop(devp, "linux,prep-residual-data", ++ residual_data, residual_data->ResidualLength); ++ if (ret != 0) ++ printf("Couldn't set linux,prep-residual-data property\n\r"); ++ ++ printf("PReP: TotalMemory = 0x%lx, GoodMemory = 0x%lx\n\r", ++ residual_data->TotalMemory, residual_data->GoodMemory); ++ /* FIXME: This makes assumptions about the layout of the ++ * memory devp(s) in the supplied flat tree, and the ++ * address-cells / size-cells values. Should check or enforce ++ * those assumptions */ ++ dt_fixup_memory(0, residual_data->GoodMemory); ++ ++ tb = (u64)vpd->ProcessorBusHz * 1000ULL; ++ __div64_32(&tb, vpd->TimeBaseDivisor); ++ dt_fixup_cpu_clocks(vpd->ProcessorHz, (u32)tb, vpd->ProcessorBusHz); ++ ++ devp = NULL; ++ while ((devp = find_node_by_devtype(devp, "cpu"))) ++ prep_fixup_cpu(devp); ++} ++ ++void platform_init(unsigned long r3, unsigned long r4, void *promptr) ++{ ++ if (r3) ++ if (((RESIDUAL *)r3)->ResidualLength) ++ residual_data = (void *)r3; ++ if (promptr) { ++ /* If we have OF, use it for console I/O */ ++ of_init(promptr); ++ of_console_init(); ++ platform_ops.malloc = of_claim_malloc; ++ platform_ops.realloc = of_claim_realloc; ++ platform_ops.exit = of_exit; ++ platform_ops.vmlinux_alloc = of_vmlinux_alloc; ++ } else { ++ /* look for a serial console */ ++ /* XXX implement me */ ++ } ++ ++ platform_ops.fixups = prep_fixups; ++ ft_init(_dtb_start, _dtb_end - _dtb_start, 32); ++} +Index: working-2.6/arch/powerpc/boot/wrapper +=================================================================== +--- working-2.6.orig/arch/powerpc/boot/wrapper 2007-08-06 13:48:10.000000000 +1000 ++++ working-2.6/arch/powerpc/boot/wrapper 2007-08-06 14:01:48.000000000 +1000 +@@ -233,6 +233,13 @@ coff) + ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile" + $object/hack-coff "$ofile" + ;; ++prep) ++ mv "$ofile" "$ofile".elf ++ $object/mkprep "$ofile".elf "$ofile" ++ if [ -z "$cacheit" ]; then ++ rm -f "$ofile.elf" ++ fi ++ ;; + cuboot*) + mv "$ofile" "$ofile".elf + ${CROSS}objcopy -O binary "$ofile".elf "$ofile".bin +Index: working-2.6/arch/powerpc/kernel/misc_32.S +=================================================================== +--- working-2.6.orig/arch/powerpc/kernel/misc_32.S 2007-08-06 14:01:47.000000000 +1000 ++++ working-2.6/arch/powerpc/kernel/misc_32.S 2007-08-06 14:01:48.000000000 +1000 +@@ -884,3 +884,30 @@ relocate_new_kernel_end: + relocate_new_kernel_size: + .long relocate_new_kernel_end - relocate_new_kernel + #endif ++ ++/* ++ * These routines turn on the MMU temporarily to do an I/O access. ++ */ ++_GLOBAL(virt_readb) ++ mfmsr r6 ++ ori r7,r6,MSR_DR ++ sync ++ mtmsr r7 ++ isync ++ lbz r3,0(r3) ++ sync ++ mtmsr r6 ++ isync ++ blr ++ ++_GLOBAL(virt_writeb) ++ mfmsr r6 ++ ori r7,r6,MSR_DR ++ sync ++ mtmsr r7 ++ isync ++ stb r3,0(r4) ++ sync ++ mtmsr r6 ++ isync ++ blr +Index: working-2.6/arch/powerpc/kernel/setup_32.c +=================================================================== +--- working-2.6.orig/arch/powerpc/kernel/setup_32.c 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/arch/powerpc/kernel/setup_32.c 2007-08-06 14:01:48.000000000 +1000 +@@ -18,7 +18,6 @@ + #include <linux/cpu.h> + #include <linux/console.h> + +-#include <asm/residual.h> + #include <asm/io.h> + #include <asm/prom.h> + #include <asm/processor.h> +Index: working-2.6/arch/powerpc/kernel/udbg_16550.c +=================================================================== +--- working-2.6.orig/arch/powerpc/kernel/udbg_16550.c 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/arch/powerpc/kernel/udbg_16550.c 2007-08-06 14:01:48.000000000 +1000 +@@ -11,6 +11,7 @@ + #include <linux/types.h> + #include <asm/udbg.h> + #include <asm/io.h> ++#include <asm/reg.h> + + extern u8 real_readb(volatile u8 __iomem *addr); + extern void real_writeb(u8 data, volatile u8 __iomem *addr); +@@ -214,3 +215,30 @@ void __init udbg_init_44x_as1(void) + udbg_putc = udbg_44x_as1_putc; + } + #endif /* CONFIG_PPC_EARLY_DEBUG_44x */ ++ ++#ifdef CONFIG_PPC_PREP ++extern u8 virt_readb(volatile u8 __iomem *addr); ++extern void virt_writeb(u8 data, volatile u8 __iomem *addr); ++ ++void udbg_prep_putc(char c) ++{ ++ if (udbg_comport) { ++ while ((virt_readb(&udbg_comport->lsr) & LSR_THRE) == 0) ++ /* wait for idle */; ++ virt_writeb(c, &udbg_comport->thr); ++ if (c == '\n') ++ udbg_prep_putc('\r'); ++ } ++} ++ ++void udbg_init_prep(void) ++{ ++ /* setup DBAT3 to map I/O */ ++ mtspr(SPRN_DBAT3U, 0x80001ffe); ++ mtspr(SPRN_DBAT3L, 0x8000002a); ++ udbg_comport = (volatile struct NS16550 __iomem *) 0x800003f8; ++ udbg_putc = udbg_prep_putc; ++ udbg_getc = NULL; ++ udbg_getc_poll = NULL; ++} ++#endif /* CONFIG_PPC_PREP */ +Index: working-2.6/arch/powerpc/platforms/prep/Makefile +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/platforms/prep/Makefile 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,4 @@ ++obj-y += setup.o ++#obj-$(CONFIG_PCI) += pci.o ++#obj-$(CONFIG_NVRAM) += nvram.o ++ +Index: working-2.6/arch/powerpc/platforms/prep/nvram.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/platforms/prep/nvram.c 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,135 @@ ++/* ++ * Copyright (C) 1998 Corey Minyard ++ * ++ * This reads the NvRAM on PReP compliant machines (generally from IBM or ++ * Motorola). Motorola kept the format of NvRAM in their ROM, PPCBUG, the ++ * same, long after they had stopped producing PReP compliant machines. So ++ * this code is useful in those cases as well. ++ * ++ */ ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/slab.h> ++#include <linux/ioport.h> ++ ++#include <asm/sections.h> ++#include <asm/io.h> ++#include <asm/machdep.h> ++#include <asm/prep_nvram.h> ++ ++static char nvramData[MAX_PREP_NVRAM]; ++static NVRAM_MAP *nvram=(NVRAM_MAP *)&nvramData[0]; ++ ++unsigned char prep_nvram_read_val(int addr) ++{ ++ outb(addr, PREP_NVRAM_AS0); ++ outb(addr>>8, PREP_NVRAM_AS1); ++ return inb(PREP_NVRAM_DATA); ++} ++ ++void prep_nvram_write_val(int addr, ++ unsigned char val) ++{ ++ outb(addr, PREP_NVRAM_AS0); ++ outb(addr>>8, PREP_NVRAM_AS1); ++ outb(val, PREP_NVRAM_DATA); ++} ++ ++void __init init_prep_nvram(void) ++{ ++ unsigned char *nvp; ++ int i; ++ int nvramSize; ++ ++ /* ++ * The following could fail if the NvRAM were corrupt but ++ * we expect the boot firmware to have checked its checksum ++ * before boot ++ */ ++ nvp = (char *) &nvram->Header; ++ for (i=0; i<sizeof(HEADER); i++) ++ { ++ *nvp = ppc_md.nvram_read_val(i); ++ nvp++; ++ } ++ ++ /* ++ * The PReP NvRAM may be any size so read in the header to ++ * determine how much we must read in order to get the complete ++ * GE area ++ */ ++ nvramSize=(int)nvram->Header.GEAddress+nvram->Header.GELength; ++ if(nvramSize>MAX_PREP_NVRAM) ++ { ++ /* ++ * NvRAM is too large ++ */ ++ nvram->Header.GELength=0; ++ return; ++ } ++ ++ /* ++ * Read the remainder of the PReP NvRAM ++ */ ++ nvp = (char *) &nvram->GEArea[0]; ++ for (i=sizeof(HEADER); i<nvramSize; i++) ++ { ++ *nvp = ppc_md.nvram_read_val(i); ++ nvp++; ++ } ++} ++ ++char *prep_nvram_get_var(const char *name) ++{ ++ char *cp; ++ int namelen; ++ ++ namelen = strlen(name); ++ cp = prep_nvram_first_var(); ++ while (cp != NULL) { ++ if ((strncmp(name, cp, namelen) == 0) ++ && (cp[namelen] == '=')) ++ { ++ return cp+namelen+1; ++ } ++ cp = prep_nvram_next_var(cp); ++ } ++ ++ return NULL; ++} ++ ++char *prep_nvram_first_var(void) ++{ ++ if (nvram->Header.GELength == 0) { ++ return NULL; ++ } else { ++ return (((char *)nvram) ++ + ((unsigned int) nvram->Header.GEAddress)); ++ } ++} ++ ++char *prep_nvram_next_var(char *name) ++{ ++ char *cp; ++ ++ ++ cp = name; ++ while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength) ++ && (*cp != '\0')) ++ { ++ cp++; ++ } ++ ++ /* Skip over any null characters. */ ++ while (((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength) ++ && (*cp == '\0')) ++ { ++ cp++; ++ } ++ ++ if ((cp - ((char *) nvram->GEArea)) < nvram->Header.GELength) { ++ return cp; ++ } else { ++ return NULL; ++ } ++} +Index: working-2.6/arch/powerpc/platforms/prep/pci.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/platforms/prep/pci.c 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,66 @@ ++/* ++ * PReP pci functions. ++ * Originally by Gary Thomas ++ * rewritten and updated by Cort Dougan (cort@cs.nmt.edu) ++ * ++ * Adapted for ARCH=powerpc and a flattened device tree by ++ * Paul Mackerras <paulus@samba.org> ++ */ ++ ++#include <linux/types.h> ++#include <linux/pci.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++ ++#include <asm/sections.h> ++#include <asm/byteorder.h> ++#include <asm/io.h> ++#include <asm/ptrace.h> ++#include <asm/prom.h> ++#include <asm/pci-bridge.h> ++#include <asm/irq.h> ++#include <asm/machdep.h> ++#include <asm/mpic.h> ++ ++void __init prep_pcibios_fixup(void) ++{ ++ struct pci_dev *dev = NULL; ++ ++ for_each_pci_dev(dev) ++ pci_read_irq_line(dev); ++} ++ ++static void __init ++prep_pcibios_after_init(void) ++{ ++} ++ ++void __init prep_find_bridges(void) ++{ ++ struct pci_controller* hose; ++ struct device_node *root = find_path_device("/"); ++ struct device_node *dev; ++ ++ for (dev = root->child; dev != NULL; dev = dev->sibling) ++ if (dev->type && strcmp(dev->type, "pci") == 0) ++ break; ++ if (!dev) { ++ printk(KERN_ERR "No PCI bridge in device tree\n"); ++ return; ++ } ++ hose = pcibios_alloc_controller(); ++ if (!hose) ++ return; ++ ++ hose->first_busno = 0; ++ hose->last_busno = 0xff; ++ pci_process_bridge_OF_ranges(hose, dev, 1); ++ ++ setup_indirect_pci(hose, hose->io_base_phys + 0xcf8, ++ hose->io_base_phys + 0xcfc); ++ ++ printk("PReP architecture\n"); ++ ++ ppc_md.pcibios_fixup = prep_pcibios_fixup; ++ ppc_md.pcibios_after_init = prep_pcibios_after_init; ++} +Index: working-2.6/arch/powerpc/platforms/prep/setup.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/platforms/prep/setup.c 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,720 @@ ++/* ++ * Copyright (C) 1995 Linus Torvalds ++ * Adapted from 'alpha' version by Gary Thomas ++ * Modified by Cort Dougan (cort@cs.nmt.edu) ++ * ++ * Support for PReP (Motorola MTX/MVME) ++ * by Troy Benjegerdes (hozer@drgw.net) ++ * ++ * Port to arch/powerpc: ++ * Copyright 2007 David Gibson, IBM Corporation. ++ */ ++ ++#include <linux/init.h> ++#include <linux/seq_file.h> ++#include <linux/initrd.h> ++ ++#include <asm/io.h> ++#include <asm/prom.h> ++#include <asm/pci-bridge.h> ++#include <asm/mpic.h> ++#include <asm/i8259.h> ++#include <asm/time.h> ++#include <asm/udbg.h> ++ ++static const char *prep_model = "(unknown)"; ++ ++/* prep registers for L2 */ ++#define CACHECRBA 0x80000823 /* Cache configuration register address */ ++#define L2CACHE_MASK 0x03 /* Mask for 2 L2 Cache bits */ ++#define L2CACHE_512KB 0x00 /* 512KB */ ++#define L2CACHE_256KB 0x01 /* 256KB */ ++#define L2CACHE_1MB 0x02 /* 1MB */ ++#define L2CACHE_NONE 0x03 /* NONE */ ++#define L2CACHE_PARITY 0x08 /* Mask for L2 Cache Parity Protected bit */ ++ ++#define PREP_PCI_DRAM_OFFSET 0x80000000 ++ ++extern unsigned char prep_nvram_read_val(int addr); ++extern void prep_nvram_write_val(int addr, ++ unsigned char val); ++extern void prep_pcibios_fixup(void); ++ ++#ifdef CONFIG_SOUND_CS4232 ++long ppc_cs4232_dma, ppc_cs4232_dma2; ++EXPORT_SYMBOL(ppc_cs4232_dma); ++EXPORT_SYMBOL(ppc_cs4232_dma2); ++#endif ++ ++extern unsigned long loops_per_jiffy; ++ ++/* useful ISA ports */ ++#define PREP_SYSCTL 0x81c ++/* present in the IBM reference design; possibly identical in Mot boxes: */ ++#define PREP_IBM_SIMM_ID 0x803 /* SIMM size: 32 or 8 MiB */ ++#define PREP_IBM_SIMM_PRESENCE 0x804 ++#define PREP_IBM_EQUIPMENT 0x80c ++#define PREP_IBM_L2INFO 0x80d ++#define PREP_IBM_PM1 0x82a /* power management register 1 */ ++#define PREP_IBM_PLANAR 0x852 /* planar ID - identifies the motherboard */ ++#define PREP_IBM_DISP 0x8c0 /* 4-digit LED display */ ++ ++/* Equipment Present Register masks: */ ++#define PREP_IBM_EQUIPMENT_RESERVED 0x80 ++#define PREP_IBM_EQUIPMENT_SCSIFUSE 0x40 ++#define PREP_IBM_EQUIPMENT_L2_COPYBACK 0x08 ++#define PREP_IBM_EQUIPMENT_L2_256 0x04 ++#define PREP_IBM_EQUIPMENT_CPU 0x02 ++#define PREP_IBM_EQUIPMENT_L2 0x01 ++ ++/* planar ID values: */ ++/* Sandalfoot/Sandalbow (6015/7020) */ ++#define PREP_IBM_SANDALFOOT 0xfc ++/* Woodfield, Thinkpad 850/860 (6042/7249) */ ++#define PREP_IBM_THINKPAD 0xff /* planar ID unimplemented */ ++/* PowerSeries 830/850 (6050/6070) */ ++#define PREP_IBM_CAROLINA_IDE_0 0xf0 ++#define PREP_IBM_CAROLINA_IDE_1 0xf1 ++#define PREP_IBM_CAROLINA_IDE_2 0xf2 ++#define PREP_IBM_CAROLINA_IDE_3 0xf3 ++/* 7248-43P */ ++#define PREP_IBM_CAROLINA_SCSI_0 0xf4 ++#define PREP_IBM_CAROLINA_SCSI_1 0xf5 ++#define PREP_IBM_CAROLINA_SCSI_2 0xf6 ++#define PREP_IBM_CAROLINA_SCSI_3 0xf7 /* missing from Carolina Tech Spec */ ++/* Tiger1 (7043-140) */ ++#define PREP_IBM_TIGER1_133 0xd1 ++#define PREP_IBM_TIGER1_166 0xd2 ++#define PREP_IBM_TIGER1_180 0xd3 ++#define PREP_IBM_TIGER1_xxx 0xd4 /* unknown, but probably exists */ ++#define PREP_IBM_TIGER1_333 0xd5 /* missing from Tiger Tech Spec */ ++ ++/* ++ * As found in the PReP reference implementation. ++ * Used by Thinkpad, Sandalfoot (6015/7020), and all Motorola PReP. ++ */ ++static void __init prep_gen_enable_l2(void) ++{ ++ outb(inb(PREP_SYSCTL) | 0x3, PREP_SYSCTL); ++} ++ ++/* Used by Carolina and Tiger1 */ ++static void __init prep_carolina_enable_l2(void) ++{ ++ outb(inb(PREP_SYSCTL) | 0xc0, PREP_SYSCTL); ++} ++ ++/* cpuinfo code common to all IBM PReP */ ++static void prep_ibm_cpuinfo(struct seq_file *m) ++{ ++ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); ++ ++ seq_printf(m, "machine\t\t: PReP %s\n", prep_model); ++ ++ seq_printf(m, "upgrade cpu\t: "); ++ if (equip_reg & PREP_IBM_EQUIPMENT_CPU) { ++ seq_printf(m, "not "); ++ } ++ seq_printf(m, "present\n"); ++ ++ /* print info about the SCSI fuse */ ++ seq_printf(m, "scsi fuse\t: "); ++ if (equip_reg & PREP_IBM_EQUIPMENT_SCSIFUSE) ++ seq_printf(m, "ok"); ++ else ++ seq_printf(m, "bad"); ++ seq_printf(m, "\n"); ++} ++ ++static void prep_sandalfoot_cpuinfo(struct seq_file *m) ++{ ++ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); ++ ++ prep_ibm_cpuinfo(m); ++ ++ /* report amount and type of L2 cache present */ ++ seq_printf(m, "L2 cache\t: "); ++ if (equip_reg & PREP_IBM_EQUIPMENT_L2) { ++ seq_printf(m, "not present"); ++ } else { ++ if (equip_reg & PREP_IBM_EQUIPMENT_L2_256) ++ seq_printf(m, "256KiB"); ++ else ++ seq_printf(m, "unknown size"); ++ ++ if (equip_reg & PREP_IBM_EQUIPMENT_L2_COPYBACK) ++ seq_printf(m, ", copy-back"); ++ else ++ seq_printf(m, ", write-through"); ++ } ++ seq_printf(m, "\n"); ++} ++ ++static void prep_thinkpad_cpuinfo(struct seq_file *m) ++{ ++ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); ++ char *cpubus_speed, *pci_speed; ++ ++ prep_ibm_cpuinfo(m); ++ ++ /* report amount and type of L2 cache present */ ++ seq_printf(m, "l2 cache\t: "); ++ if (!(equip_reg & 0x1)) { ++ switch ((equip_reg & 0xc) >> 2) { ++ case 0x0: ++ seq_printf(m, "128KiB look-aside 2-way write-through\n"); ++ break; ++ case 0x1: ++ seq_printf(m, "512KiB look-aside direct-mapped write-back\n"); ++ break; ++ case 0x2: ++ seq_printf(m, "256KiB look-aside 2-way write-through\n"); ++ break; ++ case 0x3: ++ seq_printf(m, "256KiB look-aside direct-mapped write-back\n"); ++ break; ++ } ++ } else { ++ seq_printf(m, "not present\n"); ++ } ++ ++ /* report bus speeds because we can */ ++ if ((equip_reg & 0x80) == 0) { ++ switch ((equip_reg & 0x30) >> 4) { ++ case 0x1: ++ cpubus_speed = "50"; ++ pci_speed = "25"; ++ break; ++ case 0x3: ++ cpubus_speed = "66"; ++ pci_speed = "33"; ++ break; ++ default: ++ cpubus_speed = "unknown"; ++ pci_speed = "unknown"; ++ break; ++ } ++ } else { ++ switch ((equip_reg & 0x30) >> 4) { ++ case 0x1: ++ cpubus_speed = "25"; ++ pci_speed = "25"; ++ break; ++ case 0x2: ++ cpubus_speed = "60"; ++ pci_speed = "30"; ++ break; ++ case 0x3: ++ cpubus_speed = "33"; ++ pci_speed = "33"; ++ break; ++ default: ++ cpubus_speed = "unknown"; ++ pci_speed = "unknown"; ++ break; ++ } ++ } ++ seq_printf(m, "60x bus\t\t: %sMHz\n", cpubus_speed); ++ seq_printf(m, "pci bus\t\t: %sMHz\n", pci_speed); ++} ++ ++static void prep_carolina_cpuinfo(struct seq_file *m) ++{ ++ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); ++ ++ prep_ibm_cpuinfo(m); ++ ++ /* report amount and type of L2 cache present */ ++ seq_printf(m, "l2 cache\t: "); ++ if ((equip_reg & 0x1) == 0) { ++ unsigned int l2_reg = inb(PREP_IBM_L2INFO); ++ ++ /* L2 size */ ++ if ((l2_reg & 0x60) == 0) ++ seq_printf(m, "256KiB"); ++ else if ((l2_reg & 0x60) == 0x20) ++ seq_printf(m, "512KiB"); ++ else ++ seq_printf(m, "unknown size"); ++ ++ /* L2 type */ ++ if ((l2_reg & 0x3) == 0) ++ seq_printf(m, ", async"); ++ else if ((l2_reg & 0x3) == 1) ++ seq_printf(m, ", sync"); ++ else ++ seq_printf(m, ", unknown type"); ++ ++ seq_printf(m, "\n"); ++ } else { ++ seq_printf(m, "not present\n"); ++ } ++} ++ ++static void prep_tiger1_cpuinfo(struct seq_file *m) ++{ ++ unsigned int l2_reg = inb(PREP_IBM_L2INFO); ++ ++ prep_ibm_cpuinfo(m); ++ ++ /* report amount and type of L2 cache present */ ++ seq_printf(m, "l2 cache\t: "); ++ if ((l2_reg & 0xf) == 0xf) { ++ seq_printf(m, "not present\n"); ++ } else { ++ if (l2_reg & 0x8) ++ seq_printf(m, "async, "); ++ else ++ seq_printf(m, "sync burst, "); ++ ++ if (l2_reg & 0x4) ++ seq_printf(m, "parity, "); ++ else ++ seq_printf(m, "no parity, "); ++ ++ switch (l2_reg & 0x3) { ++ case 0x0: ++ seq_printf(m, "256KiB\n"); ++ break; ++ case 0x1: ++ seq_printf(m, "512KiB\n"); ++ break; ++ case 0x2: ++ seq_printf(m, "1MiB\n"); ++ break; ++ default: ++ seq_printf(m, "unknown size\n"); ++ break; ++ } ++ } ++} ++ ++/* Used by all Motorola PReP */ ++static void prep_mot_cpuinfo(struct seq_file *m) ++{ ++ unsigned int cachew = *((unsigned char *)CACHECRBA); ++ ++ seq_printf(m, "machine\t\t: PReP %s\n", prep_model); ++ ++ /* report amount and type of L2 cache present */ ++ seq_printf(m, "l2 cache\t: "); ++ switch (cachew & L2CACHE_MASK) { ++ case L2CACHE_512KB: ++ seq_printf(m, "512KiB"); ++ break; ++ case L2CACHE_256KB: ++ seq_printf(m, "256KiB"); ++ break; ++ case L2CACHE_1MB: ++ seq_printf(m, "1MiB"); ++ break; ++ case L2CACHE_NONE: ++ seq_printf(m, "none\n"); ++ return; ++ default: ++ seq_printf(m, "%x\n", cachew); ++ } ++ ++ seq_printf(m, ", parity %s", ++ (cachew & L2CACHE_PARITY)? "enabled" : "disabled"); ++ ++ seq_printf(m, " SRAM:"); ++ ++ switch ( ((cachew & 0xf0) >> 4) & ~(0x3) ) { ++ case 1: ++ seq_printf(m, "synchronous, parity, flow-through\n"); ++ break; ++ case 2: ++ seq_printf(m, "asynchronous, no parity\n"); ++ break; ++ case 3: ++ seq_printf(m, "asynchronous, parity\n"); ++ break; ++ default: ++ seq_printf(m, "synchronous, pipelined, no parity\n"); ++ break; ++ } ++} ++ ++static void prep_restart(char *cmd) ++{ ++ local_irq_disable(); /* no interrupts */ ++ ++ /* set exception prefix high - to the prom */ ++ mtmsr(mfmsr() | MSR_IP); ++ ++ /* make sure bit 0 (reset) is a 0 */ ++ outb(inb(0x92) & ~1L, 0x92); ++ /* signal a reset to system control port A - soft reset */ ++ outb(inb(0x92) | 1, 0x92); ++ ++ for (;;) ++ ; ++ /* not reached */ ++} ++ ++static void prep_halt(void) ++{ ++ local_irq_disable(); /* no interrupts */ ++ ++ /* set exception prefix high - to the prom */ ++ mtmsr(mfmsr() | MSR_IP); ++ ++ for (;;) ++ ; ++ /* not reached */ ++} ++ ++/* ++ * On most IBM PReP's, power management is handled by a Signetics 87c750 ++ * behind the Utah component on the ISA bus. To access the 750 you must write ++ * a series of nibbles to port 0x82a (decoded by the Utah). This is described ++ * somewhat in the IBM Carolina Technical Specification. ++ * -Hollis ++ */ ++static void ++utah_sig87c750_setbit(unsigned int bytenum, unsigned int bitnum, int value) ++{ ++ /* ++ * byte1: 0 0 0 1 0 d a5 a4 ++ * byte2: 0 0 0 1 a3 a2 a1 a0 ++ * ++ * d = the bit's value, enabled or disabled ++ * (a5 a4 a3) = the byte number, minus 20 ++ * (a2 a1 a0) = the bit number ++ * ++ * example: set the 5th bit of byte 21 (21.5) ++ * a5 a4 a3 = 001 (byte 1) ++ * a2 a1 a0 = 101 (bit 5) ++ * ++ * byte1 = 0001 0100 (0x14) ++ * byte2 = 0001 1101 (0x1d) ++ */ ++ unsigned char byte1=0x10, byte2=0x10; ++ ++ /* the 750's '20.0' is accessed as '0.0' through Utah (which adds 20) */ ++ bytenum -= 20; ++ ++ byte1 |= (!!value) << 2; /* set d */ ++ byte1 |= (bytenum >> 1) & 0x3; /* set a5, a4 */ ++ ++ byte2 |= (bytenum & 0x1) << 3; /* set a3 */ ++ byte2 |= bitnum & 0x7; /* set a2, a1, a0 */ ++ ++ outb(byte1, PREP_IBM_PM1); /* first nibble */ ++ mb(); ++ udelay(100); /* important: let controller recover */ ++ ++ outb(byte2, PREP_IBM_PM1); /* second nibble */ ++ mb(); ++ udelay(100); /* important: let controller recover */ ++} ++ ++static void prep_sig750_poweroff(void) ++{ ++ /* tweak the power manager found in most IBM PRePs (except Thinkpads) */ ++ ++ local_irq_disable(); ++ /* set exception prefix high - to the prom */ ++ mtmsr(mfmsr() | MSR_IP); ++ ++ utah_sig87c750_setbit(21, 5, 1); /* set bit 21.5, "PMEXEC_OFF" */ ++ ++ for (;;) ++ ; ++ /* not reached */ ++} ++ ++static void __init prep_find_bridges(void) ++{ ++ struct device_node *phb; ++ struct pci_controller *hose; ++ ++ phb = of_find_node_by_type(NULL, "pci"); ++ if (!phb) { ++ printk(KERN_ERR "PReP: Cannot find PCI bridge OF node\n"); ++ return; ++ } ++ ++ hose = pcibios_alloc_controller(); ++ if (!hose) ++ return; ++ ++ pci_process_bridge_OF_ranges(hose, phb, 1); ++ ++ pci_dram_offset = PREP_PCI_DRAM_OFFSET; ++ ISA_DMA_THRESHOLD = 0x00ffffff; ++ DMA_MODE_READ = 0x44; ++ DMA_MODE_WRITE = 0x48; ++ ++ setup_indirect_pci(hose, hose->io_base_phys + 0xcf8, ++ hose->io_base_phys + 0xcfc); ++} ++ ++static void __init prep_setup_arch(void) ++{ ++ struct device_node *root; ++ const char *model; ++ u8 reg; ++ ++ root = of_find_node_by_path("/"); ++ model = of_get_property(root, "model", NULL); ++ of_node_put(root); ++ if (model) ++ prep_model = model; ++ ++ /* init to some ~sane value until calibrate_delay() runs */ ++ loops_per_jiffy = 50000000; /**/ ++ ++ /* Lookup PCI host bridges */ ++ prep_find_bridges(); ++ ++ /* Set up floppy in PS/2 mode */ ++ outb(0x09, SIO_CONFIG_RA); ++ reg = inb(SIO_CONFIG_RD); ++ reg = (reg & 0x3F) | 0x40; ++ outb(reg, SIO_CONFIG_RD); ++ outb(reg, SIO_CONFIG_RD); /* Have to write twice to change! */ ++ ++ if (strncmp(prep_model, "IBM,", 4) == 0) { ++ reg = inb(PREP_IBM_PLANAR); ++ printk(KERN_INFO "PReP: IBM planar ID: %02x\n", reg); ++ switch (reg) { ++ case PREP_IBM_SANDALFOOT: ++ prep_gen_enable_l2(); ++ ppc_md.power_off = prep_sig750_poweroff; ++ ppc_md.show_cpuinfo = prep_sandalfoot_cpuinfo; ++ break; ++ case PREP_IBM_THINKPAD: ++ prep_gen_enable_l2(); ++ /* Carrera is the power manager in the ++ * Thinkpads. Unfortunately not much is known ++ * about it, so we can't power down. ++ */ ++ ppc_md.show_cpuinfo = prep_thinkpad_cpuinfo; ++ break; ++ case PREP_IBM_CAROLINA_IDE_0: ++ case PREP_IBM_CAROLINA_IDE_1: ++ case PREP_IBM_CAROLINA_IDE_2: ++ case PREP_IBM_CAROLINA_IDE_3: ++ case PREP_IBM_CAROLINA_SCSI_0: ++ case PREP_IBM_CAROLINA_SCSI_1: ++ case PREP_IBM_CAROLINA_SCSI_2: ++ case PREP_IBM_CAROLINA_SCSI_3: ++ prep_carolina_enable_l2(); ++ ppc_md.power_off = prep_sig750_poweroff; ++ ppc_md.show_cpuinfo = prep_carolina_cpuinfo; ++ break; ++ case PREP_IBM_TIGER1_133: ++ case PREP_IBM_TIGER1_166: ++ case PREP_IBM_TIGER1_180: ++ case PREP_IBM_TIGER1_xxx: ++ case PREP_IBM_TIGER1_333: ++ prep_carolina_enable_l2(); ++ ppc_md.power_off = prep_sig750_poweroff; ++ ppc_md.show_cpuinfo = prep_tiger1_cpuinfo; ++ break; ++ default: ++ prep_gen_enable_l2(); ++ break; ++ } ++ } else { ++ /* _PREP_Motorola */ ++ prep_gen_enable_l2(); ++ ppc_md.show_cpuinfo = prep_mot_cpuinfo; ++ } ++ ++ /* Read in NVRAM data */ ++/* init_prep_nvram(); */ ++} ++ ++static struct mpic *prep_mpic; ++ ++static void __init prep_find_openpic(void) ++{ ++ struct device_node *np; ++ struct resource r; ++ unsigned long opaddr; ++ ++ np = of_find_node_by_type(NULL, "open-pic"); ++ if (!np) ++ return; ++ ++ if (of_address_to_resource(np, 0, &r)) ++ goto bail; ++ opaddr = r.start; ++ ++ printk(KERN_INFO "OpenPIC at %lx\n", opaddr); ++ ++ prep_mpic = mpic_alloc(np, opaddr, MPIC_PRIMARY, 0, 0, " MPIC "); ++ if (!prep_mpic) { ++ printk(KERN_ERR "Failed to allocate MPIC structure\n"); ++ goto bail; ++ } ++ mpic_init(prep_mpic); ++ ppc_md.get_irq = mpic_get_irq; ++ ++ bail: ++ of_node_put(np); ++} ++ ++static void prep_8259_cascade(unsigned int irq, struct irq_desc *desc) ++{ ++ unsigned int cascade_irq = i8259_irq(); ++ if (cascade_irq != NO_IRQ) ++ generic_handle_irq(cascade_irq); ++ desc->chip->eoi(irq); ++} ++ ++static void __init prep_find_8259(void) ++{ ++ struct device_node *np; ++ struct device_node *pic = NULL; ++ unsigned long int_ack = 0; ++ unsigned int cascade_irq; ++ ++ pic = of_find_node_by_type(NULL, "i8259"); ++ if (!pic) { ++ if (!prep_mpic) ++ printk(KERN_ERR "No interrupt controller found!\n"); ++ return; ++ } ++ ++ for_each_node_by_type(np, "pci") { ++ const unsigned int *addrp = of_get_property(np, ++ "8259-interrupt-acknowledge", NULL); ++ ++ if (!addrp) ++ continue; ++ int_ack = addrp[of_n_addr_cells(np)-1]; ++ break; ++ } ++ if (!np) ++ printk(KERN_WARNING "Cannot find PCI interrupt acknowledge" ++ " address, polling\n"); ++ ++ i8259_init(pic, int_ack); ++ if (!ppc_md.get_irq) ++ ppc_md.get_irq = i8259_irq; ++ if (prep_mpic) { ++ cascade_irq = irq_of_parse_and_map(pic, 0); ++ if (cascade_irq == NO_IRQ) ++ printk(KERN_ERR "i8259: failed to map cascade irq\n"); ++ else ++ set_irq_chained_handler(cascade_irq, ++ prep_8259_cascade); ++ } ++} ++ ++static void __init prep_init_IRQ(void) ++{ ++ prep_find_openpic(); ++ prep_find_8259(); ++} ++ ++#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ++/* ++ * IDE stuff. ++ */ ++static int prep_ide_default_irq(unsigned long base) ++{ ++ switch (base) { ++ case 0x1f0: return 13; ++ case 0x170: return 13; ++ case 0x1e8: return 11; ++ case 0x168: return 10; ++ case 0xfff0: return 14; /* MCP(N)750 ide0 */ ++ case 0xffe0: return 15; /* MCP(N)750 ide1 */ ++ default: return 0; ++ } ++} ++ ++static unsigned long prep_ide_default_io_base(int index) ++{ ++ switch (index) { ++ case 0: return 0x1f0; ++ case 1: return 0x170; ++ case 2: return 0x1e8; ++ case 3: return 0x168; ++ default: ++ return 0; ++ } ++} ++#endif ++ ++#if 0 ++static int __init prep_request_io(void) ++{ ++#ifdef CONFIG_NVRAM ++ request_region(PREP_NVRAM_AS0, 0x8, "nvram"); ++#endif ++ request_region(0x00,0x20,"dma1"); ++ request_region(0x40,0x20,"timer"); ++ request_region(0x80,0x10,"dma page reg"); ++ request_region(0xc0,0x20,"dma2"); ++ ++ return 0; ++} ++device_initcall(prep_request_io); ++#endif ++ ++#ifdef CONFIG_SMP ++static void __init smp_prep_kick_cpu(int nr) ++{ ++ *(unsigned long *)KERNELBASE = nr; ++ asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory"); ++ printk("CPU1 released, waiting\n"); ++} ++ ++static void __init smp_prep_setup_cpu(int cpu_nr) ++{ ++ if (prep_mpic) ++ mpic_setup_this_cpu(); ++} ++ ++static struct smp_ops_t prep_smp_ops = { ++ .message_pass = smp_mpic_message_pass, ++ .probe = smp_mpic_probe, ++ .kick_cpu = smp_prep_kick_cpu, ++ .setup_cpu = smp_prep_setup_cpu, ++ .give_timebase = smp_generic_give_timebase, ++ .take_timebase = smp_generic_take_timebase, ++}; ++#endif /* CONFIG_SMP */ ++ ++static int __init prep_probe(void) ++{ ++ if (! of_flat_dt_is_compatible(of_get_flat_dt_root(), "prep")) ++ return 0; ++ ++#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) ++ ppc_ide_md.default_irq = prep_ide_default_irq; ++ ppc_ide_md.default_io_base = prep_ide_default_io_base; ++#endif ++ ++#ifdef CONFIG_SMP ++ smp_ops = &prep_smp_ops; ++#endif /* CONFIG_SMP */ ++ ++ return 1; ++} ++ ++define_machine(prep) { ++ .name = "PReP", ++ .probe = prep_probe, ++ .setup_arch = prep_setup_arch, ++ .show_cpuinfo = prep_ibm_cpuinfo, /* Overriden for some variants */ ++ .init_IRQ = prep_init_IRQ, ++/* .pcibios_fixup = prep_pcibios_fixup, */ ++ .restart = prep_restart, /* Overriden for some variants */ ++ .power_off = prep_halt,/* Overriden for some variants */ ++ .halt = prep_halt,/* Overriden for some variants */ ++/* .time_init = todc_time_init, */ ++/* .set_rtc_time = todc_set_rtc_time, */ ++/* .get_rtc_time = todc_get_rtc_time, */ ++ .calibrate_decr = generic_calibrate_decr, ++ .progress = udbg_progress, ++/* .nvram_read_val = prep_nvram_read_val, */ ++/* .nvram_write_val = prep_nvram_write_val, */ ++ .phys_mem_access_prot = pci_phys_mem_access_prot, ++}; +Index: working-2.6/include/asm-powerpc/residual.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/include/asm-powerpc/residual.h 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,350 @@ ++/* 7/18/95 */ ++/*----------------------------------------------------------------------------*/ ++/* Residual Data header definitions and prototypes */ ++/*----------------------------------------------------------------------------*/ ++ ++/* Structure map for RESIDUAL on PowerPC Reference Platform */ ++/* residual.h - Residual data structure passed in r3. */ ++/* Load point passed in r4 to boot image. */ ++/* For enum's: if given in hex then they are bit significant, */ ++/* i.e. only one bit is on for each enum */ ++/* Reserved fields must be filled with zeros. */ ++ ++#ifdef __KERNEL__ ++#ifndef _RESIDUAL_ ++#define _RESIDUAL_ ++ ++#ifndef __ASSEMBLY__ ++ ++#define MAX_CPUS 32 /* These should be set to the maximum */ ++#define MAX_MEMS 64 /* number possible for this system. */ ++#define MAX_DEVICES 256 /* Changing these will change the */ ++#define AVE_PNP_SIZE 32 /* structure, hence the version of */ ++#define MAX_MEM_SEGS 64 /* this header file. */ ++ ++/*----------------------------------------------------------------------------*/ ++/* Public structures... */ ++/*----------------------------------------------------------------------------*/ ++ ++#include <asm/prep/pnp.h> ++ ++typedef enum _L1CACHE_TYPE { ++ NoneCAC = 0, ++ SplitCAC = 1, ++ CombinedCAC = 2 ++ } L1CACHE_TYPE; ++ ++typedef enum _TLB_TYPE { ++ NoneTLB = 0, ++ SplitTLB = 1, ++ CombinedTLB = 2 ++ } TLB_TYPE; ++ ++typedef enum _FIRMWARE_SUPPORT { ++ Conventional = 0x01, ++ OpenFirmware = 0x02, ++ Diagnostics = 0x04, ++ LowDebug = 0x08, ++ Multiboot = 0x10, ++ LowClient = 0x20, ++ Hex41 = 0x40, ++ FAT = 0x80, ++ ISO9660 = 0x0100, ++ SCSI_InitiatorID_Override = 0x0200, ++ Tape_Boot = 0x0400, ++ FW_Boot_Path = 0x0800 ++ } FIRMWARE_SUPPORT; ++ ++typedef enum _FIRMWARE_SUPPLIERS { ++ IBMFirmware = 0x00, ++ MotoFirmware = 0x01, /* 7/18/95 */ ++ FirmWorks = 0x02, /* 10/5/95 */ ++ Bull = 0x03, /* 04/03/96 */ ++ } FIRMWARE_SUPPLIERS; ++ ++typedef enum _ENDIAN_SWITCH_METHODS { ++ UsePort92 = 0x01, ++ UsePCIConfigA8 = 0x02, ++ UseFF001030 = 0x03, ++ } ENDIAN_SWITCH_METHODS; ++ ++typedef enum _SPREAD_IO_METHODS { ++ UsePort850 = 0x00, ++/*UsePCIConfigA8 = 0x02,*/ ++ } SPREAD_IO_METHODS; ++ ++typedef struct _VPD { ++ ++ /* Box dependent stuff */ ++ unsigned char PrintableModel[32]; /* Null terminated string. ++ Must be of the form: ++ vvv,<20h>,<model designation>,<0x0> ++ where vvv is the vendor ID ++ e.g. IBM PPS MODEL 6015<0x0> */ ++ unsigned char Serial[16]; /* 12/94: ++ Serial Number; must be of the form: ++ vvv<serial number> where vvv is the ++ vendor ID. ++ e.g. IBM60151234567<20h><20h> */ ++ unsigned char Reserved[48]; ++ unsigned long FirmwareSupplier; /* See FirmwareSuppliers enum */ ++ unsigned long FirmwareSupports; /* See FirmwareSupport enum */ ++ unsigned long NvramSize; /* Size of nvram in bytes */ ++ unsigned long NumSIMMSlots; ++ unsigned short EndianSwitchMethod; /* See EndianSwitchMethods enum */ ++ unsigned short SpreadIOMethod; /* See SpreadIOMethods enum */ ++ unsigned long SmpIar; ++ unsigned long RAMErrLogOffset; /* Heap offset to error log */ ++ unsigned long Reserved5; ++ unsigned long Reserved6; ++ unsigned long ProcessorHz; /* Processor clock frequency in Hertz */ ++ unsigned long ProcessorBusHz; /* Processor bus clock frequency */ ++ unsigned long Reserved7; ++ unsigned long TimeBaseDivisor; /* (Bus clocks per timebase tic)*1000 */ ++ unsigned long WordWidth; /* Word width in bits */ ++ unsigned long PageSize; /* Page size in bytes */ ++ unsigned long CoherenceBlockSize; /* Unit of transfer in/out of cache ++ for which coherency is maintained; ++ normally <= CacheLineSize. */ ++ unsigned long GranuleSize; /* Unit of lock allocation to avoid */ ++ /* false sharing of locks. */ ++ ++ /* L1 Cache variables */ ++ unsigned long CacheSize; /* L1 Cache size in KB. This is the */ ++ /* total size of the L1, whether */ ++ /* combined or split */ ++ unsigned long CacheAttrib; /* L1CACHE_TYPE */ ++ unsigned long CacheAssoc; /* L1 Cache associativity. Use this ++ for combined cache. If split, put ++ zeros here. */ ++ unsigned long CacheLineSize; /* L1 Cache line size in bytes. Use ++ for combined cache. If split, put ++ zeros here. */ ++ /* For split L1 Cache: (= combined if combined cache) */ ++ unsigned long I_CacheSize; ++ unsigned long I_CacheAssoc; ++ unsigned long I_CacheLineSize; ++ unsigned long D_CacheSize; ++ unsigned long D_CacheAssoc; ++ unsigned long D_CacheLineSize; ++ ++ /* Translation Lookaside Buffer variables */ ++ unsigned long TLBSize; /* Total number of TLBs on the system */ ++ unsigned long TLBAttrib; /* Combined I+D or split TLB */ ++ unsigned long TLBAssoc; /* TLB Associativity. Use this for ++ combined TLB. If split, put zeros ++ here. */ ++ /* For split TLB: (= combined if combined TLB) */ ++ unsigned long I_TLBSize; ++ unsigned long I_TLBAssoc; ++ unsigned long D_TLBSize; ++ unsigned long D_TLBAssoc; ++ ++ unsigned long ExtendedVPD; /* Offset to extended VPD area; ++ null if unused */ ++ } VPD; ++ ++typedef enum _DEVICE_FLAGS { ++ Enabled = 0x4000, /* 1 - PCI device is enabled */ ++ Integrated = 0x2000, ++ Failed = 0x1000, /* 1 - device failed POST code tests */ ++ Static = 0x0800, /* 0 - dynamically configurable ++ 1 - static */ ++ Dock = 0x0400, /* 0 - not a docking station device ++ 1 - is a docking station device */ ++ Boot = 0x0200, /* 0 - device cannot be used for BOOT ++ 1 - can be a BOOT device */ ++ Configurable = 0x0100, /* 1 - device is configurable */ ++ Disableable = 0x80, /* 1 - device can be disabled */ ++ PowerManaged = 0x40, /* 0 - not managed; 1 - managed */ ++ ReadOnly = 0x20, /* 1 - device is read only */ ++ Removable = 0x10, /* 1 - device is removable */ ++ ConsoleIn = 0x08, ++ ConsoleOut = 0x04, ++ Input = 0x02, ++ Output = 0x01 ++ } DEVICE_FLAGS; ++ ++typedef enum _BUS_ID { ++ ISADEVICE = 0x01, ++ EISADEVICE = 0x02, ++ PCIDEVICE = 0x04, ++ PCMCIADEVICE = 0x08, ++ PNPISADEVICE = 0x10, ++ MCADEVICE = 0x20, ++ MXDEVICE = 0x40, /* Devices on mezzanine bus */ ++ PROCESSORDEVICE = 0x80, /* Devices on processor bus */ ++ VMEDEVICE = 0x100, ++ } BUS_ID; ++ ++typedef struct _DEVICE_ID { ++ unsigned long BusId; /* See BUS_ID enum above */ ++ unsigned long DevId; /* Big Endian format */ ++ unsigned long SerialNum; /* For multiple usage of a single ++ DevId */ ++ unsigned long Flags; /* See DEVICE_FLAGS enum above */ ++ unsigned char BaseType; /* See pnp.h for bit definitions */ ++ unsigned char SubType; /* See pnp.h for bit definitions */ ++ unsigned char Interface; /* See pnp.h for bit definitions */ ++ unsigned char Spare; ++ } DEVICE_ID; ++ ++typedef union _BUS_ACCESS { ++ struct _PnPAccess{ ++ unsigned char CSN; ++ unsigned char LogicalDevNumber; ++ unsigned short ReadDataPort; ++ } PnPAccess; ++ struct _ISAAccess{ ++ unsigned char SlotNumber; /* ISA Slot Number generally not ++ available; 0 if unknown */ ++ unsigned char LogicalDevNumber; ++ unsigned short ISAReserved; ++ } ISAAccess; ++ struct _MCAAccess{ ++ unsigned char SlotNumber; ++ unsigned char LogicalDevNumber; ++ unsigned short MCAReserved; ++ } MCAAccess; ++ struct _PCMCIAAccess{ ++ unsigned char SlotNumber; ++ unsigned char LogicalDevNumber; ++ unsigned short PCMCIAReserved; ++ } PCMCIAAccess; ++ struct _EISAAccess{ ++ unsigned char SlotNumber; ++ unsigned char FunctionNumber; ++ unsigned short EISAReserved; ++ } EISAAccess; ++ struct _PCIAccess{ ++ unsigned char BusNumber; ++ unsigned char DevFuncNumber; ++ unsigned short PCIReserved; ++ } PCIAccess; ++ struct _ProcBusAccess{ ++ unsigned char BusNumber; ++ unsigned char BUID; ++ unsigned short ProcBusReserved; ++ } ProcBusAccess; ++ } BUS_ACCESS; ++ ++/* Per logical device information */ ++typedef struct _PPC_DEVICE { ++ DEVICE_ID DeviceId; ++ BUS_ACCESS BusAccess; ++ ++ /* The following three are offsets into the DevicePnPHeap */ ++ /* All are in PnP compressed format */ ++ unsigned long AllocatedOffset; /* Allocated resource description */ ++ unsigned long PossibleOffset; /* Possible resource description */ ++ unsigned long CompatibleOffset; /* Compatible device identifiers */ ++ } PPC_DEVICE; ++ ++typedef enum _CPU_STATE { ++ CPU_GOOD = 0, /* CPU is present, and active */ ++ CPU_GOOD_FW = 1, /* CPU is present, and in firmware */ ++ CPU_OFF = 2, /* CPU is present, but inactive */ ++ CPU_FAILED = 3, /* CPU is present, but failed POST */ ++ CPU_NOT_PRESENT = 255 /* CPU not present */ ++ } CPU_STATE; ++ ++typedef struct _PPC_CPU { ++ unsigned long CpuType; /* Result of mfspr from Processor ++ Version Register (PVR). ++ PVR(0-15) = Version (e.g. 601) ++ PVR(16-31 = EC Level */ ++ unsigned char CpuNumber; /* CPU Number for this processor */ ++ unsigned char CpuState; /* CPU State, see CPU_STATE enum */ ++ unsigned short Reserved; ++ } PPC_CPU; ++ ++typedef struct _PPC_MEM { ++ unsigned long SIMMSize; /* 0 - absent or bad ++ 8M, 32M (in MB) */ ++ } PPC_MEM; ++ ++typedef enum _MEM_USAGE { ++ Other = 0x8000, ++ ResumeBlock = 0x4000, /* for use by power management */ ++ SystemROM = 0x2000, /* Flash memory (populated) */ ++ UnPopSystemROM = 0x1000, /* Unpopulated part of SystemROM area */ ++ IOMemory = 0x0800, ++ SystemIO = 0x0400, ++ SystemRegs = 0x0200, ++ PCIAddr = 0x0100, ++ PCIConfig = 0x80, ++ ISAAddr = 0x40, ++ Unpopulated = 0x20, /* Unpopulated part of System Memory */ ++ Free = 0x10, /* Free part of System Memory */ ++ BootImage = 0x08, /* BootImage part of System Memory */ ++ FirmwareCode = 0x04, /* FirmwareCode part of System Memory */ ++ FirmwareHeap = 0x02, /* FirmwareHeap part of System Memory */ ++ FirmwareStack = 0x01 /* FirmwareStack part of System Memory*/ ++ } MEM_USAGE; ++ ++typedef struct _MEM_MAP { ++ unsigned long Usage; /* See MEM_USAGE above */ ++ unsigned long BasePage; /* Page number measured in 4KB pages */ ++ unsigned long PageCount; /* Page count measured in 4KB pages */ ++ } MEM_MAP; ++ ++typedef struct _RESIDUAL { ++ unsigned long ResidualLength; /* Length of Residual */ ++ unsigned char Version; /* of this data structure */ ++ unsigned char Revision; /* of this data structure */ ++ unsigned short EC; /* of this data structure */ ++ /* VPD */ ++ VPD VitalProductData; ++ /* CPU */ ++ unsigned short MaxNumCpus; /* Max CPUs in this system */ ++ unsigned short ActualNumCpus; /* ActualNumCpus < MaxNumCpus means */ ++ /* that there are unpopulated or */ ++ /* otherwise unusable cpu locations */ ++ PPC_CPU Cpus[MAX_CPUS]; ++ /* Memory */ ++ unsigned long TotalMemory; /* Total amount of memory installed */ ++ unsigned long GoodMemory; /* Total amount of good memory */ ++ unsigned long ActualNumMemSegs; ++ MEM_MAP Segs[MAX_MEM_SEGS]; ++ unsigned long ActualNumMemories; ++ PPC_MEM Memories[MAX_MEMS]; ++ /* Devices */ ++ unsigned long ActualNumDevices; ++ PPC_DEVICE Devices[MAX_DEVICES]; ++ unsigned char DevicePnPHeap[2*MAX_DEVICES*AVE_PNP_SIZE]; ++ } RESIDUAL; ++ ++ ++/* ++ * Forward declaration - we can't include <linux/pci.h> because it ++ * breaks the boot loader ++ */ ++struct pci_dev; ++ ++extern RESIDUAL *res; ++extern void print_residual_device_info(void); ++extern PPC_DEVICE *residual_find_device(unsigned long BusMask, ++ unsigned char * DevID, int BaseType, ++ int SubType, int Interface, int n); ++extern int residual_pcidev_irq(struct pci_dev *dev); ++extern void residual_irq_mask(char *irq_edge_mask_lo, char *irq_edge_mask_hi); ++extern unsigned int residual_isapic_addr(void); ++extern PnP_TAG_PACKET *PnP_find_packet(unsigned char *p, unsigned packet_tag, ++ int n); ++extern PnP_TAG_PACKET *PnP_find_small_vendor_packet(unsigned char *p, ++ unsigned packet_type, ++ int n); ++extern PnP_TAG_PACKET *PnP_find_large_vendor_packet(unsigned char *p, ++ unsigned packet_type, ++ int n); ++ ++#ifdef CONFIG_PREP_RESIDUAL ++#define have_residual_data (res && res->ResidualLength) ++#else ++#define have_residual_data 0 ++#endif ++ ++#endif /* __ASSEMBLY__ */ ++#endif /* ndef _RESIDUAL_ */ ++ ++#endif /* __KERNEL__ */ +Index: working-2.6/arch/powerpc/boot/pnp.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/boot/pnp.h 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,640 @@ ++#ifndef _PPC_BOOT_PNP_H_ ++#define _PPC_BOOT_PNP_H_ ++/* 11/02/95 */ ++/*----------------------------------------------------------------------------*/ ++/* Plug and Play header definitions */ ++/*----------------------------------------------------------------------------*/ ++ ++/* Structure map for PnP on PowerPC Reference Platform */ ++/* See Plug and Play ISA Specification, Version 1.0, May 28, 1993. It */ ++/* (or later versions) is available on Compuserve in the PLUGPLAY area. */ ++/* This code has extensions to that specification, namely new short and */ ++/* long tag types for platform dependent information */ ++ ++/* Warning: LE notation used throughout this file */ ++ ++/* For enum's: if given in hex then they are bit significant, i.e. */ ++/* only one bit is on for each enum */ ++ ++#define MAX_MEM_REGISTERS 9 ++#define MAX_IO_PORTS 20 ++#define MAX_IRQS 7 ++/*#define MAX_DMA_CHANNELS 7*/ ++ ++/* Interrupt controllers */ ++ ++#define PNPinterrupt0 "PNP0000" /* AT Interrupt Controller */ ++#define PNPinterrupt1 "PNP0001" /* EISA Interrupt Controller */ ++#define PNPinterrupt2 "PNP0002" /* MCA Interrupt Controller */ ++#define PNPinterrupt3 "PNP0003" /* APIC */ ++#define PNPExtInt "IBM000D" /* PowerPC Extended Interrupt Controller */ ++ ++/* Timers */ ++ ++#define PNPtimer0 "PNP0100" /* AT Timer */ ++#define PNPtimer1 "PNP0101" /* EISA Timer */ ++#define PNPtimer2 "PNP0102" /* MCA Timer */ ++ ++/* DMA controllers */ ++ ++#define PNPdma0 "PNP0200" /* AT DMA Controller */ ++#define PNPdma1 "PNP0201" /* EISA DMA Controller */ ++#define PNPdma2 "PNP0202" /* MCA DMA Controller */ ++ ++/* start of August 15, 1994 additions */ ++/* CMOS */ ++#define PNPCMOS "IBM0009" /* CMOS */ ++ ++/* L2 Cache */ ++#define PNPL2 "IBM0007" /* L2 Cache */ ++ ++/* NVRAM */ ++#define PNPNVRAM "IBM0008" /* NVRAM */ ++ ++/* Power Management */ ++#define PNPPM "IBM0005" /* Power Management */ ++/* end of August 15, 1994 additions */ ++ ++/* Keyboards */ ++ ++#define PNPkeyboard0 "PNP0300" /* IBM PC/XT KB Cntlr (83 key, no mouse) */ ++#define PNPkeyboard1 "PNP0301" /* Olivetti ICO (102 key) */ ++#define PNPkeyboard2 "PNP0302" /* IBM PC/AT KB Cntlr (84 key) */ ++#define PNPkeyboard3 "PNP0303" /* IBM Enhanced (101/2 key, PS/2 mouse) */ ++#define PNPkeyboard4 "PNP0304" /* Nokia 1050 KB Cntlr */ ++#define PNPkeyboard5 "PNP0305" /* Nokia 9140 KB Cntlr */ ++#define PNPkeyboard6 "PNP0306" /* Standard Japanese KB Cntlr */ ++#define PNPkeyboard7 "PNP0307" /* Microsoft Windows (R) KB Cntlr */ ++ ++/* Parallel port controllers */ ++ ++#define PNPparallel0 "PNP0400" /* Standard LPT Parallel Port */ ++#define PNPparallel1 "PNP0401" /* ECP Parallel Port */ ++#define PNPepp "IBM001C" /* EPP Parallel Port */ ++ ++/* Serial port controllers */ ++ ++#define PNPserial0 "PNP0500" /* Standard PC Serial port */ ++#define PNPSerial1 "PNP0501" /* 16550A Compatible Serial port */ ++ ++/* Disk controllers */ ++ ++#define PNPdisk0 "PNP0600" /* Generic ESDI/IDE/ATA Compat HD Cntlr */ ++#define PNPdisk1 "PNP0601" /* Plus Hardcard II */ ++#define PNPdisk2 "PNP0602" /* Plus Hardcard IIXL/EZ */ ++ ++/* Diskette controllers */ ++ ++#define PNPdiskette0 "PNP0700" /* PC Standard Floppy Disk Controller */ ++ ++/* Display controllers */ ++ ++#define PNPdisplay0 "PNP0900" /* VGA Compatible */ ++#define PNPdisplay1 "PNP0901" /* Video Seven VGA */ ++#define PNPdisplay2 "PNP0902" /* 8514/A Compatible */ ++#define PNPdisplay3 "PNP0903" /* Trident VGA */ ++#define PNPdisplay4 "PNP0904" /* Cirrus Logic Laptop VGA */ ++#define PNPdisplay5 "PNP0905" /* Cirrus Logic VGA */ ++#define PNPdisplay6 "PNP0906" /* Tseng ET4000 or ET4000/W32 */ ++#define PNPdisplay7 "PNP0907" /* Western Digital VGA */ ++#define PNPdisplay8 "PNP0908" /* Western Digital Laptop VGA */ ++#define PNPdisplay9 "PNP0909" /* S3 */ ++#define PNPdisplayA "PNP090A" /* ATI Ultra Pro/Plus (Mach 32) */ ++#define PNPdisplayB "PNP090B" /* ATI Ultra (Mach 8) */ ++#define PNPdisplayC "PNP090C" /* XGA Compatible */ ++#define PNPdisplayD "PNP090D" /* ATI VGA Wonder */ ++#define PNPdisplayE "PNP090E" /* Weitek P9000 Graphics Adapter */ ++#define PNPdisplayF "PNP090F" /* Oak Technology VGA */ ++ ++/* Peripheral busses */ ++ ++#define PNPbuses0 "PNP0A00" /* ISA Bus */ ++#define PNPbuses1 "PNP0A01" /* EISA Bus */ ++#define PNPbuses2 "PNP0A02" /* MCA Bus */ ++#define PNPbuses3 "PNP0A03" /* PCI Bus */ ++#define PNPbuses4 "PNP0A04" /* VESA/VL Bus */ ++ ++/* RTC, BIOS, planar devices */ ++ ++#define PNPspeaker0 "PNP0800" /* AT Style Speaker Sound */ ++#define PNPrtc0 "PNP0B00" /* AT RTC */ ++#define PNPpnpbios0 "PNP0C00" /* PNP BIOS (only created by root enum) */ ++#define PNPpnpbios1 "PNP0C01" /* System Board Memory Device */ ++#define PNPpnpbios2 "PNP0C02" /* Math Coprocessor */ ++#define PNPpnpbios3 "PNP0C03" /* PNP BIOS Event Notification Interrupt */ ++ ++/* PCMCIA controller */ ++ ++#define PNPpcmcia0 "PNP0E00" /* Intel 82365 Compatible PCMCIA Cntlr */ ++ ++/* Mice */ ++ ++#define PNPmouse0 "PNP0F00" /* Microsoft Bus Mouse */ ++#define PNPmouse1 "PNP0F01" /* Microsoft Serial Mouse */ ++#define PNPmouse2 "PNP0F02" /* Microsoft Inport Mouse */ ++#define PNPmouse3 "PNP0F03" /* Microsoft PS/2 Mouse */ ++#define PNPmouse4 "PNP0F04" /* Mousesystems Mouse */ ++#define PNPmouse5 "PNP0F05" /* Mousesystems 3 Button Mouse - COM2 */ ++#define PNPmouse6 "PNP0F06" /* Genius Mouse - COM1 */ ++#define PNPmouse7 "PNP0F07" /* Genius Mouse - COM2 */ ++#define PNPmouse8 "PNP0F08" /* Logitech Serial Mouse */ ++#define PNPmouse9 "PNP0F09" /* Microsoft Ballpoint Serial Mouse */ ++#define PNPmouseA "PNP0F0A" /* Microsoft PNP Mouse */ ++#define PNPmouseB "PNP0F0B" /* Microsoft PNP Ballpoint Mouse */ ++ ++/* Modems */ ++ ++#define PNPmodem0 "PNP9000" /* Specific IDs TBD */ ++ ++/* Network controllers */ ++ ++#define PNPnetworkC9 "PNP80C9" /* IBM Token Ring */ ++#define PNPnetworkCA "PNP80CA" /* IBM Token Ring II */ ++#define PNPnetworkCB "PNP80CB" /* IBM Token Ring II/Short */ ++#define PNPnetworkCC "PNP80CC" /* IBM Token Ring 4/16Mbs */ ++#define PNPnetwork27 "PNP8327" /* IBM Token Ring (All types) */ ++#define PNPnetworket "IBM0010" /* IBM Ethernet used by Power PC */ ++#define PNPneteisaet "IBM2001" /* IBM Ethernet EISA adapter */ ++#define PNPAMD79C970 "IBM0016" /* AMD 79C970 (PCI Ethernet) */ ++ ++/* SCSI controllers */ ++ ++#define PNPscsi0 "PNPA000" /* Adaptec 154x Compatible SCSI Cntlr */ ++#define PNPscsi1 "PNPA001" /* Adaptec 174x Compatible SCSI Cntlr */ ++#define PNPscsi2 "PNPA002" /* Future Domain 16-700 Compat SCSI Cntlr*/ ++#define PNPscsi3 "PNPA003" /* Panasonic CDROM Adapter (SBPro/SB16) */ ++#define PNPscsiF "IBM000F" /* NCR 810 SCSI Controller */ ++#define PNPscsi825 "IBM001B" /* NCR 825 SCSI Controller */ ++#define PNPscsi875 "IBM0018" /* NCR 875 SCSI Controller */ ++ ++/* Sound/Video, Multimedia */ ++ ++#define PNPmm0 "PNPB000" /* Sound Blaster Compatible Sound Device */ ++#define PNPmm1 "PNPB001" /* MS Windows Sound System Compat Device */ ++#define PNPmmF "IBM000E" /* Crystal CS4231 Audio Device */ ++#define PNPv7310 "IBM0015" /* ASCII V7310 Video Capture Device */ ++#define PNPmm4232 "IBM0017" /* Crystal CS4232 Audio Device */ ++#define PNPpmsyn "IBM001D" /* YMF 289B chip (Yamaha) */ ++#define PNPgp4232 "IBM0012" /* Crystal CS4232 Game Port */ ++#define PNPmidi4232 "IBM0013" /* Crystal CS4232 MIDI */ ++ ++/* Operator Panel */ ++#define PNPopctl "IBM000B" /* Operator's panel */ ++ ++/* Service Processor */ ++#define PNPsp "IBM0011" /* IBM Service Processor */ ++#define PNPLTsp "IBM001E" /* Lightning/Terlingua Support Processor */ ++#define PNPLTmsp "IBM001F" /* Lightning/Terlingua Mini-SP */ ++ ++/* Memory Controller */ ++#define PNPmemctl "IBM000A" /* Memory controller */ ++ ++/* Graphics Assist */ ++#define PNPg_assist "IBM0014" /* Graphics Assist */ ++ ++/* Miscellaneous Device Controllers */ ++#define PNPtablet "IBM0019" /* IBM Tablet Controller */ ++ ++/* PNP Packet Handles */ ++ ++#define S1_Packet 0x0A /* Version resource */ ++#define S2_Packet 0x15 /* Logical DEVID (without flags) */ ++#define S2_Packet_flags 0x16 /* Logical DEVID (with flags) */ ++#define S3_Packet 0x1C /* Compatible device ID */ ++#define S4_Packet 0x22 /* IRQ resource (without flags) */ ++#define S4_Packet_flags 0x23 /* IRQ resource (with flags) */ ++#define S5_Packet 0x2A /* DMA resource */ ++#define S6_Packet 0x30 /* Depend funct start (w/o priority) */ ++#define S6_Packet_priority 0x31 /* Depend funct start (w/ priority) */ ++#define S7_Packet 0x38 /* Depend funct end */ ++#define S8_Packet 0x47 /* I/O port resource (w/o fixed loc) */ ++#define S9_Packet_fixed 0x4B /* I/O port resource (w/ fixed loc) */ ++#define S14_Packet 0x71 /* Vendor defined */ ++#define S15_Packet 0x78 /* End of resource (w/o checksum) */ ++#define S15_Packet_checksum 0x79 /* End of resource (w/ checksum) */ ++#define L1_Packet 0x81 /* Memory range */ ++#define L1_Shadow 0x20 /* Memory is shadowable */ ++#define L1_32bit_mem 0x18 /* 32-bit memory only */ ++#define L1_8_16bit_mem 0x10 /* 8- and 16-bit supported */ ++#define L1_Decode_Hi 0x04 /* decode supports high address */ ++#define L1_Cache 0x02 /* read cacheable, write-through */ ++#define L1_Writeable 0x01 /* Memory is writeable */ ++#define L2_Packet 0x82 /* ANSI ID string */ ++#define L3_Packet 0x83 /* Unicode ID string */ ++#define L4_Packet 0x84 /* Vendor defined */ ++#define L5_Packet 0x85 /* Large I/O */ ++#define L6_Packet 0x86 /* 32-bit Fixed Loc Mem Range Desc */ ++#define END_TAG 0x78 /* End of resource */ ++#define DF_START_TAG 0x30 /* Dependent function start */ ++#define DF_START_TAG_priority 0x31 /* Dependent function start */ ++#define DF_END_TAG 0x38 /* Dependent function end */ ++#define SUBOPTIMAL_CONFIGURATION 0x2 /* Priority byte sub optimal config */ ++ ++/* Device Base Type Codes */ ++ ++typedef enum _PnP_BASE_TYPE { ++ Reserved = 0, ++ MassStorageDevice = 1, ++ NetworkInterfaceController = 2, ++ DisplayController = 3, ++ MultimediaController = 4, ++ MemoryController = 5, ++ BridgeController = 6, ++ CommunicationsDevice = 7, ++ SystemPeripheral = 8, ++ InputDevice = 9, ++ ServiceProcessor = 0x0A, /* 11/2/95 */ ++ } PnP_BASE_TYPE; ++ ++/* Device Sub Type Codes */ ++ ++typedef enum _PnP_SUB_TYPE { ++ SCSIController = 0, ++ IDEController = 1, ++ FloppyController = 2, ++ IPIController = 3, ++ OtherMassStorageController = 0x80, ++ ++ EthernetController = 0, ++ TokenRingController = 1, ++ FDDIController = 2, ++ OtherNetworkController = 0x80, ++ ++ VGAController= 0, ++ SVGAController= 1, ++ XGAController= 2, ++ OtherDisplayController = 0x80, ++ ++ VideoController = 0, ++ AudioController = 1, ++ OtherMultimediaController = 0x80, ++ ++ RAM = 0, ++ FLASH = 1, ++ OtherMemoryDevice = 0x80, ++ ++ HostProcessorBridge = 0, ++ ISABridge = 1, ++ EISABridge = 2, ++ MicroChannelBridge = 3, ++ PCIBridge = 4, ++ PCMCIABridge = 5, ++ VMEBridge = 6, ++ OtherBridgeDevice = 0x80, ++ ++ RS232Device = 0, ++ ATCompatibleParallelPort = 1, ++ OtherCommunicationsDevice = 0x80, ++ ++ ProgrammableInterruptController = 0, ++ DMAController = 1, ++ SystemTimer = 2, ++ RealTimeClock = 3, ++ L2Cache = 4, ++ NVRAM = 5, ++ PowerManagement = 6, ++ CMOS = 7, ++ OperatorPanel = 8, ++ ServiceProcessorClass1 = 9, ++ ServiceProcessorClass2 = 0xA, ++ ServiceProcessorClass3 = 0xB, ++ GraphicAssist = 0xC, ++ SystemPlanar = 0xF, /* 10/5/95 */ ++ OtherSystemPeripheral = 0x80, ++ ++ KeyboardController = 0, ++ Digitizer = 1, ++ MouseController = 2, ++ TabletController = 3, /* 10/27/95 */ ++ OtherInputController = 0x80, ++ ++ GeneralMemoryController = 0, ++ } PnP_SUB_TYPE; ++ ++/* Device Interface Type Codes */ ++ ++typedef enum _PnP_INTERFACE { ++ General = 0, ++ GeneralSCSI = 0, ++ GeneralIDE = 0, ++ ATACompatible = 1, ++ ++ GeneralFloppy = 0, ++ Compatible765 = 1, ++ NS398_Floppy = 2, /* NS Super I/O wired to use index ++ register at port 398 and data ++ register at port 399 */ ++ NS26E_Floppy = 3, /* Ports 26E and 26F */ ++ NS15C_Floppy = 4, /* Ports 15C and 15D */ ++ NS2E_Floppy = 5, /* Ports 2E and 2F */ ++ CHRP_Floppy = 6, /* CHRP Floppy in PR*P system */ ++ ++ GeneralIPI = 0, ++ ++ GeneralEther = 0, ++ GeneralToken = 0, ++ GeneralFDDI = 0, ++ ++ GeneralVGA = 0, ++ GeneralSVGA = 0, ++ GeneralXGA = 0, ++ ++ GeneralVideo = 0, ++ GeneralAudio = 0, ++ CS4232Audio = 1, /* CS 4232 Plug 'n Play Configured */ ++ ++ GeneralRAM = 0, ++ GeneralFLASH = 0, ++ PCIMemoryController = 0, /* PCI Config Method */ ++ RS6KMemoryController = 1, /* RS6K Config Method */ ++ ++ GeneralHostBridge = 0, ++ GeneralISABridge = 0, ++ GeneralEISABridge = 0, ++ GeneralMCABridge = 0, ++ GeneralPCIBridge = 0, ++ PCIBridgeDirect = 0, ++ PCIBridgeIndirect = 1, ++ PCIBridgeRS6K = 2, ++ GeneralPCMCIABridge = 0, ++ GeneralVMEBridge = 0, ++ ++ GeneralRS232 = 0, ++ COMx = 1, ++ Compatible16450 = 2, ++ Compatible16550 = 3, ++ NS398SerPort = 4, /* NS Super I/O wired to use index ++ register at port 398 and data ++ register at port 399 */ ++ NS26ESerPort = 5, /* Ports 26E and 26F */ ++ NS15CSerPort = 6, /* Ports 15C and 15D */ ++ NS2ESerPort = 7, /* Ports 2E and 2F */ ++ ++ GeneralParPort = 0, ++ LPTx = 1, ++ NS398ParPort = 2, /* NS Super I/O wired to use index ++ register at port 398 and data ++ register at port 399 */ ++ NS26EParPort = 3, /* Ports 26E and 26F */ ++ NS15CParPort = 4, /* Ports 15C and 15D */ ++ NS2EParPort = 5, /* Ports 2E and 2F */ ++ ++ GeneralPIC = 0, ++ ISA_PIC = 1, ++ EISA_PIC = 2, ++ MPIC = 3, ++ RS6K_PIC = 4, ++ ++ GeneralDMA = 0, ++ ISA_DMA = 1, ++ EISA_DMA = 2, ++ ++ GeneralTimer = 0, ++ ISA_Timer = 1, ++ EISA_Timer = 2, ++ GeneralRTC = 0, ++ ISA_RTC = 1, ++ ++ StoreThruOnly = 1, ++ StoreInEnabled = 2, ++ RS6KL2Cache = 3, ++ ++ IndirectNVRAM = 0, /* Indirectly addressed */ ++ DirectNVRAM = 1, /* Memory Mapped */ ++ IndirectNVRAM24 = 2, /* Indirectly addressed - 24 bit */ ++ ++ GeneralPowerManagement = 0, ++ EPOWPowerManagement = 1, ++ PowerControl = 2, // d1378 ++ ++ GeneralCMOS = 0, ++ ++ GeneralOPPanel = 0, ++ HarddiskLight = 1, ++ CDROMLight = 2, ++ PowerLight = 3, ++ KeyLock = 4, ++ ANDisplay = 5, /* AlphaNumeric Display */ ++ SystemStatusLED = 6, /* 3 digit 7 segment LED */ ++ CHRP_SystemStatusLED = 7, /* CHRP LEDs in PR*P system */ ++ ++ GeneralServiceProcessor = 0, ++ ++ TransferData = 1, ++ IGMC32 = 2, ++ IGMC64 = 3, ++ ++ GeneralSystemPlanar = 0, /* 10/5/95 */ ++ ++ } PnP_INTERFACE; ++ ++/* PnP resources */ ++ ++/* Compressed ASCII is 5 bits per char; 00001=A ... 11010=Z */ ++ ++typedef struct _SERIAL_ID { ++ unsigned char VendorID0; /* Bit(7)=0 */ ++ /* Bits(6:2)=1st character in */ ++ /* compressed ASCII */ ++ /* Bits(1:0)=2nd character in */ ++ /* compressed ASCII bits(4:3) */ ++ unsigned char VendorID1; /* Bits(7:5)=2nd character in */ ++ /* compressed ASCII bits(2:0) */ ++ /* Bits(4:0)=3rd character in */ ++ /* compressed ASCII */ ++ unsigned char VendorID2; /* Product number - vendor assigned */ ++ unsigned char VendorID3; /* Product number - vendor assigned */ ++ ++/* Serial number is to provide uniqueness if more than one board of same */ ++/* type is in system. Must be "FFFFFFFF" if feature not supported. */ ++ ++ unsigned char Serial0; /* Unique serial number bits (7:0) */ ++ unsigned char Serial1; /* Unique serial number bits (15:8) */ ++ unsigned char Serial2; /* Unique serial number bits (23:16) */ ++ unsigned char Serial3; /* Unique serial number bits (31:24) */ ++ unsigned char Checksum; ++ } SERIAL_ID; ++ ++typedef enum _PnPItemName { ++ Unused = 0, ++ PnPVersion = 1, ++ LogicalDevice = 2, ++ CompatibleDevice = 3, ++ IRQFormat = 4, ++ DMAFormat = 5, ++ StartDepFunc = 6, ++ EndDepFunc = 7, ++ IOPort = 8, ++ FixedIOPort = 9, ++ Res1 = 10, ++ Res2 = 11, ++ Res3 = 12, ++ SmallVendorItem = 14, ++ EndTag = 15, ++ MemoryRange = 1, ++ ANSIIdentifier = 2, ++ UnicodeIdentifier = 3, ++ LargeVendorItem = 4, ++ MemoryRange32 = 5, ++ MemoryRangeFixed32 = 6, ++ } PnPItemName; ++ ++/* Define a bunch of access functions for the bits in the tag field */ ++ ++/* Tag type - 0 = small; 1 = large */ ++#define tag_type(t) (((t) & 0x80)>>7) ++#define set_tag_type(t,v) (t = (t & 0x7f) | ((v)<<7)) ++ ++/* Small item name is 4 bits - one of PnPItemName enum above */ ++#define tag_small_item_name(t) (((t) & 0x78)>>3) ++#define set_tag_small_item_name(t,v) (t = (t & 0x07) | ((v)<<3)) ++ ++/* Small item count is 3 bits - count of further bytes in packet */ ++#define tag_small_count(t) ((t) & 0x07) ++#define set_tag_count(t,v) (t = (t & 0x78) | (v)) ++ ++/* Large item name is 7 bits - one of PnPItemName enum above */ ++#define tag_large_item_name(t) ((t) & 0x7f) ++#define set_tag_large_item_name(t,v) (t = (t | 0x80) | (v)) ++ ++/* a PnP resource is a bunch of contiguous TAG packets ending with an end tag */ ++ ++typedef union _PnP_TAG_PACKET { ++ struct _S1_Pack{ /* VERSION PACKET */ ++ unsigned char Tag; /* small tag = 0x0a */ ++ unsigned char Version[2]; /* PnP version, Vendor version */ ++ } S1_Pack; ++ ++ struct _S2_Pack{ /* LOGICAL DEVICE ID PACKET */ ++ unsigned char Tag; /* small tag = 0x15 or 0x16 */ ++ unsigned char DevId[4]; /* Logical device id */ ++ unsigned char Flags[2]; /* bit(0) boot device; */ ++ /* bit(7:1) cmd in range x31-x37 */ ++ /* bit(7:0) cmd in range x28-x3f (opt)*/ ++ } S2_Pack; ++ ++ struct _S3_Pack{ /* COMPATIBLE DEVICE ID PACKET */ ++ unsigned char Tag; /* small tag = 0x1c */ ++ unsigned char CompatId[4]; /* Compatible device id */ ++ } S3_Pack; ++ ++ struct _S4_Pack{ /* IRQ PACKET */ ++ unsigned char Tag; /* small tag = 0x22 or 0x23 */ ++ unsigned char IRQMask[2]; /* bit(0) is IRQ0, ...; */ ++ /* bit(0) is IRQ8 ... */ ++ unsigned char IRQInfo; /* optional; assume bit(0)=1; else */ ++ /* bit(0) - high true edge sensitive */ ++ /* bit(1) - low true edge sensitive */ ++ /* bit(2) - high true level sensitive*/ ++ /* bit(3) - low true level sensitive */ ++ /* bit(7:4) - must be 0 */ ++ } S4_Pack; ++ ++ struct _S5_Pack{ /* DMA PACKET */ ++ unsigned char Tag; /* small tag = 0x2a */ ++ unsigned char DMAMask; /* bit(0) is channel 0 ... */ ++ unsigned char DMAInfo; ++ } S5_Pack; ++ ++ struct _S6_Pack{ /* START DEPENDENT FUNCTION PACKET */ ++ unsigned char Tag; /* small tag = 0x30 or 0x31 */ ++ unsigned char Priority; /* Optional; if missing then x01; else*/ ++ /* x00 = best possible */ ++ /* x01 = acceptible */ ++ /* x02 = sub-optimal but functional */ ++ } S6_Pack; ++ ++ struct _S7_Pack{ /* END DEPENDENT FUNCTION PACKET */ ++ unsigned char Tag; /* small tag = 0x38 */ ++ } S7_Pack; ++ ++ struct _S8_Pack{ /* VARIABLE I/O PORT PACKET */ ++ unsigned char Tag; /* small tag x47 */ ++ unsigned char IOInfo; /* x0 = decode only bits(9:0); */ ++#define ISAAddr16bit 0x01 /* x01 = decode bits(15:0) */ ++ unsigned char RangeMin[2]; /* Min base address */ ++ unsigned char RangeMax[2]; /* Max base address */ ++ unsigned char IOAlign; /* base alignmt, incr in 1B blocks */ ++ unsigned char IONum; /* number of contiguous I/O ports */ ++ } S8_Pack; ++ ++ struct _S9_Pack{ /* FIXED I/O PORT PACKET */ ++ unsigned char Tag; /* small tag = 0x4b */ ++ unsigned char Range[2]; /* base address 10 bits */ ++ unsigned char IONum; /* number of contiguous I/O ports */ ++ } S9_Pack; ++ ++ struct _S14_Pack{ /* VENDOR DEFINED PACKET */ ++ unsigned char Tag; /* small tag = 0x7m m = 1-7 */ ++ union _S14_Data{ ++ unsigned char Data[7]; /* Vendor defined */ ++ struct _S14_PPCPack{ /* Pr*p s14 pack */ ++ unsigned char Type; /* 00=non-IBM */ ++ unsigned char PPCData[6]; /* Vendor defined */ ++ } S14_PPCPack; ++ } S14_Data; ++ } S14_Pack; ++ ++ struct _S15_Pack{ /* END PACKET */ ++ unsigned char Tag; /* small tag = 0x78 or 0x79 */ ++ unsigned char Check; /* optional - checksum */ ++ } S15_Pack; ++ ++ struct _L1_Pack{ /* MEMORY RANGE PACKET */ ++ unsigned char Tag; /* large tag = 0x81 */ ++ unsigned char Count0; /* x09 */ ++ unsigned char Count1; /* x00 */ ++ unsigned char Data[9]; /* a variable array of bytes, */ ++ /* count in tag */ ++ } L1_Pack; ++ ++ struct _L2_Pack{ /* ANSI ID STRING PACKET */ ++ unsigned char Tag; /* large tag = 0x82 */ ++ unsigned char Count0; /* Length of string */ ++ unsigned char Count1; ++ unsigned char Identifier[1]; /* a variable array of bytes, */ ++ /* count in tag */ ++ } L2_Pack; ++ ++ struct _L3_Pack{ /* UNICODE ID STRING PACKET */ ++ unsigned char Tag; /* large tag = 0x83 */ ++ unsigned char Count0; /* Length + 2 of string */ ++ unsigned char Count1; ++ unsigned char Country0; /* TBD */ ++ unsigned char Country1; /* TBD */ ++ unsigned char Identifier[1]; /* a variable array of bytes, */ ++ /* count in tag */ ++ } L3_Pack; ++ ++ struct _L4_Pack{ /* VENDOR DEFINED PACKET */ ++ unsigned char Tag; /* large tag = 0x84 */ ++ unsigned char Count0; ++ unsigned char Count1; ++ union _L4_Data{ ++ unsigned char Data[1]; /* a variable array of bytes, */ ++ /* count in tag */ ++ struct _L4_PPCPack{ /* Pr*p L4 packet */ ++ unsigned char Type; /* 00=non-IBM */ ++ unsigned char PPCData[1]; /* a variable array of bytes, */ ++ /* count in tag */ ++ } L4_PPCPack; ++ } L4_Data; ++ } L4_Pack; ++ ++ struct _L5_Pack{ ++ unsigned char Tag; /* large tag = 0x85 */ ++ unsigned char Count0; /* Count = 17 */ ++ unsigned char Count1; ++ unsigned char Data[17]; ++ } L5_Pack; ++ ++ struct _L6_Pack{ ++ unsigned char Tag; /* large tag = 0x86 */ ++ unsigned char Count0; /* Count = 9 */ ++ unsigned char Count1; ++ unsigned char Data[9]; ++ } L6_Pack; ++ ++ } PnP_TAG_PACKET; ++ ++#endif /* _PPC_BOOT_PNP_H_ */ +Index: working-2.6/arch/powerpc/boot/residual.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/boot/residual.h 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,313 @@ ++/* 7/18/95 */ ++/*----------------------------------------------------------------------------*/ ++/* Residual Data header definitions and prototypes */ ++/*----------------------------------------------------------------------------*/ ++ ++/* Structure map for RESIDUAL on PowerPC Reference Platform */ ++/* residual.h - Residual data structure passed in r3. */ ++/* Load point passed in r4 to boot image. */ ++/* For enum's: if given in hex then they are bit significant, */ ++/* i.e. only one bit is on for each enum */ ++/* Reserved fields must be filled with zeros. */ ++#ifndef _PPC_BOOT_RESIDUAL_H_ ++#define _PPC_BOOT_RESIDUAL_H_ ++ ++#define MAX_CPUS 32 /* These should be set to the maximum */ ++#define MAX_MEMS 64 /* number possible for this system. */ ++#define MAX_DEVICES 256 /* Changing these will change the */ ++#define AVE_PNP_SIZE 32 /* structure, hence the version of */ ++#define MAX_MEM_SEGS 64 /* this header file. */ ++ ++/*----------------------------------------------------------------------------*/ ++/* Public structures... */ ++/*----------------------------------------------------------------------------*/ ++ ++#include "pnp.h" ++ ++typedef enum _L1CACHE_TYPE { ++ NoneCAC = 0, ++ SplitCAC = 1, ++ CombinedCAC = 2 ++ } L1CACHE_TYPE; ++ ++typedef enum _TLB_TYPE { ++ NoneTLB = 0, ++ SplitTLB = 1, ++ CombinedTLB = 2 ++ } TLB_TYPE; ++ ++typedef enum _FIRMWARE_SUPPORT { ++ Conventional = 0x01, ++ OpenFirmware = 0x02, ++ Diagnostics = 0x04, ++ LowDebug = 0x08, ++ Multiboot = 0x10, ++ LowClient = 0x20, ++ Hex41 = 0x40, ++ FAT = 0x80, ++ ISO9660 = 0x0100, ++ SCSI_InitiatorID_Override = 0x0200, ++ Tape_Boot = 0x0400, ++ FW_Boot_Path = 0x0800 ++ } FIRMWARE_SUPPORT; ++ ++typedef enum _FIRMWARE_SUPPLIERS { ++ IBMFirmware = 0x00, ++ MotoFirmware = 0x01, /* 7/18/95 */ ++ FirmWorks = 0x02, /* 10/5/95 */ ++ Bull = 0x03, /* 04/03/96 */ ++ } FIRMWARE_SUPPLIERS; ++ ++typedef enum _ENDIAN_SWITCH_METHODS { ++ UsePort92 = 0x01, ++ UsePCIConfigA8 = 0x02, ++ UseFF001030 = 0x03, ++ } ENDIAN_SWITCH_METHODS; ++ ++typedef enum _SPREAD_IO_METHODS { ++ UsePort850 = 0x00, ++/*UsePCIConfigA8 = 0x02,*/ ++ } SPREAD_IO_METHODS; ++ ++typedef struct _VPD { ++ ++ /* Box dependent stuff */ ++ unsigned char PrintableModel[32]; /* Null terminated string. ++ Must be of the form: ++ vvv,<20h>,<model designation>,<0x0> ++ where vvv is the vendor ID ++ e.g. IBM PPS MODEL 6015<0x0> */ ++ unsigned char Serial[16]; /* 12/94: ++ Serial Number; must be of the form: ++ vvv<serial number> where vvv is the ++ vendor ID. ++ e.g. IBM60151234567<20h><20h> */ ++ unsigned char Reserved[48]; ++ unsigned long FirmwareSupplier; /* See FirmwareSuppliers enum */ ++ unsigned long FirmwareSupports; /* See FirmwareSupport enum */ ++ unsigned long NvramSize; /* Size of nvram in bytes */ ++ unsigned long NumSIMMSlots; ++ unsigned short EndianSwitchMethod; /* See EndianSwitchMethods enum */ ++ unsigned short SpreadIOMethod; /* See SpreadIOMethods enum */ ++ unsigned long SmpIar; ++ unsigned long RAMErrLogOffset; /* Heap offset to error log */ ++ unsigned long Reserved5; ++ unsigned long Reserved6; ++ unsigned long ProcessorHz; /* Processor clock frequency in Hertz */ ++ unsigned long ProcessorBusHz; /* Processor bus clock frequency */ ++ unsigned long Reserved7; ++ unsigned long TimeBaseDivisor; /* (Bus clocks per timebase tic)*1000 */ ++ unsigned long WordWidth; /* Word width in bits */ ++ unsigned long PageSize; /* Page size in bytes */ ++ unsigned long CoherenceBlockSize; /* Unit of transfer in/out of cache ++ for which coherency is maintained; ++ normally <= CacheLineSize. */ ++ unsigned long GranuleSize; /* Unit of lock allocation to avoid */ ++ /* false sharing of locks. */ ++ ++ /* L1 Cache variables */ ++ unsigned long CacheSize; /* L1 Cache size in KB. This is the */ ++ /* total size of the L1, whether */ ++ /* combined or split */ ++ unsigned long CacheAttrib; /* L1CACHE_TYPE */ ++ unsigned long CacheAssoc; /* L1 Cache associativity. Use this ++ for combined cache. If split, put ++ zeros here. */ ++ unsigned long CacheLineSize; /* L1 Cache line size in bytes. Use ++ for combined cache. If split, put ++ zeros here. */ ++ /* For split L1 Cache: (= combined if combined cache) */ ++ unsigned long I_CacheSize; ++ unsigned long I_CacheAssoc; ++ unsigned long I_CacheLineSize; ++ unsigned long D_CacheSize; ++ unsigned long D_CacheAssoc; ++ unsigned long D_CacheLineSize; ++ ++ /* Translation Lookaside Buffer variables */ ++ unsigned long TLBSize; /* Total number of TLBs on the system */ ++ unsigned long TLBAttrib; /* Combined I+D or split TLB */ ++ unsigned long TLBAssoc; /* TLB Associativity. Use this for ++ combined TLB. If split, put zeros ++ here. */ ++ /* For split TLB: (= combined if combined TLB) */ ++ unsigned long I_TLBSize; ++ unsigned long I_TLBAssoc; ++ unsigned long D_TLBSize; ++ unsigned long D_TLBAssoc; ++ ++ unsigned long ExtendedVPD; /* Offset to extended VPD area; ++ null if unused */ ++ } VPD; ++ ++typedef enum _DEVICE_FLAGS { ++ Enabled = 0x4000, /* 1 - PCI device is enabled */ ++ Integrated = 0x2000, ++ Failed = 0x1000, /* 1 - device failed POST code tests */ ++ Static = 0x0800, /* 0 - dynamically configurable ++ 1 - static */ ++ Dock = 0x0400, /* 0 - not a docking station device ++ 1 - is a docking station device */ ++ Boot = 0x0200, /* 0 - device cannot be used for BOOT ++ 1 - can be a BOOT device */ ++ Configurable = 0x0100, /* 1 - device is configurable */ ++ Disableable = 0x80, /* 1 - device can be disabled */ ++ PowerManaged = 0x40, /* 0 - not managed; 1 - managed */ ++ ReadOnly = 0x20, /* 1 - device is read only */ ++ Removable = 0x10, /* 1 - device is removable */ ++ ConsoleIn = 0x08, ++ ConsoleOut = 0x04, ++ Input = 0x02, ++ Output = 0x01 ++ } DEVICE_FLAGS; ++ ++typedef enum _BUS_ID { ++ ISADEVICE = 0x01, ++ EISADEVICE = 0x02, ++ PCIDEVICE = 0x04, ++ PCMCIADEVICE = 0x08, ++ PNPISADEVICE = 0x10, ++ MCADEVICE = 0x20, ++ MXDEVICE = 0x40, /* Devices on mezzanine bus */ ++ PROCESSORDEVICE = 0x80, /* Devices on processor bus */ ++ VMEDEVICE = 0x100, ++ } BUS_ID; ++ ++typedef struct _DEVICE_ID { ++ unsigned long BusId; /* See BUS_ID enum above */ ++ unsigned long DevId; /* Big Endian format */ ++ unsigned long SerialNum; /* For multiple usage of a single ++ DevId */ ++ unsigned long Flags; /* See DEVICE_FLAGS enum above */ ++ unsigned char BaseType; /* See pnp.h for bit definitions */ ++ unsigned char SubType; /* See pnp.h for bit definitions */ ++ unsigned char Interface; /* See pnp.h for bit definitions */ ++ unsigned char Spare; ++ } DEVICE_ID; ++ ++typedef union _BUS_ACCESS { ++ struct _PnPAccess{ ++ unsigned char CSN; ++ unsigned char LogicalDevNumber; ++ unsigned short ReadDataPort; ++ } PnPAccess; ++ struct _ISAAccess{ ++ unsigned char SlotNumber; /* ISA Slot Number generally not ++ available; 0 if unknown */ ++ unsigned char LogicalDevNumber; ++ unsigned short ISAReserved; ++ } ISAAccess; ++ struct _MCAAccess{ ++ unsigned char SlotNumber; ++ unsigned char LogicalDevNumber; ++ unsigned short MCAReserved; ++ } MCAAccess; ++ struct _PCMCIAAccess{ ++ unsigned char SlotNumber; ++ unsigned char LogicalDevNumber; ++ unsigned short PCMCIAReserved; ++ } PCMCIAAccess; ++ struct _EISAAccess{ ++ unsigned char SlotNumber; ++ unsigned char FunctionNumber; ++ unsigned short EISAReserved; ++ } EISAAccess; ++ struct _PCIAccess{ ++ unsigned char BusNumber; ++ unsigned char DevFuncNumber; ++ unsigned short PCIReserved; ++ } PCIAccess; ++ struct _ProcBusAccess{ ++ unsigned char BusNumber; ++ unsigned char BUID; ++ unsigned short ProcBusReserved; ++ } ProcBusAccess; ++ } BUS_ACCESS; ++ ++/* Per logical device information */ ++typedef struct _PPC_DEVICE { ++ DEVICE_ID DeviceId; ++ BUS_ACCESS BusAccess; ++ ++ /* The following three are offsets into the DevicePnPHeap */ ++ /* All are in PnP compressed format */ ++ unsigned long AllocatedOffset; /* Allocated resource description */ ++ unsigned long PossibleOffset; /* Possible resource description */ ++ unsigned long CompatibleOffset; /* Compatible device identifiers */ ++ } PPC_DEVICE; ++ ++typedef enum _CPU_STATE { ++ CPU_GOOD = 0, /* CPU is present, and active */ ++ CPU_GOOD_FW = 1, /* CPU is present, and in firmware */ ++ CPU_OFF = 2, /* CPU is present, but inactive */ ++ CPU_FAILED = 3, /* CPU is present, but failed POST */ ++ CPU_NOT_PRESENT = 255 /* CPU not present */ ++ } CPU_STATE; ++ ++typedef struct _PPC_CPU { ++ unsigned long CpuType; /* Result of mfspr from Processor ++ Version Register (PVR). ++ PVR(0-15) = Version (e.g. 601) ++ PVR(16-31 = EC Level */ ++ unsigned char CpuNumber; /* CPU Number for this processor */ ++ unsigned char CpuState; /* CPU State, see CPU_STATE enum */ ++ unsigned short Reserved; ++ } PPC_CPU; ++ ++typedef struct _PPC_MEM { ++ unsigned long SIMMSize; /* 0 - absent or bad ++ 8M, 32M (in MB) */ ++ } PPC_MEM; ++ ++typedef enum _MEM_USAGE { ++ Other = 0x8000, ++ ResumeBlock = 0x4000, /* for use by power management */ ++ SystemROM = 0x2000, /* Flash memory (populated) */ ++ UnPopSystemROM = 0x1000, /* Unpopulated part of SystemROM area */ ++ IOMemory = 0x0800, ++ SystemIO = 0x0400, ++ SystemRegs = 0x0200, ++ PCIAddr = 0x0100, ++ PCIConfig = 0x80, ++ ISAAddr = 0x40, ++ Unpopulated = 0x20, /* Unpopulated part of System Memory */ ++ Free = 0x10, /* Free part of System Memory */ ++ BootImage = 0x08, /* BootImage part of System Memory */ ++ FirmwareCode = 0x04, /* FirmwareCode part of System Memory */ ++ FirmwareHeap = 0x02, /* FirmwareHeap part of System Memory */ ++ FirmwareStack = 0x01 /* FirmwareStack part of System Memory*/ ++ } MEM_USAGE; ++ ++typedef struct _MEM_MAP { ++ unsigned long Usage; /* See MEM_USAGE above */ ++ unsigned long BasePage; /* Page number measured in 4KB pages */ ++ unsigned long PageCount; /* Page count measured in 4KB pages */ ++ } MEM_MAP; ++ ++typedef struct _RESIDUAL { ++ unsigned long ResidualLength; /* Length of Residual */ ++ unsigned char Version; /* of this data structure */ ++ unsigned char Revision; /* of this data structure */ ++ unsigned short EC; /* of this data structure */ ++ /* VPD */ ++ VPD VitalProductData; ++ /* CPU */ ++ unsigned short MaxNumCpus; /* Max CPUs in this system */ ++ unsigned short ActualNumCpus; /* ActualNumCpus < MaxNumCpus means */ ++ /* that there are unpopulated or */ ++ /* otherwise unusable cpu locations */ ++ PPC_CPU Cpus[MAX_CPUS]; ++ /* Memory */ ++ unsigned long TotalMemory; /* Total amount of memory installed */ ++ unsigned long GoodMemory; /* Total amount of good memory */ ++ unsigned long ActualNumMemSegs; ++ MEM_MAP Segs[MAX_MEM_SEGS]; ++ unsigned long ActualNumMemories; ++ PPC_MEM Memories[MAX_MEMS]; ++ /* Devices */ ++ unsigned long ActualNumDevices; ++ PPC_DEVICE Devices[MAX_DEVICES]; ++ unsigned char DevicePnPHeap[2*MAX_DEVICES*AVE_PNP_SIZE]; ++ } RESIDUAL; ++ ++#endif /* _PPC_BOOT_RESIDUAL_H_ */ +Index: working-2.6/arch/powerpc/kernel/udbg.c +=================================================================== +--- working-2.6.orig/arch/powerpc/kernel/udbg.c 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/arch/powerpc/kernel/udbg.c 2007-08-06 14:01:48.000000000 +1000 +@@ -54,6 +54,8 @@ void __init udbg_early_init(void) + #elif defined(CONFIG_PPC_EARLY_DEBUG_44x) + /* PPC44x debug */ + udbg_init_44x_as1(); ++#elif defined(CONFIG_PPC_EARLY_DEBUG_PREP) ++ udbg_init_prep(); + #endif + } + +Index: working-2.6/arch/powerpc/platforms/Makefile +=================================================================== +--- working-2.6.orig/arch/powerpc/platforms/Makefile 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/arch/powerpc/platforms/Makefile 2007-08-06 14:01:48.000000000 +1000 +@@ -6,6 +6,7 @@ obj-$(CONFIG_PPC_PMAC) += powermac/ + endif + endif + obj-$(CONFIG_PPC_CHRP) += chrp/ ++obj-$(CONFIG_PPC_PREP) += prep/ + #obj-$(CONFIG_4xx) += 4xx/ + obj-$(CONFIG_44x) += 44x/ + obj-$(CONFIG_PPC_MPC52xx) += 52xx/ +Index: working-2.6/include/asm-powerpc/udbg.h +=================================================================== +--- working-2.6.orig/include/asm-powerpc/udbg.h 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/include/asm-powerpc/udbg.h 2007-08-06 14:01:48.000000000 +1000 +@@ -48,6 +48,7 @@ extern void __init udbg_init_rtas_consol + extern void __init udbg_init_debug_beat(void); + extern void __init udbg_init_btext(void); + extern void __init udbg_init_44x_as1(void); ++extern void __init udbg_init_prep(void); + + #endif /* __KERNEL__ */ + #endif /* _ASM_POWERPC_UDBG_H */ +Index: working-2.6/arch/powerpc/platforms/prep/Kconfig +=================================================================== +--- working-2.6.orig/arch/powerpc/platforms/prep/Kconfig 2007-08-06 13:48:11.000000000 +1000 ++++ working-2.6/arch/powerpc/platforms/prep/Kconfig 2007-08-06 14:01:48.000000000 +1000 +@@ -1,11 +1,12 @@ + config PPC_PREP + bool "PowerPC Reference Platform (PReP) based machines" +- depends on PPC_MULTIPLATFORM && PPC32 && BROKEN ++ depends on PPC_MULTIPLATFORM && PPC32 + select MPIC + select PPC_I8259 + select PPC_INDIRECT_PCI + select PPC_UDBG_16550 + select PPC_NATIVE ++ select WANT_DEVICE_TREE + default n + + config PREP_RESIDUAL +Index: working-2.6/arch/powerpc/configs/prep_defconfig +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ working-2.6/arch/powerpc/configs/prep_defconfig 2007-08-06 14:01:48.000000000 +1000 +@@ -0,0 +1,1006 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.22-rc4-prep-support ++# Wed Jun 27 16:38:31 2007 ++# ++# CONFIG_PPC64 is not set ++ ++# ++# Processor support ++# ++CONFIG_CLASSIC32=y ++# CONFIG_PPC_82xx is not set ++# CONFIG_PPC_83xx is not set ++# CONFIG_PPC_85xx is not set ++# CONFIG_PPC_86xx is not set ++# CONFIG_PPC_8xx is not set ++# CONFIG_40x is not set ++# CONFIG_44x is not set ++# CONFIG_E200 is not set ++CONFIG_6xx=y ++CONFIG_PPC_FPU=y ++# CONFIG_ALTIVEC is not set ++CONFIG_PPC_STD_MMU=y ++CONFIG_PPC_STD_MMU_32=y ++# CONFIG_PPC_MM_SLICES is not set ++# CONFIG_SMP is not set ++CONFIG_PPC32=y ++CONFIG_PPC_MERGE=y ++CONFIG_MMU=y ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_IRQ_PER_CPU=y ++CONFIG_RWSEM_XCHGADD_ALGORITHM=y ++CONFIG_ARCH_HAS_ILOG2_U32=y ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_GENERIC_FIND_NEXT_BIT=y ++CONFIG_PPC=y ++CONFIG_EARLY_PRINTK=y ++CONFIG_GENERIC_NVRAM=y ++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y ++CONFIG_ARCH_MAY_HAVE_PC_FDC=y ++CONFIG_PPC_OF=y ++CONFIG_PPC_UDBG_16550=y ++# CONFIG_GENERIC_TBSYNC is not set ++CONFIG_AUDIT_ARCH=y ++CONFIG_GENERIC_BUG=y ++# CONFIG_DEFAULT_UIMAGE is not set ++# CONFIG_PPC_DCR_NATIVE is not set ++# CONFIG_PPC_DCR_MMIO is not set ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++ ++# ++# General setup ++# ++CONFIG_LOCALVERSION="" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++# CONFIG_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_UTS_NS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++# CONFIG_SYSCTL_SYSCALL is not set ++CONFIG_KALLSYMS=y ++CONFIG_KALLSYMS_ALL=y ++CONFIG_KALLSYMS_EXTRA_PASS=y ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++ ++# ++# Block layer ++# ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++# CONFIG_IOSCHED_AS is not set ++# CONFIG_IOSCHED_DEADLINE is not set ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# ++# Platform support ++# ++CONFIG_PPC_MULTIPLATFORM=y ++# CONFIG_EMBEDDED6xx is not set ++# CONFIG_PPC_CHRP is not set ++# CONFIG_PPC_MPC52xx is not set ++# CONFIG_PPC_MPC5200 is not set ++# CONFIG_PPC_EFIKA is not set ++# CONFIG_PPC_LITE5200 is not set ++# CONFIG_PPC_PMAC is not set ++CONFIG_PPC_PREP=y ++CONFIG_PREP_RESIDUAL=y ++CONFIG_PROC_PREPRESIDUAL=y ++# CONFIG_PPC_CELL is not set ++# CONFIG_PPC_CELL_NATIVE is not set ++# CONFIG_PQ2ADS is not set ++CONFIG_PPC_NATIVE=y ++CONFIG_MPIC=y ++# CONFIG_MPIC_WEIRD is not set ++CONFIG_PPC_I8259=y ++# CONFIG_PPC_RTAS is not set ++# CONFIG_MMIO_NVRAM is not set ++# CONFIG_PPC_MPC106 is not set ++# CONFIG_PPC_970_NAP is not set ++# CONFIG_PPC_INDIRECT_IO is not set ++# CONFIG_GENERIC_IOMAP is not set ++# CONFIG_CPU_FREQ is not set ++# CONFIG_PPC601_SYNC_FIX is not set ++# CONFIG_TAU is not set ++# CONFIG_CPM2 is not set ++ ++# ++# Kernel options ++# ++# CONFIG_HIGHMEM is not set ++CONFIG_HZ_100=y ++# CONFIG_HZ_250 is not set ++# CONFIG_HZ_300 is not set ++# CONFIG_HZ_1000 is not set ++CONFIG_HZ=100 ++CONFIG_PREEMPT_NONE=y ++# CONFIG_PREEMPT_VOLUNTARY is not set ++# CONFIG_PREEMPT is not set ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y ++# CONFIG_KEXEC is not set ++CONFIG_PPCBUG_NVRAM=y ++CONFIG_ARCH_FLATMEM_ENABLE=y ++CONFIG_ARCH_POPULATES_NODE_MAP=y ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++# CONFIG_SPARSEMEM_STATIC is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_PROC_DEVICETREE=y ++# CONFIG_CMDLINE_BOOL is not set ++# CONFIG_PM is not set ++# CONFIG_SECCOMP is not set ++CONFIG_WANT_DEVICE_TREE=y ++CONFIG_DEVICE_TREE="prep.dts" ++CONFIG_ISA_DMA_API=y ++ ++# ++# Bus options ++# ++# CONFIG_ISA is not set ++CONFIG_ZONE_DMA=y ++CONFIG_GENERIC_ISA_DMA=y ++CONFIG_PPC_INDIRECT_PCI=y ++# CONFIG_PPC_INDIRECT_PCI_BE is not set ++CONFIG_PCI=y ++CONFIG_PCI_DOMAINS=y ++# CONFIG_PCIEPORTBUS is not set ++CONFIG_ARCH_SUPPORTS_MSI=y ++# CONFIG_PCI_MSI is not set ++# CONFIG_PCI_DEBUG is not set ++ ++# ++# PCCARD (PCMCIA/CardBus) support ++# ++# CONFIG_PCCARD is not set ++# CONFIG_HOTPLUG_PCI is not set ++ ++# ++# Advanced setup ++# ++# CONFIG_ADVANCED_OPTIONS is not set ++ ++# ++# Default settings for advanced configuration options are used ++# ++CONFIG_HIGHMEM_START=0xfe000000 ++CONFIG_LOWMEM_SIZE=0x30000000 ++CONFIG_KERNEL_START=0xc0000000 ++CONFIG_TASK_SIZE=0x80000000 ++CONFIG_BOOT_LOAD=0x00800000 ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_IP_MROUTE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++# CONFIG_STANDALONE is not set ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++ ++# ++# Connector - unified userspace <-> kernelspace linker ++# ++# CONFIG_CONNECTOR is not set ++# CONFIG_MTD is not set ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Plug and Play support ++# ++# CONFIG_PNPACPI is not set ++ ++# ++# Block devices ++# ++CONFIG_BLK_DEV_FD=y ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++# CONFIG_BLK_DEV_UMEM is not set ++# CONFIG_BLK_DEV_COW_COMMON is not set ++# CONFIG_BLK_DEV_LOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_SX8 is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=4096 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++ ++# ++# Misc devices ++# ++# CONFIG_PHANTOM is not set ++# CONFIG_SGI_IOC4 is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_BLINK is not set ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++CONFIG_BLK_DEV_SR=y ++CONFIG_BLK_DEV_SR_VENDOR=y ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++CONFIG_SCSI_SPI_ATTRS=y ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++ ++# ++# SCSI low-level drivers ++# ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set ++# CONFIG_SCSI_3W_9XXX is not set ++# CONFIG_SCSI_ACARD is not set ++# CONFIG_SCSI_AACRAID is not set ++# CONFIG_SCSI_AIC7XXX is not set ++# CONFIG_SCSI_AIC7XXX_OLD is not set ++# CONFIG_SCSI_AIC79XX is not set ++# CONFIG_SCSI_AIC94XX is not set ++# CONFIG_SCSI_DPT_I2O is not set ++# CONFIG_SCSI_ARCMSR is not set ++# CONFIG_MEGARAID_NEWGEN is not set ++# CONFIG_MEGARAID_LEGACY is not set ++# CONFIG_MEGARAID_SAS is not set ++# CONFIG_SCSI_HPTIOP is not set ++# CONFIG_SCSI_BUSLOGIC is not set ++# CONFIG_SCSI_DMX3191D is not set ++# CONFIG_SCSI_EATA is not set ++# CONFIG_SCSI_FUTURE_DOMAIN is not set ++# CONFIG_SCSI_GDTH is not set ++# CONFIG_SCSI_IPS is not set ++# CONFIG_SCSI_INITIO is not set ++# CONFIG_SCSI_INIA100 is not set ++# CONFIG_SCSI_STEX is not set ++CONFIG_SCSI_SYM53C8XX_2=y ++CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 ++CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 ++CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 ++CONFIG_SCSI_SYM53C8XX_MMIO=y ++# CONFIG_SCSI_QLOGIC_1280 is not set ++# CONFIG_SCSI_QLA_FC is not set ++# CONFIG_SCSI_QLA_ISCSI is not set ++# CONFIG_SCSI_LPFC is not set ++# CONFIG_SCSI_DC395x is not set ++# CONFIG_SCSI_DC390T is not set ++# CONFIG_SCSI_NSP32 is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_SRP is not set ++# CONFIG_ATA is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++ ++# ++# Fusion MPT device support ++# ++# CONFIG_FUSION is not set ++# CONFIG_FUSION_SPI is not set ++# CONFIG_FUSION_FC is not set ++# CONFIG_FUSION_SAS is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_IEEE1394 is not set ++ ++# ++# I2O device support ++# ++# CONFIG_I2O is not set ++CONFIG_MACINTOSH_DRIVERS=y ++# CONFIG_MAC_EMUMOUSEBTN is not set ++# CONFIG_WINDFARM is not set ++ ++# ++# Network device support ++# ++CONFIG_NETDEVICES=y ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_ARCNET is not set ++# CONFIG_PHYLIB is not set ++ ++# ++# Ethernet (10 or 100Mbit) ++# ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NET_VENDOR_3COM is not set ++ ++# ++# Tulip family network device support ++# ++CONFIG_NET_TULIP=y ++CONFIG_DE2104X=y ++CONFIG_TULIP=y ++# CONFIG_TULIP_MWI is not set ++CONFIG_TULIP_MMIO=y ++# CONFIG_TULIP_NAPI is not set ++CONFIG_DE4X5=y ++# CONFIG_WINBOND_840 is not set ++# CONFIG_DM9102 is not set ++# CONFIG_ULI526X is not set ++# CONFIG_HP100 is not set ++CONFIG_NET_PCI=y ++CONFIG_PCNET32=y ++CONFIG_PCNET32_NAPI=y ++# CONFIG_AMD8111_ETH is not set ++# CONFIG_ADAPTEC_STARFIRE is not set ++# CONFIG_B44 is not set ++# CONFIG_FORCEDETH is not set ++# CONFIG_DGRS is not set ++# CONFIG_EEPRO100 is not set ++# CONFIG_E100 is not set ++# CONFIG_FEALNX is not set ++# CONFIG_NATSEMI is not set ++# CONFIG_NE2K_PCI is not set ++# CONFIG_8139CP is not set ++# CONFIG_8139TOO is not set ++# CONFIG_SIS900 is not set ++# CONFIG_EPIC100 is not set ++# CONFIG_SUNDANCE is not set ++# CONFIG_TLAN is not set ++# CONFIG_VIA_RHINE is not set ++# CONFIG_SC92031 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++# CONFIG_TR is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NET_FC is not set ++# CONFIG_SHAPER is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++ ++# ++# ISDN subsystem ++# ++# CONFIG_ISDN is not set ++ ++# ++# Telephony Support ++# ++# CONFIG_PHONE is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_TSDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++# CONFIG_INPUT_KEYBOARD is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_8250=y ++CONFIG_SERIAL_8250_CONSOLE=y ++# CONFIG_SERIAL_8250_PCI is not set ++CONFIG_SERIAL_8250_NR_UARTS=4 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=4 ++# CONFIG_SERIAL_8250_EXTENDED is not set ++ ++# ++# Non-8250 serial port support ++# ++# CONFIG_SERIAL_UARTLITE is not set ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++# CONFIG_SERIAL_JSM is not set ++CONFIG_SERIAL_OF_PLATFORM=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=256 ++ ++# ++# IPMI ++# ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_WATCHDOG is not set ++# CONFIG_HW_RANDOM is not set ++CONFIG_NVRAM=y ++CONFIG_GEN_RTC=y ++# CONFIG_GEN_RTC_X is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++# CONFIG_AGP is not set ++# CONFIG_DRM is not set ++# CONFIG_RAW_DRIVER is not set ++ ++# ++# TPM devices ++# ++# CONFIG_TCG_TPM is not set ++CONFIG_DEVPORT=y ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++ ++# ++# Dallas's 1-wire bus ++# ++# CONFIG_W1 is not set ++# CONFIG_HWMON is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_FB is not set ++# CONFIG_FB_IBM_GXT4500 is not set ++ ++# ++# Console display driver support ++# ++CONFIG_VGA_CONSOLE=y ++# CONFIG_VGACON_SOFT_SCROLLBACK is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++ ++# ++# HID Devices ++# ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++ ++# ++# USB support ++# ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++CONFIG_USB_ARCH_HAS_EHCI=y ++# CONFIG_USB is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# USB Gadget Support ++# ++# CONFIG_USB_GADGET is not set ++# CONFIG_MMC is not set ++ ++# ++# LED devices ++# ++# CONFIG_NEW_LEDS is not set ++ ++# ++# LED drivers ++# ++ ++# ++# LED Triggers ++# ++ ++# ++# InfiniBand support ++# ++# CONFIG_INFINIBAND is not set ++ ++# ++# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) ++# ++ ++# ++# Real Time Clock ++# ++# CONFIG_RTC_CLASS is not set ++ ++# ++# DMA Engine support ++# ++# CONFIG_DMA_ENGINE is not set ++ ++# ++# DMA Clients ++# ++ ++# ++# DMA Devices ++# ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++# CONFIG_EXT3_FS_XATTR is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++# CONFIG_QUOTA is not set ++# CONFIG_DNOTIFY is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++# CONFIG_VFAT_FS is not set ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_KCORE=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++ ++# ++# Network File Systems ++# ++# CONFIG_NFS_FS is not set ++# CONFIG_NFSD is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++# CONFIG_9P_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="utf-8" ++# CONFIG_NLS_CODEPAGE_437 is not set ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++# CONFIG_NLS_ISO8859_1 is not set ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++# CONFIG_UCC_SLOW is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_LIBCRC32C is not set ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y ++ ++# ++# Instrumentation Support ++# ++# CONFIG_PROFILING is not set ++# CONFIG_KPROBES is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++# CONFIG_ENABLE_MUST_CHECK is not set ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++# CONFIG_DETECT_SOFTLOCKUP is not set ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++CONFIG_FORCED_INLINING=y ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_DEBUG_STACKOVERFLOW is not set ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_DEBUG_PAGEALLOC is not set ++CONFIG_DEBUGGER=y ++CONFIG_XMON=y ++CONFIG_XMON_DEFAULT=y ++CONFIG_XMON_DISASSEMBLY=y ++# CONFIG_BDI_SWITCH is not set ++CONFIG_BOOTX_TEXT=y ++CONFIG_PPC_EARLY_DEBUG=y ++# CONFIG_PPC_EARLY_DEBUG_LPAR is not set ++# CONFIG_PPC_EARLY_DEBUG_G5 is not set ++# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set ++# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set ++# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set ++# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set ++# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set ++# CONFIG_PPC_EARLY_DEBUG_BEAT is not set ++# CONFIG_PPC_EARLY_DEBUG_44x is not set ++CONFIG_PPC_EARLY_DEBUG_PREP=y ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++ ++# ++# Cryptographic options ++# ++# CONFIG_CRYPTO is not set +--- linux-2.6.23-rc3/arch/powerpc/platforms/prep/setup.c 2007-08-22 02:21:52.000000000 -0500 ++++ linux-2.6.23-new/arch/powerpc/platforms/prep/setup.c 2007-08-22 04:20:37.000000000 -0500 +@@ -21,6 +21,7 @@ + #include <asm/i8259.h> + #include <asm/time.h> + #include <asm/udbg.h> ++#include <linux/ide.h> + + static const char *prep_model = "(unknown)"; + +@@ -436,7 +437,7 @@ + return; + } + +- hose = pcibios_alloc_controller(); ++ hose = pcibios_alloc_controller(phb); + if (!hose) + return; + +@@ -448,7 +449,7 @@ + DMA_MODE_WRITE = 0x48; + + setup_indirect_pci(hose, hose->io_base_phys + 0xcf8, +- hose->io_base_phys + 0xcfc); ++ hose->io_base_phys + 0xcfc, 0); + } + + static void __init prep_setup_arch(void) +diff -ru a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile +--- a/arch/powerpc/boot/Makefile 2007-08-22 18:10:29.000000000 -0500 ++++ b/arch/powerpc/boot/Makefile 2007-08-22 19:07:32.000000000 -0500 +@@ -136,7 +136,7 @@ + image-$(CONFIG_PPC_HOLLY) += zImage.holly + image-$(CONFIG_PPC_PRPMC2800) += zImage.prpmc2800 + image-$(CONFIG_PPC_ISERIES) += zImage.iseries +-image-$(CONFIG_PPC_PREP) += zImage.dts.prep ++image-$(CONFIG_PPC_PREP) += zImage.prep + image-$(CONFIG_DEFAULT_UIMAGE) += uImage + + ifneq ($(CONFIG_DEVICE_TREE),"") +Only in linux-2.6.23-rc3/arch/powerpc/boot/: mkprep +Only in linux-2.6.23-rc3/arch/powerpc/boot/: mkprep2 +diff -ru linux-2.6.23-rc3/arch/powerpc/boot/mkprep.c build/host-temp/linux-2.6.23-rc3/arch/powerpc/boot/mkprep.c +--- linux-2.6.23-rc3/arch/powerpc/boot/mkprep.c 2007-08-22 19:05:12.000000000 -0500 ++++ build/host-temp/linux-2.6.23-rc3/arch/powerpc/boot/mkprep.c 2007-08-22 19:07:32.000000000 -0500 +@@ -97,8 +97,8 @@ + be16_to_cpu(elf32->e_machine) == EM_PPC)) + die("Input doesn't appear to be a PowerPC ELF image\n"); + +- elf32ph = (Elf32_Phdr *) (elfheader + elf32->e_phoff); +- for (i = 0; i < elf32->e_phnum; i++, elf32ph++) ++ elf32ph = (Elf32_Phdr *) (elfheader + be32_to_cpu(elf32->e_phoff)); ++ for (i = 0; i < be16_to_cpu(elf32->e_phnum); i++, elf32ph++) + if (be32_to_cpu(elf32ph->p_type) == PT_LOAD) + break; + if (i >= be16_to_cpu(elf32->e_phnum))