summaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorImre Kaloz <kaloz@openwrt.org>2008-01-28 23:44:06 +0000
committerImre Kaloz <kaloz@openwrt.org>2008-01-28 23:44:06 +0000
commit7ab413f9fd0c4845e1595001d9f9b890a43ee8fe (patch)
tree5ffbebed6fd70d182fbd51b545fd994270cd0203 /target
parent8b96c7c0ea4d6d7fe446f89858c8558143442184 (diff)
downloadmaster-31e0f0ae-7ab413f9fd0c4845e1595001d9f9b890a43ee8fe.tar.gz
master-31e0f0ae-7ab413f9fd0c4845e1595001d9f9b890a43ee8fe.tar.bz2
master-31e0f0ae-7ab413f9fd0c4845e1595001d9f9b890a43ee8fe.zip
add upstream git patch for arch/powerpc
SVN-Revision: 10300
Diffstat (limited to 'target')
-rw-r--r--target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch71515
1 files changed, 71515 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch b/target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch
new file mode 100644
index 0000000000..75c8c2edc3
--- /dev/null
+++ b/target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch
@@ -0,0 +1,71515 @@
+diff -x .git -x .gitignore -Nur linux-2.6.24/Documentation/kernel-parameters.txt powerpc.git/Documentation/kernel-parameters.txt
+--- linux-2.6.24/Documentation/kernel-parameters.txt 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/Documentation/kernel-parameters.txt 2008-01-28 20:25:33.000000000 +0100
+@@ -686,6 +686,7 @@
+ See Documentation/isdn/README.HiSax.
+
+ hugepages= [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
++ hugepagesz= [HW,IA-64,PPC] The size of the HugeTLB pages.
+
+ i8042.direct [HW] Put keyboard port into non-translated mode
+ i8042.dumbkbd [HW] Pretend that controller can only read data from
+diff -x .git -x .gitignore -Nur linux-2.6.24/Documentation/powerpc/00-INDEX powerpc.git/Documentation/powerpc/00-INDEX
+--- linux-2.6.24/Documentation/powerpc/00-INDEX 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/Documentation/powerpc/00-INDEX 2008-01-28 20:25:33.000000000 +0100
+@@ -28,3 +28,6 @@
+ - info on sound support under Linux/PPC
+ zImage_layout.txt
+ - info on the kernel images for Linux/PPC
++qe_firmware.txt
++ - describes the layout of firmware binaries for the Freescale QUICC
++ Engine and the code that parses and uploads the microcode therein.
+diff -x .git -x .gitignore -Nur linux-2.6.24/Documentation/powerpc/booting-without-of.txt powerpc.git/Documentation/powerpc/booting-without-of.txt
+--- linux-2.6.24/Documentation/powerpc/booting-without-of.txt 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/Documentation/powerpc/booting-without-of.txt 2008-01-28 20:25:33.000000000 +0100
+@@ -52,7 +52,11 @@
+ i) Freescale QUICC Engine module (QE)
+ j) CFI or JEDEC memory-mapped NOR flash
+ k) Global Utilities Block
+- l) Xilinx IP cores
++ l) Freescale Communications Processor Module
++ m) Chipselect/Local Bus
++ n) 4xx/Axon EMAC ethernet nodes
++ o) Xilinx IP cores
++ p) Freescale Synchronous Serial Interface
+
+ VII - Specifying interrupt information for devices
+ 1) interrupts property
+@@ -671,10 +675,10 @@
+
+ In general, the format of an address for a device is defined by the
+ parent bus type, based on the #address-cells and #size-cells
+-property. In the absence of such a property, the parent's parent
+-values are used, etc... The kernel requires the root node to have
+-those properties defining addresses format for devices directly mapped
+-on the processor bus.
++properties. Note that the parent's parent definitions of #address-cells
++and #size-cells are not inhereted so every node with children must specify
++them. The kernel requires the root node to have those properties defining
++addresses format for devices directly mapped on the processor bus.
+
+ Those 2 properties define 'cells' for representing an address and a
+ size. A "cell" is a 32-bit number. For example, if both contain 2
+@@ -711,13 +715,14 @@
+ like address space bits, you'll have to add a bus translator to the
+ prom_parse.c file of the recent kernels for your bus type.
+
+-The "reg" property only defines addresses and sizes (if #size-cells
+-is non-0) within a given bus. In order to translate addresses upward
++The "reg" property only defines addresses and sizes (if #size-cells is
++non-0) within a given bus. In order to translate addresses upward
+ (that is into parent bus addresses, and possibly into CPU physical
+ addresses), all busses must contain a "ranges" property. If the
+ "ranges" property is missing at a given level, it's assumed that
+-translation isn't possible. The format of the "ranges" property for a
+-bus is a list of:
++translation isn't possible, i.e., the registers are not visible on the
++parent bus. The format of the "ranges" property for a bus is a list
++of:
+
+ bus address, parent bus address, size
+
+@@ -735,6 +740,10 @@
+ 1/1 format, unless the processor supports physical addresses greater
+ than 32-bits, in which case a 2/1 format is recommended.
+
++Alternatively, the "ranges" property may be empty, indicating that the
++registers are visible on the parent bus using an identity mapping
++translation. In other words, the parent bus address space is the same
++as the child bus address space.
+
+ 2) Note about "compatible" properties
+ -------------------------------------
+@@ -1218,16 +1227,14 @@
+
+ Required properties:
+ - reg : Offset and length of the register set for the device
+- - device_type : Should be "mdio"
+ - compatible : Should define the compatible device type for the
+- mdio. Currently, this is most likely to be "gianfar"
++ mdio. Currently, this is most likely to be "fsl,gianfar-mdio"
+
+ Example:
+
+ mdio@24520 {
+ reg = <24520 20>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+
+ ethernet-phy@0 {
+ ......
+@@ -1254,6 +1261,10 @@
+ services interrupts for this device.
+ - phy-handle : The phandle for the PHY connected to this ethernet
+ controller.
++ - fixed-link : <a b c d e> where a is emulated phy id - choose any,
++ but unique to the all specified fixed-links, b is duplex - 0 half,
++ 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
++ pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
+
+ Recommended properties:
+
+@@ -1408,7 +1419,6 @@
+
+ Example multi port host USB controller device node :
+ usb@22000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-mph";
+ reg = <22000 1000>;
+ #address-cells = <1>;
+@@ -1422,7 +1432,6 @@
+
+ Example dual role USB controller device node :
+ usb@23000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-dr";
+ reg = <23000 1000>;
+ #address-cells = <1>;
+@@ -1586,7 +1595,6 @@
+ iii) USB (Universal Serial Bus Controller)
+
+ Required properties:
+- - device_type : should be "usb".
+ - compatible : could be "qe_udc" or "fhci-hcd".
+ - mode : the could be "host" or "slave".
+ - reg : Offset and length of the register set for the device
+@@ -1600,7 +1608,6 @@
+
+ Example(slave):
+ usb@6c0 {
+- device_type = "usb";
+ compatible = "qe_udc";
+ reg = <6c0 40>;
+ interrupts = <8b 0>;
+@@ -1613,7 +1620,7 @@
+
+ Required properties:
+ - device_type : should be "network", "hldc", "uart", "transparent"
+- "bisync" or "atm".
++ "bisync", "atm", or "serial".
+ - compatible : could be "ucc_geth" or "fsl_atm" and so on.
+ - model : should be "UCC".
+ - device-id : the ucc number(1-8), corresponding to UCCx in UM.
+@@ -1626,6 +1633,26 @@
+ - interrupt-parent : the phandle for the interrupt controller that
+ services interrupts for this device.
+ - pio-handle : The phandle for the Parallel I/O port configuration.
++ - port-number : for UART drivers, the port number to use, between 0 and 3.
++ This usually corresponds to the /dev/ttyQE device, e.g. <0> = /dev/ttyQE0.
++ The port number is added to the minor number of the device. Unlike the
++ CPM UART driver, the port-number is required for the QE UART driver.
++ - soft-uart : for UART drivers, if specified this means the QE UART device
++ driver should use "Soft-UART" mode, which is needed on some SOCs that have
++ broken UART hardware. Soft-UART is provided via a microcode upload.
++ - rx-clock-name: the UCC receive clock source
++ "none": clock source is disabled
++ "brg1" through "brg16": clock source is BRG1-BRG16, respectively
++ "clk1" through "clk24": clock source is CLK1-CLK24, respectively
++ - tx-clock-name: the UCC transmit clock source
++ "none": clock source is disabled
++ "brg1" through "brg16": clock source is BRG1-BRG16, respectively
++ "clk1" through "clk24": clock source is CLK1-CLK24, respectively
++ The following two properties are deprecated. rx-clock has been replaced
++ with rx-clock-name, and tx-clock has been replaced with tx-clock-name.
++ Drivers that currently use the deprecated properties should continue to
++ do so, in order to support older device trees, but they should be updated
++ to check for the new properties first.
+ - rx-clock : represents the UCC receive clock source.
+ 0x00 : clock source is disabled;
+ 0x1~0x10 : clock source is BRG1~BRG16 respectively;
+@@ -1772,6 +1799,32 @@
+ };
+ };
+
++ viii) Uploaded QE firmware
++
++ If a new firwmare has been uploaded to the QE (usually by the
++ boot loader), then a 'firmware' child node should be added to the QE
++ node. This node provides information on the uploaded firmware that
++ device drivers may need.
++
++ Required properties:
++ - id: The string name of the firmware. This is taken from the 'id'
++ member of the qe_firmware structure of the uploaded firmware.
++ Device drivers can search this string to determine if the
++ firmware they want is already present.
++ - extended-modes: The Extended Modes bitfield, taken from the
++ firmware binary. It is a 64-bit number represented
++ as an array of two 32-bit numbers.
++ - virtual-traps: The virtual traps, taken from the firmware binary.
++ It is an array of 8 32-bit numbers.
++
++ Example:
++
++ firmware {
++ id = "Soft-UART";
++ extended-modes = <0 0>;
++ virtual-traps = <0 0 0 0 0 0 0 0>;
++ }
++
+ j) CFI or JEDEC memory-mapped NOR flash
+
+ Flash chips (Memory Technology Devices) are often used for solid state
+@@ -2075,8 +2128,7 @@
+
+ Example:
+ localbus@f0010100 {
+- compatible = "fsl,mpc8272ads-localbus",
+- "fsl,mpc8272-localbus",
++ compatible = "fsl,mpc8272-localbus",
+ "fsl,pq2-localbus";
+ #address-cells = <2>;
+ #size-cells = <1>;
+@@ -2254,7 +2306,7 @@
+ available.
+ For Axon: 0x0000012a
+
+- l) Xilinx IP cores
++ o) Xilinx IP cores
+
+ The Xilinx EDK toolchain ships with a set of IP cores (devices) for use
+ in Xilinx Spartan and Virtex FPGAs. The devices cover the whole range
+@@ -2276,7 +2328,7 @@
+ properties of the device node. In general, device nodes for IP-cores
+ will take the following form:
+
+- (name)@(base-address) {
++ (name): (generic-name)@(base-address) {
+ compatible = "xlnx,(ip-core-name)-(HW_VER)"
+ [, (list of compatible devices), ...];
+ reg = <(baseaddr) (size)>;
+@@ -2286,6 +2338,9 @@
+ xlnx,(parameter2) = <(int-value)>;
+ };
+
++ (generic-name): an open firmware-style name that describes the
++ generic class of device. Preferably, this is one word, such
++ as 'serial' or 'ethernet'.
+ (ip-core-name): the name of the ip block (given after the BEGIN
+ directive in system.mhs). Should be in lowercase
+ and all underscores '_' converted to dashes '-'.
+@@ -2294,9 +2349,9 @@
+ dropped from the parameter name, the name is converted
+ to lowercase and all underscore '_' characters are
+ converted to dashes '-'.
+- (baseaddr): the C_BASEADDR parameter.
++ (baseaddr): the baseaddr parameter value (often named C_BASEADDR).
+ (HW_VER): from the HW_VER parameter.
+- (size): equals C_HIGHADDR - C_BASEADDR + 1
++ (size): the address range size (often C_HIGHADDR - C_BASEADDR + 1).
+
+ Typically, the compatible list will include the exact IP core version
+ followed by an older IP core version which implements the same
+@@ -2326,11 +2381,11 @@
+
+ becomes the following device tree node:
+
+- opb-uartlite-0@ec100000 {
++ opb_uartlite_0: serial@ec100000 {
+ device_type = "serial";
+ compatible = "xlnx,opb-uartlite-1.00.b";
+ reg = <ec100000 10000>;
+- interrupt-parent = <&opb-intc>;
++ interrupt-parent = <&opb_intc_0>;
+ interrupts = <1 0>; // got this from the opb_intc parameters
+ current-speed = <d#115200>; // standard serial device prop
+ clock-frequency = <d#50000000>; // standard serial device prop
+@@ -2339,16 +2394,19 @@
+ xlnx,use-parity = <0>;
+ };
+
+- Some IP cores actually implement 2 or more logical devices. In this case,
+- the device should still describe the whole IP core with a single node
+- and add a child node for each logical device. The ranges property can
+- be used to translate from parent IP-core to the registers of each device.
+- (Note: this makes the assumption that both logical devices have the same
+- bus binding. If this is not true, then separate nodes should be used for
+- each logical device). The 'cell-index' property can be used to enumerate
+- logical devices within an IP core. For example, the following is the
+- system.mhs entry for the dual ps2 controller found on the ml403 reference
+- design.
++ Some IP cores actually implement 2 or more logical devices. In
++ this case, the device should still describe the whole IP core with
++ a single node and add a child node for each logical device. The
++ ranges property can be used to translate from parent IP-core to the
++ registers of each device. In addition, the parent node should be
++ compatible with the bus type 'xlnx,compound', and should contain
++ #address-cells and #size-cells, as with any other bus. (Note: this
++ makes the assumption that both logical devices have the same bus
++ binding. If this is not true, then separate nodes should be used
++ for each logical device). The 'cell-index' property can be used to
++ enumerate logical devices within an IP core. For example, the
++ following is the system.mhs entry for the dual ps2 controller found
++ on the ml403 reference design.
+
+ BEGIN opb_ps2_dual_ref
+ PARAMETER INSTANCE = opb_ps2_dual_ref_0
+@@ -2370,21 +2428,24 @@
+
+ It would result in the following device tree nodes:
+
+- opb_ps2_dual_ref_0@a9000000 {
++ opb_ps2_dual_ref_0: opb-ps2-dual-ref@a9000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "xlnx,compound";
+ ranges = <0 a9000000 2000>;
+ // If this device had extra parameters, then they would
+ // go here.
+ ps2@0 {
+ compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
+ reg = <0 40>;
+- interrupt-parent = <&opb-intc>;
++ interrupt-parent = <&opb_intc_0>;
+ interrupts = <3 0>;
+ cell-index = <0>;
+ };
+ ps2@1000 {
+ compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
+ reg = <1000 40>;
+- interrupt-parent = <&opb-intc>;
++ interrupt-parent = <&opb_intc_0>;
+ interrupts = <3 0>;
+ cell-index = <0>;
+ };
+@@ -2447,17 +2508,18 @@
+
+ Gives this device tree (some properties removed for clarity):
+
+- plb-v34-0 {
++ plb@0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
++ compatible = "xlnx,plb-v34-1.02.a";
+ device_type = "ibm,plb";
+ ranges; // 1:1 translation
+
+- plb-bram-if-cntrl-0@ffff0000 {
++ plb_bram_if_cntrl_0: bram@ffff0000 {
+ reg = <ffff0000 10000>;
+ }
+
+- opb-v20-0 {
++ opb@20000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <20000000 20000000 20000000
+@@ -2465,11 +2527,11 @@
+ 80000000 80000000 40000000
+ c0000000 c0000000 20000000>;
+
+- opb-uart16550-0@a0000000 {
++ opb_uart16550_0: serial@a0000000 {
+ reg = <a00000000 2000>;
+ };
+
+- opb-intc-0@d1000fc0 {
++ opb_intc_0: interrupt-controller@d1000fc0 {
+ reg = <d1000fc0 20>;
+ };
+ };
+@@ -2514,6 +2576,46 @@
+ Requred properties:
+ - current-speed : Baud rate of uartlite
+
++ p) Freescale Synchronous Serial Interface
++
++ The SSI is a serial device that communicates with audio codecs. It can
++ be programmed in AC97, I2S, left-justified, or right-justified modes.
++
++ Required properties:
++ - compatible : compatible list, containing "fsl,ssi"
++ - cell-index : the SSI, <0> = SSI1, <1> = SSI2, and so on
++ - reg : offset and length of the register set for the device
++ - interrupts : <a b> where a is the interrupt number and b is a
++ field that represents an encoding of the sense and
++ level information for the interrupt. This should be
++ encoded based on the information in section 2)
++ depending on the type of interrupt controller you
++ have.
++ - interrupt-parent : the phandle for the interrupt controller that
++ services interrupts for this device.
++ - fsl,mode : the operating mode for the SSI interface
++ "i2s-slave" - I2S mode, SSI is clock slave
++ "i2s-master" - I2S mode, SSI is clock master
++ "lj-slave" - left-justified mode, SSI is clock slave
++ "lj-master" - l.j. mode, SSI is clock master
++ "rj-slave" - right-justified mode, SSI is clock slave
++ "rj-master" - r.j., SSI is clock master
++ "ac97-slave" - AC97 mode, SSI is clock slave
++ "ac97-master" - AC97 mode, SSI is clock master
++
++ Optional properties:
++ - codec-handle : phandle to a 'codec' node that defines an audio
++ codec connected to this SSI. This node is typically
++ a child of an I2C or other control node.
++
++ Child 'codec' node required properties:
++ - compatible : compatible list, contains the name of the codec
++
++ Child 'codec' node optional properties:
++ - clock-frequency : The frequency of the input clock, which typically
++ comes from an on-board dedicated oscillator.
++
++
+ More devices will be defined as this spec matures.
+
+ VII - Specifying interrupt information for devices
+diff -x .git -x .gitignore -Nur linux-2.6.24/Documentation/powerpc/qe_firmware.txt powerpc.git/Documentation/powerpc/qe_firmware.txt
+--- linux-2.6.24/Documentation/powerpc/qe_firmware.txt 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/Documentation/powerpc/qe_firmware.txt 2008-01-28 20:25:33.000000000 +0100
+@@ -0,0 +1,295 @@
++ Freescale QUICC Engine Firmware Uploading
++ -----------------------------------------
++
++(c) 2007 Timur Tabi <timur at freescale.com>,
++ Freescale Semiconductor
++
++Table of Contents
++=================
++
++ I - Software License for Firmware
++
++ II - Microcode Availability
++
++ III - Description and Terminology
++
++ IV - Microcode Programming Details
++
++ V - Firmware Structure Layout
++
++ VI - Sample Code for Creating Firmware Files
++
++Revision Information
++====================
++
++November 30, 2007: Rev 1.0 - Initial version
++
++I - Software License for Firmware
++=================================
++
++Each firmware file comes with its own software license. For information on
++the particular license, please see the license text that is distributed with
++the firmware.
++
++II - Microcode Availability
++===========================
++
++Firmware files are distributed through various channels. Some are available on
++http://opensource.freescale.com. For other firmware files, please contact
++your Freescale representative or your operating system vendor.
++
++III - Description and Terminology
++================================
++
++In this document, the term 'microcode' refers to the sequence of 32-bit
++integers that compose the actual QE microcode.
++
++The term 'firmware' refers to a binary blob that contains the microcode as
++well as other data that
++
++ 1) describes the microcode's purpose
++ 2) describes how and where to upload the microcode
++ 3) specifies the values of various registers
++ 4) includes additional data for use by specific device drivers
++
++Firmware files are binary files that contain only a firmware.
++
++IV - Microcode Programming Details
++===================================
++
++The QE architecture allows for only one microcode present in I-RAM for each
++RISC processor. To replace any current microcode, a full QE reset (which
++disables the microcode) must be performed first.
++
++QE microcode is uploaded using the following procedure:
++
++1) The microcode is placed into I-RAM at a specific location, using the
++ IRAM.IADD and IRAM.IDATA registers.
++
++2) The CERCR.CIR bit is set to 0 or 1, depending on whether the firmware
++ needs split I-RAM. Split I-RAM is only meaningful for SOCs that have
++ QEs with multiple RISC processors, such as the 8360. Splitting the I-RAM
++ allows each processor to run a different microcode, effectively creating an
++ asymmetric multiprocessing (AMP) system.
++
++3) The TIBCR trap registers are loaded with the addresses of the trap handlers
++ in the microcode.
++
++4) The RSP.ECCR register is programmed with the value provided.
++
++5) If necessary, device drivers that need the virtual traps and extended mode
++ data will use them.
++
++Virtual Microcode Traps
++
++These virtual traps are conditional branches in the microcode. These are
++"soft" provisional introduced in the ROMcode in order to enable higher
++flexibility and save h/w traps If new features are activated or an issue is
++being fixed in the RAM package utilizing they should be activated. This data
++structure signals the microcode which of these virtual traps is active.
++
++This structure contains 6 words that the application should copy to some
++specific been defined. This table describes the structure.
++
++ ---------------------------------------------------------------
++ | Offset in | | Destination Offset | Size of |
++ | array | Protocol | within PRAM | Operand |
++ --------------------------------------------------------------|
++ | 0 | Ethernet | 0xF8 | 4 bytes |
++ | | interworking | | |
++ ---------------------------------------------------------------
++ | 4 | ATM | 0xF8 | 4 bytes |
++ | | interworking | | |
++ ---------------------------------------------------------------
++ | 8 | PPP | 0xF8 | 4 bytes |
++ | | interworking | | |
++ ---------------------------------------------------------------
++ | 12 | Ethernet RX | 0x22 | 1 byte |
++ | | Distributor Page | | |
++ ---------------------------------------------------------------
++ | 16 | ATM Globtal | 0x28 | 1 byte |
++ | | Params Table | | |
++ ---------------------------------------------------------------
++ | 20 | Insert Frame | 0xF8 | 4 bytes |
++ ---------------------------------------------------------------
++
++
++Extended Modes
++
++This is a double word bit array (64 bits) that defines special functionality
++which has an impact on the softwarew drivers. Each bit has its own impact
++and has special instructions for the s/w associated with it. This structure is
++described in this table:
++
++ -----------------------------------------------------------------------
++ | Bit # | Name | Description |
++ -----------------------------------------------------------------------
++ | 0 | General | Indicates that prior to each host command |
++ | | push command | given by the application, the software must |
++ | | | assert a special host command (push command)|
++ | | | CECDR = 0x00800000. |
++ | | | CECR = 0x01c1000f. |
++ -----------------------------------------------------------------------
++ | 1 | UCC ATM | Indicates that after issuing ATM RX INIT |
++ | | RX INIT | command, the host must issue another special|
++ | | push command | command (push command) and immediately |
++ | | | following that re-issue the ATM RX INIT |
++ | | | command. (This makes the sequence of |
++ | | | initializing the ATM receiver a sequence of |
++ | | | three host commands) |
++ | | | CECDR = 0x00800000. |
++ | | | CECR = 0x01c1000f. |
++ -----------------------------------------------------------------------
++ | 2 | Add/remove | Indicates that following the specific host |
++ | | command | command: "Add/Remove entry in Hash Lookup |
++ | | validation | Table" used in Interworking setup, the user |
++ | | | must issue another command. |
++ | | | CECDR = 0xce000003. |
++ | | | CECR = 0x01c10f58. |
++ -----------------------------------------------------------------------
++ | 3 | General push | Indicates that the s/w has to initialize |
++ | | command | some pointers in the Ethernet thread pages |
++ | | | which are used when Header Compression is |
++ | | | activated. The full details of these |
++ | | | pointers is located in the software drivers.|
++ -----------------------------------------------------------------------
++ | 4 | General push | Indicates that after issuing Ethernet TX |
++ | | command | INIT command, user must issue this command |
++ | | | for each SNUM of Ethernet TX thread. |
++ | | | CECDR = 0x00800003. |
++ | | | CECR = 0x7'b{0}, 8'b{Enet TX thread SNUM}, |
++ | | | 1'b{1}, 12'b{0}, 4'b{1} |
++ -----------------------------------------------------------------------
++ | 5 - 31 | N/A | Reserved, set to zero. |
++ -----------------------------------------------------------------------
++
++V - Firmware Structure Layout
++==============================
++
++QE microcode from Freescale is typically provided as a header file. This
++header file contains macros that define the microcode binary itself as well as
++some other data used in uploading that microcode. The format of these files
++do not lend themselves to simple inclusion into other code. Hence,
++the need for a more portable format. This section defines that format.
++
++Instead of distributing a header file, the microcode and related data are
++embedded into a binary blob. This blob is passed to the qe_upload_firmware()
++function, which parses the blob and performs everything necessary to upload
++the microcode.
++
++All integers are big-endian. See the comments for function
++qe_upload_firmware() for up-to-date implementation information.
++
++This structure supports versioning, where the version of the structure is
++embedded into the structure itself. To ensure forward and backwards
++compatibility, all versions of the structure must use the same 'qe_header'
++structure at the beginning.
++
++'header' (type: struct qe_header):
++ The 'length' field is the size, in bytes, of the entire structure,
++ including all the microcode embedded in it, as well as the CRC (if
++ present).
++
++ The 'magic' field is an array of three bytes that contains the letters
++ 'Q', 'E', and 'F'. This is an identifier that indicates that this
++ structure is a QE Firmware structure.
++
++ The 'version' field is a single byte that indicates the version of this
++ structure. If the layout of the structure should ever need to be
++ changed to add support for additional types of microcode, then the
++ version number should also be changed.
++
++The 'id' field is a null-terminated string(suitable for printing) that
++identifies the firmware.
++
++The 'count' field indicates the number of 'microcode' structures. There
++must be one and only one 'microcode' structure for each RISC processor.
++Therefore, this field also represents the number of RISC processors for this
++SOC.
++
++The 'soc' structure contains the SOC numbers and revisions used to match
++the microcode to the SOC itself. Normally, the microcode loader should
++check the data in this structure with the SOC number and revisions, and
++only upload the microcode if there's a match. However, this check is not
++made on all platforms.
++
++Although it is not recommended, you can specify '0' in the soc.model
++field to skip matching SOCs altogether.
++
++The 'model' field is a 16-bit number that matches the actual SOC. The
++'major' and 'minor' fields are the major and minor revision numbrs,
++respectively, of the SOC.
++
++For example, to match the 8323, revision 1.0:
++ soc.model = 8323
++ soc.major = 1
++ soc.minor = 0
++
++'padding' is neccessary for structure alignment. This field ensures that the
++'extended_modes' field is aligned on a 64-bit boundary.
++
++'extended_modes' is a bitfield that defines special functionality which has an
++impact on the device drivers. Each bit has its own impact and has special
++instructions for the driver associated with it. This field is stored in
++the QE library and available to any driver that calles qe_get_firmware_info().
++
++'vtraps' is an array of 8 words that contain virtual trap values for each
++virtual traps. As with 'extended_modes', this field is stored in the QE
++library and available to any driver that calles qe_get_firmware_info().
++
++'microcode' (type: struct qe_microcode):
++ For each RISC processor there is one 'microcode' structure. The first
++ 'microcode' structure is for the first RISC, and so on.
++
++ The 'id' field is a null-terminated string suitable for printing that
++ identifies this particular microcode.
++
++ 'traps' is an array of 16 words that contain hardware trap values
++ for each of the 16 traps. If trap[i] is 0, then this particular
++ trap is to be ignored (i.e. not written to TIBCR[i]). The entire value
++ is written as-is to the TIBCR[i] register, so be sure to set the EN
++ and T_IBP bits if necessary.
++
++ 'eccr' is the value to program into the ECCR register.
++
++ 'iram_offset' is the offset into IRAM to start writing the
++ microcode.
++
++ 'count' is the number of 32-bit words in the microcode.
++
++ 'code_offset' is the offset, in bytes, from the beginning of this
++ structure where the microcode itself can be found. The first
++ microcode binary should be located immediately after the 'microcode'
++ array.
++
++ 'major', 'minor', and 'revision' are the major, minor, and revision
++ version numbers, respectively, of the microcode. If all values are 0,
++ then these fields are ignored.
++
++ 'reserved' is necessary for structure alignment. Since 'microcode'
++ is an array, the 64-bit 'extended_modes' field needs to be aligned
++ on a 64-bit boundary, and this can only happen if the size of
++ 'microcode' is a multiple of 8 bytes. To ensure that, we add
++ 'reserved'.
++
++After the last microcode is a 32-bit CRC. It can be calculated using
++this algorithm:
++
++u32 crc32(const u8 *p, unsigned int len)
++{
++ unsigned int i;
++ u32 crc = 0;
++
++ while (len--) {
++ crc ^= *p++;
++ for (i = 0; i < 8; i++)
++ crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
++ }
++ return crc;
++}
++
++VI - Sample Code for Creating Firmware Files
++============================================
++
++A Python program that creates firmware binaries from the header files normally
++distributed by Freescale can be found on http://opensource.freescale.com.
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/Kconfig powerpc.git/arch/powerpc/Kconfig
+--- linux-2.6.24/arch/powerpc/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/Kconfig 2008-01-28 21:37:04.000000000 +0100
+@@ -140,6 +140,9 @@
+ Used to allow a board to specify it wants a uImage built by default
+ default n
+
++config REDBOOT
++ bool
++
+ config PPC64_SWSUSP
+ bool
+ depends on PPC64 && (BROKEN || (PPC_PMAC64 && EXPERIMENTAL))
+@@ -160,11 +163,13 @@
+
+ config PPC_OF_PLATFORM_PCI
+ bool
++ depends on PCI
+ depends on PPC64 # not supported on 32 bits yet
+ default n
+
+ source "init/Kconfig"
+
++source "arch/powerpc/sysdev/Kconfig"
+ source "arch/powerpc/platforms/Kconfig"
+
+ menu "Kernel options"
+@@ -417,7 +422,7 @@
+
+ config ISA_DMA_API
+ bool
+- default y
++ default !PPC_ISERIES || PCI
+
+ menu "Bus options"
+
+@@ -467,7 +472,7 @@
+ config PCI
+ bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
+ || PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
+- || PPC_PS3
++ || PPC_PS3 || 44x
+ default y if !40x && !CPM2 && !8xx && !PPC_83xx \
+ && !PPC_85xx && !PPC_86xx
+ default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/Kconfig.debug powerpc.git/arch/powerpc/Kconfig.debug
+--- linux-2.6.24/arch/powerpc/Kconfig.debug 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/Kconfig.debug 2008-01-28 20:25:49.000000000 +0100
+@@ -151,6 +151,13 @@
+
+ config PPC_EARLY_DEBUG
+ bool "Early debugging (dangerous)"
++ help
++ Say Y to enable some early debugging facilities that may be available
++ for your processor/board combination. Those facilities are hacks
++ intended to debug problems early during boot, this should not be
++ enabled in a production kernel.
++ Note that enabling this will also cause the kernel default log level
++ to be pushed to max automatically very early during boot
+
+ choice
+ prompt "Early debugging console"
+@@ -218,7 +225,16 @@
+ depends on 44x
+ help
+ Select this to enable early debugging for IBM 44x chips via the
+- inbuilt serial port.
++ inbuilt serial port. If you enable this, ensure you set
++ PPC_EARLY_DEBUG_44x_PHYSLOW below to suit your target board.
++
++config PPC_EARLY_DEBUG_40x
++ bool "Early serial debugging for IBM/AMCC 40x CPUs"
++ depends on 40x
++ help
++ Select this to enable early debugging for IBM 40x chips via the
++ inbuilt serial port. This works on chips with a 16550 compatible
++ UART. Xilinx chips with uartlite cannot use this option.
+
+ config PPC_EARLY_DEBUG_CPM
+ bool "Early serial debugging for Freescale CPM-based serial ports"
+@@ -235,12 +251,20 @@
+ hex "Low 32 bits of early debug UART physical address"
+ depends on PPC_EARLY_DEBUG_44x
+ default "0x40000200"
++ help
++ You probably want 0x40000200 for ebony boards and
++ 0x40000300 for taishan
+
+ config PPC_EARLY_DEBUG_44x_PHYSHIGH
+ hex "EPRN of early debug UART physical address"
+ depends on PPC_EARLY_DEBUG_44x
+ default "0x1"
+
++config PPC_EARLY_DEBUG_40x_PHYSADDR
++ hex "Early debug UART physical address"
++ depends on PPC_EARLY_DEBUG_40x
++ default "0xef600300"
++
+ config PPC_EARLY_DEBUG_CPM_ADDR
+ hex "CPM UART early debug transmit descriptor address"
+ depends on PPC_EARLY_DEBUG_CPM
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/Makefile powerpc.git/arch/powerpc/Makefile
+--- linux-2.6.24/arch/powerpc/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -167,6 +167,9 @@
+ $(BOOT_TARGETS): vmlinux
+ $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
+
++bootwrapper_install:
++ $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
++
+ define archhelp
+ @echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
+ @echo ' install - Install kernel using'
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/4xx.c powerpc.git/arch/powerpc/boot/4xx.c
+--- linux-2.6.24/arch/powerpc/boot/4xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/4xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -22,16 +22,14 @@
+ #include "dcr.h"
+
+ /* Read the 4xx SDRAM controller to get size of system memory. */
+-void ibm4xx_fixup_memsize(void)
++void ibm4xx_sdram_fixup_memsize(void)
+ {
+ int i;
+ unsigned long memsize, bank_config;
+
+ memsize = 0;
+ for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
+- mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
+- bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
+-
++ bank_config = SDRAM0_READ(sdram_bxcr[i]);
+ if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
+ memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
+ }
+@@ -39,6 +37,69 @@
+ dt_fixup_memory(0, memsize);
+ }
+
++/* Read the 440SPe MQ controller to get size of system memory. */
++#define DCRN_MQ0_B0BAS 0x40
++#define DCRN_MQ0_B1BAS 0x41
++#define DCRN_MQ0_B2BAS 0x42
++#define DCRN_MQ0_B3BAS 0x43
++
++static u64 ibm440spe_decode_bas(u32 bas)
++{
++ u64 base = ((u64)(bas & 0xFFE00000u)) << 2;
++
++ /* open coded because I'm paranoid about invalid values */
++ switch ((bas >> 4) & 0xFFF) {
++ case 0:
++ return 0;
++ case 0xffc:
++ return base + 0x000800000ull;
++ case 0xff8:
++ return base + 0x001000000ull;
++ case 0xff0:
++ return base + 0x002000000ull;
++ case 0xfe0:
++ return base + 0x004000000ull;
++ case 0xfc0:
++ return base + 0x008000000ull;
++ case 0xf80:
++ return base + 0x010000000ull;
++ case 0xf00:
++ return base + 0x020000000ull;
++ case 0xe00:
++ return base + 0x040000000ull;
++ case 0xc00:
++ return base + 0x080000000ull;
++ case 0x800:
++ return base + 0x100000000ull;
++ }
++ printf("Memory BAS value 0x%08x unsupported !\n", bas);
++ return 0;
++}
++
++void ibm440spe_fixup_memsize(void)
++{
++ u64 banktop, memsize = 0;
++
++ /* Ultimately, we should directly construct the memory node
++ * so we are able to handle holes in the memory address space
++ */
++ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B0BAS));
++ if (banktop > memsize)
++ memsize = banktop;
++ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B1BAS));
++ if (banktop > memsize)
++ memsize = banktop;
++ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B2BAS));
++ if (banktop > memsize)
++ memsize = banktop;
++ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B3BAS));
++ if (banktop > memsize)
++ memsize = banktop;
++
++ dt_fixup_memory(0, memsize);
++}
++
++
+ /* 4xx DDR1/2 Denali memory controller support */
+ /* DDR0 registers */
+ #define DDR0_02 2
+@@ -77,19 +138,13 @@
+
+ #define DDR_GET_VAL(val, mask, shift) (((val) >> (shift)) & (mask))
+
+-static inline u32 mfdcr_sdram0(u32 reg)
+-{
+- mtdcr(DCRN_SDRAM0_CFGADDR, reg);
+- return mfdcr(DCRN_SDRAM0_CFGDATA);
+-}
+-
+ void ibm4xx_denali_fixup_memsize(void)
+ {
+ u32 val, max_cs, max_col, max_row;
+ u32 cs, col, row, bank, dpath;
+ unsigned long memsize;
+
+- val = mfdcr_sdram0(DDR0_02);
++ val = SDRAM0_READ(DDR0_02);
+ if (!DDR_GET_VAL(val, DDR_START, DDR_START_SHIFT))
+ fatal("DDR controller is not initialized\n");
+
+@@ -99,12 +154,12 @@
+ max_row = DDR_GET_VAL(val, DDR_MAX_ROW_REG, DDR_MAX_ROW_REG_SHIFT);
+
+ /* get CS value */
+- val = mfdcr_sdram0(DDR0_10);
++ val = SDRAM0_READ(DDR0_10);
+
+ val = DDR_GET_VAL(val, DDR_CS_MAP, DDR_CS_MAP_SHIFT);
+ cs = 0;
+ while (val) {
+- if (val && 0x1)
++ if (val & 0x1)
+ cs++;
+ val = val >> 1;
+ }
+@@ -115,15 +170,15 @@
+ fatal("DDR wrong CS configuration\n");
+
+ /* get data path bytes */
+- val = mfdcr_sdram0(DDR0_14);
++ val = SDRAM0_READ(DDR0_14);
+
+ if (DDR_GET_VAL(val, DDR_REDUC, DDR_REDUC_SHIFT))
+ dpath = 8; /* 64 bits */
+ else
+ dpath = 4; /* 32 bits */
+
+- /* get adress pins (rows) */
+- val = mfdcr_sdram0(DDR0_42);
++ /* get address pins (rows) */
++ val = SDRAM0_READ(DDR0_42);
+
+ row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT);
+ if (row > max_row)
+@@ -131,7 +186,7 @@
+ row = max_row - row;
+
+ /* get collomn size and banks */
+- val = mfdcr_sdram0(DDR0_43);
++ val = SDRAM0_READ(DDR0_43);
+
+ col = DDR_GET_VAL(val, DDR_COL_SZ, DDR_COL_SZ_SHIFT);
+ if (col > max_col)
+@@ -179,13 +234,17 @@
+ #define EMAC_RESET 0x20000000
+ void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1)
+ {
+- /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't do this for us */
++ /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't
++ * do this for us
++ */
+ if (emac0)
+ *emac0 = EMAC_RESET;
+ if (emac1)
+ *emac1 = EMAC_RESET;
+
+ mtdcr(DCRN_MAL0_CFG, MAL_RESET);
++ while (mfdcr(DCRN_MAL0_CFG) & MAL_RESET)
++ ; /* loop until reset takes effect */
+ }
+
+ /* Read 4xx EBC bus bridge registers to get mappings of the peripheral
+@@ -217,84 +276,335 @@
+ setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
+ }
+
+-#define SPRN_CCR1 0x378
+-void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
++/* Calculate 440GP clocks */
++void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
+ {
+- u32 cpu, plb, opb, ebc, tb, uart0, m, vco;
+- u32 reg;
+- u32 fwdva, fwdvb, fbdv, lfbdv, opbdv0, perdv0, spcid0, prbdv0, tmp;
+-
+- mtdcr(DCRN_CPR0_ADDR, CPR0_PLLD0);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x000F0000) >> 16;
+- fwdva = tmp ? tmp : 16;
+- tmp = (reg & 0x00000700) >> 8;
+- fwdvb = tmp ? tmp : 8;
+- tmp = (reg & 0x1F000000) >> 24;
+- fbdv = tmp ? tmp : 32;
+- lfbdv = (reg & 0x0000007F);
+-
+- mtdcr(DCRN_CPR0_ADDR, CPR0_OPBD0);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x03000000) >> 24;
+- opbdv0 = tmp ? tmp : 4;
+-
+- mtdcr(DCRN_CPR0_ADDR, CPR0_PERD0);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x07000000) >> 24;
+- perdv0 = tmp ? tmp : 8;
+-
+- mtdcr(DCRN_CPR0_ADDR, CPR0_PRIMBD0);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x07000000) >> 24;
+- prbdv0 = tmp ? tmp : 8;
+-
+- mtdcr(DCRN_CPR0_ADDR, CPR0_SCPID);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x03000000) >> 24;
+- spcid0 = tmp ? tmp : 4;
+-
+- /* Calculate M */
+- mtdcr(DCRN_CPR0_ADDR, CPR0_PLLC0);
+- reg = mfdcr(DCRN_CPR0_DATA);
+- tmp = (reg & 0x03000000) >> 24;
+- if (tmp == 0) { /* PLL output */
+- tmp = (reg & 0x20000000) >> 29;
+- if (!tmp) /* PLLOUTA */
+- m = fbdv * lfbdv * fwdva;
++ u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
++ u32 cr0 = mfdcr(DCRN_CPC0_CR0);
++ u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
++ u32 opdv = CPC0_SYS0_OPDV(sys0);
++ u32 epdv = CPC0_SYS0_EPDV(sys0);
++
++ if (sys0 & CPC0_SYS0_BYPASS) {
++ /* Bypass system PLL */
++ cpu = plb = sys_clk;
++ } else {
++ if (sys0 & CPC0_SYS0_EXTSL)
++ /* PerClk */
++ m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
+ else
+- m = fbdv * lfbdv * fwdvb;
++ /* CPU clock */
++ m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
++ cpu = sys_clk * m / CPC0_SYS0_FWDVA(sys0);
++ plb = sys_clk * m / CPC0_SYS0_FWDVB(sys0);
+ }
+- else if (tmp == 1) /* CPU output */
+- m = fbdv * fwdva;
++
++ opb = plb / opdv;
++ ebc = opb / epdv;
++
++ /* FIXME: Check if this is for all 440GP, or just Ebony */
++ if ((mfpvr() & 0xf0000fff) == 0x40000440)
++ /* Rev. B 440GP, use external system clock */
++ tb = sys_clk;
+ else
+- m = perdv0 * opbdv0 * fwdvb;
++ /* Rev. C 440GP, errata force us to use internal clock */
++ tb = cpu;
+
+- vco = (m * sysclk) + (m >> 1);
+- cpu = vco / fwdva;
+- plb = vco / fwdvb / prbdv0;
+- opb = plb / opbdv0;
+- ebc = plb / perdv0;
++ if (cr0 & CPC0_CR0_U0EC)
++ /* External UART clock */
++ uart0 = ser_clk;
++ else
++ /* Internal UART clock */
++ uart0 = plb / CPC0_CR0_UDIV(cr0);
+
+- /* FIXME */
+- uart0 = ser_clk;
++ if (cr0 & CPC0_CR0_U1EC)
++ /* External UART clock */
++ uart1 = ser_clk;
++ else
++ /* Internal UART clock */
++ uart1 = plb / CPC0_CR0_UDIV(cr0);
++
++ printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
++ (sys_clk + 500000) / 1000000, sys_clk);
++
++ dt_fixup_cpu_clocks(cpu, tb, 0);
++
++ dt_fixup_clock("/plb", plb);
++ dt_fixup_clock("/plb/opb", opb);
++ dt_fixup_clock("/plb/opb/ebc", ebc);
++ dt_fixup_clock("/plb/opb/serial@40000200", uart0);
++ dt_fixup_clock("/plb/opb/serial@40000300", uart1);
++}
++
++#define SPRN_CCR1 0x378
++
++static inline u32 __fix_zero(u32 v, u32 def)
++{
++ return v ? v : def;
++}
++
++static unsigned int __ibm440eplike_fixup_clocks(unsigned int sys_clk,
++ unsigned int tmr_clk,
++ int per_clk_from_opb)
++{
++ /* PLL config */
++ u32 pllc = CPR0_READ(DCRN_CPR0_PLLC);
++ u32 plld = CPR0_READ(DCRN_CPR0_PLLD);
++
++ /* Dividers */
++ u32 fbdv = __fix_zero((plld >> 24) & 0x1f, 32);
++ u32 fwdva = __fix_zero((plld >> 16) & 0xf, 16);
++ u32 fwdvb = __fix_zero((plld >> 8) & 7, 8);
++ u32 lfbdv = __fix_zero(plld & 0x3f, 64);
++ u32 pradv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMAD) >> 24) & 7, 8);
++ u32 prbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMBD) >> 24) & 7, 8);
++ u32 opbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_OPBD) >> 24) & 3, 4);
++ u32 perdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PERD) >> 24) & 3, 4);
++
++ /* Input clocks for primary dividers */
++ u32 clk_a, clk_b;
++
++ /* Resulting clocks */
++ u32 cpu, plb, opb, ebc, vco;
++
++ /* Timebase */
++ u32 ccr1, tb = tmr_clk;
++
++ if (pllc & 0x40000000) {
++ u32 m;
++
++ /* Feedback path */
++ switch ((pllc >> 24) & 7) {
++ case 0:
++ /* PLLOUTx */
++ m = ((pllc & 0x20000000) ? fwdvb : fwdva) * lfbdv;
++ break;
++ case 1:
++ /* CPU */
++ m = fwdva * pradv0;
++ break;
++ case 5:
++ /* PERClk */
++ m = fwdvb * prbdv0 * opbdv0 * perdv0;
++ break;
++ default:
++ printf("WARNING ! Invalid PLL feedback source !\n");
++ goto bypass;
++ }
++ m *= fbdv;
++ vco = sys_clk * m;
++ clk_a = vco / fwdva;
++ clk_b = vco / fwdvb;
++ } else {
++bypass:
++ /* Bypass system PLL */
++ vco = 0;
++ clk_a = clk_b = sys_clk;
++ }
++
++ cpu = clk_a / pradv0;
++ plb = clk_b / prbdv0;
++ opb = plb / opbdv0;
++ ebc = (per_clk_from_opb ? opb : plb) / perdv0;
+
+ /* Figure out timebase. Either CPU or default TmrClk */
+- asm volatile (
+- "mfspr %0,%1\n"
+- :
+- "=&r"(reg) : "i"(SPRN_CCR1));
+- if (reg & 0x0080)
+- tb = 25000000; /* TmrClk is 25MHz */
+- else
++ ccr1 = mfspr(SPRN_CCR1);
++
++ /* If passed a 0 tmr_clk, force CPU clock */
++ if (tb == 0) {
++ ccr1 &= ~0x80u;
++ mtspr(SPRN_CCR1, ccr1);
++ }
++ if ((ccr1 & 0x0080) == 0)
+ tb = cpu;
+
+ dt_fixup_cpu_clocks(cpu, tb, 0);
+ dt_fixup_clock("/plb", plb);
+ dt_fixup_clock("/plb/opb", opb);
+ dt_fixup_clock("/plb/opb/ebc", ebc);
++
++ return plb;
++}
++
++static void eplike_fixup_uart_clk(int index, const char *path,
++ unsigned int ser_clk,
++ unsigned int plb_clk)
++{
++ unsigned int sdr;
++ unsigned int clock;
++
++ switch (index) {
++ case 0:
++ sdr = SDR0_READ(DCRN_SDR0_UART0);
++ break;
++ case 1:
++ sdr = SDR0_READ(DCRN_SDR0_UART1);
++ break;
++ case 2:
++ sdr = SDR0_READ(DCRN_SDR0_UART2);
++ break;
++ case 3:
++ sdr = SDR0_READ(DCRN_SDR0_UART3);
++ break;
++ default:
++ return;
++ }
++
++ if (sdr & 0x00800000u)
++ clock = ser_clk;
++ else
++ clock = plb_clk / __fix_zero(sdr & 0xff, 256);
++
++ dt_fixup_clock(path, clock);
++}
++
++void ibm440ep_fixup_clocks(unsigned int sys_clk,
++ unsigned int ser_clk,
++ unsigned int tmr_clk)
++{
++ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 0);
++
++ /* serial clocks beed fixup based on int/ext */
++ eplike_fixup_uart_clk(0, "/plb/opb/serial@ef600300", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(1, "/plb/opb/serial@ef600400", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(2, "/plb/opb/serial@ef600500", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(3, "/plb/opb/serial@ef600600", ser_clk, plb_clk);
++}
++
++void ibm440gx_fixup_clocks(unsigned int sys_clk,
++ unsigned int ser_clk,
++ unsigned int tmr_clk)
++{
++ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
++
++ /* serial clocks beed fixup based on int/ext */
++ eplike_fixup_uart_clk(0, "/plb/opb/serial@40000200", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(1, "/plb/opb/serial@40000300", ser_clk, plb_clk);
++}
++
++void ibm440spe_fixup_clocks(unsigned int sys_clk,
++ unsigned int ser_clk,
++ unsigned int tmr_clk)
++{
++ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
++
++ /* serial clocks beed fixup based on int/ext */
++ eplike_fixup_uart_clk(0, "/plb/opb/serial@10000200", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(1, "/plb/opb/serial@10000300", ser_clk, plb_clk);
++ eplike_fixup_uart_clk(2, "/plb/opb/serial@10000600", ser_clk, plb_clk);
++}
++
++void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
++{
++ u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
++ u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
++ u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
++ u32 psr = mfdcr(DCRN_405_CPC0_PSR);
++ u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
++ u32 fwdv, fwdvb, fbdv, cbdv, opdv, epdv, ppdv, udiv;
++
++ fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
++ fbdv = (pllmr & 0x1e000000) >> 25;
++ if (fbdv == 0)
++ fbdv = 16;
++ cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */
++ opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */
++ ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */
++ epdv = ((pllmr & 0x00001800) >> 11) + 2; /* PLB:EBC */
++ udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
++
++ /* check for 405GPr */
++ if ((mfpvr() & 0xfffffff0) == (0x50910951 & 0xfffffff0)) {
++ fwdvb = 8 - (pllmr & 0x00000007);
++ if (!(psr & 0x00001000)) /* PCI async mode enable == 0 */
++ if (psr & 0x00000020) /* New mode enable */
++ m = fwdvb * 2 * ppdv;
++ else
++ m = fwdvb * cbdv * ppdv;
++ else if (psr & 0x00000020) /* New mode enable */
++ if (psr & 0x00000800) /* PerClk synch mode */
++ m = fwdvb * 2 * epdv;
++ else
++ m = fbdv * fwdv;
++ else if (epdv == fbdv)
++ m = fbdv * cbdv * epdv;
++ else
++ m = fbdv * fwdvb * cbdv;
++
++ cpu = sys_clk * m / fwdv;
++ plb = sys_clk * m / (fwdvb * cbdv);
++ } else {
++ m = fwdv * fbdv * cbdv;
++ cpu = sys_clk * m / fwdv;
++ plb = cpu / cbdv;
++ }
++ opb = plb / opdv;
++ ebc = plb / epdv;
++
++ if (cpc0_cr0 & 0x80)
++ /* uart0 uses the external clock */
++ uart0 = ser_clk;
++ else
++ uart0 = cpu / udiv;
++
++ if (cpc0_cr0 & 0x40)
++ /* uart1 uses the external clock */
++ uart1 = ser_clk;
++ else
++ uart1 = cpu / udiv;
++
++ /* setup the timebase clock to tick at the cpu frequency */
++ cpc0_cr1 = cpc0_cr1 & ~0x00800000;
++ mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
++ tb = cpu;
++
++ dt_fixup_cpu_clocks(cpu, tb, 0);
++ dt_fixup_clock("/plb", plb);
++ dt_fixup_clock("/plb/opb", opb);
++ dt_fixup_clock("/plb/ebc", ebc);
++ dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
++ dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
++}
++
++
++void ibm405ep_fixup_clocks(unsigned int sys_clk)
++{
++ u32 pllmr0 = mfdcr(DCRN_CPC0_PLLMR0);
++ u32 pllmr1 = mfdcr(DCRN_CPC0_PLLMR1);
++ u32 cpc0_ucr = mfdcr(DCRN_CPC0_UCR);
++ u32 cpu, plb, opb, ebc, uart0, uart1;
++ u32 fwdva, fwdvb, fbdv, cbdv, opdv, epdv;
++ u32 pllmr0_ccdv, tb, m;
++
++ fwdva = 8 - ((pllmr1 & 0x00070000) >> 16);
++ fwdvb = 8 - ((pllmr1 & 0x00007000) >> 12);
++ fbdv = (pllmr1 & 0x00f00000) >> 20;
++ if (fbdv == 0)
++ fbdv = 16;
++
++ cbdv = ((pllmr0 & 0x00030000) >> 16) + 1; /* CPU:PLB */
++ epdv = ((pllmr0 & 0x00000300) >> 8) + 2; /* PLB:EBC */
++ opdv = ((pllmr0 & 0x00003000) >> 12) + 1; /* PLB:OPB */
++
++ m = fbdv * fwdvb;
++
++ pllmr0_ccdv = ((pllmr0 & 0x00300000) >> 20) + 1;
++ if (pllmr1 & 0x80000000)
++ cpu = sys_clk * m / (fwdva * pllmr0_ccdv);
++ else
++ cpu = sys_clk / pllmr0_ccdv;
++
++ plb = cpu / cbdv;
++ opb = plb / opdv;
++ ebc = plb / epdv;
++ tb = cpu;
++ uart0 = cpu / (cpc0_ucr & 0x0000007f);
++ uart1 = cpu / ((cpc0_ucr & 0x00007f00) >> 8);
++
++ dt_fixup_cpu_clocks(cpu, tb, 0);
++ dt_fixup_clock("/plb", plb);
++ dt_fixup_clock("/plb/opb", opb);
++ dt_fixup_clock("/plb/ebc", ebc);
+ dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
+- dt_fixup_clock("/plb/opb/serial@ef600400", uart0);
+- dt_fixup_clock("/plb/opb/serial@ef600500", uart0);
+- dt_fixup_clock("/plb/opb/serial@ef600600", uart0);
++ dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/4xx.h powerpc.git/arch/powerpc/boot/4xx.h
+--- linux-2.6.24/arch/powerpc/boot/4xx.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/4xx.h 2008-01-28 20:25:49.000000000 +0100
+@@ -11,12 +11,22 @@
+ #ifndef _POWERPC_BOOT_4XX_H_
+ #define _POWERPC_BOOT_4XX_H_
+
+-void ibm4xx_fixup_memsize(void);
++void ibm4xx_sdram_fixup_memsize(void);
++void ibm440spe_fixup_memsize(void);
+ void ibm4xx_denali_fixup_memsize(void);
+ void ibm44x_dbcr_reset(void);
+ void ibm40x_dbcr_reset(void);
+ void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1);
+ void ibm4xx_fixup_ebc_ranges(const char *ebc);
+-void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk);
++
++void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
++void ibm405ep_fixup_clocks(unsigned int sys_clk);
++void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
++void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
++ unsigned int tmr_clk);
++void ibm440gx_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
++ unsigned int tmr_clk);
++void ibm440spe_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
++ unsigned int tmr_clk);
+
+ #endif /* _POWERPC_BOOT_4XX_H_ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/Makefile powerpc.git/arch/powerpc/boot/Makefile
+--- linux-2.6.24/arch/powerpc/boot/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -33,12 +33,15 @@
+ BOOTCFLAGS += -fno-stack-protector
+ endif
+
+-BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj)
++BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt
+
+ $(obj)/4xx.o: BOOTCFLAGS += -mcpu=440
+ $(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
++$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
++$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
+ $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
+
++
+ zlib := inffast.c inflate.c inftrees.c
+ zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
+ zliblinuxheader := zlib.h zconf.h zutil.h
+@@ -46,17 +49,21 @@
+ $(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \
+ $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
+
+-src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
++src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
++src-wlib := string.S crt0.S stdio.c main.c \
++ $(addprefix libfdt/,$(src-libfdt)) libfdt-wrapper.c \
+ ns16550.c serial.c simple_alloc.c div64.S util.S \
+ gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
+ 4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
+ cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
+ fsl-soc.c mpc8xx.c pq2.c
+-src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \
++src-plat := of.c cuboot-52xx.c cuboot-824x.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 treeboot-bamboo.c cuboot-8xx.c \
+ cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c cuboot-bamboo.c \
+- fixed-head.S ep88xc.c cuboot-hpc2.c
++ fixed-head.S ep88xc.c cuboot-hpc2.c ep405.c cuboot-taishan.c \
++ cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
++ cuboot-warp.c
+ src-boot := $(src-wlib) $(src-plat) empty.c
+
+ src-boot := $(addprefix $(obj)/, $(src-boot))
+@@ -101,24 +108,61 @@
+ cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
+
+ $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE
++ $(Q)mkdir -p $(dir $@)
+ $(call if_changed_dep,bootcc)
+ $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE
++ $(Q)mkdir -p $(dir $@)
+ $(call if_changed_dep,bootas)
+
+ $(obj)/wrapper.a: $(obj-wlib) FORCE
+ $(call if_changed,bootar)
+
+-hostprogs-y := addnote addRamDisk hack-coff mktree
++hostprogs-y := addnote addRamDisk hack-coff mktree dtc
+
+ 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 dtc) \
+ $(wrapper) FORCE
+
+ #############
++# Bits for building dtc
++# DTC_GENPARSER := 1 # Uncomment to rebuild flex/bison output
++
++dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o
++dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
++dtc-objs := $(addprefix dtc-src/, $(dtc-objs))
++
++# prerequisites on generated files needs to be explicit
++$(obj)/dtc-src/dtc-parser.tab.o: $(obj)/dtc-src/dtc-parser.tab.c $(obj)/dtc-src/dtc-parser.tab.h
++$(obj)/dtc-src/dtc-lexer.lex.o: $(obj)/dtc-src/dtc-lexer.lex.c $(obj)/dtc-src/dtc-parser.tab.h
++
++HOSTCFLAGS += -I$(src)/dtc-src/ -I$(src)/libfdt/
++
++targets += dtc-src/dtc-parser.tab.c
++targets += dtc-src/dtc-lexer.lex.c
++
++ifdef DTC_GENPARSER
++BISON = bison
++FLEX = flex
++
++quiet_cmd_bison = BISON $@
++ cmd_bison = $(BISON) -o$@ -d $<; cp $@ $@_shipped
++quiet_cmd_flex = FLEX $@
++ cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
++
++$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE
++ $(call if_changed,bison)
++
++$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c
++
++$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE
++ $(call if_changed,flex)
++endif
++
++#############
+ # Bits for building various flavours of zImage
+
+ ifneq ($(CROSS32_COMPILE),)
+@@ -150,15 +194,26 @@
+ ifneq ($(CONFIG_DEVICE_TREE),"")
+ image-$(CONFIG_PPC_8xx) += cuImage.8xx
+ image-$(CONFIG_PPC_EP88XC) += zImage.ep88xc
++image-$(CONFIG_EP405) += zImage.ep405
+ image-$(CONFIG_8260) += cuImage.pq2
++image-$(CONFIG_EP8248E) += zImage.ep8248e
+ image-$(CONFIG_PPC_MPC52xx) += cuImage.52xx
++image-$(CONFIG_STORCENTER) += cuImage.824x
+ image-$(CONFIG_PPC_83xx) += cuImage.83xx
+ image-$(CONFIG_PPC_85xx) += cuImage.85xx
+ image-$(CONFIG_MPC7448HPC2) += cuImage.hpc2
+ image-$(CONFIG_EBONY) += treeImage.ebony cuImage.ebony
+ image-$(CONFIG_BAMBOO) += treeImage.bamboo cuImage.bamboo
+ image-$(CONFIG_SEQUOIA) += cuImage.sequoia
++image-$(CONFIG_RAINIER) += cuImage.rainier
+ image-$(CONFIG_WALNUT) += treeImage.walnut
++image-$(CONFIG_TAISHAN) += cuImage.taishan
++image-$(CONFIG_KATMAI) += cuImage.katmai
++image-$(CONFIG_WARP) += cuImage.warp
++endif
++
++ifneq ($(CONFIG_REDBOOT),"")
++image-$(CONFIG_PPC_8xx) += zImage.redboot-8xx
+ endif
+
+ # For 32-bit powermacs, build the COFF and miboot images
+@@ -243,3 +298,51 @@
+ clean-kernel += $(addsuffix .gz,$(clean-kernel))
+ # If not absolute clean-files are relative to $(obj).
+ clean-files += $(addprefix $(objtree)/, $(clean-kernel))
++
++WRAPPER_OBJDIR := /usr/lib/kernel-wrapper
++WRAPPER_DTSDIR := /usr/lib/kernel-wrapper/dts
++WRAPPER_BINDIR := /usr/sbin
++INSTALL := install
++
++extra-installed := $(patsubst $(obj)/%, $(DESTDIR)$(WRAPPER_OBJDIR)/%, $(extra-y))
++hostprogs-installed := $(patsubst %, $(DESTDIR)$(WRAPPER_BINDIR)/%, $(hostprogs-y))
++wrapper-installed := $(DESTDIR)$(WRAPPER_BINDIR)/wrapper
++dts-installed := $(patsubst $(obj)/dts/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(obj)/dts/*.dts))
++
++all-installed := $(extra-installed) $(hostprogs-installed) $(wrapper-installed) $(dts-installed)
++
++quiet_cmd_mkdir = MKDIR $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
++ cmd_mkdir = mkdir -p $@
++
++quiet_cmd_install = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,%,$@)
++ cmd_install = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@
++
++quiet_cmd_install_dts = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,dts/%,$@)
++ cmd_install_dts = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@
++
++quiet_cmd_install_exe = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
++ cmd_install_exe = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@
++
++quiet_cmd_install_wrapper = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
++ cmd_install_wrapper = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\
++ sed -i $@ -e 's%^object=.*%object=$(WRAPPER_OBJDIR)%' \
++ -e 's%^objbin=.*%objbin=$(WRAPPER_BINDIR)%' \
++
++
++$(DESTDIR)$(WRAPPER_OBJDIR) $(DESTDIR)$(WRAPPER_DTSDIR) $(DESTDIR)$(WRAPPER_BINDIR):
++ $(call cmd,mkdir)
++
++$(extra-installed) : $(DESTDIR)$(WRAPPER_OBJDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_OBJDIR)
++ $(call cmd,install)
++
++$(hostprogs-installed) : $(DESTDIR)$(WRAPPER_BINDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_BINDIR)
++ $(call cmd,install_exe)
++
++$(dts-installed) : $(DESTDIR)$(WRAPPER_DTSDIR)/% : $(srctree)/$(obj)/dts/% | $(DESTDIR)$(WRAPPER_DTSDIR)
++ $(call cmd,install_dts)
++
++$(wrapper-installed): $(DESTDIR)$(WRAPPER_BINDIR) $(srctree)/$(obj)/wrapper | $(DESTDIR)$(WRAPPER_BINDIR)
++ $(call cmd,install_wrapper)
++
++$(obj)/bootwrapper_install: $(all-installed)
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/bamboo.c powerpc.git/arch/powerpc/boot/bamboo.c
+--- linux-2.6.24/arch/powerpc/boot/bamboo.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/bamboo.c 2008-01-28 20:25:49.000000000 +0100
+@@ -30,8 +30,8 @@
+ {
+ unsigned long sysclk = 33333333;
+
+- ibm440ep_fixup_clocks(sysclk, 11059200);
+- ibm4xx_fixup_memsize();
++ ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
++ ibm4xx_sdram_fixup_memsize();
+ ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
+ dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
+ }
+@@ -42,6 +42,6 @@
+ platform_ops.exit = ibm44x_dbcr_reset;
+ bamboo_mac0 = mac0;
+ bamboo_mac1 = mac1;
+- ft_init(_dtb_start, 0, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-52xx.c powerpc.git/arch/powerpc/boot/cuboot-52xx.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-52xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-52xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -53,7 +53,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-824x.c powerpc.git/arch/powerpc/boot/cuboot-824x.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-824x.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-824x.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,53 @@
++/*
++ * Old U-boot compatibility for 824x
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "cuboot.h"
++
++#define TARGET_824x
++#include "ppcboot.h"
++
++static bd_t bd;
++
++
++static void platform_fixups(void)
++{
++ void *soc;
++
++ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
++ dt_fixup_mac_addresses(bd.bi_enetaddr);
++ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
++
++ soc = find_node_by_devtype(NULL, "soc");
++ if (soc) {
++ void *serial = NULL;
++
++ setprop(soc, "bus-frequency", &bd.bi_busfreq,
++ sizeof(bd.bi_busfreq));
++
++ while ((serial = find_node_by_devtype(serial, "serial"))) {
++ if (get_parent(serial) != soc)
++ continue;
++
++ setprop(serial, "clock-frequency", &bd.bi_busfreq,
++ sizeof(bd.bi_busfreq));
++ }
++ }
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ CUBOOT_INIT();
++ fdt_init(_dtb_start);
++ serial_console_init();
++ platform_ops.fixups = platform_fixups;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-83xx.c powerpc.git/arch/powerpc/boot/cuboot-83xx.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-83xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-83xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,7 +24,8 @@
+ void *soc;
+
+ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+- dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
++ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
++ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
+ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
+
+ /* Unfortunately, the specific model number is encoded in the
+@@ -52,7 +53,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-85xx.c powerpc.git/arch/powerpc/boot/cuboot-85xx.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-85xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-85xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,8 +24,9 @@
+ void *soc;
+
+ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+- dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr,
+- bd.bi_enet2addr);
++ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
++ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
++ dt_fixup_mac_address_by_alias("ethernet2", bd.bi_enet2addr);
+ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq);
+
+ /* Unfortunately, the specific model number is encoded in the
+@@ -53,7 +54,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-8xx.c powerpc.git/arch/powerpc/boot/cuboot-8xx.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-8xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-8xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -41,7 +41,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-hpc2.c powerpc.git/arch/powerpc/boot/cuboot-hpc2.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-hpc2.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-hpc2.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,7 +42,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-katmai.c powerpc.git/arch/powerpc/boot/cuboot-katmai.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-katmai.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-katmai.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,56 @@
++/*
++ * Old U-boot compatibility for Katmai
++ *
++ * Author: Hugh Blemings <hugh@au.ibm.com>
++ *
++ * Copyright 2007 Hugh Blemings, IBM Corporation.
++ * Based on cuboot-ebony.c which is:
++ * Copyright 2007 David Gibson, IBM Corporation.
++ * Based on cuboot-83xx.c, which is:
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "reg.h"
++#include "dcr.h"
++#include "4xx.h"
++#include "44x.h"
++#include "cuboot.h"
++
++#define TARGET_44x
++#include "ppcboot.h"
++
++static bd_t bd;
++
++BSS_STACK(4096);
++
++static void katmai_fixups(void)
++{
++ unsigned long sysclk = 33333000;
++
++ /* 440SP Clock logic is all but identical to 440GX
++ * so we just use that code for now at least
++ */
++ ibm440spe_fixup_clocks(sysclk, 6 * 1843200, 0);
++
++ ibm440spe_fixup_memsize();
++
++ dt_fixup_mac_address(0, bd.bi_enetaddr);
++
++ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ CUBOOT_INIT();
++
++ platform_ops.fixups = katmai_fixups;
++ fdt_init(_dtb_start);
++ serial_console_init();
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-pq2.c powerpc.git/arch/powerpc/boot/cuboot-pq2.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-pq2.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-pq2.c 2008-01-28 20:25:49.000000000 +0100
+@@ -255,7 +255,7 @@
+ unsigned long r6, unsigned long r7)
+ {
+ CUBOOT_INIT();
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ platform_ops.fixups = pq2_platform_fixups;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-rainier.c powerpc.git/arch/powerpc/boot/cuboot-rainier.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-rainier.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-rainier.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,56 @@
++/*
++ * Old U-boot compatibility for Rainier
++ *
++ * Valentine Barshak <vbarshak@ru.mvista.com>
++ * Copyright 2007 MontaVista Software, Inc
++ *
++ * Based on Ebony code by David Gibson <david@gibson.dropbear.id.au>
++ * Copyright IBM Corporation, 2007
++ *
++ * Based on Bamboo code by Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ * Copyright IBM Corporation, 2007
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; version 2 of the License
++ */
++
++#include <stdarg.h>
++#include <stddef.h>
++#include "types.h"
++#include "elf.h"
++#include "string.h"
++#include "stdio.h"
++#include "page.h"
++#include "ops.h"
++#include "dcr.h"
++#include "4xx.h"
++#include "44x.h"
++#include "cuboot.h"
++
++#define TARGET_4xx
++#define TARGET_44x
++#include "ppcboot.h"
++
++static bd_t bd;
++
++
++static void rainier_fixups(void)
++{
++ unsigned long sysclk = 33333333;
++
++ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
++ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
++ ibm4xx_denali_fixup_memsize();
++ dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ CUBOOT_INIT();
++ platform_ops.fixups = rainier_fixups;
++ platform_ops.exit = ibm44x_dbcr_reset;
++ fdt_init(_dtb_start);
++ serial_console_init();
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-sequoia.c powerpc.git/arch/powerpc/boot/cuboot-sequoia.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-sequoia.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-sequoia.c 2008-01-28 20:25:49.000000000 +0100
+@@ -39,7 +39,7 @@
+ {
+ unsigned long sysclk = 33333333;
+
+- ibm440ep_fixup_clocks(sysclk, 11059200);
++ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
+ ibm4xx_denali_fixup_memsize();
+ dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
+@@ -51,6 +51,6 @@
+ CUBOOT_INIT();
+ platform_ops.fixups = sequoia_fixups;
+ platform_ops.exit = ibm44x_dbcr_reset;
+- ft_init(_dtb_start, 0, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-taishan.c powerpc.git/arch/powerpc/boot/cuboot-taishan.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-taishan.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-taishan.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,54 @@
++/*
++ * Old U-boot compatibility for Taishan
++ *
++ * Author: Hugh Blemings <hugh@au.ibm.com>
++ *
++ * Copyright 2007 Hugh Blemings, IBM Corporation.
++ * Based on cuboot-ebony.c which is:
++ * Copyright 2007 David Gibson, IBM Corporation.
++ * Based on cuboot-83xx.c, which is:
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "cuboot.h"
++#include "reg.h"
++#include "dcr.h"
++#include "4xx.h"
++
++#define TARGET_44x
++#include "ppcboot.h"
++
++static bd_t bd;
++
++BSS_STACK(4096);
++
++static void taishan_fixups(void)
++{
++ /* FIXME: sysclk should be derived by reading the FPGA
++ registers */
++ unsigned long sysclk = 33000000;
++
++ ibm440gx_fixup_clocks(sysclk, 6 * 1843200, 25000000);
++
++ ibm4xx_sdram_fixup_memsize();
++
++ dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
++
++ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ CUBOOT_INIT();
++
++ platform_ops.fixups = taishan_fixups;
++ fdt_init(_dtb_start);
++ serial_console_init();
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/cuboot-warp.c powerpc.git/arch/powerpc/boot/cuboot-warp.c
+--- linux-2.6.24/arch/powerpc/boot/cuboot-warp.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/cuboot-warp.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (c) 2008 PIKA Technologies
++ * Sean MacLennan <smaclennan@pikatech.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "4xx.h"
++#include "cuboot.h"
++
++#define TARGET_44x
++#include "ppcboot.h"
++
++static bd_t bd;
++
++static void warp_fixups(void)
++{
++ unsigned long sysclk = 66000000;
++
++ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
++ ibm4xx_sdram_fixup_memsize();
++ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
++ dt_fixup_mac_addresses(&bd.bi_enetaddr);
++}
++
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ CUBOOT_INIT();
++
++ platform_ops.fixups = warp_fixups;
++ platform_ops.exit = ibm44x_dbcr_reset;
++ fdt_init(_dtb_start);
++ serial_console_init();
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dcr.h powerpc.git/arch/powerpc/boot/dcr.h
+--- linux-2.6.24/arch/powerpc/boot/dcr.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dcr.h 2008-01-28 20:25:49.000000000 +0100
+@@ -14,12 +14,20 @@
+ #define DCRN_SDRAM0_CFGADDR 0x010
+ #define DCRN_SDRAM0_CFGDATA 0x011
+
++#define SDRAM0_READ(offset) ({\
++ mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
++ mfdcr(DCRN_SDRAM0_CFGDATA); })
++#define SDRAM0_WRITE(offset, data) ({\
++ mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
++ mtdcr(DCRN_SDRAM0_CFGDATA, data); })
++
+ #define SDRAM0_B0CR 0x40
+ #define SDRAM0_B1CR 0x44
+ #define SDRAM0_B2CR 0x48
+ #define SDRAM0_B3CR 0x4c
+
+-static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, SDRAM0_B2CR, SDRAM0_B3CR };
++static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR,
++ SDRAM0_B2CR, SDRAM0_B3CR };
+
+ #define SDRAM_CONFIG_BANK_ENABLE 0x00000001
+ #define SDRAM_CONFIG_SIZE_MASK 0x000e0000
+@@ -138,5 +146,54 @@
+ #define DCRN_CPC0_PLLMR 0xb0
+ #define DCRN_405_CPC0_CR0 0xb1
+ #define DCRN_405_CPC0_CR1 0xb2
++#define DCRN_405_CPC0_PSR 0xb4
++
++/* 405EP Clocking/Power Management/Chip Control regs */
++#define DCRN_CPC0_PLLMR0 0xf0
++#define DCRN_CPC0_PLLMR1 0xf4
++#define DCRN_CPC0_UCR 0xf5
++
++/* 440GX Clock control etc */
++
++
++#define DCRN_CPR0_CLKUPD 0x020
++#define DCRN_CPR0_PLLC 0x040
++#define DCRN_CPR0_PLLD 0x060
++#define DCRN_CPR0_PRIMAD 0x080
++#define DCRN_CPR0_PRIMBD 0x0a0
++#define DCRN_CPR0_OPBD 0x0c0
++#define DCRN_CPR0_PERD 0x0e0
++#define DCRN_CPR0_MALD 0x100
++
++#define DCRN_SDR0_CONFIG_ADDR 0xe
++#define DCRN_SDR0_CONFIG_DATA 0xf
++
++/* SDR read/write helper macros */
++#define SDR0_READ(offset) ({\
++ mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
++ mfdcr(DCRN_SDR0_CONFIG_DATA); })
++#define SDR0_WRITE(offset, data) ({\
++ mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
++ mtdcr(DCRN_SDR0_CONFIG_DATA, data); })
++
++#define DCRN_SDR0_UART0 0x0120
++#define DCRN_SDR0_UART1 0x0121
++#define DCRN_SDR0_UART2 0x0122
++#define DCRN_SDR0_UART3 0x0123
++
++
++/* CPRs read/write helper macros - based off include/asm-ppc/ibm44x.h */
++
++#define DCRN_CPR0_CFGADDR 0xc
++#define DCRN_CPR0_CFGDATA 0xd
++
++#define CPR0_READ(offset) ({\
++ mtdcr(DCRN_CPR0_CFGADDR, offset); \
++ mfdcr(DCRN_CPR0_CFGDATA); })
++#define CPR0_WRITE(offset, data) ({\
++ mtdcr(DCRN_CPR0_CFGADDR, offset); \
++ mtdcr(DCRN_CPR0_CFGDATA, data); })
++
++
+
+ #endif /* _PPC_BOOT_DCR_H_ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/devtree.c powerpc.git/arch/powerpc/boot/devtree.c
+--- linux-2.6.24/arch/powerpc/boot/devtree.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/devtree.c 2008-01-28 20:25:49.000000000 +0100
+@@ -88,6 +88,20 @@
+ }
+ }
+
++void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr)
++{
++ void *devp = find_node_by_alias(alias);
++
++ if (devp) {
++ printf("%s: local-mac-address <-"
++ " %02x:%02x:%02x:%02x:%02x:%02x\n\r", alias,
++ addr[0], addr[1], addr[2],
++ addr[3], addr[4], addr[5]);
++
++ setprop(devp, "local-mac-address", addr, 6);
++ }
++}
++
+ void dt_fixup_mac_address(u32 index, const u8 *addr)
+ {
+ void *devp = find_node_by_prop_value(NULL, "linux,network-index",
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/Makefile.dtc powerpc.git/arch/powerpc/boot/dtc-src/Makefile.dtc
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/Makefile.dtc 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/Makefile.dtc 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,25 @@
++# Makefile.dtc
++#
++# This is not a complete Makefile of itself. Instead, it is designed to
++# be easily embeddable into other systems of Makefiles.
++#
++DTC_SRCS = dtc.c flattree.c fstree.c data.c livetree.c treesource.c srcpos.c \
++ checks.c
++DTC_EXTRA = dtc.h srcpos.h
++DTC_LEXFILES = dtc-lexer.l
++DTC_BISONFILES = dtc-parser.y
++
++DTC_LEX_SRCS = $(DTC_LEXFILES:%.l=%.lex.c)
++DTC_BISON_SRCS = $(DTC_BISONFILES:%.y=%.tab.c)
++DTC_BISON_INCLUDES = $(DTC_BISONFILES:%.y=%.tab.h)
++
++DTC_GEN_SRCS = $(DTC_LEX_SRCS) $(DTC_BISON_SRCS)
++DTC_GEN_ALL = $(DTC_GEN_SRCS) $(DTC_BISON_INCLUDES)
++DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
++
++DTC_CLEANFILES = $(DTC_GEN_ALL)
++
++# We assume the containing Makefile system can do auto-dependencies for most
++# things, but we supply the dependencies on generated header files explicitly
++
++$(addprefix $(DTC_objdir)/,$(DTC_GEN_SRCS:%.c=%.o)): $(addprefix $(DTC_objdir)/,$(DTC_BISON_INCLUDES))
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/checks.c powerpc.git/arch/powerpc/boot/dtc-src/checks.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/checks.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/checks.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,750 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++
++#ifdef TRACE_CHECKS
++#define TRACE(c, ...) \
++ do { \
++ fprintf(stderr, "=== %s: ", (c)->name); \
++ fprintf(stderr, __VA_ARGS__); \
++ fprintf(stderr, "\n"); \
++ } while (0)
++#else
++#define TRACE(c, fmt, ...) do { } while (0)
++#endif
++
++enum checklevel {
++ IGNORE = 0,
++ WARN = 1,
++ ERROR = 2,
++};
++
++enum checkstatus {
++ UNCHECKED = 0,
++ PREREQ,
++ PASSED,
++ FAILED,
++};
++
++struct check;
++
++typedef void (*tree_check_fn)(struct check *c, struct node *dt);
++typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node);
++typedef void (*prop_check_fn)(struct check *c, struct node *dt,
++ struct node *node, struct property *prop);
++
++struct check {
++ const char *name;
++ tree_check_fn tree_fn;
++ node_check_fn node_fn;
++ prop_check_fn prop_fn;
++ void *data;
++ enum checklevel level;
++ enum checkstatus status;
++ int inprogress;
++ int num_prereqs;
++ struct check **prereq;
++};
++
++#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \
++ static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \
++ static struct check nm = { \
++ .name = #nm, \
++ .tree_fn = (tfn), \
++ .node_fn = (nfn), \
++ .prop_fn = (pfn), \
++ .data = (d), \
++ .level = (lvl), \
++ .status = UNCHECKED, \
++ .num_prereqs = ARRAY_SIZE(nm##_prereqs), \
++ .prereq = nm##_prereqs, \
++ };
++
++#define TREE_CHECK(nm, d, lvl, ...) \
++ CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__)
++#define NODE_CHECK(nm, d, lvl, ...) \
++ CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__)
++#define PROP_CHECK(nm, d, lvl, ...) \
++ CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__)
++#define BATCH_CHECK(nm, lvl, ...) \
++ CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__)
++
++#ifdef __GNUC__
++static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
++#endif
++static inline void check_msg(struct check *c, const char *fmt, ...)
++{
++ va_list ap;
++ va_start(ap, fmt);
++
++ if ((c->level < WARN) || (c->level <= quiet))
++ return; /* Suppress message */
++
++ fprintf(stderr, "%s (%s): ",
++ (c->level == ERROR) ? "ERROR" : "Warning", c->name);
++ vfprintf(stderr, fmt, ap);
++ fprintf(stderr, "\n");
++}
++
++#define FAIL(c, ...) \
++ do { \
++ TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
++ (c)->status = FAILED; \
++ check_msg((c), __VA_ARGS__); \
++ } while (0)
++
++static void check_nodes_props(struct check *c, struct node *dt, struct node *node)
++{
++ struct node *child;
++ struct property *prop;
++
++ TRACE(c, "%s", node->fullpath);
++ if (c->node_fn)
++ c->node_fn(c, dt, node);
++
++ if (c->prop_fn)
++ for_each_property(node, prop) {
++ TRACE(c, "%s\t'%s'", node->fullpath, prop->name);
++ c->prop_fn(c, dt, node, prop);
++ }
++
++ for_each_child(node, child)
++ check_nodes_props(c, dt, child);
++}
++
++static int run_check(struct check *c, struct node *dt)
++{
++ int error = 0;
++ int i;
++
++ assert(!c->inprogress);
++
++ if (c->status != UNCHECKED)
++ goto out;
++
++ c->inprogress = 1;
++
++ for (i = 0; i < c->num_prereqs; i++) {
++ struct check *prq = c->prereq[i];
++ error |= run_check(prq, dt);
++ if (prq->status != PASSED) {
++ c->status = PREREQ;
++ check_msg(c, "Failed prerequisite '%s'",
++ c->prereq[i]->name);
++ }
++ }
++
++ if (c->status != UNCHECKED)
++ goto out;
++
++ if (c->node_fn || c->prop_fn)
++ check_nodes_props(c, dt, dt);
++
++ if (c->tree_fn)
++ c->tree_fn(c, dt);
++ if (c->status == UNCHECKED)
++ c->status = PASSED;
++
++ TRACE(c, "\tCompleted, status %d", c->status);
++
++out:
++ c->inprogress = 0;
++ if ((c->status != PASSED) && (c->level == ERROR))
++ error = 1;
++ return error;
++}
++
++/*
++ * Utility check functions
++ */
++
++static void check_is_string(struct check *c, struct node *root,
++ struct node *node)
++{
++ struct property *prop;
++ char *propname = c->data;
++
++ prop = get_property(node, propname);
++ if (!prop)
++ return; /* Not present, assumed ok */
++
++ if (!data_is_one_string(prop->val))
++ FAIL(c, "\"%s\" property in %s is not a string",
++ propname, node->fullpath);
++}
++#define CHECK_IS_STRING(nm, propname, lvl) \
++ CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl))
++
++static void check_is_cell(struct check *c, struct node *root,
++ struct node *node)
++{
++ struct property *prop;
++ char *propname = c->data;
++
++ prop = get_property(node, propname);
++ if (!prop)
++ return; /* Not present, assumed ok */
++
++ if (prop->val.len != sizeof(cell_t))
++ FAIL(c, "\"%s\" property in %s is not a single cell",
++ propname, node->fullpath);
++}
++#define CHECK_IS_CELL(nm, propname, lvl) \
++ CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl))
++
++/*
++ * Structural check functions
++ */
++
++static void check_duplicate_node_names(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct node *child, *child2;
++
++ for_each_child(node, child)
++ for (child2 = child->next_sibling;
++ child2;
++ child2 = child2->next_sibling)
++ if (streq(child->name, child2->name))
++ FAIL(c, "Duplicate node name %s",
++ child->fullpath);
++}
++NODE_CHECK(duplicate_node_names, NULL, ERROR);
++
++static void check_duplicate_property_names(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct property *prop, *prop2;
++
++ for_each_property(node, prop)
++ for (prop2 = prop->next; prop2; prop2 = prop2->next)
++ if (streq(prop->name, prop2->name))
++ FAIL(c, "Duplicate property name %s in %s",
++ prop->name, node->fullpath);
++}
++NODE_CHECK(duplicate_property_names, NULL, ERROR);
++
++static void check_explicit_phandles(struct check *c, struct node *root,
++ struct node *node)
++{
++ struct property *prop;
++ struct node *other;
++ cell_t phandle;
++
++ prop = get_property(node, "linux,phandle");
++ if (! prop)
++ return; /* No phandle, that's fine */
++
++ if (prop->val.len != sizeof(cell_t)) {
++ FAIL(c, "%s has bad length (%d) linux,phandle property",
++ node->fullpath, prop->val.len);
++ return;
++ }
++
++ phandle = propval_cell(prop);
++ if ((phandle == 0) || (phandle == -1)) {
++ FAIL(c, "%s has invalid linux,phandle value 0x%x",
++ node->fullpath, phandle);
++ return;
++ }
++
++ other = get_node_by_phandle(root, phandle);
++ if (other) {
++ FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
++ node->fullpath, phandle, other->fullpath);
++ return;
++ }
++
++ node->phandle = phandle;
++}
++NODE_CHECK(explicit_phandles, NULL, ERROR);
++
++static void check_name_properties(struct check *c, struct node *root,
++ struct node *node)
++{
++ struct property *prop;
++
++ prop = get_property(node, "name");
++ if (!prop)
++ return; /* No name property, that's fine */
++
++ if ((prop->val.len != node->basenamelen+1)
++ || (memcmp(prop->val.val, node->name, node->basenamelen) != 0))
++ FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
++ " of base node name)", node->fullpath, prop->val.val);
++}
++CHECK_IS_STRING(name_is_string, "name", ERROR);
++NODE_CHECK(name_properties, NULL, ERROR, &name_is_string);
++
++/*
++ * Reference fixup functions
++ */
++
++static void fixup_phandle_references(struct check *c, struct node *dt,
++ struct node *node, struct property *prop)
++{
++ struct marker *m = prop->val.markers;
++ struct node *refnode;
++ cell_t phandle;
++
++ for_each_marker_of_type(m, REF_PHANDLE) {
++ assert(m->offset + sizeof(cell_t) <= prop->val.len);
++
++ refnode = get_node_by_ref(dt, m->ref);
++ if (! refnode) {
++ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
++ m->ref);
++ continue;
++ }
++
++ phandle = get_node_phandle(dt, refnode);
++ *((cell_t *)(prop->val.val + m->offset)) = cpu_to_be32(phandle);
++ }
++}
++CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR,
++ &duplicate_node_names, &explicit_phandles);
++
++static void fixup_path_references(struct check *c, struct node *dt,
++ struct node *node, struct property *prop)
++{
++ struct marker *m = prop->val.markers;
++ struct node *refnode;
++ char *path;
++
++ for_each_marker_of_type(m, REF_PATH) {
++ assert(m->offset <= prop->val.len);
++
++ refnode = get_node_by_ref(dt, m->ref);
++ if (!refnode) {
++ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
++ m->ref);
++ continue;
++ }
++
++ path = refnode->fullpath;
++ prop->val = data_insert_at_marker(prop->val, m, path,
++ strlen(path) + 1);
++ }
++}
++CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR,
++ &duplicate_node_names);
++
++/*
++ * Semantic checks
++ */
++CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN);
++CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN);
++CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN);
++
++CHECK_IS_STRING(device_type_is_string, "device_type", WARN);
++CHECK_IS_STRING(model_is_string, "model", WARN);
++CHECK_IS_STRING(status_is_string, "status", WARN);
++
++static void fixup_addr_size_cells(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct property *prop;
++
++ node->addr_cells = -1;
++ node->size_cells = -1;
++
++ prop = get_property(node, "#address-cells");
++ if (prop)
++ node->addr_cells = propval_cell(prop);
++
++ prop = get_property(node, "#size-cells");
++ if (prop)
++ node->size_cells = propval_cell(prop);
++}
++CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN,
++ &address_cells_is_cell, &size_cells_is_cell);
++
++#define node_addr_cells(n) \
++ (((n)->addr_cells == -1) ? 2 : (n)->addr_cells)
++#define node_size_cells(n) \
++ (((n)->size_cells == -1) ? 1 : (n)->size_cells)
++
++static void check_reg_format(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct property *prop;
++ int addr_cells, size_cells, entrylen;
++
++ prop = get_property(node, "reg");
++ if (!prop)
++ return; /* No "reg", that's fine */
++
++ if (!node->parent) {
++ FAIL(c, "Root node has a \"reg\" property");
++ return;
++ }
++
++ if (prop->val.len == 0)
++ FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
++
++ addr_cells = node_addr_cells(node->parent);
++ size_cells = node_size_cells(node->parent);
++ entrylen = (addr_cells + size_cells) * sizeof(cell_t);
++
++ if ((prop->val.len % entrylen) != 0)
++ FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
++ "(#address-cells == %d, #size-cells == %d)",
++ node->fullpath, prop->val.len, addr_cells, size_cells);
++}
++NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells);
++
++static void check_ranges_format(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct property *prop;
++ int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen;
++
++ prop = get_property(node, "ranges");
++ if (!prop)
++ return;
++
++ if (!node->parent) {
++ FAIL(c, "Root node has a \"ranges\" property");
++ return;
++ }
++
++ p_addr_cells = node_addr_cells(node->parent);
++ p_size_cells = node_size_cells(node->parent);
++ c_addr_cells = node_addr_cells(node);
++ c_size_cells = node_size_cells(node);
++ entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t);
++
++ if (prop->val.len == 0) {
++ if (p_addr_cells != c_addr_cells)
++ FAIL(c, "%s has empty \"ranges\" property but its "
++ "#address-cells (%d) differs from %s (%d)",
++ node->fullpath, c_addr_cells, node->parent->fullpath,
++ p_addr_cells);
++ if (p_size_cells != c_size_cells)
++ FAIL(c, "%s has empty \"ranges\" property but its "
++ "#size-cells (%d) differs from %s (%d)",
++ node->fullpath, c_size_cells, node->parent->fullpath,
++ p_size_cells);
++ } else if ((prop->val.len % entrylen) != 0) {
++ FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
++ "(parent #address-cells == %d, child #address-cells == %d, "
++ "#size-cells == %d)", node->fullpath, prop->val.len,
++ p_addr_cells, c_addr_cells, c_size_cells);
++ }
++}
++NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells);
++
++/*
++ * Style checks
++ */
++static void check_avoid_default_addr_size(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct property *reg, *ranges;
++
++ if (!node->parent)
++ return; /* Ignore root node */
++
++ reg = get_property(node, "reg");
++ ranges = get_property(node, "ranges");
++
++ if (!reg && !ranges)
++ return;
++
++ if ((node->parent->addr_cells == -1))
++ FAIL(c, "Relying on default #address-cells value for %s",
++ node->fullpath);
++
++ if ((node->parent->size_cells == -1))
++ FAIL(c, "Relying on default #size-cells value for %s",
++ node->fullpath);
++}
++NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells);
++
++static void check_obsolete_chosen_interrupt_controller(struct check *c,
++ struct node *dt)
++{
++ struct node *chosen;
++ struct property *prop;
++
++ chosen = get_node_by_path(dt, "/chosen");
++ if (!chosen)
++ return;
++
++ prop = get_property(chosen, "interrupt-controller");
++ if (prop)
++ FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
++ "property");
++}
++TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN);
++
++static struct check *check_table[] = {
++ &duplicate_node_names, &duplicate_property_names,
++ &name_is_string, &name_properties,
++ &explicit_phandles,
++ &phandle_references, &path_references,
++
++ &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
++ &device_type_is_string, &model_is_string, &status_is_string,
++
++ &addr_size_cells, &reg_format, &ranges_format,
++
++ &avoid_default_addr_size,
++ &obsolete_chosen_interrupt_controller,
++};
++
++int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys);
++
++void process_checks(int force, struct boot_info *bi,
++ int checkflag, int outversion, int boot_cpuid_phys)
++{
++ struct node *dt = bi->dt;
++ int i;
++ int error = 0;
++
++ for (i = 0; i < ARRAY_SIZE(check_table); i++) {
++ struct check *c = check_table[i];
++
++ if (c->level != IGNORE)
++ error = error || run_check(c, dt);
++ }
++
++ if (error) {
++ if (!force) {
++ fprintf(stderr, "ERROR: Input tree has errors, aborting "
++ "(use -f to force output)\n");
++ exit(2);
++ } else if (quiet < 3) {
++ fprintf(stderr, "Warning: Input tree has errors, "
++ "output forced\n");
++ }
++ }
++
++ if (checkflag) {
++ if (error) {
++ fprintf(stderr, "Warning: Skipping semantic checks due to structural errors\n");
++ } else {
++ if (!check_semantics(bi->dt, outversion,
++ boot_cpuid_phys))
++ fprintf(stderr, "Warning: Input tree has semantic errors\n");
++ }
++ }
++}
++
++/*
++ * Semantic check functions
++ */
++
++#define ERRMSG(...) if (quiet < 2) fprintf(stderr, "ERROR: " __VA_ARGS__)
++#define WARNMSG(...) if (quiet < 1) fprintf(stderr, "Warning: " __VA_ARGS__)
++
++#define DO_ERR(...) do {ERRMSG(__VA_ARGS__); ok = 0; } while (0)
++
++#define CHECK_HAVE(node, propname) \
++ do { \
++ if (! (prop = get_property((node), (propname)))) \
++ DO_ERR("Missing \"%s\" property in %s\n", (propname), \
++ (node)->fullpath); \
++ } while (0);
++
++#define CHECK_HAVE_WARN(node, propname) \
++ do { \
++ if (! (prop = get_property((node), (propname)))) \
++ WARNMSG("%s has no \"%s\" property\n", \
++ (node)->fullpath, (propname)); \
++ } while (0)
++
++#define CHECK_HAVE_STRING(node, propname) \
++ do { \
++ CHECK_HAVE((node), (propname)); \
++ if (prop && !data_is_one_string(prop->val)) \
++ DO_ERR("\"%s\" property in %s is not a string\n", \
++ (propname), (node)->fullpath); \
++ } while (0)
++
++#define CHECK_HAVE_STREQ(node, propname, value) \
++ do { \
++ CHECK_HAVE_STRING((node), (propname)); \
++ if (prop && !streq(prop->val.val, (value))) \
++ DO_ERR("%s has wrong %s, %s (should be %s\n", \
++ (node)->fullpath, (propname), \
++ prop->val.val, (value)); \
++ } while (0)
++
++#define CHECK_HAVE_ONECELL(node, propname) \
++ do { \
++ CHECK_HAVE((node), (propname)); \
++ if (prop && (prop->val.len != sizeof(cell_t))) \
++ DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
++ } while (0)
++
++#define CHECK_HAVE_WARN_ONECELL(node, propname) \
++ do { \
++ CHECK_HAVE_WARN((node), (propname)); \
++ if (prop && (prop->val.len != sizeof(cell_t))) \
++ DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
++ } while (0)
++
++#define CHECK_HAVE_WARN_PHANDLE(xnode, propname, root) \
++ do { \
++ struct node *ref; \
++ CHECK_HAVE_WARN_ONECELL((xnode), (propname)); \
++ if (prop) {\
++ cell_t phandle = propval_cell(prop); \
++ if ((phandle == 0) || (phandle == -1)) { \
++ DO_ERR("\"%s\" property in %s contains an invalid phandle %x\n", (propname), (xnode)->fullpath, phandle); \
++ } else { \
++ ref = get_node_by_phandle((root), propval_cell(prop)); \
++ if (! ref) \
++ DO_ERR("\"%s\" property in %s refers to non-existant phandle %x\n", (propname), (xnode)->fullpath, propval_cell(prop)); \
++ } \
++ } \
++ } while (0)
++
++#define CHECK_HAVE_WARN_STRING(node, propname) \
++ do { \
++ CHECK_HAVE_WARN((node), (propname)); \
++ if (prop && !data_is_one_string(prop->val)) \
++ DO_ERR("\"%s\" property in %s is not a string\n", \
++ (propname), (node)->fullpath); \
++ } while (0)
++
++static int check_root(struct node *root)
++{
++ struct property *prop;
++ int ok = 1;
++
++ CHECK_HAVE_STRING(root, "model");
++ CHECK_HAVE_WARN(root, "compatible");
++
++ return ok;
++}
++
++static int check_cpus(struct node *root, int outversion, int boot_cpuid_phys)
++{
++ struct node *cpus, *cpu;
++ struct property *prop;
++ struct node *bootcpu = NULL;
++ int ok = 1;
++
++ cpus = get_subnode(root, "cpus");
++ if (! cpus) {
++ ERRMSG("Missing /cpus node\n");
++ return 0;
++ }
++
++ if (cpus->addr_cells != 1)
++ DO_ERR("%s has bad #address-cells value %d (should be 1)\n",
++ cpus->fullpath, cpus->addr_cells);
++ if (cpus->size_cells != 0)
++ DO_ERR("%s has bad #size-cells value %d (should be 0)\n",
++ cpus->fullpath, cpus->size_cells);
++
++ for_each_child(cpus, cpu) {
++ CHECK_HAVE_STREQ(cpu, "device_type", "cpu");
++
++ CHECK_HAVE_ONECELL(cpu, "reg");
++ if (prop) {
++ cell_t unitnum;
++ char *eptr;
++
++ unitnum = strtol(get_unitname(cpu), &eptr, 16);
++ if (*eptr) {
++ WARNMSG("%s has bad format unit name %s (should be CPU number\n",
++ cpu->fullpath, get_unitname(cpu));
++ } else if (unitnum != propval_cell(prop)) {
++ WARNMSG("%s unit name \"%s\" does not match \"reg\" property <%x>\n",
++ cpu->fullpath, get_unitname(cpu),
++ propval_cell(prop));
++ }
++ }
++
++/* CHECK_HAVE_ONECELL(cpu, "d-cache-line-size"); */
++/* CHECK_HAVE_ONECELL(cpu, "i-cache-line-size"); */
++ CHECK_HAVE_ONECELL(cpu, "d-cache-size");
++ CHECK_HAVE_ONECELL(cpu, "i-cache-size");
++
++ CHECK_HAVE_WARN_ONECELL(cpu, "clock-frequency");
++ CHECK_HAVE_WARN_ONECELL(cpu, "timebase-frequency");
++
++ prop = get_property(cpu, "linux,boot-cpu");
++ if (prop) {
++ if (prop->val.len)
++ WARNMSG("\"linux,boot-cpu\" property in %s is non-empty\n",
++ cpu->fullpath);
++ if (bootcpu)
++ DO_ERR("Multiple boot cpus (%s and %s)\n",
++ bootcpu->fullpath, cpu->fullpath);
++ else
++ bootcpu = cpu;
++ }
++ }
++
++ if (outversion < 2) {
++ if (! bootcpu)
++ WARNMSG("No cpu has \"linux,boot-cpu\" property\n");
++ } else {
++ if (bootcpu)
++ WARNMSG("\"linux,boot-cpu\" property is deprecated in blob version 2 or higher\n");
++ if (boot_cpuid_phys == 0xfeedbeef)
++ WARNMSG("physical boot CPU not set. Use -b option to set\n");
++ }
++
++ return ok;
++}
++
++static int check_memory(struct node *root)
++{
++ struct node *mem;
++ struct property *prop;
++ int nnodes = 0;
++ int ok = 1;
++
++ for_each_child(root, mem) {
++ if (! strneq(mem->name, "memory", mem->basenamelen))
++ continue;
++
++ nnodes++;
++
++ CHECK_HAVE_STREQ(mem, "device_type", "memory");
++ CHECK_HAVE(mem, "reg");
++ }
++
++ if (nnodes == 0) {
++ ERRMSG("No memory nodes\n");
++ return 0;
++ }
++
++ return ok;
++}
++
++int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys)
++{
++ int ok = 1;
++
++ ok = ok && check_root(dt);
++ ok = ok && check_cpus(dt, outversion, boot_cpuid_phys);
++ ok = ok && check_memory(dt);
++ if (! ok)
++ return 0;
++
++ return 1;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/data.c powerpc.git/arch/powerpc/boot/dtc-src/data.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/data.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/data.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,321 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++
++void data_free(struct data d)
++{
++ struct marker *m, *nm;
++
++ m = d.markers;
++ while (m) {
++ nm = m->next;
++ free(m->ref);
++ free(m);
++ m = nm;
++ }
++
++ assert(!d.val || d.asize);
++
++ if (d.val)
++ free(d.val);
++}
++
++struct data data_grow_for(struct data d, int xlen)
++{
++ struct data nd;
++ int newsize;
++
++ /* we must start with an allocated datum */
++ assert(!d.val || d.asize);
++
++ if (xlen == 0)
++ return d;
++
++ nd = d;
++
++ newsize = xlen;
++
++ while ((d.len + xlen) > newsize)
++ newsize *= 2;
++
++ nd.asize = newsize;
++ nd.val = xrealloc(d.val, newsize);
++
++ assert(nd.asize >= (d.len + xlen));
++
++ return nd;
++}
++
++struct data data_copy_mem(const char *mem, int len)
++{
++ struct data d;
++
++ d = data_grow_for(empty_data, len);
++
++ d.len = len;
++ memcpy(d.val, mem, len);
++
++ return d;
++}
++
++static char get_oct_char(const char *s, int *i)
++{
++ char x[4];
++ char *endx;
++ long val;
++
++ x[3] = '\0';
++ x[0] = s[(*i)];
++ if (x[0]) {
++ x[1] = s[(*i)+1];
++ if (x[1])
++ x[2] = s[(*i)+2];
++ }
++
++ val = strtol(x, &endx, 8);
++ if ((endx - x) == 0)
++ fprintf(stderr, "Empty \\nnn escape\n");
++
++ (*i) += endx - x;
++ return val;
++}
++
++static char get_hex_char(const char *s, int *i)
++{
++ char x[3];
++ char *endx;
++ long val;
++
++ x[2] = '\0';
++ x[0] = s[(*i)];
++ if (x[0])
++ x[1] = s[(*i)+1];
++
++ val = strtol(x, &endx, 16);
++ if ((endx - x) == 0)
++ fprintf(stderr, "Empty \\x escape\n");
++
++ (*i) += endx - x;
++ return val;
++}
++
++struct data data_copy_escape_string(const char *s, int len)
++{
++ int i = 0;
++ struct data d;
++ char *q;
++
++ d = data_grow_for(empty_data, strlen(s)+1);
++
++ q = d.val;
++ while (i < len) {
++ char c = s[i++];
++
++ if (c != '\\') {
++ q[d.len++] = c;
++ continue;
++ }
++
++ c = s[i++];
++ assert(c);
++ switch (c) {
++ case 'a':
++ q[d.len++] = '\a';
++ break;
++ case 'b':
++ q[d.len++] = '\b';
++ break;
++ case 't':
++ q[d.len++] = '\t';
++ break;
++ case 'n':
++ q[d.len++] = '\n';
++ break;
++ case 'v':
++ q[d.len++] = '\v';
++ break;
++ case 'f':
++ q[d.len++] = '\f';
++ break;
++ case 'r':
++ q[d.len++] = '\r';
++ break;
++ case '0':
++ case '1':
++ case '2':
++ case '3':
++ case '4':
++ case '5':
++ case '6':
++ case '7':
++ i--; /* need to re-read the first digit as
++ * part of the octal value */
++ q[d.len++] = get_oct_char(s, &i);
++ break;
++ case 'x':
++ q[d.len++] = get_hex_char(s, &i);
++ break;
++ default:
++ q[d.len++] = c;
++ }
++ }
++
++ q[d.len++] = '\0';
++ return d;
++}
++
++struct data data_copy_file(FILE *f, size_t len)
++{
++ struct data d;
++
++ d = data_grow_for(empty_data, len);
++
++ d.len = len;
++ fread(d.val, len, 1, f);
++
++ return d;
++}
++
++struct data data_append_data(struct data d, const void *p, int len)
++{
++ d = data_grow_for(d, len);
++ memcpy(d.val + d.len, p, len);
++ d.len += len;
++ return d;
++}
++
++struct data data_insert_at_marker(struct data d, struct marker *m,
++ const void *p, int len)
++{
++ d = data_grow_for(d, len);
++ memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset);
++ memcpy(d.val + m->offset, p, len);
++ d.len += len;
++
++ /* Adjust all markers after the one we're inserting at */
++ m = m->next;
++ for_each_marker(m)
++ m->offset += len;
++ return d;
++}
++
++struct data data_append_markers(struct data d, struct marker *m)
++{
++ struct marker **mp = &d.markers;
++
++ /* Find the end of the markerlist */
++ while (*mp)
++ mp = &((*mp)->next);
++ *mp = m;
++ return d;
++}
++
++struct data data_merge(struct data d1, struct data d2)
++{
++ struct data d;
++ struct marker *m2 = d2.markers;
++
++ d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2);
++
++ /* Adjust for the length of d1 */
++ for_each_marker(m2)
++ m2->offset += d1.len;
++
++ d2.markers = NULL; /* So data_free() doesn't clobber them */
++ data_free(d2);
++
++ return d;
++}
++
++struct data data_append_cell(struct data d, cell_t word)
++{
++ cell_t beword = cpu_to_be32(word);
++
++ return data_append_data(d, &beword, sizeof(beword));
++}
++
++struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
++{
++ struct fdt_reserve_entry bere;
++
++ bere.address = cpu_to_be64(re->address);
++ bere.size = cpu_to_be64(re->size);
++
++ return data_append_data(d, &bere, sizeof(bere));
++}
++
++struct data data_append_addr(struct data d, u64 addr)
++{
++ u64 beaddr = cpu_to_be64(addr);
++
++ return data_append_data(d, &beaddr, sizeof(beaddr));
++}
++
++struct data data_append_byte(struct data d, uint8_t byte)
++{
++ return data_append_data(d, &byte, 1);
++}
++
++struct data data_append_zeroes(struct data d, int len)
++{
++ d = data_grow_for(d, len);
++
++ memset(d.val + d.len, 0, len);
++ d.len += len;
++ return d;
++}
++
++struct data data_append_align(struct data d, int align)
++{
++ int newlen = ALIGN(d.len, align);
++ return data_append_zeroes(d, newlen - d.len);
++}
++
++struct data data_add_marker(struct data d, enum markertype type, char *ref)
++{
++ struct marker *m;
++
++ m = xmalloc(sizeof(*m));
++ m->offset = d.len;
++ m->type = type;
++ m->ref = ref;
++ m->next = NULL;
++
++ return data_append_markers(d, m);
++}
++
++int data_is_one_string(struct data d)
++{
++ int i;
++ int len = d.len;
++
++ if (len == 0)
++ return 0;
++
++ for (i = 0; i < len-1; i++)
++ if (d.val[i] == '\0')
++ return 0;
++
++ if (d.val[len-1] != '\0')
++ return 0;
++
++ return 1;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-lexer.l powerpc.git/arch/powerpc/boot/dtc-src/dtc-lexer.l
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-lexer.l 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc-lexer.l 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,328 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++%option noyywrap nounput yylineno
++
++%x INCLUDE
++%x BYTESTRING
++%x PROPNODENAME
++%s V1
++
++PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
++PATHCHAR ({PROPNODECHAR}|[/])
++LABEL [a-zA-Z_][a-zA-Z0-9_]*
++
++%{
++#include "dtc.h"
++#include "srcpos.h"
++#include "dtc-parser.tab.h"
++
++
++/*#define LEXDEBUG 1*/
++
++#ifdef LEXDEBUG
++#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
++#else
++#define DPRINT(fmt, ...) do { } while (0)
++#endif
++
++static int dts_version; /* = 0 */
++
++#define BEGIN_DEFAULT() if (dts_version == 0) { \
++ DPRINT("<INITIAL>\n"); \
++ BEGIN(INITIAL); \
++ } else { \
++ DPRINT("<V1>\n"); \
++ BEGIN(V1); \
++ }
++%}
++
++%%
++<*>"/include/" BEGIN(INCLUDE);
++
++<INCLUDE>\"[^"\n]*\" {
++ yytext[strlen(yytext) - 1] = 0;
++ if (!push_input_file(yytext + 1)) {
++ /* Some unrecoverable error.*/
++ exit(1);
++ }
++ BEGIN_DEFAULT();
++ }
++
++
++<*><<EOF>> {
++ if (!pop_input_file()) {
++ yyterminate();
++ }
++ }
++
++<*>\"([^\\"]|\\.)*\" {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("String: %s\n", yytext);
++ yylval.data = data_copy_escape_string(yytext+1,
++ yyleng-2);
++ yylloc.first_line = yylineno;
++ return DT_STRING;
++ }
++
++<*>"/dts-v1/" {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Keyword: /dts-v1/\n");
++ dts_version = 1;
++ BEGIN_DEFAULT();
++ return DT_V1;
++ }
++
++<*>"/memreserve/" {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Keyword: /memreserve/\n");
++ BEGIN_DEFAULT();
++ return DT_MEMRESERVE;
++ }
++
++<*>{LABEL}: {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Label: %s\n", yytext);
++ yylval.labelref = strdup(yytext);
++ yylval.labelref[yyleng-1] = '\0';
++ return DT_LABEL;
++ }
++
++<INITIAL>[bodh]# {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ if (*yytext == 'b')
++ yylval.cbase = 2;
++ else if (*yytext == 'o')
++ yylval.cbase = 8;
++ else if (*yytext == 'd')
++ yylval.cbase = 10;
++ else
++ yylval.cbase = 16;
++ DPRINT("Base: %d\n", yylval.cbase);
++ return DT_BASE;
++ }
++
++<INITIAL>[0-9a-fA-F]+ {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.literal = strdup(yytext);
++ DPRINT("Literal: '%s'\n", yylval.literal);
++ return DT_LEGACYLITERAL;
++ }
++
++<V1>[0-9]+|0[xX][0-9a-fA-F]+ {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.literal = strdup(yytext);
++ DPRINT("Literal: '%s'\n", yylval.literal);
++ return DT_LITERAL;
++ }
++
++\&{LABEL} { /* label reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Ref: %s\n", yytext+1);
++ yylval.labelref = strdup(yytext+1);
++ return DT_REF;
++ }
++
++"&{/"{PATHCHAR}+\} { /* new-style path reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yytext[yyleng-1] = '\0';
++ DPRINT("Ref: %s\n", yytext+2);
++ yylval.labelref = strdup(yytext+2);
++ return DT_REF;
++ }
++
++<INITIAL>"&/"{PATHCHAR}+ { /* old-style path reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Ref: %s\n", yytext+1);
++ yylval.labelref = strdup(yytext+1);
++ return DT_REF;
++ }
++
++<BYTESTRING>[0-9a-fA-F]{2} {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.byte = strtol(yytext, NULL, 16);
++ DPRINT("Byte: %02x\n", (int)yylval.byte);
++ return DT_BYTE;
++ }
++
++<BYTESTRING>"]" {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("/BYTESTRING\n");
++ BEGIN_DEFAULT();
++ return ']';
++ }
++
++<PROPNODENAME>{PROPNODECHAR}+ {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("PropNodeName: %s\n", yytext);
++ yylval.propnodename = strdup(yytext);
++ BEGIN_DEFAULT();
++ return DT_PROPNODENAME;
++ }
++
++
++<*>[[:space:]]+ /* eat whitespace */
++
++<*>"/*"([^*]|\*+[^*/])*\*+"/" {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Comment: %s\n", yytext);
++ /* eat comments */
++ }
++
++<*>"//".*\n /* eat line comments */
++
++<*>. {
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
++ (unsigned)yytext[0]);
++ if (yytext[0] == '[') {
++ DPRINT("<BYTESTRING>\n");
++ BEGIN(BYTESTRING);
++ }
++ if ((yytext[0] == '{')
++ || (yytext[0] == ';')) {
++ DPRINT("<PROPNODENAME>\n");
++ BEGIN(PROPNODENAME);
++ }
++ return yytext[0];
++ }
++
++%%
++
++
++/*
++ * Stack of nested include file contexts.
++ */
++
++struct incl_file {
++ int filenum;
++ FILE *file;
++ YY_BUFFER_STATE yy_prev_buf;
++ int yy_prev_lineno;
++ struct incl_file *prev;
++};
++
++struct incl_file *incl_file_stack;
++
++
++/*
++ * Detect infinite include recursion.
++ */
++#define MAX_INCLUDE_DEPTH (100)
++
++static int incl_depth = 0;
++
++
++int push_input_file(const char *filename)
++{
++ FILE *f;
++ struct incl_file *incl_file;
++
++ if (!filename) {
++ yyerror("No include file name given.");
++ return 0;
++ }
++
++ if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
++ yyerror("Includes nested too deeply");
++ return 0;
++ }
++
++ f = dtc_open_file(filename);
++
++ incl_file = malloc(sizeof(struct incl_file));
++ if (!incl_file) {
++ yyerror("Can not allocate include file space.");
++ return 0;
++ }
++
++ /*
++ * Save current context.
++ */
++ incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
++ incl_file->yy_prev_lineno = yylineno;
++ incl_file->filenum = srcpos_filenum;
++ incl_file->file = yyin;
++ incl_file->prev = incl_file_stack;
++
++ incl_file_stack = incl_file;
++
++ /*
++ * Establish new context.
++ */
++ srcpos_filenum = lookup_file_name(filename, 0);
++ yylineno = 1;
++ yyin = f;
++ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
++
++ return 1;
++}
++
++
++int pop_input_file(void)
++{
++ struct incl_file *incl_file;
++
++ if (incl_file_stack == 0)
++ return 0;
++
++ fclose(yyin);
++
++ /*
++ * Pop.
++ */
++ --incl_depth;
++ incl_file = incl_file_stack;
++ incl_file_stack = incl_file->prev;
++
++ /*
++ * Recover old context.
++ */
++ yy_delete_buffer(YY_CURRENT_BUFFER);
++ yy_switch_to_buffer(incl_file->yy_prev_buf);
++ yylineno = incl_file->yy_prev_lineno;
++ srcpos_filenum = incl_file->filenum;
++ yyin = incl_file->file;
++
++ /*
++ * Free old state.
++ */
++ free(incl_file);
++
++ if (YY_CURRENT_BUFFER == 0)
++ return 0;
++
++ return 1;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped powerpc.git/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,2174 @@
++#line 2 "dtc-lexer.lex.c"
++
++#line 4 "dtc-lexer.lex.c"
++
++#define YY_INT_ALIGNED short int
++
++/* A lexical scanner generated by flex */
++
++#define FLEX_SCANNER
++#define YY_FLEX_MAJOR_VERSION 2
++#define YY_FLEX_MINOR_VERSION 5
++#define YY_FLEX_SUBMINOR_VERSION 33
++#if YY_FLEX_SUBMINOR_VERSION > 0
++#define FLEX_BETA
++#endif
++
++/* First, we deal with platform-specific or compiler-specific issues. */
++
++/* begin standard C headers. */
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <stdlib.h>
++
++/* end standard C headers. */
++
++/* flex integer type definitions */
++
++#ifndef FLEXINT_H
++#define FLEXINT_H
++
++/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
++
++#if __STDC_VERSION__ >= 199901L
++
++/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
++ * if you want the limit (max/min) macros for int types.
++ */
++#ifndef __STDC_LIMIT_MACROS
++#define __STDC_LIMIT_MACROS 1
++#endif
++
++#include <inttypes.h>
++typedef int8_t flex_int8_t;
++typedef uint8_t flex_uint8_t;
++typedef int16_t flex_int16_t;
++typedef uint16_t flex_uint16_t;
++typedef int32_t flex_int32_t;
++typedef uint32_t flex_uint32_t;
++#else
++typedef signed char flex_int8_t;
++typedef short int flex_int16_t;
++typedef int flex_int32_t;
++typedef unsigned char flex_uint8_t;
++typedef unsigned short int flex_uint16_t;
++typedef unsigned int flex_uint32_t;
++#endif /* ! C99 */
++
++/* Limits of integral types. */
++#ifndef INT8_MIN
++#define INT8_MIN (-128)
++#endif
++#ifndef INT16_MIN
++#define INT16_MIN (-32767-1)
++#endif
++#ifndef INT32_MIN
++#define INT32_MIN (-2147483647-1)
++#endif
++#ifndef INT8_MAX
++#define INT8_MAX (127)
++#endif
++#ifndef INT16_MAX
++#define INT16_MAX (32767)
++#endif
++#ifndef INT32_MAX
++#define INT32_MAX (2147483647)
++#endif
++#ifndef UINT8_MAX
++#define UINT8_MAX (255U)
++#endif
++#ifndef UINT16_MAX
++#define UINT16_MAX (65535U)
++#endif
++#ifndef UINT32_MAX
++#define UINT32_MAX (4294967295U)
++#endif
++
++#endif /* ! FLEXINT_H */
++
++#ifdef __cplusplus
++
++/* The "const" storage-class-modifier is valid. */
++#define YY_USE_CONST
++
++#else /* ! __cplusplus */
++
++#if __STDC__
++
++#define YY_USE_CONST
++
++#endif /* __STDC__ */
++#endif /* ! __cplusplus */
++
++#ifdef YY_USE_CONST
++#define yyconst const
++#else
++#define yyconst
++#endif
++
++/* Returned upon end-of-file. */
++#define YY_NULL 0
++
++/* Promotes a possibly negative, possibly signed char to an unsigned
++ * integer for use as an array index. If the signed char is negative,
++ * we want to instead treat it as an 8-bit unsigned char, hence the
++ * double cast.
++ */
++#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
++
++/* Enter a start condition. This macro really ought to take a parameter,
++ * but we do it the disgusting crufty way forced on us by the ()-less
++ * definition of BEGIN.
++ */
++#define BEGIN (yy_start) = 1 + 2 *
++
++/* Translate the current start state into a value that can be later handed
++ * to BEGIN to return to the state. The YYSTATE alias is for lex
++ * compatibility.
++ */
++#define YY_START (((yy_start) - 1) / 2)
++#define YYSTATE YY_START
++
++/* Action number for EOF rule of a given start state. */
++#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
++
++/* Special action meaning "start processing a new file". */
++#define YY_NEW_FILE yyrestart(yyin )
++
++#define YY_END_OF_BUFFER_CHAR 0
++
++/* Size of default input buffer. */
++#ifndef YY_BUF_SIZE
++#define YY_BUF_SIZE 16384
++#endif
++
++/* The state buf must be large enough to hold one state per character in the main buffer.
++ */
++#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
++
++#ifndef YY_TYPEDEF_YY_BUFFER_STATE
++#define YY_TYPEDEF_YY_BUFFER_STATE
++typedef struct yy_buffer_state *YY_BUFFER_STATE;
++#endif
++
++extern int yyleng;
++
++extern FILE *yyin, *yyout;
++
++#define EOB_ACT_CONTINUE_SCAN 0
++#define EOB_ACT_END_OF_FILE 1
++#define EOB_ACT_LAST_MATCH 2
++
++ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
++ * access to the local variable yy_act. Since yyless() is a macro, it would break
++ * existing scanners that call yyless() from OUTSIDE yylex.
++ * One obvious solution it to make yy_act a global. I tried that, and saw
++ * a 5% performance hit in a non-yylineno scanner, because yy_act is
++ * normally declared as a register variable-- so it is not worth it.
++ */
++ #define YY_LESS_LINENO(n) \
++ do { \
++ int yyl;\
++ for ( yyl = n; yyl < yyleng; ++yyl )\
++ if ( yytext[yyl] == '\n' )\
++ --yylineno;\
++ }while(0)
++
++/* Return all but the first "n" matched characters back to the input stream. */
++#define yyless(n) \
++ do \
++ { \
++ /* Undo effects of setting up yytext. */ \
++ int yyless_macro_arg = (n); \
++ YY_LESS_LINENO(yyless_macro_arg);\
++ *yy_cp = (yy_hold_char); \
++ YY_RESTORE_YY_MORE_OFFSET \
++ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
++ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
++ } \
++ while ( 0 )
++
++#define unput(c) yyunput( c, (yytext_ptr) )
++
++/* The following is because we cannot portably get our hands on size_t
++ * (without autoconf's help, which isn't available because we want
++ * flex-generated scanners to compile on their own).
++ */
++
++#ifndef YY_TYPEDEF_YY_SIZE_T
++#define YY_TYPEDEF_YY_SIZE_T
++typedef unsigned int yy_size_t;
++#endif
++
++#ifndef YY_STRUCT_YY_BUFFER_STATE
++#define YY_STRUCT_YY_BUFFER_STATE
++struct yy_buffer_state
++ {
++ FILE *yy_input_file;
++
++ char *yy_ch_buf; /* input buffer */
++ char *yy_buf_pos; /* current position in input buffer */
++
++ /* Size of input buffer in bytes, not including room for EOB
++ * characters.
++ */
++ yy_size_t yy_buf_size;
++
++ /* Number of characters read into yy_ch_buf, not including EOB
++ * characters.
++ */
++ int yy_n_chars;
++
++ /* Whether we "own" the buffer - i.e., we know we created it,
++ * and can realloc() it to grow it, and should free() it to
++ * delete it.
++ */
++ int yy_is_our_buffer;
++
++ /* Whether this is an "interactive" input source; if so, and
++ * if we're using stdio for input, then we want to use getc()
++ * instead of fread(), to make sure we stop fetching input after
++ * each newline.
++ */
++ int yy_is_interactive;
++
++ /* Whether we're considered to be at the beginning of a line.
++ * If so, '^' rules will be active on the next match, otherwise
++ * not.
++ */
++ int yy_at_bol;
++
++ int yy_bs_lineno; /**< The line count. */
++ int yy_bs_column; /**< The column count. */
++
++ /* Whether to try to fill the input buffer when we reach the
++ * end of it.
++ */
++ int yy_fill_buffer;
++
++ int yy_buffer_status;
++
++#define YY_BUFFER_NEW 0
++#define YY_BUFFER_NORMAL 1
++ /* When an EOF's been seen but there's still some text to process
++ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
++ * shouldn't try reading from the input source any more. We might
++ * still have a bunch of tokens to match, though, because of
++ * possible backing-up.
++ *
++ * When we actually see the EOF, we change the status to "new"
++ * (via yyrestart()), so that the user can continue scanning by
++ * just pointing yyin at a new input file.
++ */
++#define YY_BUFFER_EOF_PENDING 2
++
++ };
++#endif /* !YY_STRUCT_YY_BUFFER_STATE */
++
++/* Stack of input buffers. */
++static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
++static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
++static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
++
++/* We provide macros for accessing buffer states in case in the
++ * future we want to put the buffer states in a more general
++ * "scanner state".
++ *
++ * Returns the top of the stack, or NULL.
++ */
++#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
++ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
++ : NULL)
++
++/* Same as previous macro, but useful when we know that the buffer stack is not
++ * NULL or when we need an lvalue. For internal use only.
++ */
++#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
++
++/* yy_hold_char holds the character lost when yytext is formed. */
++static char yy_hold_char;
++static int yy_n_chars; /* number of characters read into yy_ch_buf */
++int yyleng;
++
++/* Points to current character in buffer. */
++static char *yy_c_buf_p = (char *) 0;
++static int yy_init = 0; /* whether we need to initialize */
++static int yy_start = 0; /* start state number */
++
++/* Flag which is used to allow yywrap()'s to do buffer switches
++ * instead of setting up a fresh yyin. A bit of a hack ...
++ */
++static int yy_did_buffer_switch_on_eof;
++
++void yyrestart (FILE *input_file );
++void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
++YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
++void yy_delete_buffer (YY_BUFFER_STATE b );
++void yy_flush_buffer (YY_BUFFER_STATE b );
++void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
++void yypop_buffer_state (void );
++
++static void yyensure_buffer_stack (void );
++static void yy_load_buffer_state (void );
++static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
++
++#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
++
++YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
++YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
++YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
++
++void *yyalloc (yy_size_t );
++void *yyrealloc (void *,yy_size_t );
++void yyfree (void * );
++
++#define yy_new_buffer yy_create_buffer
++
++#define yy_set_interactive(is_interactive) \
++ { \
++ if ( ! YY_CURRENT_BUFFER ){ \
++ yyensure_buffer_stack (); \
++ YY_CURRENT_BUFFER_LVALUE = \
++ yy_create_buffer(yyin,YY_BUF_SIZE ); \
++ } \
++ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
++ }
++
++#define yy_set_bol(at_bol) \
++ { \
++ if ( ! YY_CURRENT_BUFFER ){\
++ yyensure_buffer_stack (); \
++ YY_CURRENT_BUFFER_LVALUE = \
++ yy_create_buffer(yyin,YY_BUF_SIZE ); \
++ } \
++ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
++ }
++
++#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
++
++/* Begin user sect3 */
++
++#define yywrap() 1
++#define YY_SKIP_YYWRAP
++
++typedef unsigned char YY_CHAR;
++
++FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
++
++typedef int yy_state_type;
++
++extern int yylineno;
++
++int yylineno = 1;
++
++extern char *yytext;
++#define yytext_ptr yytext
++
++static yy_state_type yy_get_previous_state (void );
++static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
++static int yy_get_next_buffer (void );
++static void yy_fatal_error (yyconst char msg[] );
++
++/* Done after the current pattern has been matched and before the
++ * corresponding action - sets up yytext.
++ */
++#define YY_DO_BEFORE_ACTION \
++ (yytext_ptr) = yy_bp; \
++ yyleng = (size_t) (yy_cp - yy_bp); \
++ (yy_hold_char) = *yy_cp; \
++ *yy_cp = '\0'; \
++ (yy_c_buf_p) = yy_cp;
++
++#define YY_NUM_RULES 20
++#define YY_END_OF_BUFFER 21
++/* This struct is not used in this scanner,
++ but its presence is necessary. */
++struct yy_trans_info
++ {
++ flex_int32_t yy_verify;
++ flex_int32_t yy_nxt;
++ };
++static yyconst flex_int16_t yy_accept[94] =
++ { 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 21, 19, 16, 16, 19, 19, 19, 8, 8, 19,
++ 8, 19, 19, 19, 19, 14, 15, 15, 19, 9,
++ 9, 16, 0, 3, 0, 0, 10, 0, 0, 0,
++ 0, 0, 0, 8, 8, 6, 0, 7, 0, 2,
++ 0, 13, 13, 15, 15, 9, 0, 12, 10, 0,
++ 0, 0, 0, 18, 0, 0, 0, 2, 9, 0,
++ 17, 0, 0, 0, 11, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 4, 0, 0, 1, 0, 0,
++ 0, 5, 0
++
++ } ;
++
++static yyconst flex_int32_t yy_ec[256] =
++ { 0,
++ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
++ 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 2, 1, 4, 5, 1, 1, 6, 1, 1,
++ 1, 7, 8, 8, 9, 8, 10, 11, 12, 13,
++ 13, 13, 13, 13, 13, 13, 13, 14, 1, 1,
++ 1, 1, 8, 8, 15, 15, 15, 15, 15, 15,
++ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
++ 16, 16, 16, 16, 16, 16, 16, 17, 16, 16,
++ 1, 18, 19, 1, 16, 1, 15, 20, 21, 22,
++
++ 23, 15, 16, 24, 25, 16, 16, 26, 27, 28,
++ 24, 16, 16, 29, 30, 31, 32, 33, 16, 17,
++ 16, 16, 34, 1, 35, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1
++ } ;
++
++static yyconst flex_int32_t yy_meta[36] =
++ { 0,
++ 1, 1, 1, 1, 2, 1, 2, 2, 2, 3,
++ 4, 4, 4, 5, 6, 7, 7, 1, 1, 6,
++ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7,
++ 7, 7, 7, 8, 1
++ } ;
++
++static yyconst flex_int16_t yy_base[107] =
++ { 0,
++ 0, 0, 32, 0, 53, 0, 76, 0, 108, 111,
++ 280, 288, 37, 39, 33, 36, 106, 0, 123, 146,
++ 255, 251, 45, 0, 159, 288, 0, 53, 108, 172,
++ 114, 127, 158, 288, 245, 0, 0, 234, 235, 236,
++ 197, 195, 199, 0, 0, 288, 0, 288, 160, 288,
++ 183, 288, 0, 0, 183, 182, 0, 0, 0, 0,
++ 204, 189, 207, 288, 179, 187, 180, 194, 0, 171,
++ 288, 196, 178, 174, 288, 169, 169, 177, 165, 153,
++ 143, 155, 137, 118, 288, 122, 42, 288, 36, 36,
++ 40, 288, 288, 212, 218, 223, 229, 234, 239, 245,
++
++ 251, 255, 262, 270, 275, 280
++ } ;
++
++static yyconst flex_int16_t yy_def[107] =
++ { 0,
++ 93, 1, 1, 3, 3, 5, 93, 7, 3, 3,
++ 93, 93, 93, 93, 94, 95, 93, 96, 93, 19,
++ 19, 20, 97, 98, 20, 93, 99, 100, 95, 93,
++ 93, 93, 94, 93, 94, 101, 102, 93, 103, 104,
++ 93, 93, 93, 96, 19, 93, 20, 93, 97, 93,
++ 97, 93, 20, 99, 100, 93, 105, 101, 102, 106,
++ 103, 103, 104, 93, 93, 93, 93, 94, 105, 106,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 0, 93, 93, 93, 93, 93, 93, 93,
++
++ 93, 93, 93, 93, 93, 93
++ } ;
++
++static yyconst flex_int16_t yy_nxt[324] =
++ { 0,
++ 12, 13, 14, 15, 12, 16, 12, 12, 12, 17,
++ 18, 18, 18, 12, 19, 20, 20, 12, 12, 21,
++ 19, 21, 19, 22, 20, 20, 20, 20, 20, 20,
++ 20, 20, 20, 12, 12, 23, 34, 12, 32, 32,
++ 32, 32, 12, 12, 12, 36, 20, 33, 50, 92,
++ 35, 20, 20, 20, 20, 20, 15, 54, 91, 54,
++ 54, 54, 51, 24, 24, 24, 46, 25, 90, 38,
++ 89, 26, 25, 25, 25, 25, 12, 13, 14, 15,
++ 27, 12, 27, 27, 27, 17, 27, 27, 27, 12,
++ 28, 28, 28, 12, 12, 28, 28, 28, 28, 28,
++
++ 28, 28, 28, 28, 28, 28, 28, 28, 28, 12,
++ 12, 15, 39, 29, 15, 40, 29, 93, 30, 31,
++ 31, 30, 31, 31, 56, 56, 56, 41, 32, 32,
++ 42, 88, 43, 45, 45, 45, 46, 45, 47, 47,
++ 87, 38, 45, 45, 45, 45, 47, 47, 47, 47,
++ 47, 47, 47, 47, 47, 47, 47, 47, 47, 86,
++ 47, 34, 33, 50, 85, 47, 47, 47, 47, 53,
++ 53, 53, 84, 53, 83, 35, 82, 51, 53, 53,
++ 53, 53, 56, 56, 56, 93, 68, 54, 57, 54,
++ 54, 54, 56, 56, 56, 62, 46, 34, 71, 81,
++
++ 80, 79, 78, 77, 76, 75, 74, 73, 72, 64,
++ 62, 35, 33, 33, 33, 33, 33, 33, 33, 33,
++ 37, 67, 66, 37, 37, 37, 44, 65, 44, 49,
++ 49, 49, 49, 49, 49, 49, 49, 52, 64, 52,
++ 54, 62, 54, 60, 54, 54, 55, 93, 55, 55,
++ 55, 55, 58, 58, 58, 48, 58, 58, 59, 48,
++ 59, 59, 61, 61, 61, 61, 61, 61, 61, 61,
++ 63, 63, 63, 63, 63, 63, 63, 63, 69, 93,
++ 69, 70, 70, 70, 93, 70, 70, 11, 93, 93,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 93
++ } ;
++
++static yyconst flex_int16_t yy_chk[324] =
++ { 0,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 3, 15, 3, 13, 13,
++ 14, 14, 3, 3, 3, 16, 3, 23, 23, 91,
++ 15, 3, 3, 3, 3, 3, 5, 28, 90, 28,
++ 28, 28, 23, 5, 5, 5, 28, 5, 89, 16,
++ 87, 5, 5, 5, 5, 5, 7, 7, 7, 7,
++ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
++ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
++
++ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
++ 7, 9, 17, 9, 10, 17, 10, 29, 9, 9,
++ 9, 10, 10, 10, 31, 31, 31, 17, 32, 32,
++ 17, 86, 17, 19, 19, 19, 19, 19, 19, 19,
++ 84, 29, 19, 19, 19, 19, 19, 19, 19, 19,
++ 19, 19, 19, 19, 19, 19, 20, 20, 20, 83,
++ 20, 33, 49, 49, 82, 20, 20, 20, 20, 25,
++ 25, 25, 81, 25, 80, 33, 79, 49, 25, 25,
++ 25, 25, 30, 30, 30, 51, 51, 55, 30, 55,
++ 55, 55, 56, 56, 56, 62, 55, 68, 62, 78,
++
++ 77, 76, 74, 73, 72, 70, 67, 66, 65, 63,
++ 61, 68, 94, 94, 94, 94, 94, 94, 94, 94,
++ 95, 43, 42, 95, 95, 95, 96, 41, 96, 97,
++ 97, 97, 97, 97, 97, 97, 97, 98, 40, 98,
++ 99, 39, 99, 38, 99, 99, 100, 35, 100, 100,
++ 100, 100, 101, 101, 101, 22, 101, 101, 102, 21,
++ 102, 102, 103, 103, 103, 103, 103, 103, 103, 103,
++ 104, 104, 104, 104, 104, 104, 104, 104, 105, 11,
++ 105, 106, 106, 106, 0, 106, 106, 93, 93, 93,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
++ 93, 93, 93
++ } ;
++
++/* Table of booleans, true if rule could match eol. */
++static yyconst flex_int32_t yy_rule_can_match_eol[21] =
++ { 0,
++0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
++ 0, };
++
++static yy_state_type yy_last_accepting_state;
++static char *yy_last_accepting_cpos;
++
++extern int yy_flex_debug;
++int yy_flex_debug = 0;
++
++/* The intent behind this definition is that it'll catch
++ * any uses of REJECT which flex missed.
++ */
++#define REJECT reject_used_but_not_detected
++#define yymore() yymore_used_but_not_detected
++#define YY_MORE_ADJ 0
++#define YY_RESTORE_YY_MORE_OFFSET
++char *yytext;
++#line 1 "dtc-lexer.l"
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++
++
++
++#line 33 "dtc-lexer.l"
++#include "dtc.h"
++#include "srcpos.h"
++#include "dtc-parser.tab.h"
++
++
++/*#define LEXDEBUG 1*/
++
++#ifdef LEXDEBUG
++#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
++#else
++#define DPRINT(fmt, ...) do { } while (0)
++#endif
++
++static int dts_version; /* = 0 */
++
++#define BEGIN_DEFAULT() if (dts_version == 0) { \
++ DPRINT("<INITIAL>\n"); \
++ BEGIN(INITIAL); \
++ } else { \
++ DPRINT("<V1>\n"); \
++ BEGIN(V1); \
++ }
++#line 627 "dtc-lexer.lex.c"
++
++#define INITIAL 0
++#define INCLUDE 1
++#define BYTESTRING 2
++#define PROPNODENAME 3
++#define V1 4
++
++#ifndef YY_NO_UNISTD_H
++/* Special case for "unistd.h", since it is non-ANSI. We include it way
++ * down here because we want the user's section 1 to have been scanned first.
++ * The user has a chance to override it with an option.
++ */
++#include <unistd.h>
++#endif
++
++#ifndef YY_EXTRA_TYPE
++#define YY_EXTRA_TYPE void *
++#endif
++
++static int yy_init_globals (void );
++
++/* Macros after this point can all be overridden by user definitions in
++ * section 1.
++ */
++
++#ifndef YY_SKIP_YYWRAP
++#ifdef __cplusplus
++extern "C" int yywrap (void );
++#else
++extern int yywrap (void );
++#endif
++#endif
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char *,yyconst char *,int );
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * );
++#endif
++
++#ifndef YY_NO_INPUT
++
++#ifdef __cplusplus
++static int yyinput (void );
++#else
++static int input (void );
++#endif
++
++#endif
++
++/* Amount of stuff to slurp up with each read. */
++#ifndef YY_READ_BUF_SIZE
++#define YY_READ_BUF_SIZE 8192
++#endif
++
++/* Copy whatever the last rule matched to the standard output. */
++#ifndef ECHO
++/* This used to be an fputs(), but since the string might contain NUL's,
++ * we now use fwrite().
++ */
++#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
++#endif
++
++/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
++ * is returned in "result".
++ */
++#ifndef YY_INPUT
++#define YY_INPUT(buf,result,max_size) \
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
++ { \
++ int c = '*'; \
++ size_t n; \
++ for ( n = 0; n < max_size && \
++ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
++ buf[n] = (char) c; \
++ if ( c == '\n' ) \
++ buf[n++] = (char) c; \
++ if ( c == EOF && ferror( yyin ) ) \
++ YY_FATAL_ERROR( "input in flex scanner failed" ); \
++ result = n; \
++ } \
++ else \
++ { \
++ errno=0; \
++ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
++ { \
++ if( errno != EINTR) \
++ { \
++ YY_FATAL_ERROR( "input in flex scanner failed" ); \
++ break; \
++ } \
++ errno=0; \
++ clearerr(yyin); \
++ } \
++ }\
++\
++
++#endif
++
++/* No semi-colon after return; correct usage is to write "yyterminate();" -
++ * we don't want an extra ';' after the "return" because that will cause
++ * some compilers to complain about unreachable statements.
++ */
++#ifndef yyterminate
++#define yyterminate() return YY_NULL
++#endif
++
++/* Number of entries by which start-condition stack grows. */
++#ifndef YY_START_STACK_INCR
++#define YY_START_STACK_INCR 25
++#endif
++
++/* Report a fatal error. */
++#ifndef YY_FATAL_ERROR
++#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
++#endif
++
++/* end tables serialization structures and prototypes */
++
++/* Default declaration of generated scanner - a define so the user can
++ * easily add parameters.
++ */
++#ifndef YY_DECL
++#define YY_DECL_IS_OURS 1
++
++extern int yylex (void);
++
++#define YY_DECL int yylex (void)
++#endif /* !YY_DECL */
++
++/* Code executed at the beginning of each rule, after yytext and yyleng
++ * have been set up.
++ */
++#ifndef YY_USER_ACTION
++#define YY_USER_ACTION
++#endif
++
++/* Code executed at the end of each rule. */
++#ifndef YY_BREAK
++#define YY_BREAK break;
++#endif
++
++#define YY_RULE_SETUP \
++ YY_USER_ACTION
++
++/** The main scanner function which does all the work.
++ */
++YY_DECL
++{
++ register yy_state_type yy_current_state;
++ register char *yy_cp, *yy_bp;
++ register int yy_act;
++
++#line 57 "dtc-lexer.l"
++
++#line 784 "dtc-lexer.lex.c"
++
++ if ( !(yy_init) )
++ {
++ (yy_init) = 1;
++
++#ifdef YY_USER_INIT
++ YY_USER_INIT;
++#endif
++
++ if ( ! (yy_start) )
++ (yy_start) = 1; /* first start state */
++
++ if ( ! yyin )
++ yyin = stdin;
++
++ if ( ! yyout )
++ yyout = stdout;
++
++ if ( ! YY_CURRENT_BUFFER ) {
++ yyensure_buffer_stack ();
++ YY_CURRENT_BUFFER_LVALUE =
++ yy_create_buffer(yyin,YY_BUF_SIZE );
++ }
++
++ yy_load_buffer_state( );
++ }
++
++ while ( 1 ) /* loops until end-of-file is reached */
++ {
++ yy_cp = (yy_c_buf_p);
++
++ /* Support of yytext. */
++ *yy_cp = (yy_hold_char);
++
++ /* yy_bp points to the position in yy_ch_buf of the start of
++ * the current run.
++ */
++ yy_bp = yy_cp;
++
++ yy_current_state = (yy_start);
++yy_match:
++ do
++ {
++ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
++ if ( yy_accept[yy_current_state] )
++ {
++ (yy_last_accepting_state) = yy_current_state;
++ (yy_last_accepting_cpos) = yy_cp;
++ }
++ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++ {
++ yy_current_state = (int) yy_def[yy_current_state];
++ if ( yy_current_state >= 94 )
++ yy_c = yy_meta[(unsigned int) yy_c];
++ }
++ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++ ++yy_cp;
++ }
++ while ( yy_base[yy_current_state] != 288 );
++
++yy_find_action:
++ yy_act = yy_accept[yy_current_state];
++ if ( yy_act == 0 )
++ { /* have to back up */
++ yy_cp = (yy_last_accepting_cpos);
++ yy_current_state = (yy_last_accepting_state);
++ yy_act = yy_accept[yy_current_state];
++ }
++
++ YY_DO_BEFORE_ACTION;
++
++ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
++ {
++ int yyl;
++ for ( yyl = 0; yyl < yyleng; ++yyl )
++ if ( yytext[yyl] == '\n' )
++
++ yylineno++;
++;
++ }
++
++do_action: /* This label is used only to access EOF actions. */
++
++ switch ( yy_act )
++ { /* beginning of action switch */
++ case 0: /* must back up */
++ /* undo the effects of YY_DO_BEFORE_ACTION */
++ *yy_cp = (yy_hold_char);
++ yy_cp = (yy_last_accepting_cpos);
++ yy_current_state = (yy_last_accepting_state);
++ goto yy_find_action;
++
++case 1:
++YY_RULE_SETUP
++#line 58 "dtc-lexer.l"
++BEGIN(INCLUDE);
++ YY_BREAK
++case 2:
++YY_RULE_SETUP
++#line 60 "dtc-lexer.l"
++{
++ yytext[strlen(yytext) - 1] = 0;
++ if (!push_input_file(yytext + 1)) {
++ /* Some unrecoverable error.*/
++ exit(1);
++ }
++ BEGIN_DEFAULT();
++ }
++ YY_BREAK
++case YY_STATE_EOF(INITIAL):
++case YY_STATE_EOF(INCLUDE):
++case YY_STATE_EOF(BYTESTRING):
++case YY_STATE_EOF(PROPNODENAME):
++case YY_STATE_EOF(V1):
++#line 70 "dtc-lexer.l"
++{
++ if (!pop_input_file()) {
++ yyterminate();
++ }
++ }
++ YY_BREAK
++case 3:
++/* rule 3 can match eol */
++YY_RULE_SETUP
++#line 76 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("String: %s\n", yytext);
++ yylval.data = data_copy_escape_string(yytext+1,
++ yyleng-2);
++ yylloc.first_line = yylineno;
++ return DT_STRING;
++ }
++ YY_BREAK
++case 4:
++YY_RULE_SETUP
++#line 86 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Keyword: /dts-v1/\n");
++ dts_version = 1;
++ BEGIN_DEFAULT();
++ return DT_V1;
++ }
++ YY_BREAK
++case 5:
++YY_RULE_SETUP
++#line 95 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Keyword: /memreserve/\n");
++ BEGIN_DEFAULT();
++ return DT_MEMRESERVE;
++ }
++ YY_BREAK
++case 6:
++YY_RULE_SETUP
++#line 103 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Label: %s\n", yytext);
++ yylval.labelref = strdup(yytext);
++ yylval.labelref[yyleng-1] = '\0';
++ return DT_LABEL;
++ }
++ YY_BREAK
++case 7:
++YY_RULE_SETUP
++#line 112 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ if (*yytext == 'b')
++ yylval.cbase = 2;
++ else if (*yytext == 'o')
++ yylval.cbase = 8;
++ else if (*yytext == 'd')
++ yylval.cbase = 10;
++ else
++ yylval.cbase = 16;
++ DPRINT("Base: %d\n", yylval.cbase);
++ return DT_BASE;
++ }
++ YY_BREAK
++case 8:
++YY_RULE_SETUP
++#line 127 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.literal = strdup(yytext);
++ DPRINT("Literal: '%s'\n", yylval.literal);
++ return DT_LEGACYLITERAL;
++ }
++ YY_BREAK
++case 9:
++YY_RULE_SETUP
++#line 135 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.literal = strdup(yytext);
++ DPRINT("Literal: '%s'\n", yylval.literal);
++ return DT_LITERAL;
++ }
++ YY_BREAK
++case 10:
++YY_RULE_SETUP
++#line 143 "dtc-lexer.l"
++{ /* label reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Ref: %s\n", yytext+1);
++ yylval.labelref = strdup(yytext+1);
++ return DT_REF;
++ }
++ YY_BREAK
++case 11:
++YY_RULE_SETUP
++#line 151 "dtc-lexer.l"
++{ /* new-style path reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yytext[yyleng-1] = '\0';
++ DPRINT("Ref: %s\n", yytext+2);
++ yylval.labelref = strdup(yytext+2);
++ return DT_REF;
++ }
++ YY_BREAK
++case 12:
++YY_RULE_SETUP
++#line 160 "dtc-lexer.l"
++{ /* old-style path reference */
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Ref: %s\n", yytext+1);
++ yylval.labelref = strdup(yytext+1);
++ return DT_REF;
++ }
++ YY_BREAK
++case 13:
++YY_RULE_SETUP
++#line 168 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ yylval.byte = strtol(yytext, NULL, 16);
++ DPRINT("Byte: %02x\n", (int)yylval.byte);
++ return DT_BYTE;
++ }
++ YY_BREAK
++case 14:
++YY_RULE_SETUP
++#line 176 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("/BYTESTRING\n");
++ BEGIN_DEFAULT();
++ return ']';
++ }
++ YY_BREAK
++case 15:
++YY_RULE_SETUP
++#line 184 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("PropNodeName: %s\n", yytext);
++ yylval.propnodename = strdup(yytext);
++ BEGIN_DEFAULT();
++ return DT_PROPNODENAME;
++ }
++ YY_BREAK
++case 16:
++/* rule 16 can match eol */
++YY_RULE_SETUP
++#line 194 "dtc-lexer.l"
++/* eat whitespace */
++ YY_BREAK
++case 17:
++/* rule 17 can match eol */
++YY_RULE_SETUP
++#line 196 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Comment: %s\n", yytext);
++ /* eat comments */
++ }
++ YY_BREAK
++case 18:
++/* rule 18 can match eol */
++YY_RULE_SETUP
++#line 203 "dtc-lexer.l"
++/* eat line comments */
++ YY_BREAK
++case 19:
++YY_RULE_SETUP
++#line 205 "dtc-lexer.l"
++{
++ yylloc.filenum = srcpos_filenum;
++ yylloc.first_line = yylineno;
++ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
++ (unsigned)yytext[0]);
++ if (yytext[0] == '[') {
++ DPRINT("<BYTESTRING>\n");
++ BEGIN(BYTESTRING);
++ }
++ if ((yytext[0] == '{')
++ || (yytext[0] == ';')) {
++ DPRINT("<PROPNODENAME>\n");
++ BEGIN(PROPNODENAME);
++ }
++ return yytext[0];
++ }
++ YY_BREAK
++case 20:
++YY_RULE_SETUP
++#line 222 "dtc-lexer.l"
++ECHO;
++ YY_BREAK
++#line 1111 "dtc-lexer.lex.c"
++
++ case YY_END_OF_BUFFER:
++ {
++ /* Amount of text matched not including the EOB char. */
++ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
++
++ /* Undo the effects of YY_DO_BEFORE_ACTION. */
++ *yy_cp = (yy_hold_char);
++ YY_RESTORE_YY_MORE_OFFSET
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
++ {
++ /* We're scanning a new file or input source. It's
++ * possible that this happened because the user
++ * just pointed yyin at a new source and called
++ * yylex(). If so, then we have to assure
++ * consistency between YY_CURRENT_BUFFER and our
++ * globals. Here is the right place to do so, because
++ * this is the first action (other than possibly a
++ * back-up) that will match for the new input source.
++ */
++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
++ }
++
++ /* Note that here we test for yy_c_buf_p "<=" to the position
++ * of the first EOB in the buffer, since yy_c_buf_p will
++ * already have been incremented past the NUL character
++ * (since all states make transitions on EOB to the
++ * end-of-buffer state). Contrast this with the test
++ * in input().
++ */
++ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++ { /* This was really a NUL. */
++ yy_state_type yy_next_state;
++
++ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
++
++ yy_current_state = yy_get_previous_state( );
++
++ /* Okay, we're now positioned to make the NUL
++ * transition. We couldn't have
++ * yy_get_previous_state() go ahead and do it
++ * for us because it doesn't know how to deal
++ * with the possibility of jamming (and we don't
++ * want to build jamming into it because then it
++ * will run more slowly).
++ */
++
++ yy_next_state = yy_try_NUL_trans( yy_current_state );
++
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++
++ if ( yy_next_state )
++ {
++ /* Consume the NUL. */
++ yy_cp = ++(yy_c_buf_p);
++ yy_current_state = yy_next_state;
++ goto yy_match;
++ }
++
++ else
++ {
++ yy_cp = (yy_c_buf_p);
++ goto yy_find_action;
++ }
++ }
++
++ else switch ( yy_get_next_buffer( ) )
++ {
++ case EOB_ACT_END_OF_FILE:
++ {
++ (yy_did_buffer_switch_on_eof) = 0;
++
++ if ( yywrap( ) )
++ {
++ /* Note: because we've taken care in
++ * yy_get_next_buffer() to have set up
++ * yytext, we can now set up
++ * yy_c_buf_p so that if some total
++ * hoser (like flex itself) wants to
++ * call the scanner after we return the
++ * YY_NULL, it'll still work - another
++ * YY_NULL will get returned.
++ */
++ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
++
++ yy_act = YY_STATE_EOF(YY_START);
++ goto do_action;
++ }
++
++ else
++ {
++ if ( ! (yy_did_buffer_switch_on_eof) )
++ YY_NEW_FILE;
++ }
++ break;
++ }
++
++ case EOB_ACT_CONTINUE_SCAN:
++ (yy_c_buf_p) =
++ (yytext_ptr) + yy_amount_of_matched_text;
++
++ yy_current_state = yy_get_previous_state( );
++
++ yy_cp = (yy_c_buf_p);
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++ goto yy_match;
++
++ case EOB_ACT_LAST_MATCH:
++ (yy_c_buf_p) =
++ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
++
++ yy_current_state = yy_get_previous_state( );
++
++ yy_cp = (yy_c_buf_p);
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++ goto yy_find_action;
++ }
++ break;
++ }
++
++ default:
++ YY_FATAL_ERROR(
++ "fatal flex scanner internal error--no action found" );
++ } /* end of action switch */
++ } /* end of scanning one token */
++} /* end of yylex */
++
++/* yy_get_next_buffer - try to read in a new buffer
++ *
++ * Returns a code representing an action:
++ * EOB_ACT_LAST_MATCH -
++ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
++ * EOB_ACT_END_OF_FILE - end of file
++ */
++static int yy_get_next_buffer (void)
++{
++ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
++ register char *source = (yytext_ptr);
++ register int number_to_move, i;
++ int ret_val;
++
++ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
++ YY_FATAL_ERROR(
++ "fatal flex scanner internal error--end of buffer missed" );
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
++ { /* Don't try to fill the buffer, so this is an EOF. */
++ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
++ {
++ /* We matched a single character, the EOB, so
++ * treat this as a final EOF.
++ */
++ return EOB_ACT_END_OF_FILE;
++ }
++
++ else
++ {
++ /* We matched some text prior to the EOB, first
++ * process it.
++ */
++ return EOB_ACT_LAST_MATCH;
++ }
++ }
++
++ /* Try to read more data. */
++
++ /* First move last chars to start of buffer. */
++ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
++
++ for ( i = 0; i < number_to_move; ++i )
++ *(dest++) = *(source++);
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
++ /* don't do the read, it's not guaranteed to return an EOF,
++ * just force an EOF
++ */
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
++
++ else
++ {
++ int num_to_read =
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
++
++ while ( num_to_read <= 0 )
++ { /* Not enough room in the buffer - grow it. */
++
++ /* just a shorter name for the current buffer */
++ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
++
++ int yy_c_buf_p_offset =
++ (int) ((yy_c_buf_p) - b->yy_ch_buf);
++
++ if ( b->yy_is_our_buffer )
++ {
++ int new_size = b->yy_buf_size * 2;
++
++ if ( new_size <= 0 )
++ b->yy_buf_size += b->yy_buf_size / 8;
++ else
++ b->yy_buf_size *= 2;
++
++ b->yy_ch_buf = (char *)
++ /* Include room in for 2 EOB chars. */
++ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
++ }
++ else
++ /* Can't grow it, we don't own it. */
++ b->yy_ch_buf = 0;
++
++ if ( ! b->yy_ch_buf )
++ YY_FATAL_ERROR(
++ "fatal error - scanner input buffer overflow" );
++
++ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
++
++ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
++ number_to_move - 1;
++
++ }
++
++ if ( num_to_read > YY_READ_BUF_SIZE )
++ num_to_read = YY_READ_BUF_SIZE;
++
++ /* Read in more data. */
++ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
++ (yy_n_chars), (size_t) num_to_read );
++
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ if ( (yy_n_chars) == 0 )
++ {
++ if ( number_to_move == YY_MORE_ADJ )
++ {
++ ret_val = EOB_ACT_END_OF_FILE;
++ yyrestart(yyin );
++ }
++
++ else
++ {
++ ret_val = EOB_ACT_LAST_MATCH;
++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
++ YY_BUFFER_EOF_PENDING;
++ }
++ }
++
++ else
++ ret_val = EOB_ACT_CONTINUE_SCAN;
++
++ (yy_n_chars) += number_to_move;
++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
++
++ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
++
++ return ret_val;
++}
++
++/* yy_get_previous_state - get the state just before the EOB char was reached */
++
++ static yy_state_type yy_get_previous_state (void)
++{
++ register yy_state_type yy_current_state;
++ register char *yy_cp;
++
++ yy_current_state = (yy_start);
++
++ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
++ {
++ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
++ if ( yy_accept[yy_current_state] )
++ {
++ (yy_last_accepting_state) = yy_current_state;
++ (yy_last_accepting_cpos) = yy_cp;
++ }
++ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++ {
++ yy_current_state = (int) yy_def[yy_current_state];
++ if ( yy_current_state >= 94 )
++ yy_c = yy_meta[(unsigned int) yy_c];
++ }
++ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++ }
++
++ return yy_current_state;
++}
++
++/* yy_try_NUL_trans - try to make a transition on the NUL character
++ *
++ * synopsis
++ * next_state = yy_try_NUL_trans( current_state );
++ */
++ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
++{
++ register int yy_is_jam;
++ register char *yy_cp = (yy_c_buf_p);
++
++ register YY_CHAR yy_c = 1;
++ if ( yy_accept[yy_current_state] )
++ {
++ (yy_last_accepting_state) = yy_current_state;
++ (yy_last_accepting_cpos) = yy_cp;
++ }
++ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
++ {
++ yy_current_state = (int) yy_def[yy_current_state];
++ if ( yy_current_state >= 94 )
++ yy_c = yy_meta[(unsigned int) yy_c];
++ }
++ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++ yy_is_jam = (yy_current_state == 93);
++
++ return yy_is_jam ? 0 : yy_current_state;
++}
++
++#ifndef YY_NO_INPUT
++#ifdef __cplusplus
++ static int yyinput (void)
++#else
++ static int input (void)
++#endif
++
++{
++ int c;
++
++ *(yy_c_buf_p) = (yy_hold_char);
++
++ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
++ {
++ /* yy_c_buf_p now points to the character we want to return.
++ * If this occurs *before* the EOB characters, then it's a
++ * valid NUL; if not, then we've hit the end of the buffer.
++ */
++ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++ /* This was really a NUL. */
++ *(yy_c_buf_p) = '\0';
++
++ else
++ { /* need more input */
++ int offset = (yy_c_buf_p) - (yytext_ptr);
++ ++(yy_c_buf_p);
++
++ switch ( yy_get_next_buffer( ) )
++ {
++ case EOB_ACT_LAST_MATCH:
++ /* This happens because yy_g_n_b()
++ * sees that we've accumulated a
++ * token and flags that we need to
++ * try matching the token before
++ * proceeding. But for input(),
++ * there's no matching to consider.
++ * So convert the EOB_ACT_LAST_MATCH
++ * to EOB_ACT_END_OF_FILE.
++ */
++
++ /* Reset buffer status. */
++ yyrestart(yyin );
++
++ /*FALLTHROUGH*/
++
++ case EOB_ACT_END_OF_FILE:
++ {
++ if ( yywrap( ) )
++ return EOF;
++
++ if ( ! (yy_did_buffer_switch_on_eof) )
++ YY_NEW_FILE;
++#ifdef __cplusplus
++ return yyinput();
++#else
++ return input();
++#endif
++ }
++
++ case EOB_ACT_CONTINUE_SCAN:
++ (yy_c_buf_p) = (yytext_ptr) + offset;
++ break;
++ }
++ }
++ }
++
++ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
++ *(yy_c_buf_p) = '\0'; /* preserve yytext */
++ (yy_hold_char) = *++(yy_c_buf_p);
++
++ if ( c == '\n' )
++
++ yylineno++;
++;
++
++ return c;
++}
++#endif /* ifndef YY_NO_INPUT */
++
++/** Immediately switch to a different input stream.
++ * @param input_file A readable stream.
++ *
++ * @note This function does not reset the start condition to @c INITIAL .
++ */
++ void yyrestart (FILE * input_file )
++{
++
++ if ( ! YY_CURRENT_BUFFER ){
++ yyensure_buffer_stack ();
++ YY_CURRENT_BUFFER_LVALUE =
++ yy_create_buffer(yyin,YY_BUF_SIZE );
++ }
++
++ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
++ yy_load_buffer_state( );
++}
++
++/** Switch to a different input buffer.
++ * @param new_buffer The new input buffer.
++ *
++ */
++ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
++{
++
++ /* TODO. We should be able to replace this entire function body
++ * with
++ * yypop_buffer_state();
++ * yypush_buffer_state(new_buffer);
++ */
++ yyensure_buffer_stack ();
++ if ( YY_CURRENT_BUFFER == new_buffer )
++ return;
++
++ if ( YY_CURRENT_BUFFER )
++ {
++ /* Flush out information for old buffer. */
++ *(yy_c_buf_p) = (yy_hold_char);
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ YY_CURRENT_BUFFER_LVALUE = new_buffer;
++ yy_load_buffer_state( );
++
++ /* We don't actually know whether we did this switch during
++ * EOF (yywrap()) processing, but the only time this flag
++ * is looked at is after yywrap() is called, so it's safe
++ * to go ahead and always set it.
++ */
++ (yy_did_buffer_switch_on_eof) = 1;
++}
++
++static void yy_load_buffer_state (void)
++{
++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
++ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
++ (yy_hold_char) = *(yy_c_buf_p);
++}
++
++/** Allocate and initialize an input buffer state.
++ * @param file A readable stream.
++ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
++ *
++ * @return the allocated buffer state.
++ */
++ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
++{
++ YY_BUFFER_STATE b;
++
++ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
++ if ( ! b )
++ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
++
++ b->yy_buf_size = size;
++
++ /* yy_ch_buf has to be 2 characters longer than the size given because
++ * we need to put in 2 end-of-buffer characters.
++ */
++ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
++ if ( ! b->yy_ch_buf )
++ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
++
++ b->yy_is_our_buffer = 1;
++
++ yy_init_buffer(b,file );
++
++ return b;
++}
++
++/** Destroy the buffer.
++ * @param b a buffer created with yy_create_buffer()
++ *
++ */
++ void yy_delete_buffer (YY_BUFFER_STATE b )
++{
++
++ if ( ! b )
++ return;
++
++ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
++ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
++
++ if ( b->yy_is_our_buffer )
++ yyfree((void *) b->yy_ch_buf );
++
++ yyfree((void *) b );
++}
++
++#ifndef __cplusplus
++extern int isatty (int );
++#endif /* __cplusplus */
++
++/* Initializes or reinitializes a buffer.
++ * This function is sometimes called more than once on the same buffer,
++ * such as during a yyrestart() or at EOF.
++ */
++ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
++
++{
++ int oerrno = errno;
++
++ yy_flush_buffer(b );
++
++ b->yy_input_file = file;
++ b->yy_fill_buffer = 1;
++
++ /* If b is the current buffer, then yy_init_buffer was _probably_
++ * called from yyrestart() or through yy_get_next_buffer.
++ * In that case, we don't want to reset the lineno or column.
++ */
++ if (b != YY_CURRENT_BUFFER){
++ b->yy_bs_lineno = 1;
++ b->yy_bs_column = 0;
++ }
++
++ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
++
++ errno = oerrno;
++}
++
++/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
++ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
++ *
++ */
++ void yy_flush_buffer (YY_BUFFER_STATE b )
++{
++ if ( ! b )
++ return;
++
++ b->yy_n_chars = 0;
++
++ /* We always need two end-of-buffer characters. The first causes
++ * a transition to the end-of-buffer state. The second causes
++ * a jam in that state.
++ */
++ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
++ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
++
++ b->yy_buf_pos = &b->yy_ch_buf[0];
++
++ b->yy_at_bol = 1;
++ b->yy_buffer_status = YY_BUFFER_NEW;
++
++ if ( b == YY_CURRENT_BUFFER )
++ yy_load_buffer_state( );
++}
++
++/** Pushes the new state onto the stack. The new state becomes
++ * the current state. This function will allocate the stack
++ * if necessary.
++ * @param new_buffer The new state.
++ *
++ */
++void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
++{
++ if (new_buffer == NULL)
++ return;
++
++ yyensure_buffer_stack();
++
++ /* This block is copied from yy_switch_to_buffer. */
++ if ( YY_CURRENT_BUFFER )
++ {
++ /* Flush out information for old buffer. */
++ *(yy_c_buf_p) = (yy_hold_char);
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ /* Only push if top exists. Otherwise, replace top. */
++ if (YY_CURRENT_BUFFER)
++ (yy_buffer_stack_top)++;
++ YY_CURRENT_BUFFER_LVALUE = new_buffer;
++
++ /* copied from yy_switch_to_buffer. */
++ yy_load_buffer_state( );
++ (yy_did_buffer_switch_on_eof) = 1;
++}
++
++/** Removes and deletes the top of the stack, if present.
++ * The next element becomes the new top.
++ *
++ */
++void yypop_buffer_state (void)
++{
++ if (!YY_CURRENT_BUFFER)
++ return;
++
++ yy_delete_buffer(YY_CURRENT_BUFFER );
++ YY_CURRENT_BUFFER_LVALUE = NULL;
++ if ((yy_buffer_stack_top) > 0)
++ --(yy_buffer_stack_top);
++
++ if (YY_CURRENT_BUFFER) {
++ yy_load_buffer_state( );
++ (yy_did_buffer_switch_on_eof) = 1;
++ }
++}
++
++/* Allocates the stack if it does not exist.
++ * Guarantees space for at least one push.
++ */
++static void yyensure_buffer_stack (void)
++{
++ int num_to_alloc;
++
++ if (!(yy_buffer_stack)) {
++
++ /* First allocation is just for 2 elements, since we don't know if this
++ * scanner will even need a stack. We use 2 instead of 1 to avoid an
++ * immediate realloc on the next call.
++ */
++ num_to_alloc = 1;
++ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
++ (num_to_alloc * sizeof(struct yy_buffer_state*)
++ );
++
++ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
++
++ (yy_buffer_stack_max) = num_to_alloc;
++ (yy_buffer_stack_top) = 0;
++ return;
++ }
++
++ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
++
++ /* Increase the buffer to prepare for a possible push. */
++ int grow_size = 8 /* arbitrary grow size */;
++
++ num_to_alloc = (yy_buffer_stack_max) + grow_size;
++ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
++ ((yy_buffer_stack),
++ num_to_alloc * sizeof(struct yy_buffer_state*)
++ );
++
++ /* zero only the new slots.*/
++ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
++ (yy_buffer_stack_max) = num_to_alloc;
++ }
++}
++
++/** Setup the input buffer state to scan directly from a user-specified character buffer.
++ * @param base the character buffer
++ * @param size the size in bytes of the character buffer
++ *
++ * @return the newly allocated buffer state object.
++ */
++YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
++{
++ YY_BUFFER_STATE b;
++
++ if ( size < 2 ||
++ base[size-2] != YY_END_OF_BUFFER_CHAR ||
++ base[size-1] != YY_END_OF_BUFFER_CHAR )
++ /* They forgot to leave room for the EOB's. */
++ return 0;
++
++ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
++ if ( ! b )
++ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
++
++ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
++ b->yy_buf_pos = b->yy_ch_buf = base;
++ b->yy_is_our_buffer = 0;
++ b->yy_input_file = 0;
++ b->yy_n_chars = b->yy_buf_size;
++ b->yy_is_interactive = 0;
++ b->yy_at_bol = 1;
++ b->yy_fill_buffer = 0;
++ b->yy_buffer_status = YY_BUFFER_NEW;
++
++ yy_switch_to_buffer(b );
++
++ return b;
++}
++
++/** Setup the input buffer state to scan a string. The next call to yylex() will
++ * scan from a @e copy of @a str.
++ * @param yystr a NUL-terminated string to scan
++ *
++ * @return the newly allocated buffer state object.
++ * @note If you want to scan bytes that may contain NUL values, then use
++ * yy_scan_bytes() instead.
++ */
++YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
++{
++
++ return yy_scan_bytes(yystr,strlen(yystr) );
++}
++
++/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
++ * scan from a @e copy of @a bytes.
++ * @param bytes the byte buffer to scan
++ * @param len the number of bytes in the buffer pointed to by @a bytes.
++ *
++ * @return the newly allocated buffer state object.
++ */
++YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
++{
++ YY_BUFFER_STATE b;
++ char *buf;
++ yy_size_t n;
++ int i;
++
++ /* Get memory for full buffer, including space for trailing EOB's. */
++ n = _yybytes_len + 2;
++ buf = (char *) yyalloc(n );
++ if ( ! buf )
++ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
++
++ for ( i = 0; i < _yybytes_len; ++i )
++ buf[i] = yybytes[i];
++
++ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
++
++ b = yy_scan_buffer(buf,n );
++ if ( ! b )
++ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
++
++ /* It's okay to grow etc. this buffer, and we should throw it
++ * away when we're done.
++ */
++ b->yy_is_our_buffer = 1;
++
++ return b;
++}
++
++#ifndef YY_EXIT_FAILURE
++#define YY_EXIT_FAILURE 2
++#endif
++
++static void yy_fatal_error (yyconst char* msg )
++{
++ (void) fprintf( stderr, "%s\n", msg );
++ exit( YY_EXIT_FAILURE );
++}
++
++/* Redefine yyless() so it works in section 3 code. */
++
++#undef yyless
++#define yyless(n) \
++ do \
++ { \
++ /* Undo effects of setting up yytext. */ \
++ int yyless_macro_arg = (n); \
++ YY_LESS_LINENO(yyless_macro_arg);\
++ yytext[yyleng] = (yy_hold_char); \
++ (yy_c_buf_p) = yytext + yyless_macro_arg; \
++ (yy_hold_char) = *(yy_c_buf_p); \
++ *(yy_c_buf_p) = '\0'; \
++ yyleng = yyless_macro_arg; \
++ } \
++ while ( 0 )
++
++/* Accessor methods (get/set functions) to struct members. */
++
++/** Get the current line number.
++ *
++ */
++int yyget_lineno (void)
++{
++
++ return yylineno;
++}
++
++/** Get the input stream.
++ *
++ */
++FILE *yyget_in (void)
++{
++ return yyin;
++}
++
++/** Get the output stream.
++ *
++ */
++FILE *yyget_out (void)
++{
++ return yyout;
++}
++
++/** Get the length of the current token.
++ *
++ */
++int yyget_leng (void)
++{
++ return yyleng;
++}
++
++/** Get the current token.
++ *
++ */
++
++char *yyget_text (void)
++{
++ return yytext;
++}
++
++/** Set the current line number.
++ * @param line_number
++ *
++ */
++void yyset_lineno (int line_number )
++{
++
++ yylineno = line_number;
++}
++
++/** Set the input stream. This does not discard the current
++ * input buffer.
++ * @param in_str A readable stream.
++ *
++ * @see yy_switch_to_buffer
++ */
++void yyset_in (FILE * in_str )
++{
++ yyin = in_str ;
++}
++
++void yyset_out (FILE * out_str )
++{
++ yyout = out_str ;
++}
++
++int yyget_debug (void)
++{
++ return yy_flex_debug;
++}
++
++void yyset_debug (int bdebug )
++{
++ yy_flex_debug = bdebug ;
++}
++
++static int yy_init_globals (void)
++{
++ /* Initialization is the same as for the non-reentrant scanner.
++ * This function is called from yylex_destroy(), so don't allocate here.
++ */
++
++ /* We do not touch yylineno unless the option is enabled. */
++ yylineno = 1;
++
++ (yy_buffer_stack) = 0;
++ (yy_buffer_stack_top) = 0;
++ (yy_buffer_stack_max) = 0;
++ (yy_c_buf_p) = (char *) 0;
++ (yy_init) = 0;
++ (yy_start) = 0;
++
++/* Defined in main.c */
++#ifdef YY_STDINIT
++ yyin = stdin;
++ yyout = stdout;
++#else
++ yyin = (FILE *) 0;
++ yyout = (FILE *) 0;
++#endif
++
++ /* For future reference: Set errno on error, since we are called by
++ * yylex_init()
++ */
++ return 0;
++}
++
++/* yylex_destroy is for both reentrant and non-reentrant scanners. */
++int yylex_destroy (void)
++{
++
++ /* Pop the buffer stack, destroying each element. */
++ while(YY_CURRENT_BUFFER){
++ yy_delete_buffer(YY_CURRENT_BUFFER );
++ YY_CURRENT_BUFFER_LVALUE = NULL;
++ yypop_buffer_state();
++ }
++
++ /* Destroy the stack itself. */
++ yyfree((yy_buffer_stack) );
++ (yy_buffer_stack) = NULL;
++
++ /* Reset the globals. This is important in a non-reentrant scanner so the next time
++ * yylex() is called, initialization will occur. */
++ yy_init_globals( );
++
++ return 0;
++}
++
++/*
++ * Internal utility routines.
++ */
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
++{
++ register int i;
++ for ( i = 0; i < n; ++i )
++ s1[i] = s2[i];
++}
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * s )
++{
++ register int n;
++ for ( n = 0; s[n]; ++n )
++ ;
++
++ return n;
++}
++#endif
++
++void *yyalloc (yy_size_t size )
++{
++ return (void *) malloc( size );
++}
++
++void *yyrealloc (void * ptr, yy_size_t size )
++{
++ /* The cast to (char *) in the following accommodates both
++ * implementations that use char* generic pointers, and those
++ * that use void* generic pointers. It works with the latter
++ * because both ANSI C and C++ allow castless assignment from
++ * any pointer type to void*, and deal with argument conversions
++ * as though doing an assignment.
++ */
++ return (void *) realloc( (char *) ptr, size );
++}
++
++void yyfree (void * ptr )
++{
++ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
++}
++
++#define YYTABLES_NAME "yytables"
++
++#line 222 "dtc-lexer.l"
++
++
++
++
++/*
++ * Stack of nested include file contexts.
++ */
++
++struct incl_file {
++ int filenum;
++ FILE *file;
++ YY_BUFFER_STATE yy_prev_buf;
++ int yy_prev_lineno;
++ struct incl_file *prev;
++};
++
++struct incl_file *incl_file_stack;
++
++
++/*
++ * Detect infinite include recursion.
++ */
++#define MAX_INCLUDE_DEPTH (100)
++
++static int incl_depth = 0;
++
++
++int push_input_file(const char *filename)
++{
++ FILE *f;
++ struct incl_file *incl_file;
++
++ if (!filename) {
++ yyerror("No include file name given.");
++ return 0;
++ }
++
++ if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
++ yyerror("Includes nested too deeply");
++ return 0;
++ }
++
++ f = dtc_open_file(filename);
++
++ incl_file = malloc(sizeof(struct incl_file));
++ if (!incl_file) {
++ yyerror("Can not allocate include file space.");
++ return 0;
++ }
++
++ /*
++ * Save current context.
++ */
++ incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
++ incl_file->yy_prev_lineno = yylineno;
++ incl_file->filenum = srcpos_filenum;
++ incl_file->file = yyin;
++ incl_file->prev = incl_file_stack;
++
++ incl_file_stack = incl_file;
++
++ /*
++ * Establish new context.
++ */
++ srcpos_filenum = lookup_file_name(filename, 0);
++ yylineno = 1;
++ yyin = f;
++ yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
++
++ return 1;
++}
++
++
++int pop_input_file(void)
++{
++ struct incl_file *incl_file;
++
++ if (incl_file_stack == 0)
++ return 0;
++
++ fclose(yyin);
++
++ /*
++ * Pop.
++ */
++ --incl_depth;
++ incl_file = incl_file_stack;
++ incl_file_stack = incl_file->prev;
++
++ /*
++ * Recover old context.
++ */
++ yy_delete_buffer(YY_CURRENT_BUFFER);
++ yy_switch_to_buffer(incl_file->yy_prev_buf);
++ yylineno = incl_file->yy_prev_lineno;
++ srcpos_filenum = incl_file->filenum;
++ yyin = incl_file->file;
++
++ /*
++ * Free old state.
++ */
++ free(incl_file);
++
++ if (YY_CURRENT_BUFFER == 0)
++ return 0;
++
++ return 1;
++}
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,1983 @@
++/* A Bison parser, made by GNU Bison 2.3. */
++
++/* Skeleton implementation for Bison's Yacc-like parsers in C
++
++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
++ Free Software Foundation, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ Boston, MA 02110-1301, USA. */
++
++/* As a special exception, you may create a larger work that contains
++ part or all of the Bison parser skeleton and distribute that work
++ under terms of your choice, so long as that work isn't itself a
++ parser generator using the skeleton or a modified version thereof
++ as a parser skeleton. Alternatively, if you modify or redistribute
++ the parser skeleton itself, you may (at your option) remove this
++ special exception, which will cause the skeleton and the resulting
++ Bison output files to be licensed under the GNU General Public
++ License without this special exception.
++
++ This special exception was added by the Free Software Foundation in
++ version 2.2 of Bison. */
++
++/* C LALR(1) parser skeleton written by Richard Stallman, by
++ simplifying the original so-called "semantic" parser. */
++
++/* All symbols defined below should begin with yy or YY, to avoid
++ infringing on user name space. This should be done even for local
++ variables, as they might otherwise be expanded by user macros.
++ There are some unavoidable exceptions within include files to
++ define necessary library symbols; they are noted "INFRINGES ON
++ USER NAME SPACE" below. */
++
++/* Identify Bison output. */
++#define YYBISON 1
++
++/* Bison version. */
++#define YYBISON_VERSION "2.3"
++
++/* Skeleton name. */
++#define YYSKELETON_NAME "yacc.c"
++
++/* Pure parsers. */
++#define YYPURE 0
++
++/* Using locations. */
++#define YYLSP_NEEDED 1
++
++
++
++/* Tokens. */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++ /* Put the tokens into the symbol table, so that GDB and other debuggers
++ know about them. */
++ enum yytokentype {
++ DT_V1 = 258,
++ DT_MEMRESERVE = 259,
++ DT_PROPNODENAME = 260,
++ DT_LITERAL = 261,
++ DT_LEGACYLITERAL = 262,
++ DT_BASE = 263,
++ DT_BYTE = 264,
++ DT_STRING = 265,
++ DT_LABEL = 266,
++ DT_REF = 267
++ };
++#endif
++/* Tokens. */
++#define DT_V1 258
++#define DT_MEMRESERVE 259
++#define DT_PROPNODENAME 260
++#define DT_LITERAL 261
++#define DT_LEGACYLITERAL 262
++#define DT_BASE 263
++#define DT_BYTE 264
++#define DT_STRING 265
++#define DT_LABEL 266
++#define DT_REF 267
++
++
++
++
++/* Copy the first part of user declarations. */
++#line 23 "dtc-parser.y"
++
++#include "dtc.h"
++#include "srcpos.h"
++
++int yylex(void);
++unsigned long long eval_literal(const char *s, int base, int bits);
++
++extern struct boot_info *the_boot_info;
++
++
++
++/* Enabling traces. */
++#ifndef YYDEBUG
++# define YYDEBUG 0
++#endif
++
++/* Enabling verbose error messages. */
++#ifdef YYERROR_VERBOSE
++# undef YYERROR_VERBOSE
++# define YYERROR_VERBOSE 1
++#else
++# define YYERROR_VERBOSE 0
++#endif
++
++/* Enabling the token table. */
++#ifndef YYTOKEN_TABLE
++# define YYTOKEN_TABLE 0
++#endif
++
++#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++typedef union YYSTYPE
++#line 34 "dtc-parser.y"
++{
++ char *propnodename;
++ char *literal;
++ char *labelref;
++ unsigned int cbase;
++ u8 byte;
++ struct data data;
++
++ u64 addr;
++ cell_t cell;
++ struct property *prop;
++ struct property *proplist;
++ struct node *node;
++ struct node *nodelist;
++ struct reserve_info *re;
++}
++/* Line 187 of yacc.c. */
++#line 148 "dtc-parser.tab.c"
++ YYSTYPE;
++# define yystype YYSTYPE /* obsolescent; will be withdrawn */
++# define YYSTYPE_IS_DECLARED 1
++# define YYSTYPE_IS_TRIVIAL 1
++#endif
++
++#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
++typedef struct YYLTYPE
++{
++ int first_line;
++ int first_column;
++ int last_line;
++ int last_column;
++} YYLTYPE;
++# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
++# define YYLTYPE_IS_DECLARED 1
++# define YYLTYPE_IS_TRIVIAL 1
++#endif
++
++
++/* Copy the second part of user declarations. */
++
++
++/* Line 216 of yacc.c. */
++#line 173 "dtc-parser.tab.c"
++
++#ifdef short
++# undef short
++#endif
++
++#ifdef YYTYPE_UINT8
++typedef YYTYPE_UINT8 yytype_uint8;
++#else
++typedef unsigned char yytype_uint8;
++#endif
++
++#ifdef YYTYPE_INT8
++typedef YYTYPE_INT8 yytype_int8;
++#elif (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++typedef signed char yytype_int8;
++#else
++typedef short int yytype_int8;
++#endif
++
++#ifdef YYTYPE_UINT16
++typedef YYTYPE_UINT16 yytype_uint16;
++#else
++typedef unsigned short int yytype_uint16;
++#endif
++
++#ifdef YYTYPE_INT16
++typedef YYTYPE_INT16 yytype_int16;
++#else
++typedef short int yytype_int16;
++#endif
++
++#ifndef YYSIZE_T
++# ifdef __SIZE_TYPE__
++# define YYSIZE_T __SIZE_TYPE__
++# elif defined size_t
++# define YYSIZE_T size_t
++# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
++# define YYSIZE_T size_t
++# else
++# define YYSIZE_T unsigned int
++# endif
++#endif
++
++#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
++
++#ifndef YY_
++# if YYENABLE_NLS
++# if ENABLE_NLS
++# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
++# define YY_(msgid) dgettext ("bison-runtime", msgid)
++# endif
++# endif
++# ifndef YY_
++# define YY_(msgid) msgid
++# endif
++#endif
++
++/* Suppress unused-variable warnings by "using" E. */
++#if ! defined lint || defined __GNUC__
++# define YYUSE(e) ((void) (e))
++#else
++# define YYUSE(e) /* empty */
++#endif
++
++/* Identity function, used to suppress warnings about constant conditions. */
++#ifndef lint
++# define YYID(n) (n)
++#else
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static int
++YYID (int i)
++#else
++static int
++YYID (i)
++ int i;
++#endif
++{
++ return i;
++}
++#endif
++
++#if ! defined yyoverflow || YYERROR_VERBOSE
++
++/* The parser invokes alloca or malloc; define the necessary symbols. */
++
++# ifdef YYSTACK_USE_ALLOCA
++# if YYSTACK_USE_ALLOCA
++# ifdef __GNUC__
++# define YYSTACK_ALLOC __builtin_alloca
++# elif defined __BUILTIN_VA_ARG_INCR
++# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
++# elif defined _AIX
++# define YYSTACK_ALLOC __alloca
++# elif defined _MSC_VER
++# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
++# define alloca _alloca
++# else
++# define YYSTACK_ALLOC alloca
++# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++# ifndef _STDLIB_H
++# define _STDLIB_H 1
++# endif
++# endif
++# endif
++# endif
++# endif
++
++# ifdef YYSTACK_ALLOC
++ /* Pacify GCC's `empty if-body' warning. */
++# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
++# ifndef YYSTACK_ALLOC_MAXIMUM
++ /* The OS might guarantee only one guard page at the bottom of the stack,
++ and a page size can be as small as 4096 bytes. So we cannot safely
++ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
++ to allow for a few compiler-allocated temporary stack slots. */
++# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
++# endif
++# else
++# define YYSTACK_ALLOC YYMALLOC
++# define YYSTACK_FREE YYFREE
++# ifndef YYSTACK_ALLOC_MAXIMUM
++# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
++# endif
++# if (defined __cplusplus && ! defined _STDLIB_H \
++ && ! ((defined YYMALLOC || defined malloc) \
++ && (defined YYFREE || defined free)))
++# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++# ifndef _STDLIB_H
++# define _STDLIB_H 1
++# endif
++# endif
++# ifndef YYMALLOC
++# define YYMALLOC malloc
++# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
++# endif
++# endif
++# ifndef YYFREE
++# define YYFREE free
++# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++void free (void *); /* INFRINGES ON USER NAME SPACE */
++# endif
++# endif
++# endif
++#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
++
++
++#if (! defined yyoverflow \
++ && (! defined __cplusplus \
++ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
++ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
++
++/* A type that is properly aligned for any stack member. */
++union yyalloc
++{
++ yytype_int16 yyss;
++ YYSTYPE yyvs;
++ YYLTYPE yyls;
++};
++
++/* The size of the maximum gap between one aligned stack and the next. */
++# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
++
++/* The size of an array large to enough to hold all stacks, each with
++ N elements. */
++# define YYSTACK_BYTES(N) \
++ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
++ + 2 * YYSTACK_GAP_MAXIMUM)
++
++/* Copy COUNT objects from FROM to TO. The source and destination do
++ not overlap. */
++# ifndef YYCOPY
++# if defined __GNUC__ && 1 < __GNUC__
++# define YYCOPY(To, From, Count) \
++ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
++# else
++# define YYCOPY(To, From, Count) \
++ do \
++ { \
++ YYSIZE_T yyi; \
++ for (yyi = 0; yyi < (Count); yyi++) \
++ (To)[yyi] = (From)[yyi]; \
++ } \
++ while (YYID (0))
++# endif
++# endif
++
++/* Relocate STACK from its old location to the new one. The
++ local variables YYSIZE and YYSTACKSIZE give the old and new number of
++ elements in the stack, and YYPTR gives the new location of the
++ stack. Advance YYPTR to a properly aligned location for the next
++ stack. */
++# define YYSTACK_RELOCATE(Stack) \
++ do \
++ { \
++ YYSIZE_T yynewbytes; \
++ YYCOPY (&yyptr->Stack, Stack, yysize); \
++ Stack = &yyptr->Stack; \
++ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
++ yyptr += yynewbytes / sizeof (*yyptr); \
++ } \
++ while (YYID (0))
++
++#endif
++
++/* YYFINAL -- State number of the termination state. */
++#define YYFINAL 9
++/* YYLAST -- Last index in YYTABLE. */
++#define YYLAST 60
++
++/* YYNTOKENS -- Number of terminals. */
++#define YYNTOKENS 24
++/* YYNNTS -- Number of nonterminals. */
++#define YYNNTS 20
++/* YYNRULES -- Number of rules. */
++#define YYNRULES 43
++/* YYNRULES -- Number of states. */
++#define YYNSTATES 67
++
++/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
++#define YYUNDEFTOK 2
++#define YYMAXUTOK 267
++
++#define YYTRANSLATE(YYX) \
++ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
++
++/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
++static const yytype_uint8 yytranslate[] =
++{
++ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 23, 14, 2, 15, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 13,
++ 19, 18, 20, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 21, 2, 22, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 16, 2, 17, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
++ 5, 6, 7, 8, 9, 10, 11, 12
++};
++
++#if YYDEBUG
++/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
++ YYRHS. */
++static const yytype_uint8 yyprhs[] =
++{
++ 0, 0, 3, 8, 11, 12, 15, 21, 22, 25,
++ 27, 34, 36, 38, 41, 47, 48, 51, 57, 61,
++ 64, 69, 74, 77, 80, 81, 84, 87, 88, 91,
++ 94, 97, 98, 100, 102, 105, 106, 109, 112, 113,
++ 116, 119, 123, 124
++};
++
++/* YYRHS -- A `-1'-separated list of the rules' RHS. */
++static const yytype_int8 yyrhs[] =
++{
++ 25, 0, -1, 3, 13, 26, 31, -1, 28, 31,
++ -1, -1, 27, 26, -1, 43, 4, 30, 30, 13,
++ -1, -1, 29, 28, -1, 27, -1, 43, 4, 30,
++ 14, 30, 13, -1, 6, -1, 7, -1, 15, 32,
++ -1, 16, 33, 41, 17, 13, -1, -1, 33, 34,
++ -1, 43, 5, 18, 35, 13, -1, 43, 5, 13,
++ -1, 36, 10, -1, 36, 19, 37, 20, -1, 36,
++ 21, 40, 22, -1, 36, 12, -1, 35, 11, -1,
++ -1, 35, 23, -1, 36, 11, -1, -1, 37, 39,
++ -1, 37, 12, -1, 37, 11, -1, -1, 8, -1,
++ 6, -1, 38, 7, -1, -1, 40, 9, -1, 40,
++ 11, -1, -1, 42, 41, -1, 42, 34, -1, 43,
++ 5, 32, -1, -1, 11, -1
++};
++
++/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
++static const yytype_uint16 yyrline[] =
++{
++ 0, 85, 85, 89, 97, 100, 107, 115, 118, 125,
++ 129, 136, 140, 147, 154, 162, 165, 172, 176, 183,
++ 187, 191, 195, 199, 207, 210, 214, 222, 225, 229,
++ 234, 242, 245, 249, 253, 261, 264, 268, 276, 279,
++ 283, 291, 299, 302
++};
++#endif
++
++#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
++/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
++ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
++static const char *const yytname[] =
++{
++ "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE",
++ "DT_PROPNODENAME", "DT_LITERAL", "DT_LEGACYLITERAL", "DT_BASE",
++ "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF", "';'", "'-'", "'/'", "'{'",
++ "'}'", "'='", "'<'", "'>'", "'['", "']'", "','", "$accept", "sourcefile",
++ "memreserves", "memreserve", "v0_memreserves", "v0_memreserve", "addr",
++ "devicetree", "nodedef", "proplist", "propdef", "propdata",
++ "propdataprefix", "celllist", "cellbase", "cellval", "bytestring",
++ "subnodes", "subnode", "label", 0
++};
++#endif
++
++# ifdef YYPRINT
++/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
++ token YYLEX-NUM. */
++static const yytype_uint16 yytoknum[] =
++{
++ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
++ 265, 266, 267, 59, 45, 47, 123, 125, 61, 60,
++ 62, 91, 93, 44
++};
++# endif
++
++/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
++static const yytype_uint8 yyr1[] =
++{
++ 0, 24, 25, 25, 26, 26, 27, 28, 28, 29,
++ 29, 30, 30, 31, 32, 33, 33, 34, 34, 35,
++ 35, 35, 35, 35, 36, 36, 36, 37, 37, 37,
++ 37, 38, 38, 39, 39, 40, 40, 40, 41, 41,
++ 41, 42, 43, 43
++};
++
++/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
++static const yytype_uint8 yyr2[] =
++{
++ 0, 2, 4, 2, 0, 2, 5, 0, 2, 1,
++ 6, 1, 1, 2, 5, 0, 2, 5, 3, 2,
++ 4, 4, 2, 2, 0, 2, 2, 0, 2, 2,
++ 2, 0, 1, 1, 2, 0, 2, 2, 0, 2,
++ 2, 3, 0, 1
++};
++
++/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
++ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
++ means the default is an error. */
++static const yytype_uint8 yydefact[] =
++{
++ 7, 0, 43, 0, 9, 0, 7, 0, 4, 1,
++ 0, 3, 8, 0, 0, 4, 0, 15, 13, 11,
++ 12, 0, 2, 5, 0, 38, 0, 0, 0, 16,
++ 0, 38, 0, 0, 6, 0, 40, 39, 0, 10,
++ 14, 18, 24, 41, 0, 0, 23, 17, 25, 19,
++ 26, 22, 27, 35, 31, 0, 33, 32, 30, 29,
++ 20, 0, 28, 36, 37, 21, 34
++};
++
++/* YYDEFGOTO[NTERM-NUM]. */
++static const yytype_int8 yydefgoto[] =
++{
++ -1, 3, 14, 4, 5, 6, 27, 11, 18, 25,
++ 29, 44, 45, 54, 61, 62, 55, 30, 31, 7
++};
++
++/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
++ STATE-NUM. */
++#define YYPACT_NINF -13
++static const yytype_int8 yypact[] =
++{
++ 23, 11, -13, 37, -13, -4, 18, 39, 18, -13,
++ 28, -13, -13, 34, -4, 18, 41, -13, -13, -13,
++ -13, 25, -13, -13, 34, -3, 34, 33, 34, -13,
++ 30, -3, 43, 36, -13, 38, -13, -13, 20, -13,
++ -13, -13, -13, -13, 2, 9, -13, -13, -13, -13,
++ -13, -13, -13, -13, -2, -6, -13, -13, -13, -13,
++ -13, 45, -13, -13, -13, -13, -13
++};
++
++/* YYPGOTO[NTERM-NUM]. */
++static const yytype_int8 yypgoto[] =
++{
++ -13, -13, 35, 27, 47, -13, -12, 40, 17, -13,
++ 26, -13, -13, -13, -13, -13, -13, 29, -13, -8
++};
++
++/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
++ positive, shift that token. If negative, reduce the rule which
++ number is the opposite. If zero, do what YYDEFACT says.
++ If YYTABLE_NINF, syntax error. */
++#define YYTABLE_NINF -43
++static const yytype_int8 yytable[] =
++{
++ 16, 21, -42, 63, 56, 64, 57, 16, 2, 58,
++ 59, 10, 28, 46, 33, 47, 65, 32, 60, 49,
++ 50, 51, -42, 32, 8, 48, 1, -42, 52, 2,
++ 53, 19, 20, 41, 2, 15, 17, 9, 42, 26,
++ 19, 20, 15, 13, 17, 24, 34, 35, 38, 39,
++ 23, 40, 66, 12, 22, 43, 0, 36, 0, 0,
++ 37
++};
++
++static const yytype_int8 yycheck[] =
++{
++ 8, 13, 5, 9, 6, 11, 8, 15, 11, 11,
++ 12, 15, 24, 11, 26, 13, 22, 25, 20, 10,
++ 11, 12, 4, 31, 13, 23, 3, 4, 19, 11,
++ 21, 6, 7, 13, 11, 8, 16, 0, 18, 14,
++ 6, 7, 15, 4, 16, 4, 13, 17, 5, 13,
++ 15, 13, 7, 6, 14, 38, -1, 31, -1, -1,
++ 31
++};
++
++/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
++ symbol of state STATE-NUM. */
++static const yytype_uint8 yystos[] =
++{
++ 0, 3, 11, 25, 27, 28, 29, 43, 13, 0,
++ 15, 31, 28, 4, 26, 27, 43, 16, 32, 6,
++ 7, 30, 31, 26, 4, 33, 14, 30, 30, 34,
++ 41, 42, 43, 30, 13, 17, 34, 41, 5, 13,
++ 13, 13, 18, 32, 35, 36, 11, 13, 23, 10,
++ 11, 12, 19, 21, 37, 40, 6, 8, 11, 12,
++ 20, 38, 39, 9, 11, 22, 7
++};
++
++#define yyerrok (yyerrstatus = 0)
++#define yyclearin (yychar = YYEMPTY)
++#define YYEMPTY (-2)
++#define YYEOF 0
++
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
++#define YYERROR goto yyerrorlab
++
++
++/* Like YYERROR except do call yyerror. This remains here temporarily
++ to ease the transition to the new meaning of YYERROR, for GCC.
++ Once GCC version 2 has supplanted version 1, this can go. */
++
++#define YYFAIL goto yyerrlab
++
++#define YYRECOVERING() (!!yyerrstatus)
++
++#define YYBACKUP(Token, Value) \
++do \
++ if (yychar == YYEMPTY && yylen == 1) \
++ { \
++ yychar = (Token); \
++ yylval = (Value); \
++ yytoken = YYTRANSLATE (yychar); \
++ YYPOPSTACK (1); \
++ goto yybackup; \
++ } \
++ else \
++ { \
++ yyerror (YY_("syntax error: cannot back up")); \
++ YYERROR; \
++ } \
++while (YYID (0))
++
++
++#define YYTERROR 1
++#define YYERRCODE 256
++
++
++/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
++ If N is 0, then set CURRENT to the empty location which ends
++ the previous symbol: RHS[0] (always defined). */
++
++#define YYRHSLOC(Rhs, K) ((Rhs)[K])
++#ifndef YYLLOC_DEFAULT
++# define YYLLOC_DEFAULT(Current, Rhs, N) \
++ do \
++ if (YYID (N)) \
++ { \
++ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
++ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
++ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
++ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
++ } \
++ else \
++ { \
++ (Current).first_line = (Current).last_line = \
++ YYRHSLOC (Rhs, 0).last_line; \
++ (Current).first_column = (Current).last_column = \
++ YYRHSLOC (Rhs, 0).last_column; \
++ } \
++ while (YYID (0))
++#endif
++
++
++/* YY_LOCATION_PRINT -- Print the location on the stream.
++ This macro was not mandated originally: define only if we know
++ we won't break user code: when these are the locations we know. */
++
++#ifndef YY_LOCATION_PRINT
++# if YYLTYPE_IS_TRIVIAL
++# define YY_LOCATION_PRINT(File, Loc) \
++ fprintf (File, "%d.%d-%d.%d", \
++ (Loc).first_line, (Loc).first_column, \
++ (Loc).last_line, (Loc).last_column)
++# else
++# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
++# endif
++#endif
++
++
++/* YYLEX -- calling `yylex' with the right arguments. */
++
++#ifdef YYLEX_PARAM
++# define YYLEX yylex (YYLEX_PARAM)
++#else
++# define YYLEX yylex ()
++#endif
++
++/* Enable debugging if requested. */
++#if YYDEBUG
++
++# ifndef YYFPRINTF
++# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
++# define YYFPRINTF fprintf
++# endif
++
++# define YYDPRINTF(Args) \
++do { \
++ if (yydebug) \
++ YYFPRINTF Args; \
++} while (YYID (0))
++
++# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
++do { \
++ if (yydebug) \
++ { \
++ YYFPRINTF (stderr, "%s ", Title); \
++ yy_symbol_print (stderr, \
++ Type, Value, Location); \
++ YYFPRINTF (stderr, "\n"); \
++ } \
++} while (YYID (0))
++
++
++/*--------------------------------.
++| Print this symbol on YYOUTPUT. |
++`--------------------------------*/
++
++/*ARGSUSED*/
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static void
++yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
++#else
++static void
++yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
++ FILE *yyoutput;
++ int yytype;
++ YYSTYPE const * const yyvaluep;
++ YYLTYPE const * const yylocationp;
++#endif
++{
++ if (!yyvaluep)
++ return;
++ YYUSE (yylocationp);
++# ifdef YYPRINT
++ if (yytype < YYNTOKENS)
++ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
++# else
++ YYUSE (yyoutput);
++# endif
++ switch (yytype)
++ {
++ default:
++ break;
++ }
++}
++
++
++/*--------------------------------.
++| Print this symbol on YYOUTPUT. |
++`--------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static void
++yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
++#else
++static void
++yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
++ FILE *yyoutput;
++ int yytype;
++ YYSTYPE const * const yyvaluep;
++ YYLTYPE const * const yylocationp;
++#endif
++{
++ if (yytype < YYNTOKENS)
++ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
++ else
++ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
++
++ YY_LOCATION_PRINT (yyoutput, *yylocationp);
++ YYFPRINTF (yyoutput, ": ");
++ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
++ YYFPRINTF (yyoutput, ")");
++}
++
++/*------------------------------------------------------------------.
++| yy_stack_print -- Print the state stack from its BOTTOM up to its |
++| TOP (included). |
++`------------------------------------------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static void
++yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
++#else
++static void
++yy_stack_print (bottom, top)
++ yytype_int16 *bottom;
++ yytype_int16 *top;
++#endif
++{
++ YYFPRINTF (stderr, "Stack now");
++ for (; bottom <= top; ++bottom)
++ YYFPRINTF (stderr, " %d", *bottom);
++ YYFPRINTF (stderr, "\n");
++}
++
++# define YY_STACK_PRINT(Bottom, Top) \
++do { \
++ if (yydebug) \
++ yy_stack_print ((Bottom), (Top)); \
++} while (YYID (0))
++
++
++/*------------------------------------------------.
++| Report that the YYRULE is going to be reduced. |
++`------------------------------------------------*/
++
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static void
++yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
++#else
++static void
++yy_reduce_print (yyvsp, yylsp, yyrule)
++ YYSTYPE *yyvsp;
++ YYLTYPE *yylsp;
++ int yyrule;
++#endif
++{
++ int yynrhs = yyr2[yyrule];
++ int yyi;
++ unsigned long int yylno = yyrline[yyrule];
++ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
++ yyrule - 1, yylno);
++ /* The symbols being reduced. */
++ for (yyi = 0; yyi < yynrhs; yyi++)
++ {
++ fprintf (stderr, " $%d = ", yyi + 1);
++ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
++ &(yyvsp[(yyi + 1) - (yynrhs)])
++ , &(yylsp[(yyi + 1) - (yynrhs)]) );
++ fprintf (stderr, "\n");
++ }
++}
++
++# define YY_REDUCE_PRINT(Rule) \
++do { \
++ if (yydebug) \
++ yy_reduce_print (yyvsp, yylsp, Rule); \
++} while (YYID (0))
++
++/* Nonzero means print parse trace. It is left uninitialized so that
++ multiple parsers can coexist. */
++int yydebug;
++#else /* !YYDEBUG */
++# define YYDPRINTF(Args)
++# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
++# define YY_STACK_PRINT(Bottom, Top)
++# define YY_REDUCE_PRINT(Rule)
++#endif /* !YYDEBUG */
++
++
++/* YYINITDEPTH -- initial size of the parser's stacks. */
++#ifndef YYINITDEPTH
++# define YYINITDEPTH 200
++#endif
++
++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
++ if the built-in stack extension method is used).
++
++ Do not make this value too large; the results are undefined if
++ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
++ evaluated with infinite-precision integer arithmetic. */
++
++#ifndef YYMAXDEPTH
++# define YYMAXDEPTH 10000
++#endif
++
++
++
++#if YYERROR_VERBOSE
++
++# ifndef yystrlen
++# if defined __GLIBC__ && defined _STRING_H
++# define yystrlen strlen
++# else
++/* Return the length of YYSTR. */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static YYSIZE_T
++yystrlen (const char *yystr)
++#else
++static YYSIZE_T
++yystrlen (yystr)
++ const char *yystr;
++#endif
++{
++ YYSIZE_T yylen;
++ for (yylen = 0; yystr[yylen]; yylen++)
++ continue;
++ return yylen;
++}
++# endif
++# endif
++
++# ifndef yystpcpy
++# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
++# define yystpcpy stpcpy
++# else
++/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
++ YYDEST. */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static char *
++yystpcpy (char *yydest, const char *yysrc)
++#else
++static char *
++yystpcpy (yydest, yysrc)
++ char *yydest;
++ const char *yysrc;
++#endif
++{
++ char *yyd = yydest;
++ const char *yys = yysrc;
++
++ while ((*yyd++ = *yys++) != '\0')
++ continue;
++
++ return yyd - 1;
++}
++# endif
++# endif
++
++# ifndef yytnamerr
++/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
++ quotes and backslashes, so that it's suitable for yyerror. The
++ heuristic is that double-quoting is unnecessary unless the string
++ contains an apostrophe, a comma, or backslash (other than
++ backslash-backslash). YYSTR is taken from yytname. If YYRES is
++ null, do not copy; instead, return the length of what the result
++ would have been. */
++static YYSIZE_T
++yytnamerr (char *yyres, const char *yystr)
++{
++ if (*yystr == '"')
++ {
++ YYSIZE_T yyn = 0;
++ char const *yyp = yystr;
++
++ for (;;)
++ switch (*++yyp)
++ {
++ case '\'':
++ case ',':
++ goto do_not_strip_quotes;
++
++ case '\\':
++ if (*++yyp != '\\')
++ goto do_not_strip_quotes;
++ /* Fall through. */
++ default:
++ if (yyres)
++ yyres[yyn] = *yyp;
++ yyn++;
++ break;
++
++ case '"':
++ if (yyres)
++ yyres[yyn] = '\0';
++ return yyn;
++ }
++ do_not_strip_quotes: ;
++ }
++
++ if (! yyres)
++ return yystrlen (yystr);
++
++ return yystpcpy (yyres, yystr) - yyres;
++}
++# endif
++
++/* Copy into YYRESULT an error message about the unexpected token
++ YYCHAR while in state YYSTATE. Return the number of bytes copied,
++ including the terminating null byte. If YYRESULT is null, do not
++ copy anything; just return the number of bytes that would be
++ copied. As a special case, return 0 if an ordinary "syntax error"
++ message will do. Return YYSIZE_MAXIMUM if overflow occurs during
++ size calculation. */
++static YYSIZE_T
++yysyntax_error (char *yyresult, int yystate, int yychar)
++{
++ int yyn = yypact[yystate];
++
++ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
++ return 0;
++ else
++ {
++ int yytype = YYTRANSLATE (yychar);
++ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
++ YYSIZE_T yysize = yysize0;
++ YYSIZE_T yysize1;
++ int yysize_overflow = 0;
++ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
++ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
++ int yyx;
++
++# if 0
++ /* This is so xgettext sees the translatable formats that are
++ constructed on the fly. */
++ YY_("syntax error, unexpected %s");
++ YY_("syntax error, unexpected %s, expecting %s");
++ YY_("syntax error, unexpected %s, expecting %s or %s");
++ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
++ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
++# endif
++ char *yyfmt;
++ char const *yyf;
++ static char const yyunexpected[] = "syntax error, unexpected %s";
++ static char const yyexpecting[] = ", expecting %s";
++ static char const yyor[] = " or %s";
++ char yyformat[sizeof yyunexpected
++ + sizeof yyexpecting - 1
++ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
++ * (sizeof yyor - 1))];
++ char const *yyprefix = yyexpecting;
++
++ /* Start YYX at -YYN if negative to avoid negative indexes in
++ YYCHECK. */
++ int yyxbegin = yyn < 0 ? -yyn : 0;
++
++ /* Stay within bounds of both yycheck and yytname. */
++ int yychecklim = YYLAST - yyn + 1;
++ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
++ int yycount = 1;
++
++ yyarg[0] = yytname[yytype];
++ yyfmt = yystpcpy (yyformat, yyunexpected);
++
++ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
++ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
++ {
++ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
++ {
++ yycount = 1;
++ yysize = yysize0;
++ yyformat[sizeof yyunexpected - 1] = '\0';
++ break;
++ }
++ yyarg[yycount++] = yytname[yyx];
++ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
++ yysize_overflow |= (yysize1 < yysize);
++ yysize = yysize1;
++ yyfmt = yystpcpy (yyfmt, yyprefix);
++ yyprefix = yyor;
++ }
++
++ yyf = YY_(yyformat);
++ yysize1 = yysize + yystrlen (yyf);
++ yysize_overflow |= (yysize1 < yysize);
++ yysize = yysize1;
++
++ if (yysize_overflow)
++ return YYSIZE_MAXIMUM;
++
++ if (yyresult)
++ {
++ /* Avoid sprintf, as that infringes on the user's name space.
++ Don't have undefined behavior even if the translation
++ produced a string with the wrong number of "%s"s. */
++ char *yyp = yyresult;
++ int yyi = 0;
++ while ((*yyp = *yyf) != '\0')
++ {
++ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
++ {
++ yyp += yytnamerr (yyp, yyarg[yyi++]);
++ yyf += 2;
++ }
++ else
++ {
++ yyp++;
++ yyf++;
++ }
++ }
++ }
++ return yysize;
++ }
++}
++#endif /* YYERROR_VERBOSE */
++
++
++/*-----------------------------------------------.
++| Release the memory associated to this symbol. |
++`-----------------------------------------------*/
++
++/*ARGSUSED*/
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++static void
++yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
++#else
++static void
++yydestruct (yymsg, yytype, yyvaluep, yylocationp)
++ const char *yymsg;
++ int yytype;
++ YYSTYPE *yyvaluep;
++ YYLTYPE *yylocationp;
++#endif
++{
++ YYUSE (yyvaluep);
++ YYUSE (yylocationp);
++
++ if (!yymsg)
++ yymsg = "Deleting";
++ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
++
++ switch (yytype)
++ {
++
++ default:
++ break;
++ }
++}
++
++
++/* Prevent warnings from -Wmissing-prototypes. */
++
++#ifdef YYPARSE_PARAM
++#if defined __STDC__ || defined __cplusplus
++int yyparse (void *YYPARSE_PARAM);
++#else
++int yyparse ();
++#endif
++#else /* ! YYPARSE_PARAM */
++#if defined __STDC__ || defined __cplusplus
++int yyparse (void);
++#else
++int yyparse ();
++#endif
++#endif /* ! YYPARSE_PARAM */
++
++
++
++/* The look-ahead symbol. */
++int yychar;
++
++/* The semantic value of the look-ahead symbol. */
++YYSTYPE yylval;
++
++/* Number of syntax errors so far. */
++int yynerrs;
++/* Location data for the look-ahead symbol. */
++YYLTYPE yylloc;
++
++
++
++/*----------.
++| yyparse. |
++`----------*/
++
++#ifdef YYPARSE_PARAM
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++int
++yyparse (void *YYPARSE_PARAM)
++#else
++int
++yyparse (YYPARSE_PARAM)
++ void *YYPARSE_PARAM;
++#endif
++#else /* ! YYPARSE_PARAM */
++#if (defined __STDC__ || defined __C99__FUNC__ \
++ || defined __cplusplus || defined _MSC_VER)
++int
++yyparse (void)
++#else
++int
++yyparse ()
++
++#endif
++#endif
++{
++
++ int yystate;
++ int yyn;
++ int yyresult;
++ /* Number of tokens to shift before error messages enabled. */
++ int yyerrstatus;
++ /* Look-ahead token as an internal (translated) token number. */
++ int yytoken = 0;
++#if YYERROR_VERBOSE
++ /* Buffer for error messages, and its allocated size. */
++ char yymsgbuf[128];
++ char *yymsg = yymsgbuf;
++ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
++#endif
++
++ /* Three stacks and their tools:
++ `yyss': related to states,
++ `yyvs': related to semantic values,
++ `yyls': related to locations.
++
++ Refer to the stacks thru separate pointers, to allow yyoverflow
++ to reallocate them elsewhere. */
++
++ /* The state stack. */
++ yytype_int16 yyssa[YYINITDEPTH];
++ yytype_int16 *yyss = yyssa;
++ yytype_int16 *yyssp;
++
++ /* The semantic value stack. */
++ YYSTYPE yyvsa[YYINITDEPTH];
++ YYSTYPE *yyvs = yyvsa;
++ YYSTYPE *yyvsp;
++
++ /* The location stack. */
++ YYLTYPE yylsa[YYINITDEPTH];
++ YYLTYPE *yyls = yylsa;
++ YYLTYPE *yylsp;
++ /* The locations where the error started and ended. */
++ YYLTYPE yyerror_range[2];
++
++#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
++
++ YYSIZE_T yystacksize = YYINITDEPTH;
++
++ /* The variables used to return semantic value and location from the
++ action routines. */
++ YYSTYPE yyval;
++ YYLTYPE yyloc;
++
++ /* The number of symbols on the RHS of the reduced rule.
++ Keep to zero when no symbol should be popped. */
++ int yylen = 0;
++
++ YYDPRINTF ((stderr, "Starting parse\n"));
++
++ yystate = 0;
++ yyerrstatus = 0;
++ yynerrs = 0;
++ yychar = YYEMPTY; /* Cause a token to be read. */
++
++ /* Initialize stack pointers.
++ Waste one element of value and location stack
++ so that they stay on the same level as the state stack.
++ The wasted elements are never initialized. */
++
++ yyssp = yyss;
++ yyvsp = yyvs;
++ yylsp = yyls;
++#if YYLTYPE_IS_TRIVIAL
++ /* Initialize the default location before parsing starts. */
++ yylloc.first_line = yylloc.last_line = 1;
++ yylloc.first_column = yylloc.last_column = 0;
++#endif
++
++ goto yysetstate;
++
++/*------------------------------------------------------------.
++| yynewstate -- Push a new state, which is found in yystate. |
++`------------------------------------------------------------*/
++ yynewstate:
++ /* In all cases, when you get here, the value and location stacks
++ have just been pushed. So pushing a state here evens the stacks. */
++ yyssp++;
++
++ yysetstate:
++ *yyssp = yystate;
++
++ if (yyss + yystacksize - 1 <= yyssp)
++ {
++ /* Get the current used size of the three stacks, in elements. */
++ YYSIZE_T yysize = yyssp - yyss + 1;
++
++#ifdef yyoverflow
++ {
++ /* Give user a chance to reallocate the stack. Use copies of
++ these so that the &'s don't force the real ones into
++ memory. */
++ YYSTYPE *yyvs1 = yyvs;
++ yytype_int16 *yyss1 = yyss;
++ YYLTYPE *yyls1 = yyls;
++
++ /* Each stack pointer address is followed by the size of the
++ data in use in that stack, in bytes. This used to be a
++ conditional around just the two extra args, but that might
++ be undefined if yyoverflow is a macro. */
++ yyoverflow (YY_("memory exhausted"),
++ &yyss1, yysize * sizeof (*yyssp),
++ &yyvs1, yysize * sizeof (*yyvsp),
++ &yyls1, yysize * sizeof (*yylsp),
++ &yystacksize);
++ yyls = yyls1;
++ yyss = yyss1;
++ yyvs = yyvs1;
++ }
++#else /* no yyoverflow */
++# ifndef YYSTACK_RELOCATE
++ goto yyexhaustedlab;
++# else
++ /* Extend the stack our own way. */
++ if (YYMAXDEPTH <= yystacksize)
++ goto yyexhaustedlab;
++ yystacksize *= 2;
++ if (YYMAXDEPTH < yystacksize)
++ yystacksize = YYMAXDEPTH;
++
++ {
++ yytype_int16 *yyss1 = yyss;
++ union yyalloc *yyptr =
++ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
++ if (! yyptr)
++ goto yyexhaustedlab;
++ YYSTACK_RELOCATE (yyss);
++ YYSTACK_RELOCATE (yyvs);
++ YYSTACK_RELOCATE (yyls);
++# undef YYSTACK_RELOCATE
++ if (yyss1 != yyssa)
++ YYSTACK_FREE (yyss1);
++ }
++# endif
++#endif /* no yyoverflow */
++
++ yyssp = yyss + yysize - 1;
++ yyvsp = yyvs + yysize - 1;
++ yylsp = yyls + yysize - 1;
++
++ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
++ (unsigned long int) yystacksize));
++
++ if (yyss + yystacksize - 1 <= yyssp)
++ YYABORT;
++ }
++
++ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
++
++ goto yybackup;
++
++/*-----------.
++| yybackup. |
++`-----------*/
++yybackup:
++
++ /* Do appropriate processing given the current state. Read a
++ look-ahead token if we need one and don't already have one. */
++
++ /* First try to decide what to do without reference to look-ahead token. */
++ yyn = yypact[yystate];
++ if (yyn == YYPACT_NINF)
++ goto yydefault;
++
++ /* Not known => get a look-ahead token if don't already have one. */
++
++ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
++ if (yychar == YYEMPTY)
++ {
++ YYDPRINTF ((stderr, "Reading a token: "));
++ yychar = YYLEX;
++ }
++
++ if (yychar <= YYEOF)
++ {
++ yychar = yytoken = YYEOF;
++ YYDPRINTF ((stderr, "Now at end of input.\n"));
++ }
++ else
++ {
++ yytoken = YYTRANSLATE (yychar);
++ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
++ }
++
++ /* If the proper action on seeing token YYTOKEN is to reduce or to
++ detect an error, take that action. */
++ yyn += yytoken;
++ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
++ goto yydefault;
++ yyn = yytable[yyn];
++ if (yyn <= 0)
++ {
++ if (yyn == 0 || yyn == YYTABLE_NINF)
++ goto yyerrlab;
++ yyn = -yyn;
++ goto yyreduce;
++ }
++
++ if (yyn == YYFINAL)
++ YYACCEPT;
++
++ /* Count tokens shifted since error; after three, turn off error
++ status. */
++ if (yyerrstatus)
++ yyerrstatus--;
++
++ /* Shift the look-ahead token. */
++ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
++
++ /* Discard the shifted token unless it is eof. */
++ if (yychar != YYEOF)
++ yychar = YYEMPTY;
++
++ yystate = yyn;
++ *++yyvsp = yylval;
++ *++yylsp = yylloc;
++ goto yynewstate;
++
++
++/*-----------------------------------------------------------.
++| yydefault -- do the default action for the current state. |
++`-----------------------------------------------------------*/
++yydefault:
++ yyn = yydefact[yystate];
++ if (yyn == 0)
++ goto yyerrlab;
++ goto yyreduce;
++
++
++/*-----------------------------.
++| yyreduce -- Do a reduction. |
++`-----------------------------*/
++yyreduce:
++ /* yyn is the number of a rule to reduce with. */
++ yylen = yyr2[yyn];
++
++ /* If YYLEN is nonzero, implement the default value of the action:
++ `$$ = $1'.
++
++ Otherwise, the following line sets YYVAL to garbage.
++ This behavior is undocumented and Bison
++ users should not rely upon it. Assigning to YYVAL
++ unconditionally makes the parser a bit smaller, and it avoids a
++ GCC warning that YYVAL may be used uninitialized. */
++ yyval = yyvsp[1-yylen];
++
++ /* Default location. */
++ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
++ YY_REDUCE_PRINT (yyn);
++ switch (yyn)
++ {
++ case 2:
++#line 86 "dtc-parser.y"
++ {
++ the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node));
++ ;}
++ break;
++
++ case 3:
++#line 90 "dtc-parser.y"
++ {
++ the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node));
++ ;}
++ break;
++
++ case 4:
++#line 97 "dtc-parser.y"
++ {
++ (yyval.re) = NULL;
++ ;}
++ break;
++
++ case 5:
++#line 101 "dtc-parser.y"
++ {
++ (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
++ ;}
++ break;
++
++ case 6:
++#line 108 "dtc-parser.y"
++ {
++ (yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref));
++ ;}
++ break;
++
++ case 7:
++#line 115 "dtc-parser.y"
++ {
++ (yyval.re) = NULL;
++ ;}
++ break;
++
++ case 8:
++#line 119 "dtc-parser.y"
++ {
++ (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
++ ;}
++ break;
++
++ case 9:
++#line 126 "dtc-parser.y"
++ {
++ (yyval.re) = (yyvsp[(1) - (1)].re);
++ ;}
++ break;
++
++ case 10:
++#line 130 "dtc-parser.y"
++ {
++ (yyval.re) = build_reserve_entry((yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr) - (yyvsp[(3) - (6)].addr) + 1, (yyvsp[(1) - (6)].labelref));
++ ;}
++ break;
++
++ case 11:
++#line 137 "dtc-parser.y"
++ {
++ (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
++ ;}
++ break;
++
++ case 12:
++#line 141 "dtc-parser.y"
++ {
++ (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64);
++ ;}
++ break;
++
++ case 13:
++#line 148 "dtc-parser.y"
++ {
++ (yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL);
++ ;}
++ break;
++
++ case 14:
++#line 155 "dtc-parser.y"
++ {
++ (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
++ ;}
++ break;
++
++ case 15:
++#line 162 "dtc-parser.y"
++ {
++ (yyval.proplist) = NULL;
++ ;}
++ break;
++
++ case 16:
++#line 166 "dtc-parser.y"
++ {
++ (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
++ ;}
++ break;
++
++ case 17:
++#line 173 "dtc-parser.y"
++ {
++ (yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref));
++ ;}
++ break;
++
++ case 18:
++#line 177 "dtc-parser.y"
++ {
++ (yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref));
++ ;}
++ break;
++
++ case 19:
++#line 184 "dtc-parser.y"
++ {
++ (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
++ ;}
++ break;
++
++ case 20:
++#line 188 "dtc-parser.y"
++ {
++ (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
++ ;}
++ break;
++
++ case 21:
++#line 192 "dtc-parser.y"
++ {
++ (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
++ ;}
++ break;
++
++ case 22:
++#line 196 "dtc-parser.y"
++ {
++ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
++ ;}
++ break;
++
++ case 23:
++#line 200 "dtc-parser.y"
++ {
++ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ ;}
++ break;
++
++ case 24:
++#line 207 "dtc-parser.y"
++ {
++ (yyval.data) = empty_data;
++ ;}
++ break;
++
++ case 25:
++#line 211 "dtc-parser.y"
++ {
++ (yyval.data) = (yyvsp[(1) - (2)].data);
++ ;}
++ break;
++
++ case 26:
++#line 215 "dtc-parser.y"
++ {
++ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ ;}
++ break;
++
++ case 27:
++#line 222 "dtc-parser.y"
++ {
++ (yyval.data) = empty_data;
++ ;}
++ break;
++
++ case 28:
++#line 226 "dtc-parser.y"
++ {
++ (yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));
++ ;}
++ break;
++
++ case 29:
++#line 230 "dtc-parser.y"
++ {
++ (yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,
++ (yyvsp[(2) - (2)].labelref)), -1);
++ ;}
++ break;
++
++ case 30:
++#line 235 "dtc-parser.y"
++ {
++ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ ;}
++ break;
++
++ case 31:
++#line 242 "dtc-parser.y"
++ {
++ (yyval.cbase) = 16;
++ ;}
++ break;
++
++ case 33:
++#line 250 "dtc-parser.y"
++ {
++ (yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);
++ ;}
++ break;
++
++ case 34:
++#line 254 "dtc-parser.y"
++ {
++ (yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32);
++ ;}
++ break;
++
++ case 35:
++#line 261 "dtc-parser.y"
++ {
++ (yyval.data) = empty_data;
++ ;}
++ break;
++
++ case 36:
++#line 265 "dtc-parser.y"
++ {
++ (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
++ ;}
++ break;
++
++ case 37:
++#line 269 "dtc-parser.y"
++ {
++ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ ;}
++ break;
++
++ case 38:
++#line 276 "dtc-parser.y"
++ {
++ (yyval.nodelist) = NULL;
++ ;}
++ break;
++
++ case 39:
++#line 280 "dtc-parser.y"
++ {
++ (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
++ ;}
++ break;
++
++ case 40:
++#line 284 "dtc-parser.y"
++ {
++ yyerror("syntax error: properties must precede subnodes\n");
++ YYERROR;
++ ;}
++ break;
++
++ case 41:
++#line 292 "dtc-parser.y"
++ {
++ (yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref));
++ ;}
++ break;
++
++ case 42:
++#line 299 "dtc-parser.y"
++ {
++ (yyval.labelref) = NULL;
++ ;}
++ break;
++
++ case 43:
++#line 303 "dtc-parser.y"
++ {
++ (yyval.labelref) = (yyvsp[(1) - (1)].labelref);
++ ;}
++ break;
++
++
++/* Line 1267 of yacc.c. */
++#line 1734 "dtc-parser.tab.c"
++ default: break;
++ }
++ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
++
++ YYPOPSTACK (yylen);
++ yylen = 0;
++ YY_STACK_PRINT (yyss, yyssp);
++
++ *++yyvsp = yyval;
++ *++yylsp = yyloc;
++
++ /* Now `shift' the result of the reduction. Determine what state
++ that goes to, based on the state we popped back to and the rule
++ number reduced by. */
++
++ yyn = yyr1[yyn];
++
++ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
++ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
++ yystate = yytable[yystate];
++ else
++ yystate = yydefgoto[yyn - YYNTOKENS];
++
++ goto yynewstate;
++
++
++/*------------------------------------.
++| yyerrlab -- here on detecting error |
++`------------------------------------*/
++yyerrlab:
++ /* If not already recovering from an error, report this error. */
++ if (!yyerrstatus)
++ {
++ ++yynerrs;
++#if ! YYERROR_VERBOSE
++ yyerror (YY_("syntax error"));
++#else
++ {
++ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
++ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
++ {
++ YYSIZE_T yyalloc = 2 * yysize;
++ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
++ yyalloc = YYSTACK_ALLOC_MAXIMUM;
++ if (yymsg != yymsgbuf)
++ YYSTACK_FREE (yymsg);
++ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
++ if (yymsg)
++ yymsg_alloc = yyalloc;
++ else
++ {
++ yymsg = yymsgbuf;
++ yymsg_alloc = sizeof yymsgbuf;
++ }
++ }
++
++ if (0 < yysize && yysize <= yymsg_alloc)
++ {
++ (void) yysyntax_error (yymsg, yystate, yychar);
++ yyerror (yymsg);
++ }
++ else
++ {
++ yyerror (YY_("syntax error"));
++ if (yysize != 0)
++ goto yyexhaustedlab;
++ }
++ }
++#endif
++ }
++
++ yyerror_range[0] = yylloc;
++
++ if (yyerrstatus == 3)
++ {
++ /* If just tried and failed to reuse look-ahead token after an
++ error, discard it. */
++
++ if (yychar <= YYEOF)
++ {
++ /* Return failure if at end of input. */
++ if (yychar == YYEOF)
++ YYABORT;
++ }
++ else
++ {
++ yydestruct ("Error: discarding",
++ yytoken, &yylval, &yylloc);
++ yychar = YYEMPTY;
++ }
++ }
++
++ /* Else will try to reuse look-ahead token after shifting the error
++ token. */
++ goto yyerrlab1;
++
++
++/*---------------------------------------------------.
++| yyerrorlab -- error raised explicitly by YYERROR. |
++`---------------------------------------------------*/
++yyerrorlab:
++
++ /* Pacify compilers like GCC when the user code never invokes
++ YYERROR and the label yyerrorlab therefore never appears in user
++ code. */
++ if (/*CONSTCOND*/ 0)
++ goto yyerrorlab;
++
++ yyerror_range[0] = yylsp[1-yylen];
++ /* Do not reclaim the symbols of the rule which action triggered
++ this YYERROR. */
++ YYPOPSTACK (yylen);
++ yylen = 0;
++ YY_STACK_PRINT (yyss, yyssp);
++ yystate = *yyssp;
++ goto yyerrlab1;
++
++
++/*-------------------------------------------------------------.
++| yyerrlab1 -- common code for both syntax error and YYERROR. |
++`-------------------------------------------------------------*/
++yyerrlab1:
++ yyerrstatus = 3; /* Each real token shifted decrements this. */
++
++ for (;;)
++ {
++ yyn = yypact[yystate];
++ if (yyn != YYPACT_NINF)
++ {
++ yyn += YYTERROR;
++ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
++ {
++ yyn = yytable[yyn];
++ if (0 < yyn)
++ break;
++ }
++ }
++
++ /* Pop the current state because it cannot handle the error token. */
++ if (yyssp == yyss)
++ YYABORT;
++
++ yyerror_range[0] = *yylsp;
++ yydestruct ("Error: popping",
++ yystos[yystate], yyvsp, yylsp);
++ YYPOPSTACK (1);
++ yystate = *yyssp;
++ YY_STACK_PRINT (yyss, yyssp);
++ }
++
++ if (yyn == YYFINAL)
++ YYACCEPT;
++
++ *++yyvsp = yylval;
++
++ yyerror_range[1] = yylloc;
++ /* Using YYLLOC is tempting, but would change the location of
++ the look-ahead. YYLOC is available though. */
++ YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
++ *++yylsp = yyloc;
++
++ /* Shift the error token. */
++ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
++
++ yystate = yyn;
++ goto yynewstate;
++
++
++/*-------------------------------------.
++| yyacceptlab -- YYACCEPT comes here. |
++`-------------------------------------*/
++yyacceptlab:
++ yyresult = 0;
++ goto yyreturn;
++
++/*-----------------------------------.
++| yyabortlab -- YYABORT comes here. |
++`-----------------------------------*/
++yyabortlab:
++ yyresult = 1;
++ goto yyreturn;
++
++#ifndef yyoverflow
++/*-------------------------------------------------.
++| yyexhaustedlab -- memory exhaustion comes here. |
++`-------------------------------------------------*/
++yyexhaustedlab:
++ yyerror (YY_("memory exhausted"));
++ yyresult = 2;
++ /* Fall through. */
++#endif
++
++yyreturn:
++ if (yychar != YYEOF && yychar != YYEMPTY)
++ yydestruct ("Cleanup: discarding lookahead",
++ yytoken, &yylval, &yylloc);
++ /* Do not reclaim the symbols of the rule which action triggered
++ this YYABORT or YYACCEPT. */
++ YYPOPSTACK (yylen);
++ YY_STACK_PRINT (yyss, yyssp);
++ while (yyssp != yyss)
++ {
++ yydestruct ("Cleanup: popping",
++ yystos[*yyssp], yyvsp, yylsp);
++ YYPOPSTACK (1);
++ }
++#ifndef yyoverflow
++ if (yyss != yyssa)
++ YYSTACK_FREE (yyss);
++#endif
++#if YYERROR_VERBOSE
++ if (yymsg != yymsgbuf)
++ YYSTACK_FREE (yymsg);
++#endif
++ /* Make sure YYID is used. */
++ return YYID (yyresult);
++}
++
++
++#line 308 "dtc-parser.y"
++
++
++void yyerror (char const *s)
++{
++ const char *fname = srcpos_filename_for_num(yylloc.filenum);
++
++ if (strcmp(fname, "-") == 0)
++ fname = "stdin";
++
++ fprintf(stderr, "%s:%d %s\n",
++ fname, yylloc.first_line, s);
++}
++
++unsigned long long eval_literal(const char *s, int base, int bits)
++{
++ unsigned long long val;
++ char *e;
++
++ errno = 0;
++ val = strtoull(s, &e, base);
++ if (*e)
++ yyerror("bad characters in literal");
++ else if ((errno == ERANGE)
++ || ((bits < 64) && (val >= (1ULL << bits))))
++ yyerror("literal out of range");
++ else if (errno != 0)
++ yyerror("bad literal");
++ return val;
++}
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,111 @@
++/* A Bison parser, made by GNU Bison 2.3. */
++
++/* Skeleton interface for Bison's Yacc-like parsers in C
++
++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
++ Free Software Foundation, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ Boston, MA 02110-1301, USA. */
++
++/* As a special exception, you may create a larger work that contains
++ part or all of the Bison parser skeleton and distribute that work
++ under terms of your choice, so long as that work isn't itself a
++ parser generator using the skeleton or a modified version thereof
++ as a parser skeleton. Alternatively, if you modify or redistribute
++ the parser skeleton itself, you may (at your option) remove this
++ special exception, which will cause the skeleton and the resulting
++ Bison output files to be licensed under the GNU General Public
++ License without this special exception.
++
++ This special exception was added by the Free Software Foundation in
++ version 2.2 of Bison. */
++
++/* Tokens. */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++ /* Put the tokens into the symbol table, so that GDB and other debuggers
++ know about them. */
++ enum yytokentype {
++ DT_V1 = 258,
++ DT_MEMRESERVE = 259,
++ DT_PROPNODENAME = 260,
++ DT_LITERAL = 261,
++ DT_LEGACYLITERAL = 262,
++ DT_BASE = 263,
++ DT_BYTE = 264,
++ DT_STRING = 265,
++ DT_LABEL = 266,
++ DT_REF = 267
++ };
++#endif
++/* Tokens. */
++#define DT_V1 258
++#define DT_MEMRESERVE 259
++#define DT_PROPNODENAME 260
++#define DT_LITERAL 261
++#define DT_LEGACYLITERAL 262
++#define DT_BASE 263
++#define DT_BYTE 264
++#define DT_STRING 265
++#define DT_LABEL 266
++#define DT_REF 267
++
++
++
++
++#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++typedef union YYSTYPE
++#line 34 "dtc-parser.y"
++{
++ char *propnodename;
++ char *literal;
++ char *labelref;
++ unsigned int cbase;
++ u8 byte;
++ struct data data;
++
++ u64 addr;
++ cell_t cell;
++ struct property *prop;
++ struct property *proplist;
++ struct node *node;
++ struct node *nodelist;
++ struct reserve_info *re;
++}
++/* Line 1489 of yacc.c. */
++#line 90 "dtc-parser.tab.h"
++ YYSTYPE;
++# define yystype YYSTYPE /* obsolescent; will be withdrawn */
++# define YYSTYPE_IS_DECLARED 1
++# define YYSTYPE_IS_TRIVIAL 1
++#endif
++
++extern YYSTYPE yylval;
++
++#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
++typedef struct YYLTYPE
++{
++ int first_line;
++ int first_column;
++ int last_line;
++ int last_column;
++} YYLTYPE;
++# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
++# define YYLTYPE_IS_DECLARED 1
++# define YYLTYPE_IS_TRIVIAL 1
++#endif
++
++extern YYLTYPE yylloc;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.y powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.y
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc-parser.y 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc-parser.y 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,336 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++%locations
++
++%{
++#include "dtc.h"
++#include "srcpos.h"
++
++int yylex(void);
++unsigned long long eval_literal(const char *s, int base, int bits);
++
++extern struct boot_info *the_boot_info;
++
++%}
++
++%union {
++ char *propnodename;
++ char *literal;
++ char *labelref;
++ unsigned int cbase;
++ u8 byte;
++ struct data data;
++
++ u64 addr;
++ cell_t cell;
++ struct property *prop;
++ struct property *proplist;
++ struct node *node;
++ struct node *nodelist;
++ struct reserve_info *re;
++}
++
++%token DT_V1
++%token DT_MEMRESERVE
++%token <propnodename> DT_PROPNODENAME
++%token <literal> DT_LITERAL
++%token <literal> DT_LEGACYLITERAL
++%token <cbase> DT_BASE
++%token <byte> DT_BYTE
++%token <data> DT_STRING
++%token <labelref> DT_LABEL
++%token <labelref> DT_REF
++
++%type <data> propdata
++%type <data> propdataprefix
++%type <re> memreserve
++%type <re> memreserves
++%type <re> v0_memreserve
++%type <re> v0_memreserves
++%type <addr> addr
++%type <data> celllist
++%type <cbase> cellbase
++%type <cell> cellval
++%type <data> bytestring
++%type <prop> propdef
++%type <proplist> proplist
++
++%type <node> devicetree
++%type <node> nodedef
++%type <node> subnode
++%type <nodelist> subnodes
++%type <labelref> label
++
++%%
++
++sourcefile:
++ DT_V1 ';' memreserves devicetree
++ {
++ the_boot_info = build_boot_info($3, $4);
++ }
++ | v0_memreserves devicetree
++ {
++ the_boot_info = build_boot_info($1, $2);
++ }
++ ;
++
++memreserves:
++ /* empty */
++ {
++ $$ = NULL;
++ }
++ | memreserve memreserves
++ {
++ $$ = chain_reserve_entry($1, $2);
++ }
++ ;
++
++memreserve:
++ label DT_MEMRESERVE addr addr ';'
++ {
++ $$ = build_reserve_entry($3, $4, $1);
++ }
++ ;
++
++v0_memreserves:
++ /* empty */
++ {
++ $$ = NULL;
++ }
++ | v0_memreserve v0_memreserves
++ {
++ $$ = chain_reserve_entry($1, $2);
++ };
++ ;
++
++v0_memreserve:
++ memreserve
++ {
++ $$ = $1;
++ }
++ | label DT_MEMRESERVE addr '-' addr ';'
++ {
++ $$ = build_reserve_entry($3, $5 - $3 + 1, $1);
++ }
++ ;
++
++addr:
++ DT_LITERAL
++ {
++ $$ = eval_literal($1, 0, 64);
++ }
++ | DT_LEGACYLITERAL
++ {
++ $$ = eval_literal($1, 16, 64);
++ }
++ ;
++
++devicetree:
++ '/' nodedef
++ {
++ $$ = name_node($2, "", NULL);
++ }
++ ;
++
++nodedef:
++ '{' proplist subnodes '}' ';'
++ {
++ $$ = build_node($2, $3);
++ }
++ ;
++
++proplist:
++ /* empty */
++ {
++ $$ = NULL;
++ }
++ | proplist propdef
++ {
++ $$ = chain_property($2, $1);
++ }
++ ;
++
++propdef:
++ label DT_PROPNODENAME '=' propdata ';'
++ {
++ $$ = build_property($2, $4, $1);
++ }
++ | label DT_PROPNODENAME ';'
++ {
++ $$ = build_property($2, empty_data, $1);
++ }
++ ;
++
++propdata:
++ propdataprefix DT_STRING
++ {
++ $$ = data_merge($1, $2);
++ }
++ | propdataprefix '<' celllist '>'
++ {
++ $$ = data_merge($1, $3);
++ }
++ | propdataprefix '[' bytestring ']'
++ {
++ $$ = data_merge($1, $3);
++ }
++ | propdataprefix DT_REF
++ {
++ $$ = data_add_marker($1, REF_PATH, $2);
++ }
++ | propdata DT_LABEL
++ {
++ $$ = data_add_marker($1, LABEL, $2);
++ }
++ ;
++
++propdataprefix:
++ /* empty */
++ {
++ $$ = empty_data;
++ }
++ | propdata ','
++ {
++ $$ = $1;
++ }
++ | propdataprefix DT_LABEL
++ {
++ $$ = data_add_marker($1, LABEL, $2);
++ }
++ ;
++
++celllist:
++ /* empty */
++ {
++ $$ = empty_data;
++ }
++ | celllist cellval
++ {
++ $$ = data_append_cell($1, $2);
++ }
++ | celllist DT_REF
++ {
++ $$ = data_append_cell(data_add_marker($1, REF_PHANDLE,
++ $2), -1);
++ }
++ | celllist DT_LABEL
++ {
++ $$ = data_add_marker($1, LABEL, $2);
++ }
++ ;
++
++cellbase:
++ /* empty */
++ {
++ $$ = 16;
++ }
++ | DT_BASE
++ ;
++
++cellval:
++ DT_LITERAL
++ {
++ $$ = eval_literal($1, 0, 32);
++ }
++ | cellbase DT_LEGACYLITERAL
++ {
++ $$ = eval_literal($2, $1, 32);
++ }
++ ;
++
++bytestring:
++ /* empty */
++ {
++ $$ = empty_data;
++ }
++ | bytestring DT_BYTE
++ {
++ $$ = data_append_byte($1, $2);
++ }
++ | bytestring DT_LABEL
++ {
++ $$ = data_add_marker($1, LABEL, $2);
++ }
++ ;
++
++subnodes:
++ /* empty */
++ {
++ $$ = NULL;
++ }
++ | subnode subnodes
++ {
++ $$ = chain_node($1, $2);
++ }
++ | subnode propdef
++ {
++ yyerror("syntax error: properties must precede subnodes\n");
++ YYERROR;
++ }
++ ;
++
++subnode:
++ label DT_PROPNODENAME nodedef
++ {
++ $$ = name_node($3, $2, $1);
++ }
++ ;
++
++label:
++ /* empty */
++ {
++ $$ = NULL;
++ }
++ | DT_LABEL
++ {
++ $$ = $1;
++ }
++ ;
++
++%%
++
++void yyerror (char const *s)
++{
++ const char *fname = srcpos_filename_for_num(yylloc.filenum);
++
++ if (strcmp(fname, "-") == 0)
++ fname = "stdin";
++
++ fprintf(stderr, "%s:%d %s\n",
++ fname, yylloc.first_line, s);
++}
++
++unsigned long long eval_literal(const char *s, int base, int bits)
++{
++ unsigned long long val;
++ char *e;
++
++ errno = 0;
++ val = strtoull(s, &e, base);
++ if (*e)
++ yyerror("bad characters in literal");
++ else if ((errno == ERANGE)
++ || ((bits < 64) && (val >= (1ULL << bits))))
++ yyerror("literal out of range");
++ else if (errno != 0)
++ yyerror("bad literal");
++ return val;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc.c powerpc.git/arch/powerpc/boot/dtc-src/dtc.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,231 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++#include "srcpos.h"
++
++#include "version_gen.h"
++
++/*
++ * Command line options
++ */
++int quiet; /* Level of quietness */
++int reservenum; /* Number of memory reservation slots */
++int minsize; /* Minimum blob size */
++int padsize; /* Additional padding to blob */
++
++char *join_path(const char *path, const char *name)
++{
++ int lenp = strlen(path);
++ int lenn = strlen(name);
++ int len;
++ int needslash = 1;
++ char *str;
++
++ len = lenp + lenn + 2;
++ if ((lenp > 0) && (path[lenp-1] == '/')) {
++ needslash = 0;
++ len--;
++ }
++
++ str = xmalloc(len);
++ memcpy(str, path, lenp);
++ if (needslash) {
++ str[lenp] = '/';
++ lenp++;
++ }
++ memcpy(str+lenp, name, lenn+1);
++ return str;
++}
++
++void fill_fullpaths(struct node *tree, const char *prefix)
++{
++ struct node *child;
++ const char *unit;
++
++ tree->fullpath = join_path(prefix, tree->name);
++
++ unit = strchr(tree->name, '@');
++ if (unit)
++ tree->basenamelen = unit - tree->name;
++ else
++ tree->basenamelen = strlen(tree->name);
++
++ for_each_child(tree, child)
++ fill_fullpaths(child, tree->fullpath);
++}
++
++static void __attribute__ ((noreturn)) usage(void)
++{
++ fprintf(stderr, "Usage:\n");
++ fprintf(stderr, "\tdtc [options] <input file>\n");
++ fprintf(stderr, "\nOptions:\n");
++ fprintf(stderr, "\t-h\n");
++ fprintf(stderr, "\t\tThis help text\n");
++ fprintf(stderr, "\t-q\n");
++ fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n");
++ fprintf(stderr, "\t-I <input format>\n");
++ fprintf(stderr, "\t\tInput formats are:\n");
++ fprintf(stderr, "\t\t\tdts - device tree source text\n");
++ fprintf(stderr, "\t\t\tdtb - device tree blob\n");
++ fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n");
++ fprintf(stderr, "\t-o <output file>\n");
++ fprintf(stderr, "\t-O <output format>\n");
++ fprintf(stderr, "\t\tOutput formats are:\n");
++ fprintf(stderr, "\t\t\tdts - device tree source text\n");
++ fprintf(stderr, "\t\t\tdtb - device tree blob\n");
++ fprintf(stderr, "\t\t\tasm - assembler source\n");
++ fprintf(stderr, "\t-V <output version>\n");
++ fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
++ fprintf(stderr, "\t-R <number>\n");
++ fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
++ fprintf(stderr, "\t-S <bytes>\n");
++ fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)\n");
++ fprintf(stderr, "\t-p <bytes>\n");
++ fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)\n");
++ fprintf(stderr, "\t-b <number>\n");
++ fprintf(stderr, "\t\tSet the physical boot cpu\n");
++ fprintf(stderr, "\t-f\n");
++ fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
++ fprintf(stderr, "\t-v\n");
++ fprintf(stderr, "\t\tPrint DTC version and exit\n");
++ exit(2);
++}
++
++int main(int argc, char *argv[])
++{
++ struct boot_info *bi;
++ const char *inform = "dts";
++ const char *outform = "dts";
++ const char *outname = "-";
++ int force = 0, check = 0;
++ const char *arg;
++ int opt;
++ FILE *inf = NULL;
++ FILE *outf = NULL;
++ int outversion = DEFAULT_FDT_VERSION;
++ int boot_cpuid_phys = 0xfeedbeef;
++
++ quiet = 0;
++ reservenum = 0;
++ minsize = 0;
++ padsize = 0;
++
++ while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) {
++ switch (opt) {
++ case 'I':
++ inform = optarg;
++ break;
++ case 'O':
++ outform = optarg;
++ break;
++ case 'o':
++ outname = optarg;
++ break;
++ case 'V':
++ outversion = strtol(optarg, NULL, 0);
++ break;
++ case 'R':
++ reservenum = strtol(optarg, NULL, 0);
++ break;
++ case 'S':
++ minsize = strtol(optarg, NULL, 0);
++ break;
++ case 'p':
++ padsize = strtol(optarg, NULL, 0);
++ break;
++ case 'f':
++ force = 1;
++ break;
++ case 'c':
++ check = 1;
++ break;
++ case 'q':
++ quiet++;
++ break;
++ case 'b':
++ boot_cpuid_phys = strtol(optarg, NULL, 0);
++ break;
++ case 'v':
++ printf("Version: %s\n", DTC_VERSION);
++ exit(0);
++ case 'h':
++ default:
++ usage();
++ }
++ }
++
++ if (argc > (optind+1))
++ usage();
++ else if (argc < (optind+1))
++ arg = "-";
++ else
++ arg = argv[optind];
++
++ /* minsize and padsize are mutually exclusive */
++ if ((minsize) && (padsize)) {
++ die("Can't set both -p and -S\n");
++ }
++
++ fprintf(stderr, "DTC: %s->%s on file \"%s\"\n",
++ inform, outform, arg);
++
++ if (streq(inform, "dts")) {
++ bi = dt_from_source(arg);
++ } else if (streq(inform, "fs")) {
++ bi = dt_from_fs(arg);
++ } else if(streq(inform, "dtb")) {
++ inf = dtc_open_file(arg);
++ bi = dt_from_blob(inf);
++ } else {
++ die("Unknown input format \"%s\"\n", inform);
++ }
++
++ if (inf && (inf != stdin))
++ fclose(inf);
++
++ if (! bi || ! bi->dt)
++ die("Couldn't read input tree\n");
++
++ process_checks(force, bi, check, outversion, boot_cpuid_phys);
++
++ if (streq(outname, "-")) {
++ outf = stdout;
++ } else {
++ outf = fopen(outname, "w");
++ if (! outf)
++ die("Couldn't open output file %s: %s\n",
++ outname, strerror(errno));
++ }
++
++ if (streq(outform, "dts")) {
++ dt_to_source(outf, bi);
++ } else if (streq(outform, "dtb")) {
++ dt_to_blob(outf, bi, outversion, boot_cpuid_phys);
++ } else if (streq(outform, "asm")) {
++ dt_to_asm(outf, bi, outversion, boot_cpuid_phys);
++ } else if (streq(outform, "null")) {
++ /* do nothing */
++ } else {
++ die("Unknown output format \"%s\"\n", outform);
++ }
++
++ exit(0);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/dtc.h powerpc.git/arch/powerpc/boot/dtc-src/dtc.h
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/dtc.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/dtc.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,269 @@
++#ifndef _DTC_H
++#define _DTC_H
++
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <stdint.h>
++#include <stdarg.h>
++#include <assert.h>
++#include <ctype.h>
++#include <errno.h>
++#include <unistd.h>
++#include <netinet/in.h>
++#include <endian.h>
++#include <byteswap.h>
++
++#include <fdt.h>
++
++#define DEFAULT_FDT_VERSION 17
++/*
++ * Command line options
++ */
++extern int quiet; /* Level of quietness */
++extern int reservenum; /* Number of memory reservation slots */
++extern int minsize; /* Minimum blob size */
++extern int padsize; /* Additional padding to blob */
++
++static inline void __attribute__((noreturn)) die(char * str, ...)
++{
++ va_list ap;
++
++ va_start(ap, str);
++ fprintf(stderr, "FATAL ERROR: ");
++ vfprintf(stderr, str, ap);
++ exit(1);
++}
++
++static inline void *xmalloc(size_t len)
++{
++ void *new = malloc(len);
++
++ if (! new)
++ die("malloc() failed\n");
++
++ return new;
++}
++
++static inline void *xrealloc(void *p, size_t len)
++{
++ void *new = realloc(p, len);
++
++ if (! new)
++ die("realloc() failed (len=%d)\n", len);
++
++ return new;
++}
++
++typedef uint8_t u8;
++typedef uint16_t u16;
++typedef uint32_t u32;
++typedef uint64_t u64;
++typedef u32 cell_t;
++
++#define cpu_to_be16(x) htons(x)
++#define be16_to_cpu(x) ntohs(x)
++
++#define cpu_to_be32(x) htonl(x)
++#define be32_to_cpu(x) ntohl(x)
++
++#if __BYTE_ORDER == __BIG_ENDIAN
++#define cpu_to_be64(x) (x)
++#define be64_to_cpu(x) (x)
++#else
++#define cpu_to_be64(x) bswap_64(x)
++#define be64_to_cpu(x) bswap_64(x)
++#endif
++
++#define streq(a, b) (strcmp((a), (b)) == 0)
++#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
++
++#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
++
++/* Data blobs */
++enum markertype {
++ REF_PHANDLE,
++ REF_PATH,
++ LABEL,
++};
++
++struct marker {
++ enum markertype type;
++ int offset;
++ char *ref;
++ struct marker *next;
++};
++
++struct data {
++ int len;
++ char *val;
++ int asize;
++ struct marker *markers;
++};
++
++
++#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
++
++#define for_each_marker(m) \
++ for (; (m); (m) = (m)->next)
++#define for_each_marker_of_type(m, t) \
++ for_each_marker(m) \
++ if ((m)->type == (t))
++
++void data_free(struct data d);
++
++struct data data_grow_for(struct data d, int xlen);
++
++struct data data_copy_mem(const char *mem, int len);
++struct data data_copy_escape_string(const char *s, int len);
++struct data data_copy_file(FILE *f, size_t len);
++
++struct data data_append_data(struct data d, const void *p, int len);
++struct data data_insert_at_marker(struct data d, struct marker *m,
++ const void *p, int len);
++struct data data_merge(struct data d1, struct data d2);
++struct data data_append_cell(struct data d, cell_t word);
++struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
++struct data data_append_addr(struct data d, u64 addr);
++struct data data_append_byte(struct data d, uint8_t byte);
++struct data data_append_zeroes(struct data d, int len);
++struct data data_append_align(struct data d, int align);
++
++struct data data_add_marker(struct data d, enum markertype type, char *ref);
++
++int data_is_one_string(struct data d);
++
++/* DT constraints */
++
++#define MAX_PROPNAME_LEN 31
++#define MAX_NODENAME_LEN 31
++
++/* Live trees */
++struct property {
++ char *name;
++ struct data val;
++
++ struct property *next;
++
++ char *label;
++};
++
++struct node {
++ char *name;
++ struct property *proplist;
++ struct node *children;
++
++ struct node *parent;
++ struct node *next_sibling;
++
++ char *fullpath;
++ int basenamelen;
++
++ cell_t phandle;
++ int addr_cells, size_cells;
++
++ char *label;
++};
++
++#define for_each_property(n, p) \
++ for ((p) = (n)->proplist; (p); (p) = (p)->next)
++
++#define for_each_child(n, c) \
++ for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
++
++struct property *build_property(char *name, struct data val, char *label);
++struct property *chain_property(struct property *first, struct property *list);
++struct property *reverse_properties(struct property *first);
++
++struct node *build_node(struct property *proplist, struct node *children);
++struct node *name_node(struct node *node, char *name, char *label);
++struct node *chain_node(struct node *first, struct node *list);
++
++void add_property(struct node *node, struct property *prop);
++void add_child(struct node *parent, struct node *child);
++
++const char *get_unitname(struct node *node);
++struct property *get_property(struct node *node, const char *propname);
++cell_t propval_cell(struct property *prop);
++struct node *get_subnode(struct node *node, const char *nodename);
++struct node *get_node_by_path(struct node *tree, const char *path);
++struct node *get_node_by_label(struct node *tree, const char *label);
++struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
++struct node *get_node_by_ref(struct node *tree, const char *ref);
++cell_t get_node_phandle(struct node *root, struct node *node);
++
++/* Boot info (tree plus memreserve information */
++
++struct reserve_info {
++ struct fdt_reserve_entry re;
++
++ struct reserve_info *next;
++
++ char *label;
++};
++
++struct reserve_info *build_reserve_entry(u64 start, u64 len, char *label);
++struct reserve_info *chain_reserve_entry(struct reserve_info *first,
++ struct reserve_info *list);
++struct reserve_info *add_reserve_entry(struct reserve_info *list,
++ struct reserve_info *new);
++
++
++struct boot_info {
++ struct reserve_info *reservelist;
++ struct node *dt; /* the device tree */
++};
++
++struct boot_info *build_boot_info(struct reserve_info *reservelist,
++ struct node *tree);
++
++/* Checks */
++
++void process_checks(int force, struct boot_info *bi,
++ int checkflag, int outversion, int boot_cpuid_phys);
++
++/* Flattened trees */
++
++void dt_to_blob(FILE *f, struct boot_info *bi, int version,
++ int boot_cpuid_phys);
++void dt_to_asm(FILE *f, struct boot_info *bi, int version,
++ int boot_cpuid_phys);
++
++struct boot_info *dt_from_blob(FILE *f);
++
++/* Tree source */
++
++void dt_to_source(FILE *f, struct boot_info *bi);
++struct boot_info *dt_from_source(const char *f);
++
++/* FS trees */
++
++struct boot_info *dt_from_fs(const char *dirname);
++
++/* misc */
++
++char *join_path(const char *path, const char *name);
++void fill_fullpaths(struct node *tree, const char *prefix);
++
++#endif /* _DTC_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/flattree.c powerpc.git/arch/powerpc/boot/dtc-src/flattree.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/flattree.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/flattree.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,968 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++
++#define FTF_FULLPATH 0x1
++#define FTF_VARALIGN 0x2
++#define FTF_NAMEPROPS 0x4
++#define FTF_BOOTCPUID 0x8
++#define FTF_STRTABSIZE 0x10
++#define FTF_STRUCTSIZE 0x20
++#define FTF_NOPS 0x40
++
++static struct version_info {
++ int version;
++ int last_comp_version;
++ int hdr_size;
++ int flags;
++} version_table[] = {
++ {1, 1, FDT_V1_SIZE,
++ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS},
++ {2, 1, FDT_V2_SIZE,
++ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID},
++ {3, 1, FDT_V3_SIZE,
++ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE},
++ {16, 16, FDT_V3_SIZE,
++ FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS},
++ {17, 16, FDT_V17_SIZE,
++ FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS},
++};
++
++struct emitter {
++ void (*cell)(void *, cell_t);
++ void (*string)(void *, char *, int);
++ void (*align)(void *, int);
++ void (*data)(void *, struct data);
++ void (*beginnode)(void *, const char *);
++ void (*endnode)(void *, const char *);
++ void (*property)(void *, const char *);
++};
++
++static void bin_emit_cell(void *e, cell_t val)
++{
++ struct data *dtbuf = e;
++
++ *dtbuf = data_append_cell(*dtbuf, val);
++}
++
++static void bin_emit_string(void *e, char *str, int len)
++{
++ struct data *dtbuf = e;
++
++ if (len == 0)
++ len = strlen(str);
++
++ *dtbuf = data_append_data(*dtbuf, str, len);
++ *dtbuf = data_append_byte(*dtbuf, '\0');
++}
++
++static void bin_emit_align(void *e, int a)
++{
++ struct data *dtbuf = e;
++
++ *dtbuf = data_append_align(*dtbuf, a);
++}
++
++static void bin_emit_data(void *e, struct data d)
++{
++ struct data *dtbuf = e;
++
++ *dtbuf = data_append_data(*dtbuf, d.val, d.len);
++}
++
++static void bin_emit_beginnode(void *e, const char *label)
++{
++ bin_emit_cell(e, FDT_BEGIN_NODE);
++}
++
++static void bin_emit_endnode(void *e, const char *label)
++{
++ bin_emit_cell(e, FDT_END_NODE);
++}
++
++static void bin_emit_property(void *e, const char *label)
++{
++ bin_emit_cell(e, FDT_PROP);
++}
++
++static struct emitter bin_emitter = {
++ .cell = bin_emit_cell,
++ .string = bin_emit_string,
++ .align = bin_emit_align,
++ .data = bin_emit_data,
++ .beginnode = bin_emit_beginnode,
++ .endnode = bin_emit_endnode,
++ .property = bin_emit_property,
++};
++
++static void emit_label(FILE *f, const char *prefix, const char *label)
++{
++ fprintf(f, "\t.globl\t%s_%s\n", prefix, label);
++ fprintf(f, "%s_%s:\n", prefix, label);
++ fprintf(f, "_%s_%s:\n", prefix, label);
++}
++
++static void emit_offset_label(FILE *f, const char *label, int offset)
++{
++ fprintf(f, "\t.globl\t%s\n", label);
++ fprintf(f, "%s\t= . + %d\n", label, offset);
++}
++
++static void asm_emit_cell(void *e, cell_t val)
++{
++ FILE *f = e;
++
++ fprintf(f, "\t.long\t0x%x\n", val);
++}
++
++static void asm_emit_string(void *e, char *str, int len)
++{
++ FILE *f = e;
++ char c = 0;
++
++ if (len != 0) {
++ /* XXX: ewww */
++ c = str[len];
++ str[len] = '\0';
++ }
++
++ fprintf(f, "\t.string\t\"%s\"\n", str);
++
++ if (len != 0) {
++ str[len] = c;
++ }
++}
++
++static void asm_emit_align(void *e, int a)
++{
++ FILE *f = e;
++
++ fprintf(f, "\t.balign\t%d\n", a);
++}
++
++static void asm_emit_data(void *e, struct data d)
++{
++ FILE *f = e;
++ int off = 0;
++ struct marker *m;
++
++ m = d.markers;
++ while (m) {
++ if (m->type == LABEL)
++ emit_offset_label(f, m->ref, m->offset);
++ m = m->next;
++ }
++
++ while ((d.len - off) >= sizeof(u32)) {
++ fprintf(f, "\t.long\t0x%x\n",
++ be32_to_cpu(*((u32 *)(d.val+off))));
++ off += sizeof(u32);
++ }
++
++ if ((d.len - off) >= sizeof(u16)) {
++ fprintf(f, "\t.short\t0x%hx\n",
++ be16_to_cpu(*((u16 *)(d.val+off))));
++ off += sizeof(u16);
++ }
++
++ if ((d.len - off) >= 1) {
++ fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]);
++ off += 1;
++ }
++
++ assert(off == d.len);
++}
++
++static void asm_emit_beginnode(void *e, const char *label)
++{
++ FILE *f = e;
++
++ if (label) {
++ fprintf(f, "\t.globl\t%s\n", label);
++ fprintf(f, "%s:\n", label);
++ }
++ fprintf(f, "\t.long\tFDT_BEGIN_NODE\n");
++}
++
++static void asm_emit_endnode(void *e, const char *label)
++{
++ FILE *f = e;
++
++ fprintf(f, "\t.long\tFDT_END_NODE\n");
++ if (label) {
++ fprintf(f, "\t.globl\t%s_end\n", label);
++ fprintf(f, "%s_end:\n", label);
++ }
++}
++
++static void asm_emit_property(void *e, const char *label)
++{
++ FILE *f = e;
++
++ if (label) {
++ fprintf(f, "\t.globl\t%s\n", label);
++ fprintf(f, "%s:\n", label);
++ }
++ fprintf(f, "\t.long\tFDT_PROP\n");
++}
++
++static struct emitter asm_emitter = {
++ .cell = asm_emit_cell,
++ .string = asm_emit_string,
++ .align = asm_emit_align,
++ .data = asm_emit_data,
++ .beginnode = asm_emit_beginnode,
++ .endnode = asm_emit_endnode,
++ .property = asm_emit_property,
++};
++
++static int stringtable_insert(struct data *d, const char *str)
++{
++ int i;
++
++ /* FIXME: do this more efficiently? */
++
++ for (i = 0; i < d->len; i++) {
++ if (streq(str, d->val + i))
++ return i;
++ }
++
++ *d = data_append_data(*d, str, strlen(str)+1);
++ return i;
++}
++
++static void flatten_tree(struct node *tree, struct emitter *emit,
++ void *etarget, struct data *strbuf,
++ struct version_info *vi)
++{
++ struct property *prop;
++ struct node *child;
++ int seen_name_prop = 0;
++
++ emit->beginnode(etarget, tree->label);
++
++ if (vi->flags & FTF_FULLPATH)
++ emit->string(etarget, tree->fullpath, 0);
++ else
++ emit->string(etarget, tree->name, 0);
++
++ emit->align(etarget, sizeof(cell_t));
++
++ for_each_property(tree, prop) {
++ int nameoff;
++
++ if (streq(prop->name, "name"))
++ seen_name_prop = 1;
++
++ nameoff = stringtable_insert(strbuf, prop->name);
++
++ emit->property(etarget, prop->label);
++ emit->cell(etarget, prop->val.len);
++ emit->cell(etarget, nameoff);
++
++ if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8))
++ emit->align(etarget, 8);
++
++ emit->data(etarget, prop->val);
++ emit->align(etarget, sizeof(cell_t));
++ }
++
++ if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) {
++ emit->property(etarget, NULL);
++ emit->cell(etarget, tree->basenamelen+1);
++ emit->cell(etarget, stringtable_insert(strbuf, "name"));
++
++ if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8))
++ emit->align(etarget, 8);
++
++ emit->string(etarget, tree->name, tree->basenamelen);
++ emit->align(etarget, sizeof(cell_t));
++ }
++
++ for_each_child(tree, child) {
++ flatten_tree(child, emit, etarget, strbuf, vi);
++ }
++
++ emit->endnode(etarget, tree->label);
++}
++
++static struct data flatten_reserve_list(struct reserve_info *reservelist,
++ struct version_info *vi)
++{
++ struct reserve_info *re;
++ struct data d = empty_data;
++ static struct fdt_reserve_entry null_re = {0,0};
++ int j;
++
++ for (re = reservelist; re; re = re->next) {
++ d = data_append_re(d, &re->re);
++ }
++ /*
++ * Add additional reserved slots if the user asked for them.
++ */
++ for (j = 0; j < reservenum; j++) {
++ d = data_append_re(d, &null_re);
++ }
++
++ return d;
++}
++
++static void make_fdt_header(struct fdt_header *fdt,
++ struct version_info *vi,
++ int reservesize, int dtsize, int strsize,
++ int boot_cpuid_phys)
++{
++ int reserve_off;
++
++ reservesize += sizeof(struct fdt_reserve_entry);
++
++ memset(fdt, 0xff, sizeof(*fdt));
++
++ fdt->magic = cpu_to_be32(FDT_MAGIC);
++ fdt->version = cpu_to_be32(vi->version);
++ fdt->last_comp_version = cpu_to_be32(vi->last_comp_version);
++
++ /* Reserve map should be doubleword aligned */
++ reserve_off = ALIGN(vi->hdr_size, 8);
++
++ fdt->off_mem_rsvmap = cpu_to_be32(reserve_off);
++ fdt->off_dt_struct = cpu_to_be32(reserve_off + reservesize);
++ fdt->off_dt_strings = cpu_to_be32(reserve_off + reservesize
++ + dtsize);
++ fdt->totalsize = cpu_to_be32(reserve_off + reservesize + dtsize + strsize);
++
++ if (vi->flags & FTF_BOOTCPUID)
++ fdt->boot_cpuid_phys = cpu_to_be32(boot_cpuid_phys);
++ if (vi->flags & FTF_STRTABSIZE)
++ fdt->size_dt_strings = cpu_to_be32(strsize);
++ if (vi->flags & FTF_STRUCTSIZE)
++ fdt->size_dt_struct = cpu_to_be32(dtsize);
++}
++
++void dt_to_blob(FILE *f, struct boot_info *bi, int version,
++ int boot_cpuid_phys)
++{
++ struct version_info *vi = NULL;
++ int i;
++ struct data blob = empty_data;
++ struct data reservebuf = empty_data;
++ struct data dtbuf = empty_data;
++ struct data strbuf = empty_data;
++ struct fdt_header fdt;
++ int padlen = 0;
++
++ for (i = 0; i < ARRAY_SIZE(version_table); i++) {
++ if (version_table[i].version == version)
++ vi = &version_table[i];
++ }
++ if (!vi)
++ die("Unknown device tree blob version %d\n", version);
++
++ flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
++ bin_emit_cell(&dtbuf, FDT_END);
++
++ reservebuf = flatten_reserve_list(bi->reservelist, vi);
++
++ /* Make header */
++ make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
++ boot_cpuid_phys);
++
++ /*
++ * If the user asked for more space than is used, adjust the totalsize.
++ */
++ if (minsize > 0) {
++ padlen = minsize - be32_to_cpu(fdt.totalsize);
++ if ((padlen < 0) && (quiet < 1))
++ fprintf(stderr,
++ "Warning: blob size %d >= minimum size %d\n",
++ be32_to_cpu(fdt.totalsize), minsize);
++ }
++
++ if (padsize > 0)
++ padlen = padsize;
++
++ if (padlen > 0) {
++ int tsize = be32_to_cpu(fdt.totalsize);
++ tsize += padlen;
++ fdt.totalsize = cpu_to_be32(tsize);
++ }
++
++ /*
++ * Assemble the blob: start with the header, add with alignment
++ * the reserve buffer, add the reserve map terminating zeroes,
++ * the device tree itself, and finally the strings.
++ */
++ blob = data_append_data(blob, &fdt, sizeof(fdt));
++ blob = data_append_align(blob, 8);
++ blob = data_merge(blob, reservebuf);
++ blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
++ blob = data_merge(blob, dtbuf);
++ blob = data_merge(blob, strbuf);
++
++ /*
++ * If the user asked for more space than is used, pad out the blob.
++ */
++ if (padlen > 0)
++ blob = data_append_zeroes(blob, padlen);
++
++ fwrite(blob.val, blob.len, 1, f);
++
++ if (ferror(f))
++ die("Error writing device tree blob: %s\n", strerror(errno));
++
++ /*
++ * data_merge() frees the right-hand element so only the blob
++ * remains to be freed.
++ */
++ data_free(blob);
++}
++
++static void dump_stringtable_asm(FILE *f, struct data strbuf)
++{
++ const char *p;
++ int len;
++
++ p = strbuf.val;
++
++ while (p < (strbuf.val + strbuf.len)) {
++ len = strlen(p);
++ fprintf(f, "\t.string \"%s\"\n", p);
++ p += len+1;
++ }
++}
++
++void dt_to_asm(FILE *f, struct boot_info *bi, int version, int boot_cpuid_phys)
++{
++ struct version_info *vi = NULL;
++ int i;
++ struct data strbuf = empty_data;
++ struct reserve_info *re;
++ const char *symprefix = "dt";
++
++ for (i = 0; i < ARRAY_SIZE(version_table); i++) {
++ if (version_table[i].version == version)
++ vi = &version_table[i];
++ }
++ if (!vi)
++ die("Unknown device tree blob version %d\n", version);
++
++ fprintf(f, "/* autogenerated by dtc, do not edit */\n\n");
++ fprintf(f, "#define FDT_MAGIC 0x%x\n", FDT_MAGIC);
++ fprintf(f, "#define FDT_BEGIN_NODE 0x%x\n", FDT_BEGIN_NODE);
++ fprintf(f, "#define FDT_END_NODE 0x%x\n", FDT_END_NODE);
++ fprintf(f, "#define FDT_PROP 0x%x\n", FDT_PROP);
++ fprintf(f, "#define FDT_END 0x%x\n", FDT_END);
++ fprintf(f, "\n");
++
++ emit_label(f, symprefix, "blob_start");
++ emit_label(f, symprefix, "header");
++ fprintf(f, "\t.long\tFDT_MAGIC\t\t\t\t/* magic */\n");
++ fprintf(f, "\t.long\t_%s_blob_abs_end - _%s_blob_start\t/* totalsize */\n",
++ symprefix, symprefix);
++ fprintf(f, "\t.long\t_%s_struct_start - _%s_blob_start\t/* off_dt_struct */\n",
++ symprefix, symprefix);
++ fprintf(f, "\t.long\t_%s_strings_start - _%s_blob_start\t/* off_dt_strings */\n",
++ symprefix, symprefix);
++ fprintf(f, "\t.long\t_%s_reserve_map - _%s_blob_start\t/* off_dt_strings */\n",
++ symprefix, symprefix);
++ fprintf(f, "\t.long\t%d\t\t\t\t\t/* version */\n", vi->version);
++ fprintf(f, "\t.long\t%d\t\t\t\t\t/* last_comp_version */\n",
++ vi->last_comp_version);
++
++ if (vi->flags & FTF_BOOTCPUID)
++ fprintf(f, "\t.long\t%i\t\t\t\t\t/* boot_cpuid_phys */\n",
++ boot_cpuid_phys);
++
++ if (vi->flags & FTF_STRTABSIZE)
++ fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n",
++ symprefix, symprefix);
++
++ if (vi->flags & FTF_STRUCTSIZE)
++ fprintf(f, "\t.long\t_%s_struct_end - _%s_struct_start\t/* size_dt_struct */\n",
++ symprefix, symprefix);
++
++ /*
++ * Reserve map entries.
++ * Align the reserve map to a doubleword boundary.
++ * Each entry is an (address, size) pair of u64 values.
++ * Always supply a zero-sized temination entry.
++ */
++ asm_emit_align(f, 8);
++ emit_label(f, symprefix, "reserve_map");
++
++ fprintf(f, "/* Memory reserve map from source file */\n");
++
++ /*
++ * Use .long on high and low halfs of u64s to avoid .quad
++ * as it appears .quad isn't available in some assemblers.
++ */
++ for (re = bi->reservelist; re; re = re->next) {
++ if (re->label) {
++ fprintf(f, "\t.globl\t%s\n", re->label);
++ fprintf(f, "%s:\n", re->label);
++ }
++ fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
++ (unsigned int)(re->re.address >> 32),
++ (unsigned int)(re->re.address & 0xffffffff));
++ fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
++ (unsigned int)(re->re.size >> 32),
++ (unsigned int)(re->re.size & 0xffffffff));
++ }
++ for (i = 0; i < reservenum; i++) {
++ fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
++ }
++
++ fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
++
++ emit_label(f, symprefix, "struct_start");
++ flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
++ fprintf(f, "\t.long\tFDT_END\n");
++ emit_label(f, symprefix, "struct_end");
++
++ emit_label(f, symprefix, "strings_start");
++ dump_stringtable_asm(f, strbuf);
++ emit_label(f, symprefix, "strings_end");
++
++ emit_label(f, symprefix, "blob_end");
++
++ /*
++ * If the user asked for more space than is used, pad it out.
++ */
++ if (minsize > 0) {
++ fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n",
++ minsize, symprefix, symprefix);
++ }
++ if (padsize > 0) {
++ fprintf(f, "\t.space\t%d, 0\n", padsize);
++ }
++ emit_label(f, symprefix, "blob_abs_end");
++
++ data_free(strbuf);
++}
++
++struct inbuf {
++ char *base, *limit, *ptr;
++};
++
++static void inbuf_init(struct inbuf *inb, void *base, void *limit)
++{
++ inb->base = base;
++ inb->limit = limit;
++ inb->ptr = inb->base;
++}
++
++static void flat_read_chunk(struct inbuf *inb, void *p, int len)
++{
++ if ((inb->ptr + len) > inb->limit)
++ die("Premature end of data parsing flat device tree\n");
++
++ memcpy(p, inb->ptr, len);
++
++ inb->ptr += len;
++}
++
++static u32 flat_read_word(struct inbuf *inb)
++{
++ u32 val;
++
++ assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
++
++ flat_read_chunk(inb, &val, sizeof(val));
++
++ return be32_to_cpu(val);
++}
++
++static void flat_realign(struct inbuf *inb, int align)
++{
++ int off = inb->ptr - inb->base;
++
++ inb->ptr = inb->base + ALIGN(off, align);
++ if (inb->ptr > inb->limit)
++ die("Premature end of data parsing flat device tree\n");
++}
++
++static char *flat_read_string(struct inbuf *inb)
++{
++ int len = 0;
++ const char *p = inb->ptr;
++ char *str;
++
++ do {
++ if (p >= inb->limit)
++ die("Premature end of data parsing flat device tree\n");
++ len++;
++ } while ((*p++) != '\0');
++
++ str = strdup(inb->ptr);
++
++ inb->ptr += len;
++
++ flat_realign(inb, sizeof(u32));
++
++ return str;
++}
++
++static struct data flat_read_data(struct inbuf *inb, int len)
++{
++ struct data d = empty_data;
++
++ if (len == 0)
++ return empty_data;
++
++ d = data_grow_for(d, len);
++ d.len = len;
++
++ flat_read_chunk(inb, d.val, len);
++
++ flat_realign(inb, sizeof(u32));
++
++ return d;
++}
++
++static char *flat_read_stringtable(struct inbuf *inb, int offset)
++{
++ const char *p;
++
++ p = inb->base + offset;
++ while (1) {
++ if (p >= inb->limit || p < inb->base)
++ die("String offset %d overruns string table\n",
++ offset);
++
++ if (*p == '\0')
++ break;
++
++ p++;
++ }
++
++ return strdup(inb->base + offset);
++}
++
++static struct property *flat_read_property(struct inbuf *dtbuf,
++ struct inbuf *strbuf, int flags)
++{
++ u32 proplen, stroff;
++ char *name;
++ struct data val;
++
++ proplen = flat_read_word(dtbuf);
++ stroff = flat_read_word(dtbuf);
++
++ name = flat_read_stringtable(strbuf, stroff);
++
++ if ((flags & FTF_VARALIGN) && (proplen >= 8))
++ flat_realign(dtbuf, 8);
++
++ val = flat_read_data(dtbuf, proplen);
++
++ return build_property(name, val, NULL);
++}
++
++
++static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
++{
++ struct reserve_info *reservelist = NULL;
++ struct reserve_info *new;
++ const char *p;
++ struct fdt_reserve_entry re;
++
++ /*
++ * Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
++ * List terminates at an entry with size equal to zero.
++ *
++ * First pass, count entries.
++ */
++ p = inb->ptr;
++ while (1) {
++ flat_read_chunk(inb, &re, sizeof(re));
++ re.address = be64_to_cpu(re.address);
++ re.size = be64_to_cpu(re.size);
++ if (re.size == 0)
++ break;
++
++ new = build_reserve_entry(re.address, re.size, NULL);
++ reservelist = add_reserve_entry(reservelist, new);
++ }
++
++ return reservelist;
++}
++
++
++static char *nodename_from_path(const char *ppath, const char *cpath)
++{
++ const char *lslash;
++ int plen;
++
++ lslash = strrchr(cpath, '/');
++ if (! lslash)
++ return NULL;
++
++ plen = lslash - cpath;
++
++ if (streq(cpath, "/") && streq(ppath, ""))
++ return "";
++
++ if ((plen == 0) && streq(ppath, "/"))
++ return strdup(lslash+1);
++
++ if (! strneq(ppath, cpath, plen))
++ return NULL;
++
++ return strdup(lslash+1);
++}
++
++static const char PROPCHAR[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,._+*#?-";
++static const char UNITCHAR[] = "0123456789abcdef,";
++
++static int check_node_name(const char *name)
++{
++ const char *atpos;
++ int basenamelen;
++
++ atpos = strrchr(name, '@');
++
++ if (atpos)
++ basenamelen = atpos - name;
++ else
++ basenamelen = strlen(name);
++
++ if (strspn(name, PROPCHAR) < basenamelen)
++ return -1;
++
++ if (atpos
++ && ((basenamelen + 1 + strspn(atpos+1, UNITCHAR)) < strlen(name)))
++ return -1;
++
++ return basenamelen;
++}
++
++static struct node *unflatten_tree(struct inbuf *dtbuf,
++ struct inbuf *strbuf,
++ const char *parent_path, int flags)
++{
++ struct node *node;
++ u32 val;
++
++ node = build_node(NULL, NULL);
++
++ if (flags & FTF_FULLPATH) {
++ node->fullpath = flat_read_string(dtbuf);
++ node->name = nodename_from_path(parent_path, node->fullpath);
++
++ if (! node->name)
++ die("Path \"%s\" is not valid as a child of \"%s\"\n",
++ node->fullpath, parent_path);
++ } else {
++ node->name = flat_read_string(dtbuf);
++ node->fullpath = join_path(parent_path, node->name);
++ }
++
++ node->basenamelen = check_node_name(node->name);
++ if (node->basenamelen < 0) {
++ fprintf(stderr, "Warning \"%s\" has incorrect format\n", node->name);
++ }
++
++ do {
++ struct property *prop;
++ struct node *child;
++
++ val = flat_read_word(dtbuf);
++ switch (val) {
++ case FDT_PROP:
++ if (node->children)
++ fprintf(stderr, "Warning: Flat tree input has "
++ "subnodes preceding a property.\n");
++ prop = flat_read_property(dtbuf, strbuf, flags);
++ add_property(node, prop);
++ break;
++
++ case FDT_BEGIN_NODE:
++ child = unflatten_tree(dtbuf,strbuf, node->fullpath,
++ flags);
++ add_child(node, child);
++ break;
++
++ case FDT_END_NODE:
++ break;
++
++ case FDT_END:
++ die("Premature FDT_END in device tree blob\n");
++ break;
++
++ case FDT_NOP:
++ if (!(flags & FTF_NOPS))
++ fprintf(stderr, "Warning: NOP tag found in flat tree"
++ " version <16\n");
++
++ /* Ignore */
++ break;
++
++ default:
++ die("Invalid opcode word %08x in device tree blob\n",
++ val);
++ }
++ } while (val != FDT_END_NODE);
++
++ return node;
++}
++
++
++struct boot_info *dt_from_blob(FILE *f)
++{
++ u32 magic, totalsize, version, size_str, size_dt;
++ u32 off_dt, off_str, off_mem_rsvmap;
++ int rc;
++ char *blob;
++ struct fdt_header *fdt;
++ char *p;
++ struct inbuf dtbuf, strbuf;
++ struct inbuf memresvbuf;
++ int sizeleft;
++ struct reserve_info *reservelist;
++ struct node *tree;
++ u32 val;
++ int flags = 0;
++
++ rc = fread(&magic, sizeof(magic), 1, f);
++ if (ferror(f))
++ die("Error reading DT blob magic number: %s\n",
++ strerror(errno));
++ if (rc < 1) {
++ if (feof(f))
++ die("EOF reading DT blob magic number\n");
++ else
++ die("Mysterious short read reading magic number\n");
++ }
++
++ magic = be32_to_cpu(magic);
++ if (magic != FDT_MAGIC)
++ die("Blob has incorrect magic number\n");
++
++ rc = fread(&totalsize, sizeof(totalsize), 1, f);
++ if (ferror(f))
++ die("Error reading DT blob size: %s\n", strerror(errno));
++ if (rc < 1) {
++ if (feof(f))
++ die("EOF reading DT blob size\n");
++ else
++ die("Mysterious short read reading blob size\n");
++ }
++
++ totalsize = be32_to_cpu(totalsize);
++ if (totalsize < FDT_V1_SIZE)
++ die("DT blob size (%d) is too small\n", totalsize);
++
++ blob = xmalloc(totalsize);
++
++ fdt = (struct fdt_header *)blob;
++ fdt->magic = cpu_to_be32(magic);
++ fdt->totalsize = cpu_to_be32(totalsize);
++
++ sizeleft = totalsize - sizeof(magic) - sizeof(totalsize);
++ p = blob + sizeof(magic) + sizeof(totalsize);
++
++ while (sizeleft) {
++ if (feof(f))
++ die("EOF before reading %d bytes of DT blob\n",
++ totalsize);
++
++ rc = fread(p, 1, sizeleft, f);
++ if (ferror(f))
++ die("Error reading DT blob: %s\n",
++ strerror(errno));
++
++ sizeleft -= rc;
++ p += rc;
++ }
++
++ off_dt = be32_to_cpu(fdt->off_dt_struct);
++ off_str = be32_to_cpu(fdt->off_dt_strings);
++ off_mem_rsvmap = be32_to_cpu(fdt->off_mem_rsvmap);
++ version = be32_to_cpu(fdt->version);
++
++ fprintf(stderr, "\tmagic:\t\t\t0x%x\n", magic);
++ fprintf(stderr, "\ttotalsize:\t\t%d\n", totalsize);
++ fprintf(stderr, "\toff_dt_struct:\t\t0x%x\n", off_dt);
++ fprintf(stderr, "\toff_dt_strings:\t\t0x%x\n", off_str);
++ fprintf(stderr, "\toff_mem_rsvmap:\t\t0x%x\n", off_mem_rsvmap);
++ fprintf(stderr, "\tversion:\t\t0x%x\n", version );
++ fprintf(stderr, "\tlast_comp_version:\t0x%x\n",
++ be32_to_cpu(fdt->last_comp_version));
++
++ if (off_mem_rsvmap >= totalsize)
++ die("Mem Reserve structure offset exceeds total size\n");
++
++ if (off_dt >= totalsize)
++ die("DT structure offset exceeds total size\n");
++
++ if (off_str > totalsize)
++ die("String table offset exceeds total size\n");
++
++ if (version >= 2)
++ fprintf(stderr, "\tboot_cpuid_phys:\t0x%x\n",
++ be32_to_cpu(fdt->boot_cpuid_phys));
++
++ size_str = -1;
++ if (version >= 3) {
++ size_str = be32_to_cpu(fdt->size_dt_strings);
++ fprintf(stderr, "\tsize_dt_strings:\t%d\n", size_str);
++ if (off_str+size_str > totalsize)
++ die("String table extends past total size\n");
++ }
++
++ if (version >= 17) {
++ size_dt = be32_to_cpu(fdt->size_dt_struct);
++ fprintf(stderr, "\tsize_dt_struct:\t\t%d\n", size_dt);
++ if (off_dt+size_dt > totalsize)
++ die("Structure block extends past total size\n");
++ }
++
++ if (version < 16) {
++ flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN;
++ } else {
++ flags |= FTF_NOPS;
++ }
++
++ inbuf_init(&memresvbuf,
++ blob + off_mem_rsvmap, blob + totalsize);
++ inbuf_init(&dtbuf, blob + off_dt, blob + totalsize);
++ if (size_str >= 0)
++ inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
++ else
++ inbuf_init(&strbuf, blob + off_str, blob + totalsize);
++
++ reservelist = flat_read_mem_reserve(&memresvbuf);
++
++ val = flat_read_word(&dtbuf);
++
++ if (val != FDT_BEGIN_NODE)
++ die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val);
++
++ tree = unflatten_tree(&dtbuf, &strbuf, "", flags);
++
++ val = flat_read_word(&dtbuf);
++ if (val != FDT_END)
++ die("Device tree blob doesn't end with FDT_END\n");
++
++ free(blob);
++
++ return build_boot_info(reservelist, tree);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/fstree.c powerpc.git/arch/powerpc/boot/dtc-src/fstree.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/fstree.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/fstree.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,94 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++
++#include <dirent.h>
++#include <sys/stat.h>
++
++static struct node *read_fstree(const char *dirname)
++{
++ DIR *d;
++ struct dirent *de;
++ struct stat st;
++ struct node *tree;
++
++ d = opendir(dirname);
++ if (! d)
++ die("opendir(): %s\n", strerror(errno));
++
++ tree = build_node(NULL, NULL);
++
++ while ((de = readdir(d)) != NULL) {
++ char *tmpnam;
++
++ if (streq(de->d_name, ".")
++ || streq(de->d_name, ".."))
++ continue;
++
++ tmpnam = join_path(dirname, de->d_name);
++
++ if (lstat(tmpnam, &st) < 0)
++ die("stat(%s): %s\n", tmpnam, strerror(errno));
++
++ if (S_ISREG(st.st_mode)) {
++ struct property *prop;
++ FILE *pfile;
++
++ pfile = fopen(tmpnam, "r");
++ if (! pfile) {
++ fprintf(stderr,
++ "WARNING: Cannot open %s: %s\n",
++ tmpnam, strerror(errno));
++ } else {
++ prop = build_property(strdup(de->d_name),
++ data_copy_file(pfile,
++ st.st_size),
++ NULL);
++ add_property(tree, prop);
++ fclose(pfile);
++ }
++ } else if (S_ISDIR(st.st_mode)) {
++ struct node *newchild;
++
++ newchild = read_fstree(tmpnam);
++ newchild = name_node(newchild, strdup(de->d_name),
++ NULL);
++ add_child(tree, newchild);
++ }
++
++ free(tmpnam);
++ }
++
++ return tree;
++}
++
++struct boot_info *dt_from_fs(const char *dirname)
++{
++ struct node *tree;
++
++ tree = read_fstree(dirname);
++ tree = name_node(tree, "", NULL);
++
++ fill_fullpaths(tree, "");
++
++ return build_boot_info(NULL, tree);
++}
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/livetree.c powerpc.git/arch/powerpc/boot/dtc-src/livetree.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/livetree.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/livetree.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,305 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++
++/*
++ * Tree building functions
++ */
++
++struct property *build_property(char *name, struct data val, char *label)
++{
++ struct property *new = xmalloc(sizeof(*new));
++
++ new->name = name;
++ new->val = val;
++
++ new->next = NULL;
++
++ new->label = label;
++
++ return new;
++}
++
++struct property *chain_property(struct property *first, struct property *list)
++{
++ assert(first->next == NULL);
++
++ first->next = list;
++ return first;
++}
++
++struct property *reverse_properties(struct property *first)
++{
++ struct property *p = first;
++ struct property *head = NULL;
++ struct property *next;
++
++ while (p) {
++ next = p->next;
++ p->next = head;
++ head = p;
++ p = next;
++ }
++ return head;
++}
++
++struct node *build_node(struct property *proplist, struct node *children)
++{
++ struct node *new = xmalloc(sizeof(*new));
++ struct node *child;
++
++ memset(new, 0, sizeof(*new));
++
++ new->proplist = reverse_properties(proplist);
++ new->children = children;
++
++ for_each_child(new, child) {
++ child->parent = new;
++ }
++
++ return new;
++}
++
++struct node *name_node(struct node *node, char *name, char * label)
++{
++ assert(node->name == NULL);
++
++ node->name = name;
++
++ node->label = label;
++
++ return node;
++}
++
++struct node *chain_node(struct node *first, struct node *list)
++{
++ assert(first->next_sibling == NULL);
++
++ first->next_sibling = list;
++ return first;
++}
++
++void add_property(struct node *node, struct property *prop)
++{
++ struct property **p;
++
++ prop->next = NULL;
++
++ p = &node->proplist;
++ while (*p)
++ p = &((*p)->next);
++
++ *p = prop;
++}
++
++void add_child(struct node *parent, struct node *child)
++{
++ struct node **p;
++
++ child->next_sibling = NULL;
++
++ p = &parent->children;
++ while (*p)
++ p = &((*p)->next_sibling);
++
++ *p = child;
++}
++
++struct reserve_info *build_reserve_entry(u64 address, u64 size, char *label)
++{
++ struct reserve_info *new = xmalloc(sizeof(*new));
++
++ new->re.address = address;
++ new->re.size = size;
++
++ new->next = NULL;
++
++ new->label = label;
++
++ return new;
++}
++
++struct reserve_info *chain_reserve_entry(struct reserve_info *first,
++ struct reserve_info *list)
++{
++ assert(first->next == NULL);
++
++ first->next = list;
++ return first;
++}
++
++struct reserve_info *add_reserve_entry(struct reserve_info *list,
++ struct reserve_info *new)
++{
++ struct reserve_info *last;
++
++ new->next = NULL;
++
++ if (! list)
++ return new;
++
++ for (last = list; last->next; last = last->next)
++ ;
++
++ last->next = new;
++
++ return list;
++}
++
++struct boot_info *build_boot_info(struct reserve_info *reservelist,
++ struct node *tree)
++{
++ struct boot_info *bi;
++
++ bi = xmalloc(sizeof(*bi));
++ bi->reservelist = reservelist;
++ bi->dt = tree;
++
++ return bi;
++}
++
++/*
++ * Tree accessor functions
++ */
++
++const char *get_unitname(struct node *node)
++{
++ if (node->name[node->basenamelen] == '\0')
++ return "";
++ else
++ return node->name + node->basenamelen + 1;
++}
++
++struct property *get_property(struct node *node, const char *propname)
++{
++ struct property *prop;
++
++ for_each_property(node, prop)
++ if (streq(prop->name, propname))
++ return prop;
++
++ return NULL;
++}
++
++cell_t propval_cell(struct property *prop)
++{
++ assert(prop->val.len == sizeof(cell_t));
++ return be32_to_cpu(*((cell_t *)prop->val.val));
++}
++
++struct node *get_subnode(struct node *node, const char *nodename)
++{
++ struct node *child;
++
++ for_each_child(node, child)
++ if (streq(child->name, nodename))
++ return child;
++
++ return NULL;
++}
++
++struct node *get_node_by_path(struct node *tree, const char *path)
++{
++ const char *p;
++ struct node *child;
++
++ if (!path || ! (*path))
++ return tree;
++
++ while (path[0] == '/')
++ path++;
++
++ p = strchr(path, '/');
++
++ for_each_child(tree, child) {
++ if (p && strneq(path, child->name, p-path))
++ return get_node_by_path(child, p+1);
++ else if (!p && streq(path, child->name))
++ return child;
++ }
++
++ return NULL;
++}
++
++struct node *get_node_by_label(struct node *tree, const char *label)
++{
++ struct node *child, *node;
++
++ assert(label && (strlen(label) > 0));
++
++ if (tree->label && streq(tree->label, label))
++ return tree;
++
++ for_each_child(tree, child) {
++ node = get_node_by_label(child, label);
++ if (node)
++ return node;
++ }
++
++ return NULL;
++}
++
++struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
++{
++ struct node *child, *node;
++
++ assert((phandle != 0) && (phandle != -1));
++
++ if (tree->phandle == phandle)
++ return tree;
++
++ for_each_child(tree, child) {
++ node = get_node_by_phandle(child, phandle);
++ if (node)
++ return node;
++ }
++
++ return NULL;
++}
++
++struct node *get_node_by_ref(struct node *tree, const char *ref)
++{
++ if (ref[0] == '/')
++ return get_node_by_path(tree, ref);
++ else
++ return get_node_by_label(tree, ref);
++}
++
++cell_t get_node_phandle(struct node *root, struct node *node)
++{
++ static cell_t phandle = 1; /* FIXME: ick, static local */
++
++ if ((node->phandle != 0) && (node->phandle != -1))
++ return node->phandle;
++
++ assert(! get_property(node, "linux,phandle"));
++
++ while (get_node_by_phandle(root, phandle))
++ phandle++;
++
++ node->phandle = phandle;
++ add_property(node,
++ build_property("linux,phandle",
++ data_append_cell(empty_data, phandle),
++ NULL));
++
++ return node->phandle;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/srcpos.c powerpc.git/arch/powerpc/boot/dtc-src/srcpos.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/srcpos.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/srcpos.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,105 @@
++/*
++ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++#include "srcpos.h"
++
++
++/*
++ * Record the complete unique set of opened file names.
++ * Primarily used to cache source position file names.
++ */
++#define MAX_N_FILE_NAMES (100)
++
++const char *file_names[MAX_N_FILE_NAMES];
++static int n_file_names = 0;
++
++/*
++ * Like yylineno, this is the current open file pos.
++ */
++
++int srcpos_filenum = -1;
++
++
++
++FILE *dtc_open_file(const char *fname)
++{
++ FILE *f;
++
++ if (lookup_file_name(fname, 1) < 0)
++ die("Too many files opened\n");
++
++ if (streq(fname, "-"))
++ f = stdin;
++ else
++ f = fopen(fname, "r");
++
++ if (! f)
++ die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
++
++ return f;
++}
++
++
++
++/*
++ * Locate and optionally add filename fname in the file_names[] array.
++ *
++ * If the filename is currently not in the array and the boolean
++ * add_it is non-zero, an attempt to add the filename will be made.
++ *
++ * Returns;
++ * Index [0..MAX_N_FILE_NAMES) where the filename is kept
++ * -1 if the name can not be recorded
++ */
++
++int lookup_file_name(const char *fname, int add_it)
++{
++ int i;
++
++ for (i = 0; i < n_file_names; i++) {
++ if (strcmp(file_names[i], fname) == 0)
++ return i;
++ }
++
++ if (add_it) {
++ if (n_file_names < MAX_N_FILE_NAMES) {
++ file_names[n_file_names] = strdup(fname);
++ return n_file_names++;
++ }
++ }
++
++ return -1;
++}
++
++
++const char *srcpos_filename_for_num(int filenum)
++{
++ if (0 <= filenum && filenum < n_file_names) {
++ return file_names[filenum];
++ }
++
++ return 0;
++}
++
++
++const char *srcpos_get_filename(void)
++{
++ return srcpos_filename_for_num(srcpos_filenum);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/srcpos.h powerpc.git/arch/powerpc/boot/dtc-src/srcpos.h
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/srcpos.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/srcpos.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,75 @@
++/*
++ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++/*
++ * Augment the standard YYLTYPE with a filenum index into an
++ * array of all opened filenames.
++ */
++
++#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
++typedef struct YYLTYPE {
++ int first_line;
++ int first_column;
++ int last_line;
++ int last_column;
++ int filenum;
++} YYLTYPE;
++
++#define YYLTYPE_IS_DECLARED 1
++#define YYLTYPE_IS_TRIVIAL 1
++#endif
++
++/* Cater to old parser templates. */
++#ifndef YYID
++#define YYID(n) (n)
++#endif
++
++#define YYLLOC_DEFAULT(Current, Rhs, N) \
++ do \
++ if (YYID (N)) \
++ { \
++ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
++ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
++ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
++ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
++ (Current).filenum = YYRHSLOC (Rhs, N).filenum; \
++ } \
++ else \
++ { \
++ (Current).first_line = (Current).last_line = \
++ YYRHSLOC (Rhs, 0).last_line; \
++ (Current).first_column = (Current).last_column = \
++ YYRHSLOC (Rhs, 0).last_column; \
++ (Current).filenum = YYRHSLOC (Rhs, 0).filenum; \
++ } \
++ while (YYID (0))
++
++
++
++extern void yyerror(char const *);
++
++extern int srcpos_filenum;
++
++extern int push_input_file(const char *filename);
++extern int pop_input_file(void);
++
++extern FILE *dtc_open_file(const char *fname);
++extern int lookup_file_name(const char *fname, int add_it);
++extern const char *srcpos_filename_for_num(int filenum);
++const char *srcpos_get_filename(void);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/treesource.c powerpc.git/arch/powerpc/boot/dtc-src/treesource.c
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/treesource.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/treesource.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,275 @@
++/*
++ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
++ *
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
++ * USA
++ */
++
++#include "dtc.h"
++#include "srcpos.h"
++
++extern FILE *yyin;
++extern int yyparse(void);
++extern void yyerror(char const *);
++
++struct boot_info *the_boot_info;
++
++struct boot_info *dt_from_source(const char *fname)
++{
++ the_boot_info = NULL;
++
++ push_input_file(fname);
++
++ if (yyparse() != 0)
++ return NULL;
++
++ fill_fullpaths(the_boot_info->dt, "");
++
++ return the_boot_info;
++}
++
++static void write_prefix(FILE *f, int level)
++{
++ int i;
++
++ for (i = 0; i < level; i++)
++ fputc('\t', f);
++}
++
++int isstring(char c)
++{
++ return (isprint(c)
++ || (c == '\0')
++ || strchr("\a\b\t\n\v\f\r", c));
++}
++
++static void write_propval_string(FILE *f, struct data val)
++{
++ const char *str = val.val;
++ int i;
++ int newchunk = 1;
++ struct marker *m = val.markers;
++
++ assert(str[val.len-1] == '\0');
++
++ for (i = 0; i < (val.len-1); i++) {
++ char c = str[i];
++
++ if (newchunk) {
++ while (m && (m->offset <= i)) {
++ if (m->type == LABEL) {
++ assert(m->offset == i);
++ fprintf(f, "%s: ", m->ref);
++ }
++ m = m->next;
++ }
++ fprintf(f, "\"");
++ newchunk = 0;
++ }
++
++ switch (c) {
++ case '\a':
++ fprintf(f, "\\a");
++ break;
++ case '\b':
++ fprintf(f, "\\b");
++ break;
++ case '\t':
++ fprintf(f, "\\t");
++ break;
++ case '\n':
++ fprintf(f, "\\n");
++ break;
++ case '\v':
++ fprintf(f, "\\v");
++ break;
++ case '\f':
++ fprintf(f, "\\f");
++ break;
++ case '\r':
++ fprintf(f, "\\r");
++ break;
++ case '\\':
++ fprintf(f, "\\\\");
++ break;
++ case '\"':
++ fprintf(f, "\\\"");
++ break;
++ case '\0':
++ fprintf(f, "\", ");
++ newchunk = 1;
++ break;
++ default:
++ if (isprint(c))
++ fprintf(f, "%c", c);
++ else
++ fprintf(f, "\\x%02hhx", c);
++ }
++ }
++ fprintf(f, "\"");
++
++ /* Wrap up any labels at the end of the value */
++ for_each_marker_of_type(m, LABEL) {
++ assert (m->offset == val.len);
++ fprintf(f, " %s:", m->ref);
++ }
++}
++
++static void write_propval_cells(FILE *f, struct data val)
++{
++ void *propend = val.val + val.len;
++ cell_t *cp = (cell_t *)val.val;
++ struct marker *m = val.markers;
++
++ fprintf(f, "<");
++ for (;;) {
++ while (m && (m->offset <= ((char *)cp - val.val))) {
++ if (m->type == LABEL) {
++ assert(m->offset == ((char *)cp - val.val));
++ fprintf(f, "%s: ", m->ref);
++ }
++ m = m->next;
++ }
++
++ fprintf(f, "0x%x", be32_to_cpu(*cp++));
++ if ((void *)cp >= propend)
++ break;
++ fprintf(f, " ");
++ }
++
++ /* Wrap up any labels at the end of the value */
++ for_each_marker_of_type(m, LABEL) {
++ assert (m->offset == val.len);
++ fprintf(f, " %s:", m->ref);
++ }
++ fprintf(f, ">");
++}
++
++static void write_propval_bytes(FILE *f, struct data val)
++{
++ void *propend = val.val + val.len;
++ const char *bp = val.val;
++ struct marker *m = val.markers;
++
++ fprintf(f, "[");
++ for (;;) {
++ while (m && (m->offset == (bp-val.val))) {
++ if (m->type == LABEL)
++ fprintf(f, "%s: ", m->ref);
++ m = m->next;
++ }
++
++ fprintf(f, "%02hhx", *bp++);
++ if ((void *)bp >= propend)
++ break;
++ fprintf(f, " ");
++ }
++
++ /* Wrap up any labels at the end of the value */
++ for_each_marker_of_type(m, LABEL) {
++ assert (m->offset == val.len);
++ fprintf(f, " %s:", m->ref);
++ }
++ fprintf(f, "]");
++}
++
++static void write_propval(FILE *f, struct property *prop)
++{
++ int len = prop->val.len;
++ const char *p = prop->val.val;
++ struct marker *m = prop->val.markers;
++ int nnotstring = 0, nnul = 0;
++ int nnotstringlbl = 0, nnotcelllbl = 0;
++ int i;
++
++ if (len == 0) {
++ fprintf(f, ";\n");
++ return;
++ }
++
++ for (i = 0; i < len; i++) {
++ if (! isstring(p[i]))
++ nnotstring++;
++ if (p[i] == '\0')
++ nnul++;
++ }
++
++ for_each_marker_of_type(m, LABEL) {
++ if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0'))
++ nnotstringlbl++;
++ if ((m->offset % sizeof(cell_t)) != 0)
++ nnotcelllbl++;
++ }
++
++ fprintf(f, " = ");
++ if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))
++ && (nnotstringlbl == 0)) {
++ write_propval_string(f, prop->val);
++ } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
++ write_propval_cells(f, prop->val);
++ } else {
++ write_propval_bytes(f, prop->val);
++ }
++
++ fprintf(f, ";\n");
++}
++
++static void write_tree_source_node(FILE *f, struct node *tree, int level)
++{
++ struct property *prop;
++ struct node *child;
++
++ write_prefix(f, level);
++ if (tree->label)
++ fprintf(f, "%s: ", tree->label);
++ if (tree->name && (*tree->name))
++ fprintf(f, "%s {\n", tree->name);
++ else
++ fprintf(f, "/ {\n");
++
++ for_each_property(tree, prop) {
++ write_prefix(f, level+1);
++ if (prop->label)
++ fprintf(f, "%s: ", prop->label);
++ fprintf(f, "%s", prop->name);
++ write_propval(f, prop);
++ }
++ for_each_child(tree, child) {
++ fprintf(f, "\n");
++ write_tree_source_node(f, child, level+1);
++ }
++ write_prefix(f, level);
++ fprintf(f, "};\n");
++}
++
++
++void dt_to_source(FILE *f, struct boot_info *bi)
++{
++ struct reserve_info *re;
++
++ fprintf(f, "/dts-v1/;\n\n");
++
++ for (re = bi->reservelist; re; re = re->next) {
++ if (re->label)
++ fprintf(f, "%s: ", re->label);
++ fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
++ (unsigned long long)re->re.address,
++ (unsigned long long)re->re.size);
++ }
++
++ write_tree_source_node(f, bi->dt, 0);
++}
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dtc-src/version_gen.h powerpc.git/arch/powerpc/boot/dtc-src/version_gen.h
+--- linux-2.6.24/arch/powerpc/boot/dtc-src/version_gen.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dtc-src/version_gen.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1 @@
++#define DTC_VERSION "DTC 1.0.0-gd6f9b62f"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/adder875-redboot.dts powerpc.git/arch/powerpc/boot/dts/adder875-redboot.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/adder875-redboot.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/adder875-redboot.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,184 @@
++/*
++ * Device Tree Source for MPC885 ADS running RedBoot
++ *
++ * Copyright 2006 MontaVista Software, Inc.
++ * Copyright 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++/ {
++ model = "Analogue & Micro Adder MPC875";
++ compatible = "analogue-and-micro,adder875";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ console = &console;
++ ethernet0 = &eth0;
++ ethernet1 = &eth1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,875@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <16>;
++ i-cache-line-size = <16>;
++ d-cache-size = <8192>;
++ i-cache-size = <8192>;
++ timebase-frequency = <0>;
++ bus-frequency = <0>;
++ clock-frequency = <0>;
++ interrupts = <15 2>; // decrementer interrupt
++ interrupt-parent = <&PIC>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0x01000000>;
++ };
++
++ localbus@fa200100 {
++ compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
++ "simple-bus";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ reg = <0xfa200100 0x40>;
++
++ ranges = <
++ 0 0 0xfe000000 0x00800000
++ 2 0 0xfa100000 0x00008000
++ >;
++
++ flash@0,0 {
++ compatible = "cfi-flash";
++ reg = <0 0 0x800000>;
++ bank-width = <2>;
++ device-width = <2>;
++ };
++ };
++
++ soc@fa200000 {
++ compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0xfa200000 0x00004000>;
++
++ // Temporary until code stops depending on it.
++ device_type = "soc";
++
++ // Temporary until get_immrbase() is fixed.
++ reg = <0xfa200000 0x4000>;
++
++ mdio@e00 {
++ compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
++ reg = <0xe00 0x188>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PHY0: ethernet-phy@0 {
++ reg = <0>;
++ device_type = "ethernet-phy";
++ };
++
++ PHY1: ethernet-phy@1 {
++ reg = <1>;
++ device_type = "ethernet-phy";
++ };
++ };
++
++ eth0: ethernet@e00 {
++ device_type = "network";
++ compatible = "fsl,mpc875-fec-enet",
++ "fsl,pq1-fec-enet";
++ reg = <0xe00 0x188>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <3 1>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY0>;
++ linux,network-index = <0>;
++ };
++
++ eth1: ethernet@1e00 {
++ device_type = "network";
++ compatible = "fsl,mpc875-fec-enet",
++ "fsl,pq1-fec-enet";
++ reg = <0x1e00 0x188>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <7 1>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY1>;
++ linux,network-index = <1>;
++ };
++
++ PIC: interrupt-controller@0 {
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ reg = <0 0x24>;
++ compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
++ };
++
++ cpm@9c0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
++ interrupts = <0>; // cpm error interrupt
++ interrupt-parent = <&CPM_PIC>;
++ reg = <0x9c0 0x40>;
++ ranges;
++
++ muram {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0x2000 0x2000>;
++
++ data@0 {
++ compatible = "fsl,cpm-muram-data";
++ reg = <0 0x1c00>;
++ };
++ };
++
++ brg@9f0 {
++ compatible = "fsl,mpc875-brg",
++ "fsl,cpm1-brg",
++ "fsl,cpm-brg";
++ reg = <0x9f0 0x10>;
++ };
++
++ CPM_PIC: interrupt-controller@930 {
++ interrupt-controller;
++ #interrupt-cells = <1>;
++ interrupts = <5 2 0 2>;
++ interrupt-parent = <&PIC>;
++ reg = <0x930 0x20>;
++ compatible = "fsl,mpc875-cpm-pic",
++ "fsl,cpm1-pic";
++ };
++
++ console: serial@a80 {
++ device_type = "serial";
++ compatible = "fsl,mpc875-smc-uart",
++ "fsl,cpm1-smc-uart";
++ reg = <0xa80 0x10 0x3e80 0x40>;
++ interrupts = <4>;
++ interrupt-parent = <&CPM_PIC>;
++ fsl,cpm-brg = <1>;
++ fsl,cpm-command = <0x0090>;
++ current-speed = <115200>;
++ };
++ };
++ };
++
++ chosen {
++ linux,stdout-path = &console;
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/adder875-uboot.dts powerpc.git/arch/powerpc/boot/dts/adder875-uboot.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/adder875-uboot.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/adder875-uboot.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,183 @@
++/*
++ * Device Tree Source for MPC885 ADS running U-Boot
++ *
++ * Copyright 2006 MontaVista Software, Inc.
++ * Copyright 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++/ {
++ model = "Analogue & Micro Adder MPC875";
++ compatible = "analogue-and-micro,adder875";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ console = &console;
++ ethernet0 = &eth0;
++ ethernet1 = &eth1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,875@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <16>;
++ i-cache-line-size = <16>;
++ d-cache-size = <8192>;
++ i-cache-size = <8192>;
++ timebase-frequency = <0>;
++ bus-frequency = <0>;
++ clock-frequency = <0>;
++ interrupts = <15 2>; // decrementer interrupt
++ interrupt-parent = <&PIC>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0x01000000>;
++ };
++
++ localbus@ff000100 {
++ compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
++ "simple-bus";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ reg = <0xff000100 0x40>;
++
++ ranges = <
++ 0 0 0xfe000000 0x01000000
++ >;
++
++ flash@0,0 {
++ compatible = "cfi-flash";
++ reg = <0 0 0x800000>;
++ bank-width = <2>;
++ device-width = <2>;
++ };
++ };
++
++ soc@ff000000 {
++ compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0xff000000 0x00004000>;
++
++ // Temporary until code stops depending on it.
++ device_type = "soc";
++
++ // Temporary until get_immrbase() is fixed.
++ reg = <0xff000000 0x4000>;
++
++ mdio@e00 {
++ compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
++ reg = <0xe00 0x188>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PHY0: ethernet-phy@0 {
++ reg = <0>;
++ device_type = "ethernet-phy";
++ };
++
++ PHY1: ethernet-phy@1 {
++ reg = <1>;
++ device_type = "ethernet-phy";
++ };
++ };
++
++ eth0: ethernet@e00 {
++ device_type = "network";
++ compatible = "fsl,mpc875-fec-enet",
++ "fsl,pq1-fec-enet";
++ reg = <0xe00 0x188>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <3 1>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY0>;
++ linux,network-index = <0>;
++ };
++
++ eth1: ethernet@1e00 {
++ device_type = "network";
++ compatible = "fsl,mpc875-fec-enet",
++ "fsl,pq1-fec-enet";
++ reg = <0x1e00 0x188>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <7 1>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY1>;
++ linux,network-index = <1>;
++ };
++
++ PIC: interrupt-controller@0 {
++ interrupt-controller;
++ #interrupt-cells = <2>;
++ reg = <0 0x24>;
++ compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
++ };
++
++ cpm@9c0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
++ interrupts = <0>; // cpm error interrupt
++ interrupt-parent = <&CPM_PIC>;
++ reg = <0x9c0 0x40>;
++ ranges;
++
++ muram {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0x2000 0x2000>;
++
++ data@0 {
++ compatible = "fsl,cpm-muram-data";
++ reg = <0 0x1c00>;
++ };
++ };
++
++ brg@9f0 {
++ compatible = "fsl,mpc875-brg",
++ "fsl,cpm1-brg",
++ "fsl,cpm-brg";
++ reg = <0x9f0 0x10>;
++ };
++
++ CPM_PIC: interrupt-controller@930 {
++ interrupt-controller;
++ #interrupt-cells = <1>;
++ interrupts = <5 2 0 2>;
++ interrupt-parent = <&PIC>;
++ reg = <0x930 0x20>;
++ compatible = "fsl,mpc875-cpm-pic",
++ "fsl,cpm1-pic";
++ };
++
++ console: serial@a80 {
++ device_type = "serial";
++ compatible = "fsl,mpc875-smc-uart",
++ "fsl,cpm1-smc-uart";
++ reg = <0xa80 0x10 0x3e80 0x40>;
++ interrupts = <4>;
++ interrupt-parent = <&CPM_PIC>;
++ fsl,cpm-brg = <1>;
++ fsl,cpm-command = <0x0090>;
++ current-speed = <115200>;
++ };
++ };
++ };
++
++ chosen {
++ linux,stdout-path = &console;
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/bamboo.dts powerpc.git/arch/powerpc/boot/dts/bamboo.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/bamboo.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/bamboo.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,14 +16,24 @@
+ #size-cells = <1>;
+ model = "amcc,bamboo";
+ compatible = "amcc,bamboo";
+- dcr-parent = <&/cpus/PowerPC,440EP@0>;
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ serial2 = &UART2;
++ serial3 = &UART3;
++ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- PowerPC,440EP@0 {
++ cpu@0 {
+ device_type = "cpu";
++ model = "PowerPC,440EP";
+ reg = <0>;
+ clock-frequency = <0>; /* Filled in by zImage */
+ timebase-frequency = <0>; /* Filled in by zImage */
+@@ -126,7 +136,6 @@
+ #address-cells = <2>;
+ #size-cells = <1>;
+ clock-frequency = <0>; /* Filled in by zImage */
+- ranges;
+ interrupts = <5 1>;
+ interrupt-parent = <&UIC1>;
+ };
+@@ -238,11 +247,56 @@
+ zmii-device = <&ZMII0>;
+ zmii-channel = <1>;
+ };
++
++ usb@ef601000 {
++ compatible = "ohci-be";
++ reg = <ef601000 80>;
++ interrupts = <8 1 9 1>;
++ interrupt-parent = < &UIC1 >;
++ };
++ };
++
++ PCI0: pci@ec000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb440ep-pci", "ibm,plb-pci";
++ primary;
++ reg = <0 eec00000 8 /* Config space access */
++ 0 eed00000 4 /* IACK */
++ 0 eed00000 4 /* Special cycle */
++ 0 ef400000 40>; /* Internal registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed. Chip supports a second
++ * IO range but we don't use it for now
++ */
++ ranges = <02000000 0 a0000000 0 a0000000 0 20000000
++ 01000000 0 00000000 0 e8000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* Bamboo has all 4 IRQ pins tied together per slot */
++ interrupt-map-mask = <f800 0 0 0>;
++ interrupt-map = <
++ /* IDSEL 1 */
++ 0800 0 0 0 &UIC0 1c 8
++
++ /* IDSEL 2 */
++ 1000 0 0 0 &UIC0 1b 8
++
++ /* IDSEL 3 */
++ 1800 0 0 0 &UIC0 1a 8
++
++ /* IDSEL 4 */
++ 2000 0 0 0 &UIC0 19 8
++ >;
+ };
+ };
+
+ chosen {
+ linux,stdout-path = "/plb/opb/serial@ef600300";
+- bootargs = "console=ttyS0,115200";
+ };
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/cm5200.dts powerpc.git/arch/powerpc/boot/dts/cm5200.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/cm5200.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/cm5200.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,236 @@
++/*
++ * CM5200 board Device Tree Source
++ *
++ * Copyright (C) 2007 Semihalf
++ * Marian Balakowicz <m8@semihalf.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/*
++ * WARNING: Do not depend on this tree layout remaining static just yet.
++ * The MPC5200 device tree conventions are still in flux
++ * Keep an eye on the linuxppc-dev mailing list for more details
++ */
++
++/ {
++ model = "schindler,cm5200";
++ compatible = "schindler,cm5200";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,5200@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <20>;
++ i-cache-line-size = <20>;
++ d-cache-size = <4000>; // L1, 16K
++ i-cache-size = <4000>; // L1, 16K
++ timebase-frequency = <0>; // from bootloader
++ bus-frequency = <0>; // from bootloader
++ clock-frequency = <0>; // from bootloader
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <00000000 04000000>; // 64MB
++ };
++
++ soc5200@f0000000 {
++ model = "fsl,mpc5200b";
++ compatible = "fsl,mpc5200b";
++ revision = ""; // from bootloader
++ device_type = "soc";
++ ranges = <0 f0000000 0000c000>;
++ reg = <f0000000 00000100>;
++ bus-frequency = <0>; // from bootloader
++ system-frequency = <0>; // from bootloader
++
++ cdm@200 {
++ compatible = "mpc5200b-cdm","mpc5200-cdm";
++ reg = <200 38>;
++ };
++
++ mpc5200_pic: pic@500 {
++ // 5200 interrupts are encoded into two levels;
++ interrupt-controller;
++ #interrupt-cells = <3>;
++ compatible = "mpc5200b-pic","mpc5200-pic";
++ reg = <500 80>;
++ };
++
++ gpt@600 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <600 10>;
++ interrupts = <1 9 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl,has-wdt;
++ };
++
++ gpt@610 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <610 10>;
++ interrupts = <1 a 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@620 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <620 10>;
++ interrupts = <1 b 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@630 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <630 10>;
++ interrupts = <1 c 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@640 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <640 10>;
++ interrupts = <1 d 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@650 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <650 10>;
++ interrupts = <1 e 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@660 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <660 10>;
++ interrupts = <1 f 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@670 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <670 10>;
++ interrupts = <1 10 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ rtc@800 { // Real time clock
++ compatible = "mpc5200b-rtc","mpc5200-rtc";
++ reg = <800 100>;
++ interrupts = <1 5 0 1 6 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpio@b00 {
++ compatible = "mpc5200b-gpio","mpc5200-gpio";
++ reg = <b00 40>;
++ interrupts = <1 7 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpio-wkup@c00 {
++ compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
++ reg = <c00 40>;
++ interrupts = <1 8 0 0 3 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ spi@f00 {
++ compatible = "mpc5200b-spi","mpc5200-spi";
++ reg = <f00 20>;
++ interrupts = <2 d 0 2 e 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ usb@1000 {
++ device_type = "usb-ohci-be";
++ compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
++ reg = <1000 ff>;
++ interrupts = <2 6 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ dma-controller@1200 {
++ compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
++ reg = <1200 80>;
++ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
++ 3 4 0 3 5 0 3 6 0 3 7 0
++ 3 8 0 3 9 0 3 a 0 3 b 0
++ 3 c 0 3 d 0 3 e 0 3 f 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ xlb@1f00 {
++ compatible = "mpc5200b-xlb","mpc5200-xlb";
++ reg = <1f00 100>;
++ };
++
++ serial@2000 { // PSC1
++ device_type = "serial";
++ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
++ port-number = <0>; // Logical port assignment
++ reg = <2000 100>;
++ interrupts = <2 1 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ serial@2200 { // PSC2
++ device_type = "serial";
++ compatible = "mpc5200-psc-uart";
++ port-number = <1>; // Logical port assignment
++ reg = <2200 100>;
++ interrupts = <2 2 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ serial@2400 { // PSC3
++ device_type = "serial";
++ compatible = "mpc5200-psc-uart";
++ port-number = <2>; // Logical port assignment
++ reg = <2400 100>;
++ interrupts = <2 3 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ serial@2c00 { // PSC6
++ device_type = "serial";
++ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
++ port-number = <5>; // Logical port assignment
++ reg = <2c00 100>;
++ interrupts = <2 4 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ ethernet@3000 {
++ device_type = "network";
++ compatible = "mpc5200b-fec","mpc5200-fec";
++ reg = <3000 800>;
++ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
++ interrupts = <2 5 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ i2c@3d40 {
++ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
++ reg = <3d40 40>;
++ interrupts = <2 10 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl5200-clocking;
++ };
++
++ sram@8000 {
++ compatible = "mpc5200b-sram","mpc5200-sram";
++ reg = <8000 4000>;
++ };
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/ebony.dts powerpc.git/arch/powerpc/boot/dts/ebony.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/ebony.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/ebony.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,14 +16,22 @@
+ #size-cells = <1>;
+ model = "ibm,ebony";
+ compatible = "ibm,ebony";
+- dcr-parent = <&/cpus/PowerPC,440GP@0>;
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- PowerPC,440GP@0 {
++ cpu@0 {
+ device_type = "cpu";
++ model = "PowerPC,440GP";
+ reg = <0>;
+ clock-frequency = <0>; // Filled in by zImage
+ timebase-frequency = <0>; // Filled in by zImage
+@@ -150,9 +158,10 @@
+ };
+ };
+
+- ds1743@1,0 {
++ nvram@1,0 {
+ /* NVRAM & RTC */
+- compatible = "ds1743";
++ compatible = "ds1743-nvram";
++ #bytes = <2000>;
+ reg = <1 0 2000>;
+ };
+
+@@ -284,12 +293,43 @@
+
+ };
+
+- PCIX0: pci@1234 {
++ PCIX0: pci@20ec00000 {
+ device_type = "pci";
+- /* FIXME */
+- reg = <2 0ec00000 8
+- 2 0ec80000 f0
+- 2 0ec80100 fc>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
++ primary;
++ reg = <2 0ec00000 8 /* Config space access */
++ 0 0 0 /* no IACK cycles */
++ 2 0ed00000 4 /* Special cycles */
++ 2 0ec80000 f0 /* Internal registers */
++ 2 0ec80100 fc>; /* Internal messaging registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 00000003 80000000 0 80000000
++ 01000000 0 00000000 00000002 08000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* Ebony has all 4 IRQ pins tied together per slot */
++ interrupt-map-mask = <f800 0 0 0>;
++ interrupt-map = <
++ /* IDSEL 1 */
++ 0800 0 0 0 &UIC0 17 8
++
++ /* IDSEL 2 */
++ 1000 0 0 0 &UIC0 18 8
++
++ /* IDSEL 3 */
++ 1800 0 0 0 &UIC0 19 8
++
++ /* IDSEL 4 */
++ 2000 0 0 0 &UIC0 1a 8
++ >;
+ };
+ };
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/ep405.dts powerpc.git/arch/powerpc/boot/dts/ep405.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/ep405.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/ep405.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,228 @@
++/*
++ * Device Tree Source for EP405
++ *
++ * Copyright 2007 IBM Corp.
++ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "ep405";
++ compatible = "ep405";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,405GP";
++ reg = <0>;
++ clock-frequency = <bebc200>; /* Filled in by zImage */
++ timebase-frequency = <0>; /* Filled in by zImage */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <4000>;
++ d-cache-size = <4000>;
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0>; /* Filled in by zImage */
++ };
++
++ UIC0: interrupt-controller {
++ compatible = "ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 9>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ plb {
++ compatible = "ibm,plb3";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ SDRAM0: memory-controller {
++ compatible = "ibm,sdram-405gp";
++ dcr-reg = <010 2>;
++ };
++
++ MAL: mcmal {
++ compatible = "ibm,mcmal-405gp", "ibm,mcmal";
++ dcr-reg = <180 62>;
++ num-tx-chans = <1>;
++ num-rx-chans = <1>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <
++ b 4 /* TXEOB */
++ c 4 /* RXEOB */
++ a 4 /* SERR */
++ d 4 /* TXDE */
++ e 4 /* RXDE */>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-405gp", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <ef600000 ef600000 a00000>;
++ dcr-reg = <0a0 5>;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ UART0: serial@ef600300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600300 8>;
++ virtual-reg = <ef600300>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ current-speed = <2580>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <0 4>;
++ };
++
++ UART1: serial@ef600400 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600400 8>;
++ virtual-reg = <ef600400>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ current-speed = <2580>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++ IIC: i2c@ef600500 {
++ compatible = "ibm,iic-405gp", "ibm,iic";
++ reg = <ef600500 11>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ GPIO: gpio@ef600700 {
++ compatible = "ibm,gpio-405gp";
++ reg = <ef600700 20>;
++ };
++
++ EMAC: ethernet@ef600800 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-405gp", "ibm,emac";
++ interrupt-parent = <&UIC0>;
++ interrupts = <
++ f 4 /* Ethernet */
++ 9 4 /* Ethernet Wake Up */>;
++ local-mac-address = [000000000000]; /* Filled in by zImage */
++ reg = <ef600800 70>;
++ mal-device = <&MAL>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rmii";
++ phy-map = <00000000>;
++ };
++
++ };
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-405gp", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++
++
++ /* The ranges property is supplied by the bootwrapper
++ * and is based on the firmware's configuration of the
++ * EBC bridge
++ */
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ /* NVRAM and RTC */
++ nvrtc@4,200000 {
++ compatible = "ds1742";
++ reg = <4 200000 0>; /* size fixed up by zImage */
++ };
++
++ /* "BCSR" CPLD contains a PCI irq controller */
++ bcsr@4,0 {
++ compatible = "ep405-bcsr";
++ reg = <4 0 10>;
++ interrupt-controller;
++ /* Routing table */
++ irq-routing = [ 00 /* SYSERR */
++ 01 /* STTM */
++ 01 /* RTC */
++ 01 /* FENET */
++ 02 /* NB PCIIRQ mux ? */
++ 03 /* SB Winbond 8259 ? */
++ 04 /* Serial Ring */
++ 05 /* USB (ep405pc) */
++ 06 /* XIRQ 0 */
++ 06 /* XIRQ 1 */
++ 06 /* XIRQ 2 */
++ 06 /* XIRQ 3 */
++ 06 /* XIRQ 4 */
++ 06 /* XIRQ 5 */
++ 06 /* XIRQ 6 */
++ 07]; /* Reserved */
++ };
++ };
++
++ PCI0: pci@ec000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
++ primary;
++ reg = <eec00000 8 /* Config space access */
++ eed80000 4 /* IACK */
++ eed80000 4 /* Special cycle */
++ ef480000 40>; /* Internal registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed. Chip supports a second
++ * IO range but we don't use it for now
++ */
++ ranges = <02000000 0 80000000 80000000 0 20000000
++ 01000000 0 00000000 e8000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* That's all I know about IRQs on that thing ... */
++ interrupt-map-mask = <f800 0 0 0>;
++ interrupt-map = <
++ /* USB */
++ 7000 0 0 0 &UIC0 1e 8 /* IRQ5 */
++ >;
++ };
++ };
++
++ chosen {
++ linux,stdout-path = "/plb/opb/serial@ef600300";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/ep8248e.dts powerpc.git/arch/powerpc/boot/dts/ep8248e.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/ep8248e.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/ep8248e.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,207 @@
++/*
++ * Device Tree for the Embedded Planet EP8248E board running PlanetCore.
++ *
++ * Copyright 2007 Freescale Semiconductor Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++/ {
++ model = "EP8248E";
++ compatible = "fsl,ep8248e";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ planetcore-SMC1 = &smc1;
++ planetcore-SCC1 = &scc1;
++ ethernet0 = &eth0;
++ ethernet1 = &eth1;
++ serial0 = &smc1;
++ serial1 = &scc1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8248@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <32>;
++ i-cache-line-size = <32>;
++ d-cache-size = <16384>;
++ i-cache-size = <16384>;
++ timebase-frequency = <0>;
++ clock-frequency = <0>;
++ };
++ };
++
++ localbus@f0010100 {
++ compatible = "fsl,mpc8248-localbus",
++ "fsl,pq2-localbus",
++ "simple-bus";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ reg = <0xf0010100 0x40>;
++
++ ranges = <0 0 0xfc000000 0x04000000
++ 1 0 0xfa000000 0x00008000>;
++
++ flash@0,3800000 {
++ compatible = "cfi-flash";
++ reg = <0 0x3800000 0x800000>;
++ bank-width = <4>;
++ device-width = <2>;
++ };
++
++ bcsr@1,0 {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ reg = <1 0 0x10>;
++ compatible = "fsl,ep8248e-bcsr";
++ ranges;
++
++ mdio {
++ device_type = "mdio";
++ compatible = "fsl,ep8248e-mdio-bitbang";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <1 8 1>;
++
++ PHY0: ethernet-phy@0 {
++ interrupt-parent = <&PIC>;
++ reg = <0>;
++ device_type = "ethernet-phy";
++ };
++
++ PHY1: ethernet-phy@1 {
++ interrupt-parent = <&PIC>;
++ reg = <1>;
++ device_type = "ethernet-phy";
++ };
++ };
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0>;
++ };
++
++ soc@f0000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8248-immr", "fsl,pq2-soc", "simple-bus";
++ ranges = <0x00000000 0xf0000000 0x00053000>;
++
++ // Temporary until code stops depending on it.
++ device_type = "soc";
++
++ // Temporary -- will go away once kernel uses ranges for get_immrbase().
++ reg = <0xf0000000 0x00053000>;
++
++ cpm@119c0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ #interrupt-cells = <2>;
++ compatible = "fsl,mpc8248-cpm", "fsl,cpm2",
++ "simple-bus";
++ reg = <0x119c0 0x30>;
++ ranges;
++
++ muram {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 0 0x10000>;
++
++ data@0 {
++ compatible = "fsl,cpm-muram-data";
++ reg = <0 0x1100 0x1140
++ 0xec0 0x9800 0x800>;
++ };
++ };
++
++ brg@119f0 {
++ compatible = "fsl,mpc8248-brg",
++ "fsl,cpm2-brg",
++ "fsl,cpm-brg";
++ reg = <0x119f0 0x10 0x115f0 0x10>;
++ };
++
++ /* Monitor port/SMC1 */
++ smc1: serial@11a80 {
++ device_type = "serial";
++ compatible = "fsl,mpc8248-smc-uart",
++ "fsl,cpm2-smc-uart";
++ reg = <0x11a80 0x20 0x1100 0x40>;
++ interrupts = <4 8>;
++ interrupt-parent = <&PIC>;
++ fsl,cpm-brg = <7>;
++ fsl,cpm-command = <0x1d000000>;
++ linux,planetcore-label = "SMC1";
++ };
++
++ /* "Serial" port/SCC1 */
++ scc1: serial@11a00 {
++ device_type = "serial";
++ compatible = "fsl,mpc8248-scc-uart",
++ "fsl,cpm2-scc-uart";
++ reg = <0x11a00 0x20 0x8000 0x100>;
++ interrupts = <40 8>;
++ interrupt-parent = <&PIC>;
++ fsl,cpm-brg = <1>;
++ fsl,cpm-command = <0x00800000>;
++ linux,planetcore-label = "SCC1";
++ };
++
++ eth0: ethernet@11300 {
++ device_type = "network";
++ compatible = "fsl,mpc8248-fcc-enet",
++ "fsl,cpm2-fcc-enet";
++ reg = <0x11300 0x20 0x8400 0x100 0x11390 1>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <32 8>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY0>;
++ linux,network-index = <0>;
++ fsl,cpm-command = <0x12000300>;
++ };
++
++ eth1: ethernet@11320 {
++ device_type = "network";
++ compatible = "fsl,mpc8248-fcc-enet",
++ "fsl,cpm2-fcc-enet";
++ reg = <0x11320 0x20 0x8500 0x100 0x113b0 1>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <33 8>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY1>;
++ linux,network-index = <1>;
++ fsl,cpm-command = <0x16200300>;
++ };
++
++ usb@11b60 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,mpc8248-usb",
++ "fsl,cpm2-usb";
++ reg = <0x11b60 0x18 0x8b00 0x100>;
++ interrupt-parent = <&PIC>;
++ interrupts = <11 8>;
++ fsl,cpm-command = <0x2e600000>;
++ };
++ };
++
++ PIC: interrupt-controller@10c00 {
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ reg = <0x10c00 0x80>;
++ compatible = "fsl,mpc8248-pic", "fsl,pq2-pic";
++ };
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/haleakala.dts powerpc.git/arch/powerpc/boot/dts/haleakala.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/haleakala.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/haleakala.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,274 @@
++/*
++ * Device Tree Source for AMCC Haleakala (405EXr)
++ *
++ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "amcc,haleakala";
++ compatible = "amcc,kilauea";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,405EXr";
++ reg = <0>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ timebase-frequency = <0>; /* Filled in by U-Boot */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <4000>; /* 16 kB */
++ d-cache-size = <4000>; /* 16 kB */
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0>; /* Filled in by U-Boot */
++ };
++
++ UIC0: interrupt-controller {
++ compatible = "ibm,uic-405exr", "ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-405exr","ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1e 4 1f 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ UIC2: interrupt-controller2 {
++ compatible = "ibm,uic-405exr","ibm,uic";
++ interrupt-controller;
++ cell-index = <2>;
++ dcr-reg = <0e0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1c 4 1d 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ plb {
++ compatible = "ibm,plb-405exr", "ibm,plb4";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++
++ SDRAM0: memory-controller {
++ compatible = "ibm,sdram-405exr";
++ dcr-reg = <010 2>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-405exr", "ibm,mcmal2";
++ dcr-reg = <180 62>;
++ num-tx-chans = <2>;
++ num-rx-chans = <2>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
++ /*RXEOB*/ 1 &UIC0 b 4
++ /*SERR*/ 2 &UIC1 0 4
++ /*TXDE*/ 3 &UIC1 1 4
++ /*RXDE*/ 4 &UIC1 2 4>;
++ interrupt-map-mask = <ffffffff>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-405exr", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <80000000 80000000 10000000
++ ef600000 ef600000 a00000
++ f0000000 f0000000 10000000>;
++ dcr-reg = <0a0 5>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-405exr", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ /* ranges property is supplied by U-Boot */
++ interrupts = <5 1>;
++ interrupt-parent = <&UIC1>;
++
++ nor_flash@0,0 {
++ compatible = "amd,s29gl512n", "cfi-flash";
++ bank-width = <2>;
++ reg = <0 000000 4000000>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ partition@0 {
++ label = "kernel";
++ reg = <0 200000>;
++ };
++ partition@200000 {
++ label = "root";
++ reg = <200000 200000>;
++ };
++ partition@400000 {
++ label = "user";
++ reg = <400000 3b60000>;
++ };
++ partition@3f60000 {
++ label = "env";
++ reg = <3f60000 40000>;
++ };
++ partition@3fa0000 {
++ label = "u-boot";
++ reg = <3fa0000 60000>;
++ };
++ };
++ };
++
++ UART0: serial@ef600200 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600200 8>;
++ virtual-reg = <ef600200>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1a 4>;
++ };
++
++ UART1: serial@ef600300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600300 8>;
++ virtual-reg = <ef600300>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++ IIC0: i2c@ef600400 {
++ compatible = "ibm,iic-405exr", "ibm,iic";
++ reg = <ef600400 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ IIC1: i2c@ef600500 {
++ compatible = "ibm,iic-405exr", "ibm,iic";
++ reg = <ef600500 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <7 4>;
++ };
++
++
++ RGMII0: emac-rgmii@ef600b00 {
++ compatible = "ibm,rgmii-405exr", "ibm,rgmii";
++ reg = <ef600b00 104>;
++ has-mdio;
++ };
++
++ EMAC0: ethernet@ef600900 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-405exr", "ibm,emac4";
++ interrupt-parent = <&EMAC0>;
++ interrupts = <0 1>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*Status*/ 0 &UIC0 18 4
++ /*Wake*/ 1 &UIC1 1d 4>;
++ reg = <ef600900 70>;
++ local-mac-address = [000000000000]; /* Filled in by U-Boot */
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000000>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <0>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++ };
++
++ PCIE0: pciex@0a0000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-405exr", "ibm,plb-pciex";
++ primary;
++ port = <0>; /* port number */
++ reg = <a0000000 20000000 /* Config space access */
++ ef000000 00001000>; /* Registers */
++ dcr-reg = <040 020>;
++ sdr-base = <400>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 90000000 0 08000000
++ 01000000 0 00000000 e0000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* This drives busses 0x00 to 0x3f */
++ bus-range = <00 3f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
++ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
++ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
++ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
++ };
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/katmai.dts powerpc.git/arch/powerpc/boot/dts/katmai.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/katmai.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/katmai.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,400 @@
++/*
++ * Device Tree Source for AMCC Katmai eval board
++ *
++ * Copyright (c) 2006, 2007 IBM Corp.
++ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
++ *
++ * Copyright (c) 2006, 2007 IBM Corp.
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ model = "amcc,katmai";
++ compatible = "amcc,katmai";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ serial2 = &UART2;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,440SPe";
++ reg = <0>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ timebase-frequency = <0>; /* Filled in by zImage */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <20000>;
++ d-cache-size = <20000>;
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0 0>; /* Filled in by zImage */
++ };
++
++ UIC0: interrupt-controller0 {
++ compatible = "ibm,uic-440spe","ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-440spe","ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1e 4 1f 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ UIC2: interrupt-controller2 {
++ compatible = "ibm,uic-440spe","ibm,uic";
++ interrupt-controller;
++ cell-index = <2>;
++ dcr-reg = <0e0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <a 4 b 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ UIC3: interrupt-controller3 {
++ compatible = "ibm,uic-440spe","ibm,uic";
++ interrupt-controller;
++ cell-index = <3>;
++ dcr-reg = <0f0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <10 4 11 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ SDR0: sdr {
++ compatible = "ibm,sdr-440spe";
++ dcr-reg = <00e 002>;
++ };
++
++ CPR0: cpr {
++ compatible = "ibm,cpr-440spe";
++ dcr-reg = <00c 002>;
++ };
++
++ plb {
++ compatible = "ibm,plb-440spe", "ibm,plb-440gp", "ibm,plb4";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ SDRAM0: sdram {
++ compatible = "ibm,sdram-440spe", "ibm,sdram-405gp";
++ dcr-reg = <010 2>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-440spe", "ibm,mcmal2";
++ dcr-reg = <180 62>;
++ num-tx-chans = <2>;
++ num-rx-chans = <1>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC1 6 4
++ /*RXEOB*/ 1 &UIC1 7 4
++ /*SERR*/ 2 &UIC1 1 4
++ /*TXDE*/ 3 &UIC1 2 4
++ /*RXDE*/ 4 &UIC1 3 4>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <00000000 4 e0000000 20000000>;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ interrupts = <5 1>;
++ interrupt-parent = <&UIC1>;
++ };
++
++ UART0: serial@10000200 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <10000200 8>;
++ virtual-reg = <a0000200>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ current-speed = <1c200>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <0 4>;
++ };
++
++ UART1: serial@10000300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <10000300 8>;
++ virtual-reg = <a0000300>;
++ clock-frequency = <0>;
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++
++ UART2: serial@10000600 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <10000600 8>;
++ virtual-reg = <a0000600>;
++ clock-frequency = <0>;
++ current-speed = <0>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <5 4>;
++ };
++
++ IIC0: i2c@10000400 {
++ device_type = "i2c";
++ compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
++ reg = <10000400 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ IIC1: i2c@10000500 {
++ device_type = "i2c";
++ compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
++ reg = <10000500 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <3 4>;
++ };
++
++ EMAC0: ethernet@10000800 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-440spe", "ibm,emac4";
++ interrupt-parent = <&UIC1>;
++ interrupts = <1c 4 1d 4>;
++ reg = <10000800 70>;
++ local-mac-address = [000000000000];
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "gmii";
++ phy-map = <00000000>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++ };
++
++ PCIX0: pci@c0ec00000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pcix-440spe", "ibm,plb-pcix";
++ primary;
++ large-inbound-windows;
++ enable-msi-hole;
++ reg = <c 0ec00000 8 /* Config space access */
++ 0 0 0 /* no IACK cycles */
++ c 0ed00000 4 /* Special cycles */
++ c 0ec80000 100 /* Internal registers */
++ c 0ec80100 fc>; /* Internal messaging registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 0000000d 80000000 0 80000000
++ 01000000 0 00000000 0000000c 08000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* This drives busses 0 to 0xf */
++ bus-range = <0 f>;
++
++ /*
++ * On Katmai, the following PCI-X interrupts signals
++ * have to be enabled via jumpers (only INTA is
++ * enabled per default):
++ *
++ * INTB: J3: 1-2
++ * INTC: J2: 1-2
++ * INTD: J1: 1-2
++ */
++ interrupt-map-mask = <f800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 1 */
++ 0800 0 0 1 &UIC1 14 8
++ 0800 0 0 2 &UIC1 13 8
++ 0800 0 0 3 &UIC1 12 8
++ 0800 0 0 4 &UIC1 11 8
++ >;
++ };
++
++ PCIE0: pciex@d00000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
++ primary;
++ port = <0>; /* port number */
++ reg = <d 00000000 20000000 /* Config space access */
++ c 10000000 00001000>; /* Registers */
++ dcr-reg = <100 020>;
++ sdr-base = <300>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 0000000e 00000000 0 80000000
++ 01000000 0 00000000 0000000f 80000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* This drives busses 10 to 0x1f */
++ bus-range = <10 1f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC3 0 4 /* swizzled int A */
++ 0000 0 0 2 &UIC3 1 4 /* swizzled int B */
++ 0000 0 0 3 &UIC3 2 4 /* swizzled int C */
++ 0000 0 0 4 &UIC3 3 4 /* swizzled int D */>;
++ };
++
++ PCIE1: pciex@d20000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
++ primary;
++ port = <1>; /* port number */
++ reg = <d 20000000 20000000 /* Config space access */
++ c 10001000 00001000>; /* Registers */
++ dcr-reg = <120 020>;
++ sdr-base = <340>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 0000000e 80000000 0 80000000
++ 01000000 0 00000000 0000000f 80010000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* This drives busses 10 to 0x1f */
++ bus-range = <20 2f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC3 4 4 /* swizzled int A */
++ 0000 0 0 2 &UIC3 5 4 /* swizzled int B */
++ 0000 0 0 3 &UIC3 6 4 /* swizzled int C */
++ 0000 0 0 4 &UIC3 7 4 /* swizzled int D */>;
++ };
++
++ PCIE2: pciex@d40000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
++ primary;
++ port = <2>; /* port number */
++ reg = <d 40000000 20000000 /* Config space access */
++ c 10002000 00001000>; /* Registers */
++ dcr-reg = <140 020>;
++ sdr-base = <370>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 0000000f 00000000 0 80000000
++ 01000000 0 00000000 0000000f 80020000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* This drives busses 10 to 0x1f */
++ bus-range = <30 3f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC3 8 4 /* swizzled int A */
++ 0000 0 0 2 &UIC3 9 4 /* swizzled int B */
++ 0000 0 0 3 &UIC3 a 4 /* swizzled int C */
++ 0000 0 0 4 &UIC3 b 4 /* swizzled int D */>;
++ };
++ };
++
++ chosen {
++ linux,stdout-path = "/plb/opb/serial@10000200";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/kilauea.dts powerpc.git/arch/powerpc/boot/dts/kilauea.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/kilauea.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/kilauea.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -13,14 +13,22 @@
+ #size-cells = <1>;
+ model = "amcc,kilauea";
+ compatible = "amcc,kilauea";
+- dcr-parent = <&/cpus/PowerPC,405EX@0>;
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- PowerPC,405EX@0 {
++ cpu@0 {
+ device_type = "cpu";
++ model = "PowerPC,405EX";
+ reg = <0>;
+ clock-frequency = <0>; /* Filled in by U-Boot */
+ timebase-frequency = <0>; /* Filled in by U-Boot */
+@@ -194,6 +202,7 @@
+ device_type = "rgmii-interface";
+ compatible = "ibm,rgmii-405ex", "ibm,rgmii";
+ reg = <ef600b00 104>;
++ has-mdio;
+ };
+
+ EMAC0: ethernet@ef600900 {
+@@ -220,6 +229,8 @@
+ phy-map = <00000000>;
+ rgmii-device = <&RGMII0>;
+ rgmii-channel = <0>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
+ };
+
+ EMAC1: ethernet@ef600a00 {
+@@ -246,7 +257,91 @@
+ phy-map = <00000000>;
+ rgmii-device = <&RGMII0>;
+ rgmii-channel = <1>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
+ };
+ };
++
++ PCIE0: pciex@0a0000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
++ primary;
++ port = <0>; /* port number */
++ reg = <a0000000 20000000 /* Config space access */
++ ef000000 00001000>; /* Registers */
++ dcr-reg = <040 020>;
++ sdr-base = <400>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 90000000 0 08000000
++ 01000000 0 00000000 e0000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* This drives busses 0x00 to 0x3f */
++ bus-range = <00 3f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
++ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
++ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
++ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
++ };
++
++ PCIE1: pciex@0c0000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
++ primary;
++ port = <1>; /* port number */
++ reg = <c0000000 20000000 /* Config space access */
++ ef001000 00001000>; /* Registers */
++ dcr-reg = <060 020>;
++ sdr-base = <440>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 98000000 0 08000000
++ 01000000 0 00000000 e0010000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* This drives busses 0x40 to 0x7f */
++ bus-range = <40 7f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC2 b 4 /* swizzled int A */
++ 0000 0 0 2 &UIC2 c 4 /* swizzled int B */
++ 0000 0 0 3 &UIC2 d 4 /* swizzled int C */
++ 0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
++ };
+ };
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/kuroboxHD.dts powerpc.git/arch/powerpc/boot/dts/kuroboxHD.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/kuroboxHD.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/kuroboxHD.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -23,6 +23,12 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -60,7 +66,7 @@
+ i2c@80003000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <80003000 1000>;
+ interrupts = <5 2>;
+@@ -73,7 +79,8 @@
+ };
+ };
+
+- serial@80004500 {
++ serial0: serial@80004500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <80004500 8>;
+@@ -83,7 +90,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@80004600 {
++ serial1: serial@80004600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <80004600 8>;
+@@ -102,7 +110,7 @@
+ reg = <80040000 40000>;
+ };
+
+- pci@fec00000 {
++ pci0: pci@fec00000 {
+ #address-cells = <3>;
+ #size-cells = <2>;
+ #interrupt-cells = <1>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/kuroboxHG.dts powerpc.git/arch/powerpc/boot/dts/kuroboxHG.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/kuroboxHG.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/kuroboxHG.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -23,6 +23,12 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -60,7 +66,7 @@
+ i2c@80003000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <80003000 1000>;
+ interrupts = <5 2>;
+@@ -73,7 +79,8 @@
+ };
+ };
+
+- serial@80004500 {
++ serial0: serial@80004500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <80004500 8>;
+@@ -83,7 +90,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@80004600 {
++ serial1: serial@80004600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <80004600 8>;
+@@ -102,7 +110,7 @@
+ reg = <80040000 40000>;
+ };
+
+- pci@fec00000 {
++ pci0: pci@fec00000 {
+ #address-cells = <3>;
+ #size-cells = <2>;
+ #interrupt-cells = <1>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/lite5200.dts powerpc.git/arch/powerpc/boot/dts/lite5200.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/lite5200.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/lite5200.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -19,7 +19,7 @@
+ / {
+ model = "fsl,lite5200";
+ // revision = "1.0";
+- compatible = "fsl,lite5200","generic-mpc5200";
++ compatible = "fsl,lite5200";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+@@ -284,7 +284,8 @@
+ };
+
+ i2c@3d00 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
+ compatible = "mpc5200-i2c","fsl-i2c";
+ cell-index = <0>;
+ reg = <3d00 40>;
+@@ -294,7 +295,8 @@
+ };
+
+ i2c@3d40 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
+ compatible = "mpc5200-i2c","fsl-i2c";
+ cell-index = <1>;
+ reg = <3d40 40>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/lite5200b.dts powerpc.git/arch/powerpc/boot/dts/lite5200b.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/lite5200b.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/lite5200b.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -19,7 +19,7 @@
+ / {
+ model = "fsl,lite5200b";
+ // revision = "1.0";
+- compatible = "fsl,lite5200b","generic-mpc5200";
++ compatible = "fsl,lite5200b";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+@@ -300,7 +300,8 @@
+ };
+
+ i2c@3d00 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
+ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
+ cell-index = <0>;
+ reg = <3d00 40>;
+@@ -310,7 +311,8 @@
+ };
+
+ i2c@3d40 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
+ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
+ cell-index = <1>;
+ reg = <3d40 40>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/makalu.dts powerpc.git/arch/powerpc/boot/dts/makalu.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/makalu.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/makalu.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,347 @@
++/*
++ * Device Tree Source for AMCC Makalu (405EX)
++ *
++ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "amcc,makalu";
++ compatible = "amcc,makalu";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,405EX";
++ reg = <0>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ timebase-frequency = <0>; /* Filled in by U-Boot */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <4000>; /* 16 kB */
++ d-cache-size = <4000>; /* 16 kB */
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0>; /* Filled in by U-Boot */
++ };
++
++ UIC0: interrupt-controller {
++ compatible = "ibm,uic-405ex", "ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-405ex","ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1e 4 1f 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ UIC2: interrupt-controller2 {
++ compatible = "ibm,uic-405ex","ibm,uic";
++ interrupt-controller;
++ cell-index = <2>;
++ dcr-reg = <0e0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1c 4 1d 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ plb {
++ compatible = "ibm,plb-405ex", "ibm,plb4";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++
++ SDRAM0: memory-controller {
++ compatible = "ibm,sdram-405ex";
++ dcr-reg = <010 2>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-405ex", "ibm,mcmal2";
++ dcr-reg = <180 62>;
++ num-tx-chans = <2>;
++ num-rx-chans = <2>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
++ /*RXEOB*/ 1 &UIC0 b 4
++ /*SERR*/ 2 &UIC1 0 4
++ /*TXDE*/ 3 &UIC1 1 4
++ /*RXDE*/ 4 &UIC1 2 4>;
++ interrupt-map-mask = <ffffffff>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-405ex", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <80000000 80000000 10000000
++ ef600000 ef600000 a00000
++ f0000000 f0000000 10000000>;
++ dcr-reg = <0a0 5>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-405ex", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ /* ranges property is supplied by U-Boot */
++ interrupts = <5 1>;
++ interrupt-parent = <&UIC1>;
++
++ nor_flash@0,0 {
++ compatible = "amd,s29gl512n", "cfi-flash";
++ bank-width = <2>;
++ reg = <0 000000 4000000>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ partition@0 {
++ label = "kernel";
++ reg = <0 200000>;
++ };
++ partition@200000 {
++ label = "root";
++ reg = <200000 200000>;
++ };
++ partition@400000 {
++ label = "user";
++ reg = <400000 3b60000>;
++ };
++ partition@3f60000 {
++ label = "env";
++ reg = <3f60000 40000>;
++ };
++ partition@3fa0000 {
++ label = "u-boot";
++ reg = <3fa0000 60000>;
++ };
++ };
++ };
++
++ UART0: serial@ef600200 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600200 8>;
++ virtual-reg = <ef600200>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1a 4>;
++ };
++
++ UART1: serial@ef600300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600300 8>;
++ virtual-reg = <ef600300>;
++ clock-frequency = <0>; /* Filled in by U-Boot */
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++ IIC0: i2c@ef600400 {
++ device_type = "i2c";
++ compatible = "ibm,iic-405ex", "ibm,iic";
++ reg = <ef600400 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ IIC1: i2c@ef600500 {
++ device_type = "i2c";
++ compatible = "ibm,iic-405ex", "ibm,iic";
++ reg = <ef600500 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <7 4>;
++ };
++
++
++ RGMII0: emac-rgmii@ef600b00 {
++ device_type = "rgmii-interface";
++ compatible = "ibm,rgmii-405ex", "ibm,rgmii";
++ reg = <ef600b00 104>;
++ has-mdio;
++ };
++
++ EMAC0: ethernet@ef600900 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-405ex", "ibm,emac4";
++ interrupt-parent = <&EMAC0>;
++ interrupts = <0 1>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*Status*/ 0 &UIC0 18 4
++ /*Wake*/ 1 &UIC1 1d 4>;
++ reg = <ef600900 70>;
++ local-mac-address = [000000000000]; /* Filled in by U-Boot */
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <0000003f>; /* Start at 6 */
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <0>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++
++ EMAC1: ethernet@ef600a00 {
++ linux,network-index = <1>;
++ device_type = "network";
++ compatible = "ibm,emac-405ex", "ibm,emac4";
++ interrupt-parent = <&EMAC1>;
++ interrupts = <0 1>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*Status*/ 0 &UIC0 19 4
++ /*Wake*/ 1 &UIC1 1f 4>;
++ reg = <ef600a00 70>;
++ local-mac-address = [000000000000]; /* Filled in by U-Boot */
++ mal-device = <&MAL0>;
++ mal-tx-channel = <1>;
++ mal-rx-channel = <1>;
++ cell-index = <1>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000000>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <1>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++ };
++
++ PCIE0: pciex@0a0000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
++ primary;
++ port = <0>; /* port number */
++ reg = <a0000000 20000000 /* Config space access */
++ ef000000 00001000>; /* Registers */
++ dcr-reg = <040 020>;
++ sdr-base = <400>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 90000000 0 08000000
++ 01000000 0 00000000 e0000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* This drives busses 0x00 to 0x3f */
++ bus-range = <00 3f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
++ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
++ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
++ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
++ };
++
++ PCIE1: pciex@0c0000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
++ primary;
++ port = <1>; /* port number */
++ reg = <c0000000 20000000 /* Config space access */
++ ef001000 00001000>; /* Registers */
++ dcr-reg = <060 020>;
++ sdr-base = <440>;
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 98000000 0 08000000
++ 01000000 0 00000000 e0010000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* This drives busses 0x40 to 0x7f */
++ bus-range = <40 7f>;
++
++ /* Legacy interrupts (note the weird polarity, the bridge seems
++ * to invert PCIe legacy interrupts).
++ * We are de-swizzling here because the numbers are actually for
++ * port of the root complex virtual P2P bridge. But I want
++ * to avoid putting a node for it in the tree, so the numbers
++ * below are basically de-swizzled numbers.
++ * The real slot is on idsel 0, so the swizzling is 1:1
++ */
++ interrupt-map-mask = <0000 0 0 7>;
++ interrupt-map = <
++ 0000 0 0 1 &UIC2 b 4 /* swizzled int A */
++ 0000 0 0 2 &UIC2 c 4 /* swizzled int B */
++ 0000 0 0 3 &UIC2 d 4 /* swizzled int C */
++ 0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
++ };
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/motionpro.dts powerpc.git/arch/powerpc/boot/dts/motionpro.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/motionpro.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/motionpro.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,309 @@
++/*
++ * Motion-PRO board Device Tree Source
++ *
++ * Copyright (C) 2007 Semihalf
++ * Marian Balakowicz <m8@semihalf.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/*
++ * WARNING: Do not depend on this tree layout remaining static just yet.
++ * The MPC5200 device tree conventions are still in flux
++ * Keep an eye on the linuxppc-dev mailing list for more details
++ */
++
++/ {
++ model = "promess,motionpro";
++ compatible = "promess,motionpro";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,5200@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <20>;
++ i-cache-line-size = <20>;
++ d-cache-size = <4000>; // L1, 16K
++ i-cache-size = <4000>; // L1, 16K
++ timebase-frequency = <0>; // from bootloader
++ bus-frequency = <0>; // from bootloader
++ clock-frequency = <0>; // from bootloader
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <00000000 04000000>; // 64MB
++ };
++
++ soc5200@f0000000 {
++ model = "fsl,mpc5200b";
++ compatible = "fsl,mpc5200b";
++ revision = ""; // from bootloader
++ device_type = "soc";
++ ranges = <0 f0000000 0000c000>;
++ reg = <f0000000 00000100>;
++ bus-frequency = <0>; // from bootloader
++ system-frequency = <0>; // from bootloader
++
++ cdm@200 {
++ compatible = "mpc5200b-cdm","mpc5200-cdm";
++ reg = <200 38>;
++ };
++
++ mpc5200_pic: pic@500 {
++ // 5200 interrupts are encoded into two levels;
++ interrupt-controller;
++ #interrupt-cells = <3>;
++ compatible = "mpc5200b-pic","mpc5200-pic";
++ reg = <500 80>;
++ };
++
++ gpt@600 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <600 10>;
++ interrupts = <1 9 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl,has-wdt;
++ };
++
++ gpt@610 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <610 10>;
++ interrupts = <1 a 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@620 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <620 10>;
++ interrupts = <1 b 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@630 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <630 10>;
++ interrupts = <1 c 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@640 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <640 10>;
++ interrupts = <1 d 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpt@650 { // General Purpose Timer
++ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
++ reg = <650 10>;
++ interrupts = <1 e 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ motionpro-led@660 { // Motion-PRO status LED
++ compatible = "promess,motionpro-led";
++ label = "motionpro-statusled";
++ reg = <660 10>;
++ interrupts = <1 f 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ blink-delay = <64>; // 100 msec
++ };
++
++ motionpro-led@670 { // Motion-PRO ready LED
++ compatible = "promess,motionpro-led";
++ label = "motionpro-readyled";
++ reg = <670 10>;
++ interrupts = <1 10 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ rtc@800 { // Real time clock
++ compatible = "mpc5200b-rtc","mpc5200-rtc";
++ reg = <800 100>;
++ interrupts = <1 5 0 1 6 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ mscan@980 {
++ compatible = "mpc5200b-mscan","mpc5200-mscan";
++ interrupts = <2 12 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ reg = <980 80>;
++ };
++
++ gpio@b00 {
++ compatible = "mpc5200b-gpio","mpc5200-gpio";
++ reg = <b00 40>;
++ interrupts = <1 7 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ gpio-wkup@c00 {
++ compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
++ reg = <c00 40>;
++ interrupts = <1 8 0 0 3 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++
++ spi@f00 {
++ compatible = "mpc5200b-spi","mpc5200-spi";
++ reg = <f00 20>;
++ interrupts = <2 d 0 2 e 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ usb@1000 {
++ compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
++ reg = <1000 ff>;
++ interrupts = <2 6 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ dma-controller@1200 {
++ compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
++ reg = <1200 80>;
++ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
++ 3 4 0 3 5 0 3 6 0 3 7 0
++ 3 8 0 3 9 0 3 a 0 3 b 0
++ 3 c 0 3 d 0 3 e 0 3 f 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ xlb@1f00 {
++ compatible = "mpc5200b-xlb","mpc5200-xlb";
++ reg = <1f00 100>;
++ };
++
++ serial@2000 { // PSC1
++ device_type = "serial";
++ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
++ port-number = <0>; // Logical port assignment
++ reg = <2000 100>;
++ interrupts = <2 1 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ // PSC2 in spi master mode
++ spi@2200 { // PSC2
++ compatible = "mpc5200b-psc-spi","mpc5200-psc-spi";
++ cell-index = <1>;
++ reg = <2200 100>;
++ interrupts = <2 2 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ // PSC5 in uart mode
++ serial@2800 { // PSC5
++ device_type = "serial";
++ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
++ port-number = <4>; // Logical port assignment
++ reg = <2800 100>;
++ interrupts = <2 c 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ ethernet@3000 {
++ device_type = "network";
++ compatible = "mpc5200b-fec","mpc5200-fec";
++ reg = <3000 800>;
++ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
++ interrupts = <2 5 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ ata@3a00 {
++ compatible = "mpc5200b-ata","mpc5200-ata";
++ reg = <3a00 100>;
++ interrupts = <2 7 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ i2c@3d40 {
++ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
++ reg = <3d40 40>;
++ interrupts = <2 10 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl5200-clocking;
++ };
++
++ sram@8000 {
++ compatible = "mpc5200b-sram","mpc5200-sram";
++ reg = <8000 4000>;
++ };
++ };
++
++ lpb {
++ model = "fsl,lpb";
++ compatible = "fsl,lpb";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ ranges = <1 0 50000000 00010000
++ 2 0 50010000 00010000
++ 3 0 50020000 00010000>;
++
++ // 8-bit DualPort SRAM on LocalPlus Bus CS1
++ kollmorgen@1,0 {
++ compatible = "promess,motionpro-kollmorgen";
++ reg = <1 0 10000>;
++ interrupts = <1 1 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ // 8-bit board CPLD on LocalPlus Bus CS2
++ cpld@2,0 {
++ compatible = "promess,motionpro-cpld";
++ reg = <2 0 10000>;
++ };
++
++ // 8-bit custom Anybus Module on LocalPlus Bus CS3
++ anybus@3,0 {
++ compatible = "promess,motionpro-anybus";
++ reg = <3 0 10000>;
++ };
++ pro_module_general@3,0 {
++ compatible = "promess,pro_module_general";
++ reg = <3 0 3>;
++ };
++ pro_module_dio@3,800 {
++ compatible = "promess,pro_module_dio";
++ reg = <3 800 2>;
++ };
++ };
++
++ pci@f0000d00 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ compatible = "mpc5200b-pci","mpc5200-pci";
++ reg = <f0000d00 100>;
++ interrupt-map-mask = <f800 0 0 7>;
++ interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot
++ c000 0 0 2 &mpc5200_pic 1 1 3
++ c000 0 0 3 &mpc5200_pic 1 2 3
++ c000 0 0 4 &mpc5200_pic 1 3 3
++
++ c800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot
++ c800 0 0 2 &mpc5200_pic 1 2 3
++ c800 0 0 3 &mpc5200_pic 1 3 3
++ c800 0 0 4 &mpc5200_pic 0 0 3>;
++ clock-frequency = <0>; // From boot loader
++ interrupts = <2 8 0 2 9 0 2 a 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ bus-range = <0 0>;
++ ranges = <42000000 0 80000000 80000000 0 20000000
++ 02000000 0 a0000000 a0000000 0 10000000
++ 01000000 0 00000000 b0000000 0 01000000>;
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8313erdb.dts powerpc.git/arch/powerpc/boot/dts/mpc8313erdb.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8313erdb.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8313erdb.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -15,6 +15,14 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -37,10 +45,58 @@
+ reg = <00000000 08000000>; // 128MB at 0
+ };
+
++ localbus@e0005000 {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8313-elbc", "fsl,elbc", "simple-bus";
++ reg = <e0005000 1000>;
++ interrupts = <d#77 8>;
++ interrupt-parent = <&ipic>;
++
++ // CS0 and CS1 are swapped when
++ // booting from nand, but the
++ // addresses are the same.
++ ranges = <0 0 fe000000 00800000
++ 1 0 e2800000 00008000
++ 2 0 f0000000 00020000
++ 3 0 fa000000 00008000>;
++
++ flash@0,0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "cfi-flash";
++ reg = <0 0 800000>;
++ bank-width = <2>;
++ device-width = <1>;
++ };
++
++ nand@1,0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8313-fcm-nand",
++ "fsl,elbc-fcm-nand";
++ reg = <1 0 2000>;
++
++ u-boot@0 {
++ reg = <0 100000>;
++ read-only;
++ };
++
++ kernel@100000 {
++ reg = <100000 300000>;
++ };
++
++ fs@400000 {
++ reg = <400000 1c00000>;
++ };
++ };
++ };
++
+ soc8313@e0000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ device_type = "soc";
++ compatible = "simple-bus";
+ ranges = <0 e0000000 00100000>;
+ reg = <e0000000 00000200>;
+ bus-frequency = <0>;
+@@ -52,7 +108,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -61,7 +119,9 @@
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <f 8>;
+@@ -80,7 +140,6 @@
+
+ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+ usb@23000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-dr";
+ reg = <23000 1000>;
+ #address-cells = <1>;
+@@ -91,11 +150,10 @@
+ };
+
+ mdio@24520 {
+- device_type = "mdio";
+- compatible = "gianfar";
+- reg = <24520 20>;
+ #address-cells = <1>;
+ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <24520 20>;
+ phy1: ethernet-phy@1 {
+ interrupt-parent = < &ipic >;
+ interrupts = <13 8>;
+@@ -110,7 +168,8 @@
+ };
+ };
+
+- ethernet@24000 {
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -121,7 +180,8 @@
+ phy-handle = < &phy1 >;
+ };
+
+- ethernet@25000 {
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -132,7 +192,8 @@
+ phy-handle = < &phy4 >;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -141,7 +202,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -179,7 +241,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc832x_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc832x_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc832x_mds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc832x_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -7,6 +7,18 @@
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
++
++ * To enable external serial I/O on a Freescale MPC 8323 SYS/MDS board, do
++ * this:
++ *
++ * 1) On chip U61, lift (disconnect) pins 21 (TXD) and 22 (RXD) from the board.
++ * 2) Solder a wire from U61-21 to P19A-23. P19 is a grid of pins on the board
++ * next to the serial ports.
++ * 3) Solder a wire from U61-22 to P19K-22.
++ *
++ * Note that there's a typo in the schematic. The board labels the last column
++ * of pins "P19K", but in the schematic, that column is called "P19J". So if
++ * you're going by the schematic, the pin is called "P19J-K22".
+ */
+
+ / {
+@@ -15,6 +27,14 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -59,7 +79,7 @@
+ i2c@3000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -72,7 +92,8 @@
+ };
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -81,7 +102,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -159,6 +181,23 @@
+ 1 1e 1 0 1 0 /* TX_EN */
+ 1 1f 2 0 1 0>;/* CRS */
+ };
++ pio5: ucc_pin@05 {
++ pio-map = <
++ /*
++ * open has
++ * port pin dir drain sel irq
++ */
++ 2 0 1 0 2 0 /* TxD5 */
++ 2 8 2 0 2 0 /* RxD5 */
++
++ 2 1d 2 0 0 0 /* CTS5 */
++ 2 1f 1 0 2 0 /* RTS5 */
++
++ 2 18 2 0 0 0 /* CD */
++
++ >;
++ };
++
+ };
+ };
+
+@@ -166,6 +205,7 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+ device_type = "qe";
++ compatible = "fsl,qe";
+ model = "QE";
+ ranges = <0 e0100000 00100000>;
+ reg = <e0100000 480>;
+@@ -200,7 +240,6 @@
+ };
+
+ usb@6c0 {
+- device_type = "usb";
+ compatible = "qe_udc";
+ reg = <6c0 40 8B00 100>;
+ interrupts = <b>;
+@@ -208,48 +247,58 @@
+ mode = "slave";
+ };
+
+- ucc@2200 {
++ enet0: ucc@2200 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <3>;
+ device-id = <3>;
+ reg = <2200 200>;
+ interrupts = <22>;
+ interrupt-parent = < &qeic >;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <19>;
+- tx-clock = <1a>;
++ rx-clock-name = "clk9";
++ tx-clock-name = "clk10";
+ phy-handle = < &phy3 >;
+ pio-handle = < &pio3 >;
+ };
+
+- ucc@3200 {
++ enet1: ucc@3200 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <4>;
+ device-id = <4>;
+ reg = <3200 200>;
+ interrupts = <23>;
+ interrupt-parent = < &qeic >;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <17>;
+- tx-clock = <18>;
++ rx-clock-name = "clk7";
++ tx-clock-name = "clk8";
+ phy-handle = < &phy4 >;
+ pio-handle = < &pio4 >;
+ };
+
++ ucc@2400 {
++ device_type = "serial";
++ compatible = "ucc_uart";
++ model = "UCC";
++ device-id = <5>; /* The UCC number, 1-7*/
++ port-number = <0>; /* Which ttyQEx device */
++ soft-uart; /* We need Soft-UART */
++ reg = <2400 200>;
++ interrupts = <28>; /* From Table 18-12 */
++ interrupt-parent = < &qeic >;
++ /*
++ * For Soft-UART, we need to set TX to 1X, which
++ * means specifying separate clock sources.
++ */
++ rx-clock-name = "brg5";
++ tx-clock-name = "brg6";
++ pio-handle = < &pio5 >;
++ };
++
++
+ mdio@2320 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -283,7 +332,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x11 AD17 */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc832x_rdb.dts powerpc.git/arch/powerpc/boot/dts/mpc832x_rdb.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc832x_rdb.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc832x_rdb.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -15,6 +15,14 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -52,7 +60,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -60,7 +70,8 @@
+ dfsrr;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -69,7 +80,8 @@
+ interrupt-parent = <&pic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -187,44 +199,34 @@
+ mode = "cpu";
+ };
+
+- ucc@3000 {
++ enet0: ucc@3000 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <2>;
+ device-id = <2>;
+ reg = <3000 200>;
+ interrupts = <21>;
+ interrupt-parent = <&qeic>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <20>;
+- tx-clock = <13>;
++ rx-clock-name = "clk16";
++ tx-clock-name = "clk3";
+ phy-handle = <&phy00>;
+ pio-handle = <&ucc2pio>;
+ };
+
+- ucc@2200 {
++ enet1: ucc@2200 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <3>;
+ device-id = <3>;
+ reg = <2200 200>;
+ interrupts = <22>;
+ interrupt-parent = <&qeic>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <19>;
+- tx-clock = <1a>;
++ rx-clock-name = "clk9";
++ tx-clock-name = "clk10";
+ phy-handle = <&phy04>;
+ pio-handle = <&ucc3pio>;
+ };
+@@ -262,7 +264,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x10 AD16 (USB) */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8349emitx.dts powerpc.git/arch/powerpc/boot/dts/mpc8349emitx.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8349emitx.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8349emitx.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -14,6 +14,15 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -51,7 +60,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -60,7 +71,9 @@
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <f 8>;
+@@ -78,7 +91,6 @@
+ };
+
+ usb@22000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-mph";
+ reg = <22000 1000>;
+ #address-cells = <1>;
+@@ -90,7 +102,6 @@
+ };
+
+ usb@23000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-dr";
+ reg = <23000 1000>;
+ #address-cells = <1>;
+@@ -102,11 +113,10 @@
+ };
+
+ mdio@24520 {
+- device_type = "mdio";
+- compatible = "gianfar";
+- reg = <24520 20>;
+ #address-cells = <1>;
+ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <24520 20>;
+
+ /* Vitesse 8201 */
+ phy1c: ethernet-phy@1c {
+@@ -115,27 +125,14 @@
+ reg = <1c>;
+ device_type = "ethernet-phy";
+ };
+-
+- /* Vitesse 7385 */
+- phy1f: ethernet-phy@1f {
+- interrupt-parent = < &ipic >;
+- interrupts = <12 8>;
+- reg = <1f>;
+- device_type = "ethernet-phy";
+- };
+ };
+
+- ethernet@24000 {
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <20 8 21 8 22 8>;
+ interrupt-parent = < &ipic >;
+@@ -143,27 +140,22 @@
+ linux,network-index = <0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 8 24 8 25 8>;
+ interrupt-parent = < &ipic >;
+- phy-handle = < &phy1f >;
++ /* Vitesse 7385 isn't on the MDIO bus */
++ fixed-link = <1 1 d#1000 0 0>;
+ linux,network-index = <1>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -172,7 +164,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -203,7 +196,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x10 - SATA */
+@@ -224,7 +218,8 @@
+ device_type = "pci";
+ };
+
+- pci@e0008600 {
++ pci1: pci@e0008600 {
++ cell-index = <2>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x0E - MiniPCI Slot */
+@@ -249,6 +244,21 @@
+ device_type = "pci";
+ };
+
+-
+-
++ localbus@e0005000 {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8349e-localbus",
++ "fsl,pq2pro-localbus";
++ reg = <e0005000 d8>;
++ ranges = <3 0 f0000000 210>;
++
++ pata@3,0 {
++ compatible = "fsl,mpc8349emitx-pata", "ata-generic";
++ reg = <3 0 10 3 20c 4>;
++ reg-shift = <1>;
++ pio-mode = <6>;
++ interrupts = <17 8>;
++ interrupt-parent = <&ipic>;
++ };
++ };
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8349emitxgp.dts powerpc.git/arch/powerpc/boot/dts/mpc8349emitxgp.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8349emitxgp.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8349emitxgp.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -14,6 +14,13 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -51,7 +58,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -60,7 +69,9 @@
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <f 8>;
+@@ -78,7 +89,6 @@
+ };
+
+ usb@23000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-dr";
+ reg = <23000 1000>;
+ #address-cells = <1>;
+@@ -90,11 +100,10 @@
+ };
+
+ mdio@24520 {
+- device_type = "mdio";
+- compatible = "gianfar";
+- reg = <24520 20>;
+ #address-cells = <1>;
+ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <24520 20>;
+
+ /* Vitesse 8201 */
+ phy1c: ethernet-phy@1c {
+@@ -105,7 +114,8 @@
+ };
+ };
+
+- ethernet@24000 {
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -117,7 +127,8 @@
+ linux,network-index = <0>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -126,7 +137,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -157,7 +169,8 @@
+ };
+ };
+
+- pci@e0008600 {
++ pci0: pci@e0008600 {
++ cell-index = <2>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x0F - PCI Slot */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc834x_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc834x_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc834x_mds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc834x_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -15,6 +15,15 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -59,7 +68,7 @@
+ i2c@3000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -75,7 +84,7 @@
+ i2c@3100 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <f 8>;
+@@ -95,7 +104,6 @@
+ /* phy type (ULPI or SERIAL) are only types supportted for MPH */
+ /* port = 0 or 1 */
+ usb@22000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-mph";
+ reg = <22000 1000>;
+ #address-cells = <1>;
+@@ -107,7 +115,6 @@
+ };
+ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+ usb@23000 {
+- device_type = "usb";
+ compatible = "fsl-usb2-dr";
+ reg = <23000 1000>;
+ #address-cells = <1>;
+@@ -119,11 +126,11 @@
+ };
+
+ mdio@24520 {
+- device_type = "mdio";
+- compatible = "gianfar";
+- reg = <24520 20>;
+ #address-cells = <1>;
+ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = < &ipic >;
+ interrupts = <11 8>;
+@@ -138,17 +145,12 @@
+ };
+ };
+
+- ethernet@24000 {
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <20 8 21 8 22 8>;
+ interrupt-parent = < &ipic >;
+@@ -156,19 +158,12 @@
+ linux,network-index = <0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 8 24 8 25 8>;
+ interrupt-parent = < &ipic >;
+@@ -176,7 +171,8 @@
+ linux,network-index = <1>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -185,7 +181,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -225,7 +222,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+@@ -285,7 +283,8 @@
+ device_type = "pci";
+ };
+
+- pci@e0008600 {
++ pci1: pci@e0008600 {
++ cell-index = <2>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc836x_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc836x_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc836x_mds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc836x_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -20,6 +20,14 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -64,7 +72,7 @@
+ i2c@3000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <e 8>;
+@@ -80,7 +88,7 @@
+ i2c@3100 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <f 8>;
+@@ -88,7 +96,8 @@
+ dfsrr;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -97,7 +106,8 @@
+ interrupt-parent = < &ipic >;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -231,7 +241,6 @@
+ };
+
+ usb@6c0 {
+- device_type = "usb";
+ compatible = "qe_udc";
+ reg = <6c0 40 8B00 100>;
+ interrupts = <b>;
+@@ -239,45 +248,35 @@
+ mode = "slave";
+ };
+
+- ucc@2000 {
++ enet0: ucc@2000 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <1>;
+ device-id = <1>;
+ reg = <2000 200>;
+ interrupts = <20>;
+ interrupt-parent = < &qeic >;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <0>;
+- tx-clock = <19>;
++ rx-clock-name = "none";
++ tx-clock-name = "clk9";
+ phy-handle = < &phy0 >;
+ phy-connection-type = "rgmii-id";
+ pio-handle = < &pio1 >;
+ };
+
+- ucc@3000 {
++ enet1: ucc@3000 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <2>;
+ device-id = <2>;
+ reg = <3000 200>;
+ interrupts = <21>;
+ interrupt-parent = < &qeic >;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <0>;
+- tx-clock = <14>;
++ rx-clock-name = "none";
++ tx-clock-name = "clk4";
+ phy-handle = < &phy1 >;
+ phy-connection-type = "rgmii-id";
+ pio-handle = < &pio2 >;
+@@ -316,7 +315,8 @@
+ };
+ };
+
+- pci@e0008500 {
++ pci0: pci@e0008500 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8377_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc8377_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8377_mds.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8377_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,279 @@
++/*
++ * MPC8377E MDS Device Tree Source
++ *
++ * Copyright 2007 Freescale Semiconductor Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++
++/ {
++ model = "fsl,mpc8377emds";
++ compatible = "fsl,mpc8377emds","fsl,mpc837xmds";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8377@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <0x20>;
++ i-cache-line-size = <0x20>;
++ d-cache-size = <0x8000>; // L1, 32K
++ i-cache-size = <0x8000>; // L1, 32K
++ timebase-frequency = <0>;
++ bus-frequency = <0>;
++ clock-frequency = <0>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0x00000000 0x20000000>; // 512MB at 0
++ };
++
++ soc@e0000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ ranges = <0x0 0xe0000000 0x00100000>;
++ reg = <0xe0000000 0x00000200>;
++ bus-frequency = <0>;
++
++ wdt@200 {
++ compatible = "mpc83xx_wdt";
++ reg = <0x200 0x100>;
++ };
++
++ i2c@3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
++ reg = <0x3000 0x100>;
++ interrupts = <0xe 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <0x3100 0x100>;
++ interrupts = <0xf 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ spi@7000 {
++ compatible = "fsl_spi";
++ reg = <0x7000 0x1000>;
++ interrupts = <0x10 0x8>;
++ interrupt-parent = < &ipic >;
++ mode = "cpu";
++ };
++
++ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
++ usb@23000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x23000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x26 0x8>;
++ phy_type = "utmi_wide";
++ };
++
++ mdio@24520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <0x24520 0x20>;
++ phy2: ethernet-phy@2 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x11 0x8>;
++ reg = <2>;
++ device_type = "ethernet-phy";
++ };
++ phy3: ethernet-phy@3 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x12 0x8>;
++ reg = <3>;
++ device_type = "ethernet-phy";
++ };
++ };
++
++ enet0: ethernet@24000 {
++ cell-index = <0>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x24000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy2 >;
++ };
++
++ enet1: ethernet@25000 {
++ cell-index = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x25000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy3 >;
++ };
++
++ serial0: serial@4500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0x9 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ serial1: serial@4600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0xa 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ crypto@30000 {
++ model = "SEC3";
++ compatible = "talitos";
++ reg = <0x30000 0x10000>;
++ interrupts = <0xb 0x8>;
++ interrupt-parent = < &ipic >;
++ /* Rev. 3.0 geometry */
++ num-channels = <4>;
++ channel-fifo-len = <0x18>;
++ exec-units-mask = <0x000001fe>;
++ descriptor-types-mask = <0x03ab0ebf>;
++ };
++
++ sdhc@2e000 {
++ model = "eSDHC";
++ compatible = "fsl,esdhc";
++ reg = <0x2e000 0x1000>;
++ interrupts = <0x2a 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@18000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x18000 0x1000>;
++ interrupts = <0x2c 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@19000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x19000 0x1000>;
++ interrupts = <0x2d 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ /* IPIC
++ * interrupts cell = <intr #, sense>
++ * sense values match linux IORESOURCE_IRQ_* defines:
++ * sense == 8: Level, low assertion
++ * sense == 2: Edge, high-to-low change
++ */
++ ipic: pic@700 {
++ compatible = "fsl,ipic";
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <2>;
++ reg = <0x700 0x100>;
++ };
++ };
++
++ pci0: pci@e0008500 {
++ cell-index = <0>;
++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
++ interrupt-map = <
++
++ /* IDSEL 0x11 */
++ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x12 */
++ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x13 */
++ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x15 */
++ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x16 */
++ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x17 */
++ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x18 */
++ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
++ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
++ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
++ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x42 0x8>;
++ bus-range = <0 0>;
++ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
++ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
++ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
++ clock-frequency = <0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ reg = <0xe0008500 0x100>;
++ compatible = "fsl,mpc8349-pci";
++ device_type = "pci";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8378_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc8378_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8378_mds.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8378_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,265 @@
++/*
++ * MPC8378E MDS Device Tree Source
++ *
++ * Copyright 2007 Freescale Semiconductor Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++
++/ {
++ model = "fsl,mpc8378emds";
++ compatible = "fsl,mpc8378emds","fsl,mpc837xmds";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8378@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <0x20>;
++ i-cache-line-size = <0x20>;
++ d-cache-size = <0x8000>; // L1, 32K
++ i-cache-size = <0x8000>; // L1, 32K
++ timebase-frequency = <0>;
++ bus-frequency = <0>;
++ clock-frequency = <0>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0x00000000 0x20000000>; // 512MB at 0
++ };
++
++ soc@e0000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ ranges = <0x0 0xe0000000 0x00100000>;
++ reg = <0xe0000000 0x00000200>;
++ bus-frequency = <0>;
++
++ wdt@200 {
++ compatible = "mpc83xx_wdt";
++ reg = <0x200 0x100>;
++ };
++
++ i2c@3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
++ reg = <0x3000 0x100>;
++ interrupts = <0xe 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <0x3100 0x100>;
++ interrupts = <0xf 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ spi@7000 {
++ compatible = "fsl_spi";
++ reg = <0x7000 0x1000>;
++ interrupts = <0x10 0x8>;
++ interrupt-parent = < &ipic >;
++ mode = "cpu";
++ };
++
++ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
++ usb@23000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x23000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x26 0x8>;
++ phy_type = "utmi_wide";
++ };
++
++ mdio@24520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <0x24520 0x20>;
++ phy2: ethernet-phy@2 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x11 0x8>;
++ reg = <2>;
++ device_type = "ethernet-phy";
++ };
++ phy3: ethernet-phy@3 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x12 0x8>;
++ reg = <3>;
++ device_type = "ethernet-phy";
++ };
++ };
++
++ enet0: ethernet@24000 {
++ cell-index = <0>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x24000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy2 >;
++ };
++
++ enet1: ethernet@25000 {
++ cell-index = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x25000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy3 >;
++ };
++
++ serial0: serial@4500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0x9 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ serial1: serial@4600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0xa 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ crypto@30000 {
++ model = "SEC3";
++ compatible = "talitos";
++ reg = <0x30000 0x10000>;
++ interrupts = <0xb 0x8>;
++ interrupt-parent = < &ipic >;
++ /* Rev. 3.0 geometry */
++ num-channels = <4>;
++ channel-fifo-len = <0x18>;
++ exec-units-mask = <0x000001fe>;
++ descriptor-types-mask = <0x03ab0ebf>;
++ };
++
++ sdhc@2e000 {
++ model = "eSDHC";
++ compatible = "fsl,esdhc";
++ reg = <0x2e000 0x1000>;
++ interrupts = <0x2a 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ /* IPIC
++ * interrupts cell = <intr #, sense>
++ * sense values match linux IORESOURCE_IRQ_* defines:
++ * sense == 8: Level, low assertion
++ * sense == 2: Edge, high-to-low change
++ */
++ ipic: pic@700 {
++ compatible = "fsl,ipic";
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <2>;
++ reg = <0x700 0x100>;
++ };
++ };
++
++ pci0: pci@e0008500 {
++ cell-index = <0>;
++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
++ interrupt-map = <
++
++ /* IDSEL 0x11 */
++ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x12 */
++ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x13 */
++ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x15 */
++ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x16 */
++ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x17 */
++ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x18 */
++ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
++ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
++ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
++ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x42 0x8>;
++ bus-range = <0 0>;
++ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
++ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
++ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
++ clock-frequency = <0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ reg = <0xe0008500 0x100>;
++ compatible = "fsl,mpc8349-pci";
++ device_type = "pci";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8379_mds.dts powerpc.git/arch/powerpc/boot/dts/mpc8379_mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8379_mds.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8379_mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,293 @@
++/*
++ * MPC8379E MDS Device Tree Source
++ *
++ * Copyright 2007 Freescale Semiconductor Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/dts-v1/;
++
++/ {
++ model = "fsl,mpc8379emds";
++ compatible = "fsl,mpc8379emds","fsl,mpc837xmds";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8379@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <0x20>;
++ i-cache-line-size = <0x20>;
++ d-cache-size = <0x8000>; // L1, 32K
++ i-cache-size = <0x8000>; // L1, 32K
++ timebase-frequency = <0>;
++ bus-frequency = <0>;
++ clock-frequency = <0>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0x00000000 0x20000000>; // 512MB at 0
++ };
++
++ soc@e0000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ ranges = <0x0 0xe0000000 0x00100000>;
++ reg = <0xe0000000 0x00000200>;
++ bus-frequency = <0>;
++
++ wdt@200 {
++ compatible = "mpc83xx_wdt";
++ reg = <0x200 0x100>;
++ };
++
++ i2c@3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
++ reg = <0x3000 0x100>;
++ interrupts = <0xe 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <0x3100 0x100>;
++ interrupts = <0xf 0x8>;
++ interrupt-parent = < &ipic >;
++ dfsrr;
++ };
++
++ spi@7000 {
++ compatible = "fsl_spi";
++ reg = <0x7000 0x1000>;
++ interrupts = <0x10 0x8>;
++ interrupt-parent = < &ipic >;
++ mode = "cpu";
++ };
++
++ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
++ usb@23000 {
++ compatible = "fsl-usb2-dr";
++ reg = <0x23000 0x1000>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x26 0x8>;
++ phy_type = "utmi_wide";
++ };
++
++ mdio@24520 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <0x24520 0x20>;
++ phy2: ethernet-phy@2 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x11 0x8>;
++ reg = <2>;
++ device_type = "ethernet-phy";
++ };
++ phy3: ethernet-phy@3 {
++ interrupt-parent = < &ipic >;
++ interrupts = <0x12 0x8>;
++ reg = <3>;
++ device_type = "ethernet-phy";
++ };
++ };
++
++ enet0: ethernet@24000 {
++ cell-index = <0>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x24000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy2 >;
++ };
++
++ enet1: ethernet@25000 {
++ cell-index = <1>;
++ device_type = "network";
++ model = "eTSEC";
++ compatible = "gianfar";
++ reg = <0x25000 0x1000>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
++ phy-connection-type = "mii";
++ interrupt-parent = < &ipic >;
++ phy-handle = < &phy3 >;
++ };
++
++ serial0: serial@4500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4500 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0x9 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ serial1: serial@4600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <0x4600 0x100>;
++ clock-frequency = <0>;
++ interrupts = <0xa 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ crypto@30000 {
++ model = "SEC3";
++ compatible = "talitos";
++ reg = <0x30000 0x10000>;
++ interrupts = <0xb 0x8>;
++ interrupt-parent = < &ipic >;
++ /* Rev. 3.0 geometry */
++ num-channels = <4>;
++ channel-fifo-len = <0x18>;
++ exec-units-mask = <0x000001fe>;
++ descriptor-types-mask = <0x03ab0ebf>;
++ };
++
++ sdhc@2e000 {
++ model = "eSDHC";
++ compatible = "fsl,esdhc";
++ reg = <0x2e000 0x1000>;
++ interrupts = <0x2a 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@18000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x18000 0x1000>;
++ interrupts = <0x2c 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@19000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x19000 0x1000>;
++ interrupts = <0x2d 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@1a000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x1a000 0x1000>;
++ interrupts = <0x2e 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ sata@1b000 {
++ compatible = "fsl,mpc8379-sata";
++ reg = <0x1b000 0x1000>;
++ interrupts = <0x2f 0x8>;
++ interrupt-parent = < &ipic >;
++ };
++
++ /* IPIC
++ * interrupts cell = <intr #, sense>
++ * sense values match linux IORESOURCE_IRQ_* defines:
++ * sense == 8: Level, low assertion
++ * sense == 2: Edge, high-to-low change
++ */
++ ipic: pic@700 {
++ compatible = "fsl,ipic";
++ interrupt-controller;
++ #address-cells = <0>;
++ #interrupt-cells = <2>;
++ reg = <0x700 0x100>;
++ };
++ };
++
++ pci0: pci@e0008500 {
++ cell-index = <0>;
++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
++ interrupt-map = <
++
++ /* IDSEL 0x11 */
++ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x12 */
++ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x13 */
++ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x15 */
++ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
++ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
++ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
++ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
++
++ /* IDSEL 0x16 */
++ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
++ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
++ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
++ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
++
++ /* IDSEL 0x17 */
++ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
++ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
++ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
++ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
++
++ /* IDSEL 0x18 */
++ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
++ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
++ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
++ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
++ interrupt-parent = < &ipic >;
++ interrupts = <0x42 0x8>;
++ bus-range = <0 0>;
++ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
++ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
++ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
++ clock-frequency = <0>;
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ reg = <0xe0008500 0x100>;
++ compatible = "fsl,mpc8349-pci";
++ device_type = "pci";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8540ads.dts powerpc.git/arch/powerpc/boot/dts/mpc8540ads.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8540ads.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8540ads.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,15 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -63,7 +72,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -74,9 +85,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <5 1>;
+@@ -97,64 +108,44 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <1d 2 1e 2 22 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 2 24 2 28 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy1>;
+ };
+
+- ethernet@26000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet2: ethernet@26000 {
++ cell-index = <2>;
+ device_type = "network";
+ model = "FEC";
+ compatible = "gianfar";
+ reg = <26000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <29 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy3>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>; // reg base, size
+@@ -163,7 +154,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>; // reg base, size
+@@ -183,7 +175,8 @@
+ };
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8541cds.dts powerpc.git/arch/powerpc/boot/dts/mpc8541cds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8541cds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8541cds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,15 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -63,7 +72,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -74,9 +85,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <5 1>;
+@@ -91,9 +102,8 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -104,9 +114,8 @@
+ phy-handle = <&phy0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -117,7 +126,8 @@
+ phy-handle = <&phy1>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>; // reg base, size
+@@ -126,7 +136,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>; // reg base, size
+@@ -183,7 +194,8 @@
+ };
+ };
+
+- pci1: pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ interrupt-map-mask = <1f800 0 0 7>;
+ interrupt-map = <
+
+@@ -250,11 +262,12 @@
+ #interrupt-cells = <2>;
+ compatible = "chrp,iic";
+ interrupts = <1>;
+- interrupt-parent = <&pci1>;
++ interrupt-parent = <&pci0>;
+ };
+ };
+
+- pci@e0009000 {
++ pci1: pci@e0009000 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8544ds.dts powerpc.git/arch/powerpc/boot/dts/mpc8544ds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8544ds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8544ds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -15,6 +15,17 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ pci3 = &pci3;
++ };
++
+ cpus {
+ #cpus = <1>;
+ #address-cells = <1>;
+@@ -64,7 +75,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -72,12 +85,23 @@
+ dfsrr;
+ };
+
++ i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <3100 100>;
++ interrupts = <2b 2>;
++ interrupt-parent = <&mpic>;
++ dfsrr;
++ };
++
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <a 1>;
+@@ -92,9 +116,8 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -106,9 +129,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@26000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@26000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -120,7 +142,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -129,7 +152,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -156,7 +180,8 @@
+ };
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ compatible = "fsl,mpc8540-pci";
+ device_type = "pci";
+ interrupt-map-mask = <f800 0 0 7>;
+@@ -187,7 +212,8 @@
+ reg = <e0008000 1000>;
+ };
+
+- pcie@e0009000 {
++ pci1: pcie@e0009000 {
++ cell-index = <1>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -223,7 +249,8 @@
+ };
+ };
+
+- pcie@e000a000 {
++ pci2: pcie@e000a000 {
++ cell-index = <2>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -259,7 +286,8 @@
+ };
+ };
+
+- pcie@e000b000 {
++ pci3: pcie@e000b000 {
++ cell-index = <3>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -276,9 +304,9 @@
+ interrupt-map = <
+ // IDSEL 0x1c USB
+ e000 0 0 1 &i8259 c 2
+- e100 0 0 1 &i8259 9 2
+- e200 0 0 1 &i8259 a 2
+- e300 0 0 1 &i8259 b 2
++ e100 0 0 2 &i8259 9 2
++ e200 0 0 3 &i8259 a 2
++ e300 0 0 4 &i8259 b 2
+
+ // IDSEL 0x1d Audio
+ e800 0 0 1 &i8259 6 2
+@@ -369,6 +397,5 @@
+ };
+ };
+ };
+-
+ };
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8548cds.dts powerpc.git/arch/powerpc/boot/dts/mpc8548cds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8548cds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8548cds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,20 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++/*
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++*/
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -63,7 +77,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -71,12 +87,23 @@
+ dfsrr;
+ };
+
++ i2c@3100 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
++ reg = <3100 100>;
++ interrupts = <2b 2>;
++ interrupt-parent = <&mpic>;
++ dfsrr;
++ };
++
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <5 1>;
+@@ -103,9 +130,8 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -116,9 +142,8 @@
+ phy-handle = <&phy0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -130,9 +155,8 @@
+ };
+
+ /* eTSEC 3/4 are currently broken
+- ethernet@26000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet2: ethernet@26000 {
++ cell-index = <2>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -143,9 +167,8 @@
+ phy-handle = <&phy2>;
+ };
+
+- ethernet@27000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet3: ethernet@27000 {
++ cell-index = <3>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -157,7 +180,8 @@
+ };
+ */
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>; // reg base, size
+@@ -166,7 +190,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>; // reg base, size
+@@ -193,7 +218,8 @@
+ };
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x4 (PCIX Slot 2) */
+@@ -342,7 +368,8 @@
+ };
+ };
+
+- pci@e0009000 {
++ pci1: pci@e0009000 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+@@ -366,7 +393,8 @@
+ device_type = "pci";
+ };
+
+- pcie@e000a000 {
++ pci2: pcie@e000a000 {
++ cell-index = <2>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8555cds.dts powerpc.git/arch/powerpc/boot/dts/mpc8555cds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8555cds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8555cds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,15 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -63,7 +72,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -74,9 +85,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <5 1>;
+@@ -91,9 +102,8 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -104,9 +114,8 @@
+ phy-handle = <&phy0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+@@ -117,7 +126,8 @@
+ phy-handle = <&phy1>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>; // reg base, size
+@@ -126,7 +136,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>; // reg base, size
+@@ -183,7 +194,8 @@
+ };
+ };
+
+- pci1: pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ interrupt-map-mask = <1f800 0 0 7>;
+ interrupt-map = <
+
+@@ -250,11 +262,12 @@
+ #interrupt-cells = <2>;
+ compatible = "chrp,iic";
+ interrupts = <1>;
+- interrupt-parent = <&pci1>;
++ interrupt-parent = <&pci0>;
+ };
+ };
+
+- pci@e0009000 {
++ pci1: pci@e0009000 {
++ cell-index = <1>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8560ads.dts powerpc.git/arch/powerpc/boot/dts/mpc8560ads.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8560ads.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8560ads.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,16 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -63,11 +73,11 @@
+ };
+
+ mdio@24520 {
+- device_type = "mdio";
+- compatible = "gianfar";
+- reg = <24520 20>;
+ #address-cells = <1>;
+ #size-cells = <0>;
++ compatible = "fsl,gianfar-mdio";
++ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <5 1>;
+@@ -94,36 +104,24 @@
+ };
+ };
+
+- ethernet@24000 {
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <1d 2 1e 2 22 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy0>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 2 24 2 28 2>;
+ interrupt-parent = <&mpic>;
+@@ -174,7 +172,7 @@
+ compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
+ };
+
+- serial@91a00 {
++ serial0: serial@91a00 {
+ device_type = "serial";
+ compatible = "fsl,mpc8560-scc-uart",
+ "fsl,cpm2-scc-uart";
+@@ -186,7 +184,7 @@
+ interrupt-parent = <&cpmpic>;
+ };
+
+- serial@91a20 {
++ serial1: serial@91a20 {
+ device_type = "serial";
+ compatible = "fsl,mpc8560-scc-uart",
+ "fsl,cpm2-scc-uart";
+@@ -198,17 +196,11 @@
+ interrupt-parent = <&cpmpic>;
+ };
+
+- ethernet@91320 {
++ enet2: ethernet@91320 {
+ device_type = "network";
+ compatible = "fsl,mpc8560-fcc-enet",
+ "fsl,cpm2-fcc-enet";
+ reg = <91320 20 88500 100 913b0 1>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ fsl,cpm-command = <16200300>;
+ interrupts = <21 8>;
+@@ -216,17 +208,11 @@
+ phy-handle = <&phy2>;
+ };
+
+- ethernet@91340 {
++ enet3: ethernet@91340 {
+ device_type = "network";
+ compatible = "fsl,mpc8560-fcc-enet",
+ "fsl,cpm2-fcc-enet";
+ reg = <91340 20 88600 100 913d0 1>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ fsl,cpm-command = <1a400300>;
+ interrupts = <22 8>;
+@@ -236,7 +222,8 @@
+ };
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ #interrupt-cells = <1>;
+ #size-cells = <2>;
+ #address-cells = <3>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8568mds.dts powerpc.git/arch/powerpc/boot/dts/mpc8568mds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8568mds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8568mds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -20,6 +20,17 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -74,7 +85,7 @@
+ i2c@3000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -90,7 +101,7 @@
+ i2c@3100 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "i2c";
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <2b 2>;
+@@ -101,9 +112,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@7 {
+ interrupt-parent = <&mpic>;
+ interrupts = <1 1>;
+@@ -130,45 +141,32 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <1d 2 1e 2 22 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy2>;
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 2 24 2 28 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy3>;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -183,7 +181,8 @@
+ fsl,has-rstcr;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -318,45 +317,35 @@
+ mode = "cpu";
+ };
+
+- ucc@2000 {
++ enet2: ucc@2000 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <1>;
+ device-id = <1>;
+ reg = <2000 200>;
+ interrupts = <20>;
+ interrupt-parent = <&qeic>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <0>;
+- tx-clock = <20>;
++ rx-clock-name = "none";
++ tx-clock-name = "clk16";
+ pio-handle = <&pio1>;
+ phy-handle = <&phy0>;
+ phy-connection-type = "rgmii-id";
+ };
+
+- ucc@3000 {
++ enet3: ucc@3000 {
+ device_type = "network";
+ compatible = "ucc_geth";
+ model = "UCC";
++ cell-index = <2>;
+ device-id = <2>;
+ reg = <3000 200>;
+ interrupts = <21>;
+ interrupt-parent = <&qeic>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+- rx-clock = <0>;
+- tx-clock = <20>;
++ rx-clock-name = "none";
++ tx-clock-name = "clk16";
+ pio-handle = <&pio2>;
+ phy-handle = <&phy1>;
+ phy-connection-type = "rgmii-id";
+@@ -366,7 +355,6 @@
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <2120 18>;
+- device_type = "mdio";
+ compatible = "ucc_geth_phy";
+
+ /* These are the same PHYs as on
+@@ -410,7 +398,8 @@
+
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x12 AD18 */
+@@ -440,7 +429,8 @@
+ };
+
+ /* PCI Express */
+- pcie@e000a000 {
++ pci1: pcie@e000a000 {
++ cell-index = <2>;
+ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8572ds.dts powerpc.git/arch/powerpc/boot/dts/mpc8572ds.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8572ds.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8572ds.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -15,6 +15,18 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ pci2 = &pci2;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -69,7 +81,9 @@
+ };
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -78,7 +92,9 @@
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <2b 2>;
+@@ -89,9 +105,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <a 1>;
+@@ -114,9 +130,8 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -128,9 +143,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -142,9 +156,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@26000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet2: ethernet@26000 {
++ cell-index = <2>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -156,9 +169,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@27000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet3: ethernet@27000 {
++ cell-index = <3>;
+ device_type = "network";
+ model = "eTSEC";
+ compatible = "gianfar";
+@@ -170,7 +182,8 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -179,7 +192,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -206,7 +220,8 @@
+ };
+ };
+
+- pcie@ffe08000 {
++ pci0: pcie@ffe08000 {
++ cell-index = <0>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -319,9 +334,9 @@
+
+ // IDSEL 0x1c USB
+ e000 0 0 1 &i8259 c 2
+- e100 0 0 1 &i8259 9 2
+- e200 0 0 1 &i8259 a 2
+- e300 0 0 1 &i8259 b 2
++ e100 0 0 2 &i8259 9 2
++ e200 0 0 3 &i8259 a 2
++ e300 0 0 4 &i8259 b 2
+
+ // IDSEL 0x1d Audio
+ e800 0 0 1 &i8259 6 2
+@@ -415,7 +430,8 @@
+
+ };
+
+- pcie@ffe09000 {
++ pci1: pcie@ffe09000 {
++ cell-index = <1>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -451,7 +467,8 @@
+ };
+ };
+
+- pcie@ffe0a000 {
++ pci2: pcie@ffe0a000 {
++ cell-index = <2>;
+ compatible = "fsl,mpc8548-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -464,6 +481,7 @@
+ clock-frequency = <1fca055>;
+ interrupt-parent = <&mpic>;
+ interrupts = <1b 2>;
++ interrupt-map-mask = <f800 0 0 7>;
+ interrupt-map = <
+ /* IDSEL 0x0 */
+ 0000 0 0 1 &mpic 0 1
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8610_hpcd.dts powerpc.git/arch/powerpc/boot/dts/mpc8610_hpcd.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8610_hpcd.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8610_hpcd.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ /*
+ * MPC8610 HPCD Device Tree Source
+ *
+- * Copyright 2007 Freescale Semiconductor Inc.
++ * Copyright 2007-2008 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License Version 2 as published
+@@ -15,6 +15,13 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -42,33 +49,42 @@
+ #size-cells = <1>;
+ #interrupt-cells = <2>;
+ device_type = "soc";
++ compatible = "fsl,mpc8610-immr", "simple-bus";
+ ranges = <0 e0000000 00100000>;
+ reg = <e0000000 1000>;
+ bus-frequency = <0>;
+
+ i2c@3000 {
+- device_type = "i2c";
+- compatible = "fsl-i2c";
+ #address-cells = <1>;
+ #size-cells = <0>;
++ cell-index = <0>;
++ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+ interrupt-parent = <&mpic>;
+ dfsrr;
++
++ cs4270:codec@4f {
++ compatible = "cirrus,cs4270";
++ reg = <4f>;
++ /* MCLK source is a stand-alone oscillator */
++ clock-frequency = <bb8000>;
++ };
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
+- compatible = "fsl-i2c";
+ #address-cells = <1>;
+ #size-cells = <0>;
++ cell-index = <1>;
++ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <2b 2>;
+ interrupt-parent = <&mpic>;
+ dfsrr;
+ };
+
+- serial@4500 {
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -77,7 +93,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -86,7 +103,6 @@
+ interrupt-parent = <&mpic>;
+ };
+
+-
+ mpic: interrupt-controller@40000 {
+ clock-frequency = <0>;
+ interrupt-controller;
+@@ -103,9 +119,113 @@
+ reg = <e0000 1000>;
+ fsl,has-rstcr;
+ };
++
++ i2s@16000 {
++ compatible = "fsl,mpc8610-ssi";
++ cell-index = <0>;
++ reg = <16000 100>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3e 2>;
++ fsl,mode = "i2s-slave";
++ codec-handle = <&cs4270>;
++ };
++
++ ssi@16100 {
++ compatible = "fsl,mpc8610-ssi";
++ cell-index = <1>;
++ reg = <16100 100>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3f 2>;
++ };
++
++ dma@21300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8610-dma", "fsl,eloplus-dma";
++ cell-index = <0>;
++ reg = <21300 4>; /* DMA general status register */
++ ranges = <0 21100 200>;
++
++ dma-channel@0 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,eloplus-dma-channel";
++ cell-index = <0>;
++ reg = <0 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <14 2>;
++ };
++ dma-channel@1 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,eloplus-dma-channel";
++ cell-index = <1>;
++ reg = <80 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <15 2>;
++ };
++ dma-channel@2 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,eloplus-dma-channel";
++ cell-index = <2>;
++ reg = <100 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <16 2>;
++ };
++ dma-channel@3 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,eloplus-dma-channel";
++ cell-index = <3>;
++ reg = <180 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <17 2>;
++ };
++ };
++
++ dma@c300 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8610-dma", "fsl,mpc8540-dma";
++ cell-index = <1>;
++ reg = <c300 4>; /* DMA general status register */
++ ranges = <0 c100 200>;
++
++ dma-channel@0 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,mpc8540-dma-channel";
++ cell-index = <0>;
++ reg = <0 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3c 2>;
++ };
++ dma-channel@1 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,mpc8540-dma-channel";
++ cell-index = <1>;
++ reg = <80 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3d 2>;
++ };
++ dma-channel@2 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,mpc8540-dma-channel";
++ cell-index = <2>;
++ reg = <100 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3e 2>;
++ };
++ dma-channel@3 {
++ compatible = "fsl,mpc8610-dma-channel",
++ "fsl,mpc8540-dma-channel";
++ cell-index = <3>;
++ reg = <180 80>;
++ interrupt-parent = <&mpic>;
++ interrupts = <3f 2>;
++ };
++ };
++
+ };
+
+- pci@e0008000 {
++ pci0: pci@e0008000 {
++ cell-index = <0>;
+ compatible = "fsl,mpc8610-pci";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -134,7 +254,8 @@
+ >;
+ };
+
+- pcie@e000a000 {
++ pci1: pcie@e000a000 {
++ cell-index = <1>;
+ compatible = "fsl,mpc8641-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc8641_hpcn.dts powerpc.git/arch/powerpc/boot/dts/mpc8641_hpcn.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc8641_hpcn.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc8641_hpcn.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,17 @@
+ #address-cells = <1>;
+ #size-cells = <1>;
+
++ aliases {
++ ethernet0 = &enet0;
++ ethernet1 = &enet1;
++ ethernet2 = &enet2;
++ ethernet3 = &enet3;
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ pci1 = &pci1;
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+@@ -49,16 +60,60 @@
+ reg = <00000000 40000000>; // 1G at 0x0
+ };
+
++ localbus@f8005000 {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ compatible = "fsl,mpc8641-localbus", "simple-bus";
++ reg = <f8005000 1000>;
++ interrupts = <13 2>;
++ interrupt-parent = <&mpic>;
++
++ ranges = <0 0 ff800000 00800000
++ 1 0 fe000000 01000000
++ 2 0 f8200000 00100000
++ 3 0 f8100000 00100000>;
++
++ flash@0,0 {
++ compatible = "cfi-flash";
++ reg = <0 0 00800000>;
++ bank-width = <2>;
++ device-width = <2>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ partition@0 {
++ label = "kernel";
++ reg = <00000000 00300000>;
++ };
++ partition@300000 {
++ label = "firmware b";
++ reg = <00300000 00100000>;
++ read-only;
++ };
++ partition@400000 {
++ label = "fs";
++ reg = <00400000 00300000>;
++ };
++ partition@700000 {
++ label = "firmware a";
++ reg = <00700000 00100000>;
++ read-only;
++ };
++ };
++ };
++
+ soc8641@f8000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ device_type = "soc";
++ compatible = "simple-bus";
+ ranges = <00000000 f8000000 00100000>;
+ reg = <f8000000 00001000>; // CCSRBAR
+ bus-frequency = <0>;
+
+ i2c@3000 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <0>;
+ compatible = "fsl-i2c";
+ reg = <3000 100>;
+ interrupts = <2b 2>;
+@@ -67,7 +122,9 @@
+ };
+
+ i2c@3100 {
+- device_type = "i2c";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ cell-index = <1>;
+ compatible = "fsl-i2c";
+ reg = <3100 100>;
+ interrupts = <2b 2>;
+@@ -78,9 +135,9 @@
+ mdio@24520 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+- device_type = "mdio";
+- compatible = "gianfar";
++ compatible = "fsl,gianfar-mdio";
+ reg = <24520 20>;
++
+ phy0: ethernet-phy@0 {
+ interrupt-parent = <&mpic>;
+ interrupts = <a 1>;
+@@ -107,19 +164,12 @@
+ };
+ };
+
+- ethernet@24000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet0: ethernet@24000 {
++ cell-index = <0>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <24000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <1d 2 1e 2 22 2>;
+ interrupt-parent = <&mpic>;
+@@ -127,19 +177,12 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet1: ethernet@25000 {
++ cell-index = <1>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <25000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <23 2 24 2 28 2>;
+ interrupt-parent = <&mpic>;
+@@ -147,19 +190,12 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@26000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet2: ethernet@26000 {
++ cell-index = <2>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <26000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <1F 2 20 2 21 2>;
+ interrupt-parent = <&mpic>;
+@@ -167,26 +203,21 @@
+ phy-connection-type = "rgmii-id";
+ };
+
+- ethernet@27000 {
+- #address-cells = <1>;
+- #size-cells = <0>;
++ enet3: ethernet@27000 {
++ cell-index = <3>;
+ device_type = "network";
+ model = "TSEC";
+ compatible = "gianfar";
+ reg = <27000 1000>;
+- /*
+- * mac-address is deprecated and will be removed
+- * in 2.6.25. Only recent versions of
+- * U-Boot support local-mac-address, however.
+- */
+- mac-address = [ 00 00 00 00 00 00 ];
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <25 2 26 2 27 2>;
+ interrupt-parent = <&mpic>;
+ phy-handle = <&phy3>;
+ phy-connection-type = "rgmii-id";
+ };
+- serial@4500 {
++
++ serial0: serial@4500 {
++ cell-index = <0>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4500 100>;
+@@ -195,7 +226,8 @@
+ interrupt-parent = <&mpic>;
+ };
+
+- serial@4600 {
++ serial1: serial@4600 {
++ cell-index = <1>;
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <4600 100>;
+@@ -222,7 +254,8 @@
+ };
+ };
+
+- pcie@f8008000 {
++ pci0: pcie@f8008000 {
++ cell-index = <0>;
+ compatible = "fsl,mpc8641-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+@@ -335,9 +368,9 @@
+
+ // IDSEL 0x1c USB
+ e000 0 0 1 &i8259 c 2
+- e100 0 0 1 &i8259 9 2
+- e200 0 0 1 &i8259 a 2
+- e300 0 0 1 &i8259 b 2
++ e100 0 0 2 &i8259 9 2
++ e200 0 0 3 &i8259 a 2
++ e300 0 0 4 &i8259 b 2
+
+ // IDSEL 0x1d Audio
+ e800 0 0 1 &i8259 6 2
+@@ -430,7 +463,8 @@
+
+ };
+
+- pcie@f8009000 {
++ pci1: pcie@f8009000 {
++ cell-index = <1>;
+ compatible = "fsl,mpc8641-pcie";
+ device_type = "pci";
+ #interrupt-cells = <1>;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/mpc866ads.dts powerpc.git/arch/powerpc/boot/dts/mpc866ads.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/mpc866ads.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/mpc866ads.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -12,7 +12,7 @@
+
+ / {
+ model = "MPC866ADS";
+- compatible = "mpc8xx";
++ compatible = "fsl,mpc866ads";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+@@ -23,15 +23,15 @@
+ PowerPC,866@0 {
+ device_type = "cpu";
+ reg = <0>;
+- d-cache-line-size = <20>; // 32 bytes
+- i-cache-line-size = <20>; // 32 bytes
++ d-cache-line-size = <10>; // 16 bytes
++ i-cache-line-size = <10>; // 16 bytes
+ d-cache-size = <2000>; // L1, 8K
+ i-cache-size = <4000>; // L1, 16K
+ timebase-frequency = <0>;
+ bus-frequency = <0>;
+ clock-frequency = <0>;
+ interrupts = <f 2>; // decrementer interrupt
+- interrupt-parent = <&Mpc8xx_pic>;
++ interrupt-parent = <&PIC>;
+ };
+ };
+
+@@ -40,107 +40,139 @@
+ reg = <00000000 800000>;
+ };
+
+- soc866@ff000000 {
++ localbus@ff000100 {
++ compatible = "fsl,mpc866-localbus", "fsl,pq1-localbus";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ reg = <ff000100 40>;
++
++ ranges = <
++ 1 0 ff080000 00008000
++ 5 0 ff0a0000 00008000
++ >;
++
++ board-control@1,0 {
++ reg = <1 0 20 5 300 4>;
++ compatible = "fsl,mpc866ads-bcsr";
++ };
++ };
++
++ soc@ff000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ device_type = "soc";
+ ranges = <0 ff000000 00100000>;
+ reg = <ff000000 00000200>;
+ bus-frequency = <0>;
+- mdio@e80 {
+- device_type = "mdio";
+- compatible = "fs_enet";
+- reg = <e80 8>;
++
++ mdio@e00 {
++ compatible = "fsl,mpc866-fec-mdio", "fsl,pq1-fec-mdio";
++ reg = <e00 188>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+- phy: ethernet-phy@f {
++ PHY: ethernet-phy@f {
+ reg = <f>;
+ device_type = "ethernet-phy";
+ };
+ };
+
+- fec@e00 {
++ ethernet@e00 {
+ device_type = "network";
+- compatible = "fs_enet";
+- model = "FEC";
+- device-id = <1>;
++ compatible = "fsl,mpc866-fec-enet",
++ "fsl,pq1-fec-enet";
+ reg = <e00 188>;
+- mac-address = [ 00 00 0C 00 01 FD ];
++ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <3 1>;
+- interrupt-parent = <&Mpc8xx_pic>;
+- phy-handle = <&Phy>;
++ interrupt-parent = <&PIC>;
++ phy-handle = <&PHY>;
++ linux,network-index = <0>;
+ };
+
+- mpc8xx_pic: pic@ff000000 {
++ PIC: pic@0 {
+ interrupt-controller;
+- #address-cells = <0>;
+ #interrupt-cells = <2>;
+ reg = <0 24>;
+- device_type = "mpc8xx-pic";
+- compatible = "CPM";
++ compatible = "fsl,mpc866-pic", "fsl,pq1-pic";
+ };
+
+- cpm@ff000000 {
++ cpm@9c0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+- device_type = "cpm";
+- model = "CPM";
+- ranges = <0 0 4000>;
+- reg = <860 f0>;
+- command-proc = <9c0>;
++ compatible = "fsl,mpc866-cpm", "fsl,cpm1";
++ ranges;
++ reg = <9c0 40>;
+ brg-frequency = <0>;
+ interrupts = <0 2>; // cpm error interrupt
+- interrupt-parent = <&Cpm_pic>;
++ interrupt-parent = <&CPM_PIC>;
+
+- cpm_pic: pic@930 {
++ muram@2000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <0 2000 2000>;
++
++ data@0 {
++ compatible = "fsl,cpm-muram-data";
++ reg = <0 1c00>;
++ };
++ };
++
++ brg@9f0 {
++ compatible = "fsl,mpc866-brg",
++ "fsl,cpm1-brg",
++ "fsl,cpm-brg";
++ reg = <9f0 10>;
++ clock-frequency = <0>;
++ };
++
++ CPM_PIC: pic@930 {
+ interrupt-controller;
+ #address-cells = <0>;
+- #interrupt-cells = <2>;
++ #interrupt-cells = <1>;
+ interrupts = <5 2 0 2>;
+- interrupt-parent = <&Mpc8xx_pic>;
++ interrupt-parent = <&PIC>;
+ reg = <930 20>;
+- device_type = "cpm-pic";
+- compatible = "CPM";
++ compatible = "fsl,mpc866-cpm-pic",
++ "fsl,cpm1-pic";
+ };
+
+- smc@a80 {
++
++ serial@a80 {
+ device_type = "serial";
+- compatible = "cpm_uart";
+- model = "SMC";
+- device-id = <1>;
++ compatible = "fsl,mpc866-smc-uart",
++ "fsl,cpm1-smc-uart";
+ reg = <a80 10 3e80 40>;
+- clock-setup = <00ffffff 0>;
+- rx-clock = <1>;
+- tx-clock = <1>;
+- current-speed = <0>;
+- interrupts = <4 3>;
+- interrupt-parent = <&Cpm_pic>;
++ interrupts = <4>;
++ interrupt-parent = <&CPM_PIC>;
++ fsl,cpm-brg = <1>;
++ fsl,cpm-command = <0090>;
+ };
+
+- smc@a90 {
++ serial@a90 {
+ device_type = "serial";
+- compatible = "cpm_uart";
+- model = "SMC";
+- device-id = <2>;
+- reg = <a90 20 3f80 40>;
+- clock-setup = <ff00ffff 90000>;
+- rx-clock = <2>;
+- tx-clock = <2>;
+- current-speed = <0>;
+- interrupts = <3 3>;
+- interrupt-parent = <&Cpm_pic>;
++ compatible = "fsl,mpc866-smc-uart",
++ "fsl,cpm1-smc-uart";
++ reg = <a90 10 3f80 40>;
++ interrupts = <3>;
++ interrupt-parent = <&CPM_PIC>;
++ fsl,cpm-brg = <2>;
++ fsl,cpm-command = <00d0>;
+ };
+
+- scc@a00 {
++ ethernet@a00 {
+ device_type = "network";
+- compatible = "fs_enet";
+- model = "SCC";
+- device-id = <1>;
+- reg = <a00 18 3c00 80>;
+- mac-address = [ 00 00 0C 00 03 FD ];
+- interrupts = <1e 3>;
+- interrupt-parent = <&Cpm_pic>;
++ compatible = "fsl,mpc866-scc-enet",
++ "fsl,cpm1-scc-enet";
++ reg = <a00 18 3c00 100>;
++ local-mac-address = [ 00 00 00 00 00 00 ];
++ interrupts = <1e>;
++ interrupt-parent = <&CPM_PIC>;
++ fsl,cpm-command = <0000>;
++ linux,network-index = <1>;
+ };
+ };
+ };
++
++ chosen {
++ linux,stdout-path = "/soc/cpm/serial@a80";
++ };
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/rainier.dts powerpc.git/arch/powerpc/boot/dts/rainier.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/rainier.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/rainier.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,353 @@
++/*
++ * Device Tree Source for AMCC Rainier
++ *
++ * Based on Sequoia code
++ * Copyright (c) 2007 MontaVista Software, Inc.
++ *
++ * FIXME: Draft only!
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ *
++ */
++
++/ {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ model = "amcc,rainier";
++ compatible = "amcc,rainier";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ serial2 = &UART2;
++ serial3 = &UART3;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,440GRx";
++ reg = <0>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ timebase-frequency = <0>; /* Filled in by zImage */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <8000>;
++ d-cache-size = <8000>;
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0 0>; /* Filled in by zImage */
++ };
++
++ UIC0: interrupt-controller0 {
++ compatible = "ibm,uic-440grx","ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-440grx","ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1e 4 1f 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ UIC2: interrupt-controller2 {
++ compatible = "ibm,uic-440grx","ibm,uic";
++ interrupt-controller;
++ cell-index = <2>;
++ dcr-reg = <0e0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1c 4 1d 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ SDR0: sdr {
++ compatible = "ibm,sdr-440grx", "ibm,sdr-440ep";
++ dcr-reg = <00e 002>;
++ };
++
++ CPR0: cpr {
++ compatible = "ibm,cpr-440grx", "ibm,cpr-440ep";
++ dcr-reg = <00c 002>;
++ };
++
++ plb {
++ compatible = "ibm,plb-440grx", "ibm,plb4";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ SDRAM0: sdram {
++ compatible = "ibm,sdram-440grx", "ibm,sdram-44x-ddr2denali";
++ dcr-reg = <010 2>;
++ };
++
++ DMA0: dma {
++ compatible = "ibm,dma-440grx", "ibm,dma-4xx";
++ dcr-reg = <100 027>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-440grx", "ibm,mcmal2";
++ dcr-reg = <180 62>;
++ num-tx-chans = <2>;
++ num-rx-chans = <2>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
++ /*RXEOB*/ 1 &UIC0 b 4
++ /*SERR*/ 2 &UIC1 0 4
++ /*TXDE*/ 3 &UIC1 1 4
++ /*RXDE*/ 4 &UIC1 2 4>;
++ interrupt-map-mask = <ffffffff>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-440grx", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <00000000 1 00000000 80000000
++ 80000000 1 80000000 80000000>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <7 4>;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-440grx", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ interrupts = <5 1>;
++ interrupt-parent = <&UIC1>;
++
++ nor_flash@0,0 {
++ compatible = "amd,s29gl256n", "cfi-flash";
++ bank-width = <2>;
++ reg = <0 000000 4000000>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ partition@0 {
++ label = "Kernel";
++ reg = <0 180000>;
++ };
++ partition@180000 {
++ label = "ramdisk";
++ reg = <180000 200000>;
++ };
++ partition@380000 {
++ label = "file system";
++ reg = <380000 3aa0000>;
++ };
++ partition@3e20000 {
++ label = "kozio";
++ reg = <3e20000 140000>;
++ };
++ partition@3f60000 {
++ label = "env";
++ reg = <3f60000 40000>;
++ };
++ partition@3fa0000 {
++ label = "u-boot";
++ reg = <3fa0000 60000>;
++ };
++ };
++
++ };
++
++ UART0: serial@ef600300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600300 8>;
++ virtual-reg = <ef600300>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ current-speed = <1c200>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <0 4>;
++ };
++
++ UART1: serial@ef600400 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600400 8>;
++ virtual-reg = <ef600400>;
++ clock-frequency = <0>;
++ current-speed = <0>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++ UART2: serial@ef600500 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600500 8>;
++ virtual-reg = <ef600500>;
++ clock-frequency = <0>;
++ current-speed = <0>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <3 4>;
++ };
++
++ UART3: serial@ef600600 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600600 8>;
++ virtual-reg = <ef600600>;
++ clock-frequency = <0>;
++ current-speed = <0>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <4 4>;
++ };
++
++ IIC0: i2c@ef600700 {
++ device_type = "i2c";
++ compatible = "ibm,iic-440grx", "ibm,iic";
++ reg = <ef600700 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ IIC1: i2c@ef600800 {
++ device_type = "i2c";
++ compatible = "ibm,iic-440grx", "ibm,iic";
++ reg = <ef600800 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <7 4>;
++ };
++
++ ZMII0: emac-zmii@ef600d00 {
++ device_type = "zmii-interface";
++ compatible = "ibm,zmii-440grx", "ibm,zmii";
++ reg = <ef600d00 c>;
++ };
++
++ RGMII0: emac-rgmii@ef601000 {
++ device_type = "rgmii-interface";
++ compatible = "ibm,rgmii-440grx", "ibm,rgmii";
++ reg = <ef601000 8>;
++ has-mdio;
++ };
++
++ EMAC0: ethernet@ef600e00 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
++ interrupt-parent = <&EMAC0>;
++ interrupts = <0 1>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*Status*/ 0 &UIC0 18 4
++ /*Wake*/ 1 &UIC1 1d 4>;
++ reg = <ef600e00 70>;
++ local-mac-address = [000000000000];
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000000>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <0>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <0>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++
++ EMAC1: ethernet@ef600f00 {
++ linux,network-index = <1>;
++ device_type = "network";
++ compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
++ interrupt-parent = <&EMAC1>;
++ interrupts = <0 1>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*Status*/ 0 &UIC0 19 4
++ /*Wake*/ 1 &UIC1 1f 4>;
++ reg = <ef600f00 70>;
++ local-mac-address = [000000000000];
++ mal-device = <&MAL0>;
++ mal-tx-channel = <1>;
++ mal-rx-channel = <1>;
++ cell-index = <1>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000000>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <1>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <1>;
++ has-inverted-stacr-oc;
++ has-new-stacr-staopc;
++ };
++ };
++
++ PCI0: pci@1ec000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb440grx-pci", "ibm,plb-pci";
++ primary;
++ reg = <1 eec00000 8 /* Config space access */
++ 1 eed00000 4 /* IACK */
++ 1 eed00000 4 /* Special cycle */
++ 1 ef400000 40>; /* Internal registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed. Chip supports a second
++ * IO range but we don't use it for now
++ */
++ ranges = <02000000 0 80000000 1 80000000 0 10000000
++ 01000000 0 00000000 1 e8000000 0 00100000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* All PCI interrupts are routed to IRQ 67 */
++ interrupt-map-mask = <0000 0 0 0>;
++ interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
++ };
++ };
++
++ chosen {
++ linux,stdout-path = "/plb/opb/serial@ef600300";
++ bootargs = "console=ttyS0,115200";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/sequoia.dts powerpc.git/arch/powerpc/boot/dts/sequoia.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/sequoia.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/sequoia.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -17,14 +17,24 @@
+ #size-cells = <1>;
+ model = "amcc,sequoia";
+ compatible = "amcc,sequoia";
+- dcr-parent = <&/cpus/PowerPC,440EPx@0>;
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ ethernet1 = &EMAC1;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ serial2 = &UART2;
++ serial3 = &UART3;
++ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- PowerPC,440EPx@0 {
++ cpu@0 {
+ device_type = "cpu";
++ model = "PowerPC,440EPx";
+ reg = <0>;
+ clock-frequency = <0>; /* Filled in by zImage */
+ timebase-frequency = <0>; /* Filled in by zImage */
+@@ -94,7 +104,6 @@
+ clock-frequency = <0>; /* Filled in by zImage */
+
+ SDRAM0: sdram {
+- device_type = "memory-controller";
+ compatible = "ibm,sdram-440epx", "ibm,sdram-44x-ddr2denali";
+ dcr-reg = <010 2>;
+ };
+@@ -122,6 +131,13 @@
+ interrupt-map-mask = <ffffffff>;
+ };
+
++ USB1: usb@e0000400 {
++ compatible = "ohci-be";
++ reg = <0 e0000400 60>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <15 8>;
++ };
++
+ POB0: opb {
+ compatible = "ibm,opb-440epx", "ibm,opb";
+ #address-cells = <1>;
+@@ -308,6 +324,33 @@
+ has-new-stacr-staopc;
+ };
+ };
++
++ PCI0: pci@1ec000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb440epx-pci", "ibm,plb-pci";
++ primary;
++ reg = <1 eec00000 8 /* Config space access */
++ 1 eed00000 4 /* IACK */
++ 1 eed00000 4 /* Special cycle */
++ 1 ef400000 40>; /* Internal registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed. Chip supports a second
++ * IO range but we don't use it for now
++ */
++ ranges = <02000000 0 80000000 1 80000000 0 10000000
++ 01000000 0 00000000 1 e8000000 0 00100000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ /* All PCI interrupts are routed to IRQ 67 */
++ interrupt-map-mask = <0000 0 0 0>;
++ interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
++ };
+ };
+
+ chosen {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/storcenter.dts powerpc.git/arch/powerpc/boot/dts/storcenter.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/storcenter.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/storcenter.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,138 @@
++/*
++ * Device Tree Source for IOMEGA StorCenter
++ *
++ * Copyright 2007 Oyvind Repvik
++ * Copyright 2007 Jon Loeliger
++ *
++ * Based on the Kurobox DTS by G. Liakhovetski <g.liakhovetski@gmx.de>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without any
++ * warranty of any kind, whether express or implied.
++ */
++
++/ {
++ model = "StorCenter";
++ compatible = "storcenter";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ aliases {
++ serial0 = &serial0;
++ serial1 = &serial1;
++ pci0 = &pci0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,8241@0 {
++ device_type = "cpu";
++ reg = <0>;
++ clock-frequency = <d# 200000000>; /* Hz */
++ timebase-frequency = <d# 25000000>; /* Hz */
++ bus-frequency = <0>; /* from bootwrapper */
++ i-cache-line-size = <d# 32>; /* bytes */
++ d-cache-line-size = <d# 32>; /* bytes */
++ i-cache-size = <4000>;
++ d-cache-size = <4000>;
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <00000000 04000000>; /* 64MB @ 0x0 */
++ };
++
++ soc@fc000000 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ device_type = "soc";
++ compatible = "fsl,mpc8241", "mpc10x";
++ store-gathering = <0>; /* 0 == off, !0 == on */
++ ranges = <0 fc000000 100000>;
++ reg = <fc000000 100000>; /* EUMB */
++ bus-frequency = <0>; /* fixed by loader */
++
++ i2c@3000 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ compatible = "fsl-i2c";
++ reg = <3000 100>;
++ interrupts = <5 2>;
++ interrupt-parent = <&mpic>;
++
++ rtc@68 {
++ compatible = "dallas,ds1337";
++ reg = <68>;
++ };
++ };
++
++ serial0: serial@4500 {
++ cell-index = <0>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <4500 20>;
++ clock-frequency = <d# 97553800>; /* Hz */
++ current-speed = <d# 115200>;
++ interrupts = <9 2>;
++ interrupt-parent = <&mpic>;
++ };
++
++ serial1: serial@4600 {
++ cell-index = <1>;
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <4600 20>;
++ clock-frequency = <d# 97553800>; /* Hz */
++ current-speed = <d# 9600>;
++ interrupts = <a 2>;
++ interrupt-parent = <&mpic>;
++ };
++
++ mpic: interrupt-controller@40000 {
++ #interrupt-cells = <2>;
++ device_type = "open-pic";
++ compatible = "chrp,open-pic";
++ interrupt-controller;
++ reg = <40000 40000>;
++ };
++
++ };
++
++ pci0: pci@fe800000 {
++ #address-cells = <3>;
++ #size-cells = <2>;
++ #interrupt-cells = <1>;
++ device_type = "pci";
++ compatible = "mpc10x-pci";
++ reg = <fe800000 1000>;
++ ranges = <01000000 0 0 fe000000 0 00c00000
++ 02000000 0 80000000 80000000 0 70000000>;
++ bus-range = <0 ff>;
++ clock-frequency = <d# 97553800>; /* Hz */
++ interrupt-parent = <&mpic>;
++ interrupt-map-mask = <f800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 13 - IDE */
++ 6800 0 0 1 &mpic 0 1
++ 6800 0 0 2 &mpic 0 1
++ 6800 0 0 3 &mpic 0 1
++ /* IDSEL 14 - USB */
++ 7000 0 0 1 &mpic 0 1
++ 7000 0 0 2 &mpic 0 1
++ 7000 0 0 3 &mpic 0 1
++ 7000 0 0 4 &mpic 0 1
++ /* IDSEL 15 - ETH */
++ 7800 0 0 1 &mpic 0 1
++ 7800 0 0 2 &mpic 0 1
++ 7800 0 0 3 &mpic 0 1
++ 7800 0 0 4 &mpic 0 1
++ >;
++ };
++
++ chosen {
++ linux,stdout-path = "/soc/serial@4500";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/taishan.dts powerpc.git/arch/powerpc/boot/dts/taishan.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/taishan.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/taishan.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,383 @@
++/*
++ * Device Tree Source for IBM/AMCC Taishan
++ *
++ * Copyright 2007 IBM Corp.
++ * Hugh Blemings <hugh@au.ibm.com> based off code by
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>, David Gibson <dwg@au1.ibm.com>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ model = "amcc,taishan";
++ compatible = "amcc,taishan";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC2;
++ ethernet1 = &EMAC3;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,440GX";
++ reg = <0>;
++ clock-frequency = <2FAF0800>; // 800MHz
++ timebase-frequency = <0>; // Filled in by zImage
++ i-cache-line-size = <32>;
++ d-cache-line-size = <32>;
++ i-cache-size = <8000>; /* 32 kB */
++ d-cache-size = <8000>; /* 32 kB */
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0 0>; // Filled in by zImage
++ };
++
++
++ UICB0: interrupt-controller-base {
++ compatible = "ibm,uic-440gx", "ibm,uic";
++ interrupt-controller;
++ cell-index = <3>;
++ dcr-reg = <200 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++
++ UIC0: interrupt-controller0 {
++ compatible = "ibm,uic-440gx", "ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <01 4 00 4>; /* cascade - first non-critical */
++ interrupt-parent = <&UICB0>;
++
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-440gx", "ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <03 4 02 4>; /* cascade */
++ interrupt-parent = <&UICB0>;
++ };
++
++ UIC2: interrupt-controller2 {
++ compatible = "ibm,uic-440gx", "ibm,uic";
++ interrupt-controller;
++ cell-index = <2>; /* was 1 */
++ dcr-reg = <210 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <05 4 04 4>; /* cascade */
++ interrupt-parent = <&UICB0>;
++ };
++
++
++ CPC0: cpc {
++ compatible = "ibm,cpc-440gp";
++ dcr-reg = <0b0 003 0e0 010>;
++ // FIXME: anything else?
++ };
++
++ plb {
++ compatible = "ibm,plb-440gx", "ibm,plb4";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <9896800>; // 160MHz
++
++ SDRAM0: memory-controller {
++ compatible = "ibm,sdram-440gp";
++ dcr-reg = <010 2>;
++ // FIXME: anything else?
++ };
++
++ SRAM0: sram {
++ compatible = "ibm,sram-440gp";
++ dcr-reg = <020 8 00a 1>;
++ };
++
++ DMA0: dma {
++ // FIXME: ???
++ compatible = "ibm,dma-440gp";
++ dcr-reg = <100 027>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-440gx", "ibm,mcmal2";
++ dcr-reg = <180 62>;
++ num-tx-chans = <4>;
++ num-rx-chans = <4>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
++ /*RXEOB*/ 1 &UIC0 b 4
++ /*SERR*/ 2 &UIC1 0 4
++ /*TXDE*/ 3 &UIC1 1 4
++ /*RXDE*/ 4 &UIC1 2 4>;
++ interrupt-map-mask = <ffffffff>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-440gx", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ /* Wish there was a nicer way of specifying a full 32-bit
++ range */
++ ranges = <00000000 1 00000000 80000000
++ 80000000 1 80000000 80000000>;
++ dcr-reg = <090 00b>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <7 4>;
++ clock-frequency = <4C4B400>; // 80MHz
++
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-440gx", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <4C4B400>; // 80MHz
++
++ /* ranges property is supplied by zImage
++ * based on firmware's configuration of the
++ * EBC bridge */
++
++ interrupts = <5 4>;
++ interrupt-parent = <&UIC1>;
++
++ /* TODO: Add other EBC devices */
++ };
++
++
++
++ UART0: serial@40000200 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <40000200 8>;
++ virtual-reg = <e0000200>;
++ clock-frequency = <A8C000>;
++ current-speed = <1C200>; /* 115200 */
++ interrupt-parent = <&UIC0>;
++ interrupts = <0 4>;
++ };
++
++ UART1: serial@40000300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <40000300 8>;
++ virtual-reg = <e0000300>;
++ clock-frequency = <A8C000>;
++ current-speed = <1C200>; /* 115200 */
++ interrupt-parent = <&UIC0>;
++ interrupts = <1 4>;
++ };
++
++ IIC0: i2c@40000400 {
++ /* FIXME */
++ device_type = "i2c";
++ compatible = "ibm,iic-440gp", "ibm,iic";
++ reg = <40000400 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++ IIC1: i2c@40000500 {
++ /* FIXME */
++ device_type = "i2c";
++ compatible = "ibm,iic-440gp", "ibm,iic";
++ reg = <40000500 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <3 4>;
++ };
++
++ GPIO0: gpio@40000700 {
++ /* FIXME */
++ compatible = "ibm,gpio-440gp";
++ reg = <40000700 20>;
++ };
++
++ ZMII0: emac-zmii@40000780 {
++ device_type = "zgmii-interface";
++ compatible = "ibm,zmii-440gx", "ibm,zmii";
++ reg = <40000780 c>;
++ };
++
++ RGMII0: emac-rgmii@40000790 {
++ device_type = "rgmii-interface";
++ compatible = "ibm,rgmii";
++ reg = <40000790 8>;
++ };
++
++
++ EMAC0: ethernet@40000800 {
++ unused = <1>;
++ linux,network-index = <2>;
++ device_type = "network";
++ compatible = "ibm,emac-440gx", "ibm,emac4";
++ interrupt-parent = <&UIC1>;
++ interrupts = <1c 4 1d 4>;
++ reg = <40000800 70>;
++ local-mac-address = [000000000000]; // Filled in by zImage
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rmii";
++ phy-map = <00000001>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <0>;
++ };
++ EMAC1: ethernet@40000900 {
++ unused = <1>;
++ linux,network-index = <3>;
++ device_type = "network";
++ compatible = "ibm,emac-440gx", "ibm,emac4";
++ interrupt-parent = <&UIC1>;
++ interrupts = <1e 4 1f 4>;
++ reg = <40000900 70>;
++ local-mac-address = [000000000000]; // Filled in by zImage
++ mal-device = <&MAL0>;
++ mal-tx-channel = <1>;
++ mal-rx-channel = <1>;
++ cell-index = <1>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rmii";
++ phy-map = <00000001>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <1>;
++ };
++
++ EMAC2: ethernet@40000c00 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-440gx", "ibm,emac4";
++ interrupt-parent = <&UIC2>;
++ interrupts = <0 4 1 4>;
++ reg = <40000c00 70>;
++ local-mac-address = [000000000000]; // Filled in by zImage
++ mal-device = <&MAL0>;
++ mal-tx-channel = <2>;
++ mal-rx-channel = <2>;
++ cell-index = <2>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000001>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <0>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <2>;
++ };
++
++ EMAC3: ethernet@40000e00 {
++ linux,network-index = <1>;
++ device_type = "network";
++ compatible = "ibm,emac-440gx", "ibm,emac4";
++ interrupt-parent = <&UIC2>;
++ interrupts = <2 4 3 4>;
++ reg = <40000e00 70>;
++ local-mac-address = [000000000000]; // Filled in by zImage
++ mal-device = <&MAL0>;
++ mal-tx-channel = <3>;
++ mal-rx-channel = <3>;
++ cell-index = <3>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rgmii";
++ phy-map = <00000003>;
++ rgmii-device = <&RGMII0>;
++ rgmii-channel = <1>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <3>;
++ };
++
++
++ GPT0: gpt@40000a00 {
++ /* FIXME */
++ reg = <40000a00 d4>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <12 4 13 4 14 4 15 4 16 4>;
++ };
++
++ };
++
++ PCIX0: pci@20ec00000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
++ primary;
++ large-inbound-windows;
++ enable-msi-hole;
++ reg = <2 0ec00000 8 /* Config space access */
++ 0 0 0 /* no IACK cycles */
++ 2 0ed00000 4 /* Special cycles */
++ 2 0ec80000 100 /* Internal registers */
++ 2 0ec80100 fc>; /* Internal messaging registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed
++ */
++ ranges = <02000000 0 80000000 00000003 80000000 0 80000000
++ 01000000 0 00000000 00000002 08000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 0 80000000>;
++
++ interrupt-map-mask = <f800 0 0 7>;
++ interrupt-map = <
++ /* IDSEL 1 */
++ 0800 0 0 1 &UIC0 17 8
++ 0800 0 0 2 &UIC0 18 8
++ 0800 0 0 3 &UIC0 19 8
++ 0800 0 0 4 &UIC0 1a 8
++
++ /* IDSEL 2 */
++ 1000 0 0 1 &UIC0 18 8
++ 1000 0 0 2 &UIC0 19 8
++ 1000 0 0 3 &UIC0 1a 8
++ 1000 0 0 4 &UIC0 17 8
++ >;
++ };
++ };
++
++ chosen {
++ linux,stdout-path = "/plb/opb/serial@40000300";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/tqm5200.dts powerpc.git/arch/powerpc/boot/dts/tqm5200.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/tqm5200.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/tqm5200.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,184 @@
++/*
++ * TQM5200 board Device Tree Source
++ *
++ * Copyright (C) 2007 Semihalf
++ * Marian Balakowicz <m8@semihalf.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++/*
++ * WARNING: Do not depend on this tree layout remaining static just yet.
++ * The MPC5200 device tree conventions are still in flux
++ * Keep an eye on the linuxppc-dev mailing list for more details
++ */
++
++/ {
++ model = "tqc,tqm5200";
++ compatible = "tqc,tqm5200";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ PowerPC,5200@0 {
++ device_type = "cpu";
++ reg = <0>;
++ d-cache-line-size = <20>;
++ i-cache-line-size = <20>;
++ d-cache-size = <4000>; // L1, 16K
++ i-cache-size = <4000>; // L1, 16K
++ timebase-frequency = <0>; // from bootloader
++ bus-frequency = <0>; // from bootloader
++ clock-frequency = <0>; // from bootloader
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <00000000 04000000>; // 64MB
++ };
++
++ soc5200@f0000000 {
++ model = "fsl,mpc5200";
++ compatible = "fsl,mpc5200";
++ revision = ""; // from bootloader
++ device_type = "soc";
++ ranges = <0 f0000000 0000c000>;
++ reg = <f0000000 00000100>;
++ bus-frequency = <0>; // from bootloader
++ system-frequency = <0>; // from bootloader
++
++ cdm@200 {
++ compatible = "mpc5200-cdm";
++ reg = <200 38>;
++ };
++
++ mpc5200_pic: pic@500 {
++ // 5200 interrupts are encoded into two levels;
++ interrupt-controller;
++ #interrupt-cells = <3>;
++ compatible = "mpc5200-pic";
++ reg = <500 80>;
++ };
++
++ gpt@600 { // General Purpose Timer
++ compatible = "fsl,mpc5200-gpt";
++ reg = <600 10>;
++ interrupts = <1 9 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl,has-wdt;
++ };
++
++ gpio@b00 {
++ compatible = "mpc5200-gpio";
++ reg = <b00 40>;
++ interrupts = <1 7 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ usb@1000 {
++ compatible = "mpc5200-ohci","ohci-be";
++ reg = <1000 ff>;
++ interrupts = <2 6 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ dma-controller@1200 {
++ compatible = "mpc5200-bestcomm";
++ reg = <1200 80>;
++ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
++ 3 4 0 3 5 0 3 6 0 3 7 0
++ 3 8 0 3 9 0 3 a 0 3 b 0
++ 3 c 0 3 d 0 3 e 0 3 f 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ xlb@1f00 {
++ compatible = "mpc5200-xlb";
++ reg = <1f00 100>;
++ };
++
++ serial@2000 { // PSC1
++ device_type = "serial";
++ compatible = "mpc5200-psc-uart";
++ port-number = <0>; // Logical port assignment
++ reg = <2000 100>;
++ interrupts = <2 1 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ serial@2200 { // PSC2
++ device_type = "serial";
++ compatible = "mpc5200-psc-uart";
++ port-number = <1>; // Logical port assignment
++ reg = <2200 100>;
++ interrupts = <2 2 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ serial@2400 { // PSC3
++ device_type = "serial";
++ compatible = "mpc5200-psc-uart";
++ port-number = <2>; // Logical port assignment
++ reg = <2400 100>;
++ interrupts = <2 3 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ ethernet@3000 {
++ device_type = "network";
++ compatible = "mpc5200-fec";
++ reg = <3000 800>;
++ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
++ interrupts = <2 5 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ ata@3a00 {
++ compatible = "mpc5200-ata";
++ reg = <3a00 100>;
++ interrupts = <2 7 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ };
++
++ i2c@3d40 {
++ compatible = "mpc5200-i2c","fsl-i2c";
++ reg = <3d40 40>;
++ interrupts = <2 10 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ fsl5200-clocking;
++ };
++
++ sram@8000 {
++ compatible = "mpc5200-sram";
++ reg = <8000 4000>;
++ };
++ };
++
++ pci@f0000d00 {
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ device_type = "pci";
++ compatible = "fsl,mpc5200-pci";
++ reg = <f0000d00 100>;
++ interrupt-map-mask = <f800 0 0 7>;
++ interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3
++ c000 0 0 2 &mpc5200_pic 0 0 3
++ c000 0 0 3 &mpc5200_pic 0 0 3
++ c000 0 0 4 &mpc5200_pic 0 0 3>;
++ clock-frequency = <0>; // From boot loader
++ interrupts = <2 8 0 2 9 0 2 a 0>;
++ interrupt-parent = <&mpc5200_pic>;
++ bus-range = <0 0>;
++ ranges = <42000000 0 80000000 80000000 0 10000000
++ 02000000 0 90000000 90000000 0 10000000
++ 01000000 0 00000000 a0000000 0 01000000>;
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/walnut.dts powerpc.git/arch/powerpc/boot/dts/walnut.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/walnut.dts 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/walnut.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -14,14 +14,21 @@
+ #size-cells = <1>;
+ model = "ibm,walnut";
+ compatible = "ibm,walnut";
+- dcr-parent = <&/cpus/PowerPC,405GP@0>;
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC;
++ serial0 = &UART0;
++ serial1 = &UART1;
++ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- PowerPC,405GP@0 {
++ cpu@0 {
+ device_type = "cpu";
++ model = "PowerPC,405GP";
+ reg = <0>;
+ clock-frequency = <bebc200>; /* Filled in by zImage */
+ timebase-frequency = <0>; /* Filled in by zImage */
+@@ -168,9 +175,10 @@
+ };
+ };
+
+- ds1743@1,0 {
++ nvram@1,0 {
+ /* NVRAM and RTC */
+- compatible = "ds1743";
++ compatible = "ds1743-nvram";
++ #bytes = <2000>;
+ reg = <1 0 2000>;
+ };
+
+@@ -190,6 +198,45 @@
+ virtual-reg = <f0300005>;
+ };
+ };
++
++ PCI0: pci@ec000000 {
++ device_type = "pci";
++ #interrupt-cells = <1>;
++ #size-cells = <2>;
++ #address-cells = <3>;
++ compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
++ primary;
++ reg = <eec00000 8 /* Config space access */
++ eed80000 4 /* IACK */
++ eed80000 4 /* Special cycle */
++ ef480000 40>; /* Internal registers */
++
++ /* Outbound ranges, one memory and one IO,
++ * later cannot be changed. Chip supports a second
++ * IO range but we don't use it for now
++ */
++ ranges = <02000000 0 80000000 80000000 0 20000000
++ 01000000 0 00000000 e8000000 0 00010000>;
++
++ /* Inbound 2GB range starting at 0 */
++ dma-ranges = <42000000 0 0 0 0 80000000>;
++
++ /* Walnut has all 4 IRQ pins tied together per slot */
++ interrupt-map-mask = <f800 0 0 0>;
++ interrupt-map = <
++ /* IDSEL 1 */
++ 0800 0 0 0 &UIC0 1c 8
++
++ /* IDSEL 2 */
++ 1000 0 0 0 &UIC0 1d 8
++
++ /* IDSEL 3 */
++ 1800 0 0 0 &UIC0 1e 8
++
++ /* IDSEL 4 */
++ 2000 0 0 0 &UIC0 1f 8
++ >;
++ };
+ };
+
+ chosen {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/dts/warp.dts powerpc.git/arch/powerpc/boot/dts/warp.dts
+--- linux-2.6.24/arch/powerpc/boot/dts/warp.dts 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/dts/warp.dts 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,239 @@
++/*
++ * Device Tree Source for PIKA Warp
++ *
++ * Copyright (c) 2008 PIKA Technologies
++ * Sean MacLennan <smaclennan@pikatech.com>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2. This program is licensed "as is" without
++ * any warranty of any kind, whether express or implied.
++ */
++
++/ {
++ #address-cells = <2>;
++ #size-cells = <1>;
++ model = "pika,warp";
++ compatible = "pika,warp";
++ dcr-parent = <&/cpus/cpu@0>;
++
++ aliases {
++ ethernet0 = &EMAC0;
++ serial0 = &UART0;
++ };
++
++ cpus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ cpu@0 {
++ device_type = "cpu";
++ model = "PowerPC,440EP";
++ reg = <0>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ timebase-frequency = <0>; /* Filled in by zImage */
++ i-cache-line-size = <20>;
++ d-cache-line-size = <20>;
++ i-cache-size = <8000>;
++ d-cache-size = <8000>;
++ dcr-controller;
++ dcr-access-method = "native";
++ };
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0 0 0>; /* Filled in by zImage */
++ };
++
++ UIC0: interrupt-controller0 {
++ compatible = "ibm,uic-440ep","ibm,uic";
++ interrupt-controller;
++ cell-index = <0>;
++ dcr-reg = <0c0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ };
++
++ UIC1: interrupt-controller1 {
++ compatible = "ibm,uic-440ep","ibm,uic";
++ interrupt-controller;
++ cell-index = <1>;
++ dcr-reg = <0d0 009>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ #interrupt-cells = <2>;
++ interrupts = <1e 4 1f 4>; /* cascade */
++ interrupt-parent = <&UIC0>;
++ };
++
++ SDR0: sdr {
++ compatible = "ibm,sdr-440ep";
++ dcr-reg = <00e 002>;
++ };
++
++ CPR0: cpr {
++ compatible = "ibm,cpr-440ep";
++ dcr-reg = <00c 002>;
++ };
++
++ plb {
++ compatible = "ibm,plb-440ep", "ibm,plb-440gp", "ibm,plb4";
++ #address-cells = <2>;
++ #size-cells = <1>;
++ ranges;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ SDRAM0: sdram {
++ compatible = "ibm,sdram-440ep", "ibm,sdram-405gp";
++ dcr-reg = <010 2>;
++ };
++
++ DMA0: dma {
++ compatible = "ibm,dma-440ep", "ibm,dma-440gp";
++ dcr-reg = <100 027>;
++ };
++
++ MAL0: mcmal {
++ compatible = "ibm,mcmal-440ep", "ibm,mcmal-440gp", "ibm,mcmal";
++ dcr-reg = <180 62>;
++ num-tx-chans = <4>;
++ num-rx-chans = <2>;
++ interrupt-parent = <&MAL0>;
++ interrupts = <0 1 2 3 4>;
++ #interrupt-cells = <1>;
++ #address-cells = <0>;
++ #size-cells = <0>;
++ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
++ /*RXEOB*/ 1 &UIC0 b 4
++ /*SERR*/ 2 &UIC1 0 4
++ /*TXDE*/ 3 &UIC1 1 4
++ /*RXDE*/ 4 &UIC1 2 4>;
++ };
++
++ POB0: opb {
++ compatible = "ibm,opb-440ep", "ibm,opb-440gp", "ibm,opb";
++ #address-cells = <1>;
++ #size-cells = <1>;
++ ranges = <00000000 0 00000000 80000000
++ 80000000 0 80000000 80000000>;
++ interrupt-parent = <&UIC1>;
++ interrupts = <7 4>;
++ clock-frequency = <0>; /* Filled in by zImage */
++
++ EBC0: ebc {
++ compatible = "ibm,ebc-440ep", "ibm,ebc-440gp", "ibm,ebc";
++ dcr-reg = <012 2>;
++ #address-cells = <2>;
++ #size-cells = <1>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ interrupts = <5 1>;
++ interrupt-parent = <&UIC1>;
++
++ fpga@2,0 {
++ compatible = "pika,fpga";
++ reg = <2 0 2200>;
++ interrupts = <18 8>;
++ interrupt-parent = <&UIC0>;
++ };
++
++ nor_flash@0,0 {
++ compatible = "amd,s29gl512n", "cfi-flash";
++ bank-width = <2>;
++ reg = <0 0 4000000>;
++ #address-cells = <1>;
++ #size-cells = <1>;
++ partition@0 {
++ label = "kernel";
++ reg = <0 180000>;
++ };
++ partition@180000 {
++ label = "root";
++ reg = <180000 3480000>;
++ };
++ partition@3600000 {
++ label = "user";
++ reg = <3600000 900000>;
++ };
++ partition@3f00000 {
++ label = "fpga";
++ reg = <3f00000 40000>;
++ };
++ partition@3f40000 {
++ label = "env";
++ reg = <3f40000 40000>;
++ };
++ partition@3f80000 {
++ label = "u-boot";
++ reg = <3f80000 80000>;
++ };
++ };
++ };
++
++ UART0: serial@ef600300 {
++ device_type = "serial";
++ compatible = "ns16550";
++ reg = <ef600300 8>;
++ virtual-reg = <ef600300>;
++ clock-frequency = <0>; /* Filled in by zImage */
++ current-speed = <1c200>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <0 4>;
++ };
++
++ IIC0: i2c@ef600700 {
++ compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
++ reg = <ef600700 14>;
++ interrupt-parent = <&UIC0>;
++ interrupts = <2 4>;
++ };
++
++ GPIO0: gpio@ef600b00 {
++ compatible = "ibm,gpio-440ep";
++ reg = <ef600b00 48>;
++ };
++
++ GPIO1: gpio@ef600c00 {
++ compatible = "ibm,gpio-440ep";
++ reg = <ef600c00 48>;
++ };
++
++ ZMII0: emac-zmii@ef600d00 {
++ compatible = "ibm,zmii-440ep", "ibm,zmii-440gp", "ibm,zmii";
++ reg = <ef600d00 c>;
++ };
++
++ EMAC0: ethernet@ef600e00 {
++ linux,network-index = <0>;
++ device_type = "network";
++ compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
++ interrupt-parent = <&UIC1>;
++ interrupts = <1c 4 1d 4>;
++ reg = <ef600e00 70>;
++ local-mac-address = [000000000000];
++ mal-device = <&MAL0>;
++ mal-tx-channel = <0 1>;
++ mal-rx-channel = <0>;
++ cell-index = <0>;
++ max-frame-size = <5dc>;
++ rx-fifo-size = <1000>;
++ tx-fifo-size = <800>;
++ phy-mode = "rmii";
++ phy-map = <00000000>;
++ zmii-device = <&ZMII0>;
++ zmii-channel = <0>;
++ };
++
++ usb@ef601000 {
++ compatible = "ohci-be";
++ reg = <ef601000 80>;
++ interrupts = <8 1 9 1>;
++ interrupt-parent = < &UIC1 >;
++ };
++ };
++ };
++
++ chosen {
++ linux,stdout-path = "/plb/opb/serial@ef600300";
++ };
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ebony.c powerpc.git/arch/powerpc/boot/ebony.c
+--- linux-2.6.24/arch/powerpc/boot/ebony.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ebony.c 2008-01-28 20:25:49.000000000 +0100
+@@ -31,66 +31,6 @@
+
+ static u8 *ebony_mac0, *ebony_mac1;
+
+-/* Calculate 440GP clocks */
+-void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
+-{
+- u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
+- u32 cr0 = mfdcr(DCRN_CPC0_CR0);
+- u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
+- u32 opdv = CPC0_SYS0_OPDV(sys0);
+- u32 epdv = CPC0_SYS0_EPDV(sys0);
+-
+- if (sys0 & CPC0_SYS0_BYPASS) {
+- /* Bypass system PLL */
+- cpu = plb = sysclk;
+- } else {
+- if (sys0 & CPC0_SYS0_EXTSL)
+- /* PerClk */
+- m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
+- else
+- /* CPU clock */
+- m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
+- cpu = sysclk * m / CPC0_SYS0_FWDVA(sys0);
+- plb = sysclk * m / CPC0_SYS0_FWDVB(sys0);
+- }
+-
+- opb = plb / opdv;
+- ebc = opb / epdv;
+-
+- /* FIXME: Check if this is for all 440GP, or just Ebony */
+- if ((mfpvr() & 0xf0000fff) == 0x40000440)
+- /* Rev. B 440GP, use external system clock */
+- tb = sysclk;
+- else
+- /* Rev. C 440GP, errata force us to use internal clock */
+- tb = cpu;
+-
+- if (cr0 & CPC0_CR0_U0EC)
+- /* External UART clock */
+- uart0 = ser_clk;
+- else
+- /* Internal UART clock */
+- uart0 = plb / CPC0_CR0_UDIV(cr0);
+-
+- if (cr0 & CPC0_CR0_U1EC)
+- /* External UART clock */
+- uart1 = ser_clk;
+- else
+- /* Internal UART clock */
+- uart1 = plb / CPC0_CR0_UDIV(cr0);
+-
+- printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
+- (sysclk + 500000) / 1000000, sysclk);
+-
+- dt_fixup_cpu_clocks(cpu, tb, 0);
+-
+- dt_fixup_clock("/plb", plb);
+- dt_fixup_clock("/plb/opb", opb);
+- dt_fixup_clock("/plb/opb/ebc", ebc);
+- dt_fixup_clock("/plb/opb/serial@40000200", uart0);
+- dt_fixup_clock("/plb/opb/serial@40000300", uart1);
+-}
+-
+ #define EBONY_FPGA_PATH "/plb/opb/ebc/fpga"
+ #define EBONY_FPGA_FLASH_SEL 0x01
+ #define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash"
+@@ -134,7 +74,7 @@
+ unsigned long sysclk = 33000000;
+
+ ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
+- ibm4xx_fixup_memsize();
++ ibm4xx_sdram_fixup_memsize();
+ dt_fixup_mac_addresses(ebony_mac0, ebony_mac1);
+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
+ ebony_flashsel_fixup();
+@@ -146,6 +86,6 @@
+ platform_ops.exit = ibm44x_dbcr_reset;
+ ebony_mac0 = mac0;
+ ebony_mac1 = mac1;
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ep405.c powerpc.git/arch/powerpc/boot/ep405.c
+--- linux-2.6.24/arch/powerpc/boot/ep405.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ep405.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,74 @@
++/*
++ * Embedded Planet EP405 with PlanetCore firmware
++ *
++ * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\
++ *
++ * Based on ep88xc.c by
++ *
++ * Scott Wood <scottwood@freescale.com>
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "planetcore.h"
++#include "dcr.h"
++#include "4xx.h"
++#include "io.h"
++
++static char *table;
++static u64 mem_size;
++
++static void platform_fixups(void)
++{
++ u64 val;
++ void *nvrtc;
++
++ dt_fixup_memory(0, mem_size);
++ planetcore_set_mac_addrs(table);
++
++ if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
++ printf("No PlanetCore crystal frequency key.\r\n");
++ return;
++ }
++ ibm405gp_fixup_clocks(val, 0xa8c000);
++ ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
++ ibm4xx_fixup_ebc_ranges("/plb/ebc");
++
++ if (!planetcore_get_decimal(table, PLANETCORE_KEY_KB_NVRAM, &val)) {
++ printf("No PlanetCore NVRAM size key.\r\n");
++ return;
++ }
++ nvrtc = finddevice("/plb/ebc/nvrtc@4,200000");
++ if (nvrtc != NULL) {
++ u32 reg[3] = { 4, 0x200000, 0};
++ getprop(nvrtc, "reg", reg, 3);
++ reg[2] = (val << 10) & 0xffffffff;
++ setprop(nvrtc, "reg", reg, 3);
++ }
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ table = (char *)r3;
++ planetcore_prepare_table(table);
++
++ if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
++ return;
++
++ mem_size *= 1024 * 1024;
++ simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
++
++ fdt_init(_dtb_start);
++
++ planetcore_set_stdout_path(table);
++
++ serial_console_init();
++ platform_ops.fixups = platform_fixups;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ep8248e.c powerpc.git/arch/powerpc/boot/ep8248e.c
+--- linux-2.6.24/arch/powerpc/boot/ep8248e.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ep8248e.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,55 @@
++/*
++ * Embedded Planet EP8248E with PlanetCore firmware
++ *
++ * Author: Scott Wood <scottwood@freescale.com>
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "planetcore.h"
++#include "pq2.h"
++
++static char *table;
++static u64 mem_size;
++
++#include <io.h>
++
++static void platform_fixups(void)
++{
++ u64 val;
++
++ dt_fixup_memory(0, mem_size);
++ planetcore_set_mac_addrs(table);
++
++ if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
++ printf("No PlanetCore crystal frequency key.\r\n");
++ return;
++ }
++
++ pq2_fixup_clocks(val);
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ table = (char *)r3;
++ planetcore_prepare_table(table);
++
++ if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
++ return;
++
++ mem_size *= 1024 * 1024;
++ simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
++
++ fdt_init(_dtb_start);
++
++ planetcore_set_stdout_path(table);
++ serial_console_init();
++ platform_ops.fixups = platform_fixups;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ep88xc.c powerpc.git/arch/powerpc/boot/ep88xc.c
+--- linux-2.6.24/arch/powerpc/boot/ep88xc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ep88xc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -45,7 +45,7 @@
+ mem_size *= 1024 * 1024;
+ simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
+
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+
+ planetcore_set_stdout_path(table);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/flatdevtree.c powerpc.git/arch/powerpc/boot/flatdevtree.c
+--- linux-2.6.24/arch/powerpc/boot/flatdevtree.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/flatdevtree.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1036 +0,0 @@
+-/*
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+- *
+- * Copyright Pantelis Antoniou 2006
+- * Copyright (C) IBM Corporation 2006
+- *
+- * Authors: Pantelis Antoniou <pantelis@embeddedalley.com>
+- * Hollis Blanchard <hollisb@us.ibm.com>
+- * Mark A. Greer <mgreer@mvista.com>
+- * Paul Mackerras <paulus@samba.org>
+- */
+-
+-#include <string.h>
+-#include <stddef.h>
+-#include "flatdevtree.h"
+-#include "flatdevtree_env.h"
+-
+-#define _ALIGN(x, al) (((x) + (al) - 1) & ~((al) - 1))
+-
+-static char *ft_root_node(struct ft_cxt *cxt)
+-{
+- return cxt->rgn[FT_STRUCT].start;
+-}
+-
+-/* Routines for keeping node ptrs returned by ft_find_device current */
+-/* First entry not used b/c it would return 0 and be taken as NULL/error */
+-static void *ft_get_phandle(struct ft_cxt *cxt, char *node)
+-{
+- unsigned int i;
+-
+- if (!node)
+- return NULL;
+-
+- for (i = 1; i < cxt->nodes_used; i++) /* already there? */
+- if (cxt->node_tbl[i] == node)
+- return (void *)i;
+-
+- if (cxt->nodes_used < cxt->node_max) {
+- cxt->node_tbl[cxt->nodes_used] = node;
+- return (void *)cxt->nodes_used++;
+- }
+-
+- return NULL;
+-}
+-
+-static char *ft_node_ph2node(struct ft_cxt *cxt, const void *phandle)
+-{
+- unsigned int i = (unsigned int)phandle;
+-
+- if (i < cxt->nodes_used)
+- return cxt->node_tbl[i];
+- return NULL;
+-}
+-
+-static void ft_node_update_before(struct ft_cxt *cxt, char *addr, int shift)
+-{
+- unsigned int i;
+-
+- if (shift == 0)
+- return;
+-
+- for (i = 1; i < cxt->nodes_used; i++)
+- if (cxt->node_tbl[i] < addr)
+- cxt->node_tbl[i] += shift;
+-}
+-
+-static void ft_node_update_after(struct ft_cxt *cxt, char *addr, int shift)
+-{
+- unsigned int i;
+-
+- if (shift == 0)
+- return;
+-
+- for (i = 1; i < cxt->nodes_used; i++)
+- if (cxt->node_tbl[i] >= addr)
+- cxt->node_tbl[i] += shift;
+-}
+-
+-/* Struct used to return info from ft_next() */
+-struct ft_atom {
+- u32 tag;
+- const char *name;
+- void *data;
+- u32 size;
+-};
+-
+-/* Set ptrs to current one's info; return addr of next one */
+-static char *ft_next(struct ft_cxt *cxt, char *p, struct ft_atom *ret)
+-{
+- u32 sz;
+-
+- if (p >= cxt->rgn[FT_STRUCT].start + cxt->rgn[FT_STRUCT].size)
+- return NULL;
+-
+- ret->tag = be32_to_cpu(*(u32 *) p);
+- p += 4;
+-
+- switch (ret->tag) { /* Tag */
+- case OF_DT_BEGIN_NODE:
+- ret->name = p;
+- ret->data = (void *)(p - 4); /* start of node */
+- p += _ALIGN(strlen(p) + 1, 4);
+- break;
+- case OF_DT_PROP:
+- ret->size = sz = be32_to_cpu(*(u32 *) p);
+- ret->name = cxt->str_anchor + be32_to_cpu(*(u32 *) (p + 4));
+- ret->data = (void *)(p + 8);
+- p += 8 + _ALIGN(sz, 4);
+- break;
+- case OF_DT_END_NODE:
+- case OF_DT_NOP:
+- break;
+- case OF_DT_END:
+- default:
+- p = NULL;
+- break;
+- }
+-
+- return p;
+-}
+-
+-#define HDR_SIZE _ALIGN(sizeof(struct boot_param_header), 8)
+-#define EXPAND_INCR 1024 /* alloc this much extra when expanding */
+-
+-/* Copy the tree to a newly-allocated region and put things in order */
+-static int ft_reorder(struct ft_cxt *cxt, int nextra)
+-{
+- unsigned long tot;
+- enum ft_rgn_id r;
+- char *p, *pend;
+- int stroff;
+-
+- tot = HDR_SIZE + EXPAND_INCR;
+- for (r = FT_RSVMAP; r <= FT_STRINGS; ++r)
+- tot += cxt->rgn[r].size;
+- if (nextra > 0)
+- tot += nextra;
+- tot = _ALIGN(tot, 8);
+-
+- if (!cxt->realloc)
+- return 0;
+- p = cxt->realloc(NULL, tot);
+- if (!p)
+- return 0;
+-
+- memcpy(p, cxt->bph, sizeof(struct boot_param_header));
+- /* offsets get fixed up later */
+-
+- cxt->bph = (struct boot_param_header *)p;
+- cxt->max_size = tot;
+- pend = p + tot;
+- p += HDR_SIZE;
+-
+- memcpy(p, cxt->rgn[FT_RSVMAP].start, cxt->rgn[FT_RSVMAP].size);
+- cxt->rgn[FT_RSVMAP].start = p;
+- p += cxt->rgn[FT_RSVMAP].size;
+-
+- memcpy(p, cxt->rgn[FT_STRUCT].start, cxt->rgn[FT_STRUCT].size);
+- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
+- p - cxt->rgn[FT_STRUCT].start);
+- cxt->p += p - cxt->rgn[FT_STRUCT].start;
+- cxt->rgn[FT_STRUCT].start = p;
+-
+- p = pend - cxt->rgn[FT_STRINGS].size;
+- memcpy(p, cxt->rgn[FT_STRINGS].start, cxt->rgn[FT_STRINGS].size);
+- stroff = cxt->str_anchor - cxt->rgn[FT_STRINGS].start;
+- cxt->rgn[FT_STRINGS].start = p;
+- cxt->str_anchor = p + stroff;
+-
+- cxt->isordered = 1;
+- return 1;
+-}
+-
+-static inline char *prev_end(struct ft_cxt *cxt, enum ft_rgn_id r)
+-{
+- if (r > FT_RSVMAP)
+- return cxt->rgn[r - 1].start + cxt->rgn[r - 1].size;
+- return (char *)cxt->bph + HDR_SIZE;
+-}
+-
+-static inline char *next_start(struct ft_cxt *cxt, enum ft_rgn_id r)
+-{
+- if (r < FT_STRINGS)
+- return cxt->rgn[r + 1].start;
+- return (char *)cxt->bph + cxt->max_size;
+-}
+-
+-/*
+- * See if we can expand region rgn by nextra bytes by using up
+- * free space after or before the region.
+- */
+-static int ft_shuffle(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
+- int nextra)
+-{
+- char *p = *pp;
+- char *rgn_start, *rgn_end;
+-
+- rgn_start = cxt->rgn[rgn].start;
+- rgn_end = rgn_start + cxt->rgn[rgn].size;
+- if (nextra <= 0 || rgn_end + nextra <= next_start(cxt, rgn)) {
+- /* move following stuff */
+- if (p < rgn_end) {
+- if (nextra < 0)
+- memmove(p, p - nextra, rgn_end - p + nextra);
+- else
+- memmove(p + nextra, p, rgn_end - p);
+- if (rgn == FT_STRUCT)
+- ft_node_update_after(cxt, p, nextra);
+- }
+- cxt->rgn[rgn].size += nextra;
+- if (rgn == FT_STRINGS)
+- /* assumes strings only added at beginning */
+- cxt->str_anchor += nextra;
+- return 1;
+- }
+- if (prev_end(cxt, rgn) <= rgn_start - nextra) {
+- /* move preceding stuff */
+- if (p > rgn_start) {
+- memmove(rgn_start - nextra, rgn_start, p - rgn_start);
+- if (rgn == FT_STRUCT)
+- ft_node_update_before(cxt, p, -nextra);
+- }
+- *pp -= nextra;
+- cxt->rgn[rgn].start -= nextra;
+- cxt->rgn[rgn].size += nextra;
+- return 1;
+- }
+- return 0;
+-}
+-
+-static int ft_make_space(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
+- int nextra)
+-{
+- unsigned long size, ssize, tot;
+- char *str, *next;
+- enum ft_rgn_id r;
+-
+- if (!cxt->isordered) {
+- unsigned long rgn_off = *pp - cxt->rgn[rgn].start;
+-
+- if (!ft_reorder(cxt, nextra))
+- return 0;
+-
+- *pp = cxt->rgn[rgn].start + rgn_off;
+- }
+- if (ft_shuffle(cxt, pp, rgn, nextra))
+- return 1;
+-
+- /* See if there is space after the strings section */
+- ssize = cxt->rgn[FT_STRINGS].size;
+- if (cxt->rgn[FT_STRINGS].start + ssize
+- < (char *)cxt->bph + cxt->max_size) {
+- /* move strings up as far as possible */
+- str = (char *)cxt->bph + cxt->max_size - ssize;
+- cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
+- memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
+- cxt->rgn[FT_STRINGS].start = str;
+- /* enough space now? */
+- if (rgn >= FT_STRUCT && ft_shuffle(cxt, pp, rgn, nextra))
+- return 1;
+- }
+-
+- /* how much total free space is there following this region? */
+- tot = 0;
+- for (r = rgn; r < FT_STRINGS; ++r) {
+- char *r_end = cxt->rgn[r].start + cxt->rgn[r].size;
+- tot += next_start(cxt, rgn) - r_end;
+- }
+-
+- /* cast is to shut gcc up; we know nextra >= 0 */
+- if (tot < (unsigned int)nextra) {
+- /* have to reallocate */
+- char *newp, *new_start;
+- int shift;
+-
+- if (!cxt->realloc)
+- return 0;
+- size = _ALIGN(cxt->max_size + (nextra - tot) + EXPAND_INCR, 8);
+- newp = cxt->realloc(cxt->bph, size);
+- if (!newp)
+- return 0;
+- cxt->max_size = size;
+- shift = newp - (char *)cxt->bph;
+-
+- if (shift) { /* realloc can return same addr */
+- cxt->bph = (struct boot_param_header *)newp;
+- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
+- shift);
+- for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
+- new_start = cxt->rgn[r].start + shift;
+- cxt->rgn[r].start = new_start;
+- }
+- *pp += shift;
+- cxt->str_anchor += shift;
+- }
+-
+- /* move strings up to the end */
+- str = newp + size - ssize;
+- cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
+- memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
+- cxt->rgn[FT_STRINGS].start = str;
+-
+- if (ft_shuffle(cxt, pp, rgn, nextra))
+- return 1;
+- }
+-
+- /* must be FT_RSVMAP and we need to move FT_STRUCT up */
+- if (rgn == FT_RSVMAP) {
+- next = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
+- + nextra;
+- ssize = cxt->rgn[FT_STRUCT].size;
+- if (next + ssize >= cxt->rgn[FT_STRINGS].start)
+- return 0; /* "can't happen" */
+- memmove(next, cxt->rgn[FT_STRUCT].start, ssize);
+- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start, nextra);
+- cxt->rgn[FT_STRUCT].start = next;
+-
+- if (ft_shuffle(cxt, pp, rgn, nextra))
+- return 1;
+- }
+-
+- return 0; /* "can't happen" */
+-}
+-
+-static void ft_put_word(struct ft_cxt *cxt, u32 v)
+-{
+- *(u32 *) cxt->p = cpu_to_be32(v);
+- cxt->p += 4;
+-}
+-
+-static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
+-{
+- unsigned long sza = _ALIGN(sz, 4);
+-
+- /* zero out the alignment gap if necessary */
+- if (sz < sza)
+- *(u32 *) (cxt->p + sza - 4) = 0;
+-
+- /* copy in the data */
+- memcpy(cxt->p, data, sz);
+-
+- cxt->p += sza;
+-}
+-
+-char *ft_begin_node(struct ft_cxt *cxt, const char *name)
+-{
+- unsigned long nlen = strlen(name) + 1;
+- unsigned long len = 8 + _ALIGN(nlen, 4);
+- char *ret;
+-
+- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
+- return NULL;
+-
+- ret = cxt->p;
+-
+- ft_put_word(cxt, OF_DT_BEGIN_NODE);
+- ft_put_bin(cxt, name, strlen(name) + 1);
+-
+- return ret;
+-}
+-
+-void ft_end_node(struct ft_cxt *cxt)
+-{
+- ft_put_word(cxt, OF_DT_END_NODE);
+-}
+-
+-void ft_nop(struct ft_cxt *cxt)
+-{
+- if (ft_make_space(cxt, &cxt->p, FT_STRUCT, 4))
+- ft_put_word(cxt, OF_DT_NOP);
+-}
+-
+-#define NO_STRING 0x7fffffff
+-
+-static int lookup_string(struct ft_cxt *cxt, const char *name)
+-{
+- char *p, *end;
+-
+- p = cxt->rgn[FT_STRINGS].start;
+- end = p + cxt->rgn[FT_STRINGS].size;
+- while (p < end) {
+- if (strcmp(p, (char *)name) == 0)
+- return p - cxt->str_anchor;
+- p += strlen(p) + 1;
+- }
+-
+- return NO_STRING;
+-}
+-
+-/* lookup string and insert if not found */
+-static int map_string(struct ft_cxt *cxt, const char *name)
+-{
+- int off;
+- char *p;
+-
+- off = lookup_string(cxt, name);
+- if (off != NO_STRING)
+- return off;
+- p = cxt->rgn[FT_STRINGS].start;
+- if (!ft_make_space(cxt, &p, FT_STRINGS, strlen(name) + 1))
+- return NO_STRING;
+- strcpy(p, name);
+- return p - cxt->str_anchor;
+-}
+-
+-int ft_prop(struct ft_cxt *cxt, const char *name, const void *data,
+- unsigned int sz)
+-{
+- int off, len;
+-
+- off = map_string(cxt, name);
+- if (off == NO_STRING)
+- return -1;
+-
+- len = 12 + _ALIGN(sz, 4);
+- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
+- return -1;
+-
+- ft_put_word(cxt, OF_DT_PROP);
+- ft_put_word(cxt, sz);
+- ft_put_word(cxt, off);
+- ft_put_bin(cxt, data, sz);
+- return 0;
+-}
+-
+-int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
+-{
+- return ft_prop(cxt, name, str, strlen(str) + 1);
+-}
+-
+-int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val)
+-{
+- u32 v = cpu_to_be32((u32) val);
+-
+- return ft_prop(cxt, name, &v, 4);
+-}
+-
+-/* Calculate the size of the reserved map */
+-static unsigned long rsvmap_size(struct ft_cxt *cxt)
+-{
+- struct ft_reserve *res;
+-
+- res = (struct ft_reserve *)cxt->rgn[FT_RSVMAP].start;
+- while (res->start || res->len)
+- ++res;
+- return (char *)(res + 1) - cxt->rgn[FT_RSVMAP].start;
+-}
+-
+-/* Calculate the size of the struct region by stepping through it */
+-static unsigned long struct_size(struct ft_cxt *cxt)
+-{
+- char *p = cxt->rgn[FT_STRUCT].start;
+- char *next;
+- struct ft_atom atom;
+-
+- /* make check in ft_next happy */
+- if (cxt->rgn[FT_STRUCT].size == 0)
+- cxt->rgn[FT_STRUCT].size = 0xfffffffful - (unsigned long)p;
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL)
+- p = next;
+- return p + 4 - cxt->rgn[FT_STRUCT].start;
+-}
+-
+-/* add `adj' on to all string offset values in the struct area */
+-static void adjust_string_offsets(struct ft_cxt *cxt, int adj)
+-{
+- char *p = cxt->rgn[FT_STRUCT].start;
+- char *next;
+- struct ft_atom atom;
+- int off;
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- if (atom.tag == OF_DT_PROP) {
+- off = be32_to_cpu(*(u32 *) (p + 8));
+- *(u32 *) (p + 8) = cpu_to_be32(off + adj);
+- }
+- p = next;
+- }
+-}
+-
+-/* start construction of the flat OF tree from scratch */
+-void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
+- void *(*realloc_fn) (void *, unsigned long))
+-{
+- struct boot_param_header *bph = blob;
+- char *p;
+- struct ft_reserve *pres;
+-
+- /* clear the cxt */
+- memset(cxt, 0, sizeof(*cxt));
+-
+- cxt->bph = bph;
+- cxt->max_size = max_size;
+- cxt->realloc = realloc_fn;
+- cxt->isordered = 1;
+-
+- /* zero everything in the header area */
+- memset(bph, 0, sizeof(*bph));
+-
+- bph->magic = cpu_to_be32(OF_DT_HEADER);
+- bph->version = cpu_to_be32(0x10);
+- bph->last_comp_version = cpu_to_be32(0x10);
+-
+- /* start pointers */
+- cxt->rgn[FT_RSVMAP].start = p = blob + HDR_SIZE;
+- cxt->rgn[FT_RSVMAP].size = sizeof(struct ft_reserve);
+- pres = (struct ft_reserve *)p;
+- cxt->rgn[FT_STRUCT].start = p += sizeof(struct ft_reserve);
+- cxt->rgn[FT_STRUCT].size = 4;
+- cxt->rgn[FT_STRINGS].start = blob + max_size;
+- cxt->rgn[FT_STRINGS].size = 0;
+-
+- /* init rsvmap and struct */
+- pres->start = 0;
+- pres->len = 0;
+- *(u32 *) p = cpu_to_be32(OF_DT_END);
+-
+- cxt->str_anchor = blob;
+-}
+-
+-/* open up an existing blob to be examined or modified */
+-int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
+- unsigned int max_find_device,
+- void *(*realloc_fn) (void *, unsigned long))
+-{
+- struct boot_param_header *bph = blob;
+-
+- /* can't cope with version < 16 */
+- if (be32_to_cpu(bph->version) < 16)
+- return -1;
+-
+- /* clear the cxt */
+- memset(cxt, 0, sizeof(*cxt));
+-
+- /* alloc node_tbl to track node ptrs returned by ft_find_device */
+- ++max_find_device;
+- cxt->node_tbl = realloc_fn(NULL, max_find_device * sizeof(char *));
+- if (!cxt->node_tbl)
+- return -1;
+- memset(cxt->node_tbl, 0, max_find_device * sizeof(char *));
+- cxt->node_max = max_find_device;
+- cxt->nodes_used = 1; /* don't use idx 0 b/c looks like NULL */
+-
+- cxt->bph = bph;
+- cxt->max_size = max_size;
+- cxt->realloc = realloc_fn;
+-
+- cxt->rgn[FT_RSVMAP].start = blob + be32_to_cpu(bph->off_mem_rsvmap);
+- cxt->rgn[FT_RSVMAP].size = rsvmap_size(cxt);
+- cxt->rgn[FT_STRUCT].start = blob + be32_to_cpu(bph->off_dt_struct);
+- cxt->rgn[FT_STRUCT].size = struct_size(cxt);
+- cxt->rgn[FT_STRINGS].start = blob + be32_to_cpu(bph->off_dt_strings);
+- cxt->rgn[FT_STRINGS].size = be32_to_cpu(bph->dt_strings_size);
+-
+- cxt->p = cxt->rgn[FT_STRUCT].start;
+- cxt->str_anchor = cxt->rgn[FT_STRINGS].start;
+-
+- return 0;
+-}
+-
+-/* add a reserver physical area to the rsvmap */
+-int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)
+-{
+- char *p;
+- struct ft_reserve *pres;
+-
+- p = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
+- - sizeof(struct ft_reserve);
+- if (!ft_make_space(cxt, &p, FT_RSVMAP, sizeof(struct ft_reserve)))
+- return -1;
+-
+- pres = (struct ft_reserve *)p;
+- pres->start = cpu_to_be64(physaddr);
+- pres->len = cpu_to_be64(size);
+-
+- return 0;
+-}
+-
+-void ft_begin_tree(struct ft_cxt *cxt)
+-{
+- cxt->p = ft_root_node(cxt);
+-}
+-
+-void ft_end_tree(struct ft_cxt *cxt)
+-{
+- struct boot_param_header *bph = cxt->bph;
+- char *p, *oldstr, *str, *endp;
+- unsigned long ssize;
+- int adj;
+-
+- if (!cxt->isordered)
+- return; /* we haven't touched anything */
+-
+- /* adjust string offsets */
+- oldstr = cxt->rgn[FT_STRINGS].start;
+- adj = cxt->str_anchor - oldstr;
+- if (adj)
+- adjust_string_offsets(cxt, adj);
+-
+- /* make strings end on 8-byte boundary */
+- ssize = cxt->rgn[FT_STRINGS].size;
+- endp = (char *)_ALIGN((unsigned long)cxt->rgn[FT_STRUCT].start
+- + cxt->rgn[FT_STRUCT].size + ssize, 8);
+- str = endp - ssize;
+-
+- /* move strings down to end of structs */
+- memmove(str, oldstr, ssize);
+- cxt->str_anchor = str;
+- cxt->rgn[FT_STRINGS].start = str;
+-
+- /* fill in header fields */
+- p = (char *)bph;
+- bph->totalsize = cpu_to_be32(endp - p);
+- bph->off_mem_rsvmap = cpu_to_be32(cxt->rgn[FT_RSVMAP].start - p);
+- bph->off_dt_struct = cpu_to_be32(cxt->rgn[FT_STRUCT].start - p);
+- bph->off_dt_strings = cpu_to_be32(cxt->rgn[FT_STRINGS].start - p);
+- bph->dt_strings_size = cpu_to_be32(ssize);
+-}
+-
+-void *ft_find_device(struct ft_cxt *cxt, const void *top, const char *srch_path)
+-{
+- char *node;
+-
+- if (top) {
+- node = ft_node_ph2node(cxt, top);
+- if (node == NULL)
+- return NULL;
+- } else {
+- node = ft_root_node(cxt);
+- }
+-
+- node = ft_find_descendent(cxt, node, srch_path);
+- return ft_get_phandle(cxt, node);
+-}
+-
+-void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path)
+-{
+- struct ft_atom atom;
+- char *p;
+- const char *cp, *q;
+- int cl;
+- int depth = -1;
+- int dmatch = 0;
+- const char *path_comp[FT_MAX_DEPTH];
+-
+- cp = srch_path;
+- cl = 0;
+- p = top;
+-
+- while ((p = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- ++depth;
+- if (depth != dmatch)
+- break;
+- cxt->genealogy[depth] = atom.data;
+- cxt->genealogy[depth + 1] = NULL;
+- if (depth && !(strncmp(atom.name, cp, cl) == 0
+- && (atom.name[cl] == '/'
+- || atom.name[cl] == '\0'
+- || atom.name[cl] == '@')))
+- break;
+- path_comp[dmatch] = cp;
+- /* it matches so far, advance to next path component */
+- cp += cl;
+- /* skip slashes */
+- while (*cp == '/')
+- ++cp;
+- /* we're done if this is the end of the string */
+- if (*cp == 0)
+- return atom.data;
+- /* look for end of this component */
+- q = strchr(cp, '/');
+- if (q)
+- cl = q - cp;
+- else
+- cl = strlen(cp);
+- ++dmatch;
+- break;
+- case OF_DT_END_NODE:
+- if (depth == 0)
+- return NULL;
+- if (dmatch > depth) {
+- --dmatch;
+- cl = cp - path_comp[dmatch] - 1;
+- cp = path_comp[dmatch];
+- while (cl > 0 && cp[cl - 1] == '/')
+- --cl;
+- }
+- --depth;
+- break;
+- }
+- }
+- return NULL;
+-}
+-
+-void *__ft_get_parent(struct ft_cxt *cxt, void *node)
+-{
+- int d;
+- struct ft_atom atom;
+- char *p;
+-
+- for (d = 0; cxt->genealogy[d] != NULL; ++d)
+- if (cxt->genealogy[d] == node)
+- return d > 0 ? cxt->genealogy[d - 1] : NULL;
+-
+- /* have to do it the hard way... */
+- p = ft_root_node(cxt);
+- d = 0;
+- while ((p = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- cxt->genealogy[d] = atom.data;
+- if (node == atom.data) {
+- /* found it */
+- cxt->genealogy[d + 1] = NULL;
+- return d > 0 ? cxt->genealogy[d - 1] : NULL;
+- }
+- ++d;
+- break;
+- case OF_DT_END_NODE:
+- --d;
+- break;
+- }
+- }
+- return NULL;
+-}
+-
+-void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
+-{
+- void *node = ft_node_ph2node(cxt, phandle);
+- if (node == NULL)
+- return NULL;
+-
+- node = __ft_get_parent(cxt, node);
+- return ft_get_phandle(cxt, node);
+-}
+-
+-static const void *__ft_get_prop(struct ft_cxt *cxt, void *node,
+- const char *propname, unsigned int *len)
+-{
+- struct ft_atom atom;
+- int depth = 0;
+-
+- while ((node = ft_next(cxt, node, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- ++depth;
+- break;
+-
+- case OF_DT_PROP:
+- if (depth != 1 || strcmp(atom.name, propname))
+- break;
+-
+- if (len)
+- *len = atom.size;
+-
+- return atom.data;
+-
+- case OF_DT_END_NODE:
+- if (--depth <= 0)
+- return NULL;
+- }
+- }
+-
+- return NULL;
+-}
+-
+-int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
+- void *buf, const unsigned int buflen)
+-{
+- const void *data;
+- unsigned int size;
+-
+- void *node = ft_node_ph2node(cxt, phandle);
+- if (!node)
+- return -1;
+-
+- data = __ft_get_prop(cxt, node, propname, &size);
+- if (data) {
+- unsigned int clipped_size = min(size, buflen);
+- memcpy(buf, data, clipped_size);
+- return size;
+- }
+-
+- return -1;
+-}
+-
+-void *__ft_find_node_by_prop_value(struct ft_cxt *cxt, void *prev,
+- const char *propname, const char *propval,
+- unsigned int proplen)
+-{
+- struct ft_atom atom;
+- char *p = ft_root_node(cxt);
+- char *next;
+- int past_prev = prev ? 0 : 1;
+- int depth = -1;
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- const void *data;
+- unsigned int size;
+-
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- depth++;
+-
+- if (prev == p) {
+- past_prev = 1;
+- break;
+- }
+-
+- if (!past_prev || depth < 1)
+- break;
+-
+- data = __ft_get_prop(cxt, p, propname, &size);
+- if (!data || size != proplen)
+- break;
+- if (memcmp(data, propval, size))
+- break;
+-
+- return p;
+-
+- case OF_DT_END_NODE:
+- if (depth-- == 0)
+- return NULL;
+-
+- break;
+- }
+-
+- p = next;
+- }
+-
+- return NULL;
+-}
+-
+-void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
+- const char *propname, const char *propval,
+- int proplen)
+-{
+- void *node = NULL;
+-
+- if (prev) {
+- node = ft_node_ph2node(cxt, prev);
+-
+- if (!node)
+- return NULL;
+- }
+-
+- node = __ft_find_node_by_prop_value(cxt, node, propname,
+- propval, proplen);
+- return ft_get_phandle(cxt, node);
+-}
+-
+-int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
+- const void *buf, const unsigned int buflen)
+-{
+- struct ft_atom atom;
+- void *node;
+- char *p, *next;
+- int nextra;
+-
+- node = ft_node_ph2node(cxt, phandle);
+- if (node == NULL)
+- return -1;
+-
+- next = ft_next(cxt, node, &atom);
+- if (atom.tag != OF_DT_BEGIN_NODE)
+- /* phandle didn't point to a node */
+- return -1;
+- p = next;
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
+- case OF_DT_END_NODE:
+- /* haven't found the property, insert here */
+- cxt->p = p;
+- return ft_prop(cxt, propname, buf, buflen);
+- case OF_DT_PROP:
+- if (strcmp(atom.name, propname))
+- break;
+- /* found an existing property, overwrite it */
+- nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
+- cxt->p = atom.data;
+- if (nextra && !ft_make_space(cxt, &cxt->p, FT_STRUCT,
+- nextra))
+- return -1;
+- *(u32 *) (cxt->p - 8) = cpu_to_be32(buflen);
+- ft_put_bin(cxt, buf, buflen);
+- return 0;
+- }
+- p = next;
+- }
+- return -1;
+-}
+-
+-int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
+-{
+- struct ft_atom atom;
+- void *node;
+- char *p, *next;
+- int size;
+-
+- node = ft_node_ph2node(cxt, phandle);
+- if (node == NULL)
+- return -1;
+-
+- p = node;
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- case OF_DT_END_NODE:
+- return -1;
+- case OF_DT_PROP:
+- if (strcmp(atom.name, propname))
+- break;
+- /* found the property, remove it */
+- size = 12 + -_ALIGN(atom.size, 4);
+- cxt->p = p;
+- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, -size))
+- return -1;
+- return 0;
+- }
+- p = next;
+- }
+- return -1;
+-}
+-
+-void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
+-{
+- struct ft_atom atom;
+- char *p, *next, *ret;
+- int depth = 0;
+-
+- if (parent) {
+- p = ft_node_ph2node(cxt, parent);
+- if (!p)
+- return NULL;
+- } else {
+- p = ft_root_node(cxt);
+- }
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- ++depth;
+- if (depth == 1 && strcmp(atom.name, name) == 0)
+- /* duplicate node name, return error */
+- return NULL;
+- break;
+- case OF_DT_END_NODE:
+- --depth;
+- if (depth > 0)
+- break;
+- /* end of node, insert here */
+- cxt->p = p;
+- ret = ft_begin_node(cxt, name);
+- ft_end_node(cxt);
+- return ft_get_phandle(cxt, ret);
+- }
+- p = next;
+- }
+- return NULL;
+-}
+-
+-/* Returns the start of the path within the provided buffer, or NULL on
+- * error.
+- */
+-char *ft_get_path(struct ft_cxt *cxt, const void *phandle,
+- char *buf, int len)
+-{
+- const char *path_comp[FT_MAX_DEPTH];
+- struct ft_atom atom;
+- char *p, *next, *pos;
+- int depth = 0, i;
+- void *node;
+-
+- node = ft_node_ph2node(cxt, phandle);
+- if (node == NULL)
+- return NULL;
+-
+- p = ft_root_node(cxt);
+-
+- while ((next = ft_next(cxt, p, &atom)) != NULL) {
+- switch (atom.tag) {
+- case OF_DT_BEGIN_NODE:
+- path_comp[depth++] = atom.name;
+- if (p == node)
+- goto found;
+-
+- break;
+-
+- case OF_DT_END_NODE:
+- if (--depth == 0)
+- return NULL;
+- }
+-
+- p = next;
+- }
+-
+-found:
+- pos = buf;
+- for (i = 1; i < depth; i++) {
+- int this_len;
+-
+- if (len <= 1)
+- return NULL;
+-
+- *pos++ = '/';
+- len--;
+-
+- strncpy(pos, path_comp[i], len);
+-
+- if (pos[len - 1] != 0)
+- return NULL;
+-
+- this_len = strlen(pos);
+- len -= this_len;
+- pos += this_len;
+- }
+-
+- return buf;
+-}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/flatdevtree.h powerpc.git/arch/powerpc/boot/flatdevtree.h
+--- linux-2.6.24/arch/powerpc/boot/flatdevtree.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/flatdevtree.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,113 +0,0 @@
+-/*
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+- */
+-
+-#ifndef FLATDEVTREE_H
+-#define FLATDEVTREE_H
+-
+-#include "flatdevtree_env.h"
+-
+-/* Definitions used by the flattened device tree */
+-#define OF_DT_HEADER 0xd00dfeed /* marker */
+-#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
+-#define OF_DT_END_NODE 0x2 /* End node */
+-#define OF_DT_PROP 0x3 /* Property: name off, size, content */
+-#define OF_DT_NOP 0x4 /* nop */
+-#define OF_DT_END 0x9
+-
+-#define OF_DT_VERSION 0x10
+-
+-struct boot_param_header {
+- u32 magic; /* magic word OF_DT_HEADER */
+- u32 totalsize; /* total size of DT block */
+- u32 off_dt_struct; /* offset to structure */
+- u32 off_dt_strings; /* offset to strings */
+- u32 off_mem_rsvmap; /* offset to memory reserve map */
+- u32 version; /* format version */
+- u32 last_comp_version; /* last compatible version */
+- /* version 2 fields below */
+- u32 boot_cpuid_phys; /* Physical CPU id we're booting on */
+- /* version 3 fields below */
+- u32 dt_strings_size; /* size of the DT strings block */
+-};
+-
+-struct ft_reserve {
+- u64 start;
+- u64 len;
+-};
+-
+-struct ft_region {
+- char *start;
+- unsigned long size;
+-};
+-
+-enum ft_rgn_id {
+- FT_RSVMAP,
+- FT_STRUCT,
+- FT_STRINGS,
+- FT_N_REGION
+-};
+-
+-#define FT_MAX_DEPTH 50
+-
+-struct ft_cxt {
+- struct boot_param_header *bph;
+- int max_size; /* maximum size of tree */
+- int isordered; /* everything in standard order */
+- void *(*realloc)(void *, unsigned long);
+- char *str_anchor;
+- char *p; /* current insertion point in structs */
+- struct ft_region rgn[FT_N_REGION];
+- void *genealogy[FT_MAX_DEPTH+1];
+- char **node_tbl;
+- unsigned int node_max;
+- unsigned int nodes_used;
+-};
+-
+-char *ft_begin_node(struct ft_cxt *cxt, const char *name);
+-void ft_end_node(struct ft_cxt *cxt);
+-
+-void ft_begin_tree(struct ft_cxt *cxt);
+-void ft_end_tree(struct ft_cxt *cxt);
+-
+-void ft_nop(struct ft_cxt *cxt);
+-int ft_prop(struct ft_cxt *cxt, const char *name,
+- const void *data, unsigned int sz);
+-int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
+-int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val);
+-void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
+- void *(*realloc_fn)(void *, unsigned long));
+-int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
+- unsigned int max_find_device,
+- void *(*realloc_fn)(void *, unsigned long));
+-int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
+-
+-void ft_dump_blob(const void *bphp);
+-void ft_merge_blob(struct ft_cxt *cxt, void *blob);
+-void *ft_find_device(struct ft_cxt *cxt, const void *top,
+- const char *srch_path);
+-void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
+-int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
+- void *buf, const unsigned int buflen);
+-int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
+- const void *buf, const unsigned int buflen);
+-void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
+-void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
+- const char *propname, const char *propval,
+- int proplen);
+-void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name);
+-char *ft_get_path(struct ft_cxt *cxt, const void *phandle, char *buf, int len);
+-
+-#endif /* FLATDEVTREE_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/flatdevtree_misc.c powerpc.git/arch/powerpc/boot/flatdevtree_misc.c
+--- linux-2.6.24/arch/powerpc/boot/flatdevtree_misc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/flatdevtree_misc.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,79 +0,0 @@
+-/*
+- * This file does the necessary interface mapping between the bootwrapper
+- * device tree operations and the interface provided by shared source
+- * files flatdevicetree.[ch].
+- *
+- * Author: Mark A. Greer <mgreer@mvista.com>
+- *
+- * 2006 (c) MontaVista Software, Inc. This file is licensed under
+- * the terms of the GNU General Public License version 2. This program
+- * is licensed "as is" without any warranty of any kind, whether express
+- * or implied.
+- */
+-#include <stddef.h>
+-#include "flatdevtree.h"
+-#include "ops.h"
+-
+-static struct ft_cxt cxt;
+-
+-static void *fdtm_finddevice(const char *name)
+-{
+- return ft_find_device(&cxt, NULL, name);
+-}
+-
+-static int fdtm_getprop(const void *phandle, const char *propname,
+- void *buf, const int buflen)
+-{
+- return ft_get_prop(&cxt, phandle, propname, buf, buflen);
+-}
+-
+-static int fdtm_setprop(const void *phandle, const char *propname,
+- const void *buf, const int buflen)
+-{
+- return ft_set_prop(&cxt, phandle, propname, buf, buflen);
+-}
+-
+-static void *fdtm_get_parent(const void *phandle)
+-{
+- return ft_get_parent(&cxt, phandle);
+-}
+-
+-static void *fdtm_create_node(const void *phandle, const char *name)
+-{
+- return ft_create_node(&cxt, phandle, name);
+-}
+-
+-static void *fdtm_find_node_by_prop_value(const void *prev,
+- const char *propname,
+- const char *propval,
+- int proplen)
+-{
+- return ft_find_node_by_prop_value(&cxt, prev, propname,
+- propval, proplen);
+-}
+-
+-static unsigned long fdtm_finalize(void)
+-{
+- ft_end_tree(&cxt);
+- return (unsigned long)cxt.bph;
+-}
+-
+-static char *fdtm_get_path(const void *phandle, char *buf, int len)
+-{
+- return ft_get_path(&cxt, phandle, buf, len);
+-}
+-
+-int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
+-{
+- dt_ops.finddevice = fdtm_finddevice;
+- dt_ops.getprop = fdtm_getprop;
+- dt_ops.setprop = fdtm_setprop;
+- dt_ops.get_parent = fdtm_get_parent;
+- dt_ops.create_node = fdtm_create_node;
+- dt_ops.find_node_by_prop_value = fdtm_find_node_by_prop_value;
+- dt_ops.finalize = fdtm_finalize;
+- dt_ops.get_path = fdtm_get_path;
+-
+- return ft_open(&cxt, dt_blob, max_size, max_find_device,
+- platform_ops.realloc);
+-}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/holly.c powerpc.git/arch/powerpc/boot/holly.c
+--- linux-2.6.24/arch/powerpc/boot/holly.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/holly.c 2008-01-28 20:25:49.000000000 +0100
+@@ -28,6 +28,6 @@
+ u32 heapsize = 0x8000000 - (u32)_end; /* 128M */
+
+ simple_alloc_init(_end, heapsize, 32, 64);
+- ft_init(_dtb_start, 0, 4);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/Makefile.libfdt powerpc.git/arch/powerpc/boot/libfdt/Makefile.libfdt
+--- linux-2.6.24/arch/powerpc/boot/libfdt/Makefile.libfdt 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/Makefile.libfdt 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,14 @@
++# Makefile.libfdt
++#
++# This is not a complete Makefile of itself. Instead, it is designed to
++# be easily embeddable into other systems of Makefiles.
++#
++LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
++LIBFDT_INCLUDES = fdt.h libfdt.h
++LIBFDT_EXTRA = libfdt_internal.h
++LIBFDT_LIB = libfdt/libfdt.a
++
++LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
++
++$(LIBFDT_objdir)/$(LIBFDT_LIB): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS))
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt.c powerpc.git/arch/powerpc/boot/libfdt/fdt.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,156 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++int fdt_check_header(const void *fdt)
++{
++ if (fdt_magic(fdt) == FDT_MAGIC) {
++ /* Complete tree */
++ if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
++ return -FDT_ERR_BADVERSION;
++ if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
++ return -FDT_ERR_BADVERSION;
++ } else if (fdt_magic(fdt) == SW_MAGIC) {
++ /* Unfinished sequential-write blob */
++ if (fdt_size_dt_struct(fdt) == 0)
++ return -FDT_ERR_BADSTATE;
++ } else {
++ return -FDT_ERR_BADMAGIC;
++ }
++
++ return 0;
++}
++
++const void *fdt_offset_ptr(const void *fdt, int offset, int len)
++{
++ const void *p;
++
++ if (fdt_version(fdt) >= 0x11)
++ if (((offset + len) < offset)
++ || ((offset + len) > fdt_size_dt_struct(fdt)))
++ return NULL;
++
++ p = _fdt_offset_ptr(fdt, offset);
++
++ if (p + len < p)
++ return NULL;
++ return p;
++}
++
++uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
++{
++ const uint32_t *tagp, *lenp;
++ uint32_t tag;
++ const char *p;
++
++ if (offset % FDT_TAGSIZE)
++ return -1;
++
++ tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
++ if (! tagp)
++ return FDT_END; /* premature end */
++ tag = fdt32_to_cpu(*tagp);
++ offset += FDT_TAGSIZE;
++
++ switch (tag) {
++ case FDT_BEGIN_NODE:
++ /* skip name */
++ do {
++ p = fdt_offset_ptr(fdt, offset++, 1);
++ } while (p && (*p != '\0'));
++ if (! p)
++ return FDT_END;
++ break;
++ case FDT_PROP:
++ lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
++ if (! lenp)
++ return FDT_END;
++ /* skip name offset, length and value */
++ offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
++ break;
++ }
++
++ if (nextoffset)
++ *nextoffset = ALIGN(offset, FDT_TAGSIZE);
++
++ return tag;
++}
++
++const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
++{
++ int len = strlen(s) + 1;
++ const char *last = strtab + tabsize - len;
++ const char *p;
++
++ for (p = strtab; p <= last; p++)
++ if (memeq(p, s, len))
++ return p;
++ return NULL;
++}
++
++int fdt_move(const void *fdt, void *buf, int bufsize)
++{
++ int err = fdt_check_header(fdt);
++
++ if (err)
++ return err;
++
++ if (fdt_totalsize(fdt) > bufsize)
++ return -FDT_ERR_NOSPACE;
++
++ memmove(buf, fdt, fdt_totalsize(fdt));
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt.h powerpc.git/arch/powerpc/boot/libfdt/fdt.h
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,60 @@
++#ifndef _FDT_H
++#define _FDT_H
++
++#ifndef __ASSEMBLY__
++
++struct fdt_header {
++ uint32_t magic; /* magic word FDT_MAGIC */
++ uint32_t totalsize; /* total size of DT block */
++ uint32_t off_dt_struct; /* offset to structure */
++ uint32_t off_dt_strings; /* offset to strings */
++ uint32_t off_mem_rsvmap; /* offset to memory reserve map */
++ uint32_t version; /* format version */
++ uint32_t last_comp_version; /* last compatible version */
++
++ /* version 2 fields below */
++ uint32_t boot_cpuid_phys; /* Which physical CPU id we're
++ booting on */
++ /* version 3 fields below */
++ uint32_t size_dt_strings; /* size of the strings block */
++
++ /* version 17 fields below */
++ uint32_t size_dt_struct; /* size of the structure block */
++};
++
++struct fdt_reserve_entry {
++ uint64_t address;
++ uint64_t size;
++};
++
++struct fdt_node_header {
++ uint32_t tag;
++ char name[0];
++};
++
++struct fdt_property {
++ uint32_t tag;
++ uint32_t len;
++ uint32_t nameoff;
++ char data[0];
++};
++
++#endif /* !__ASSEMBLY */
++
++#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
++#define FDT_TAGSIZE sizeof(uint32_t)
++
++#define FDT_BEGIN_NODE 0x1 /* Start node: full name */
++#define FDT_END_NODE 0x2 /* End node */
++#define FDT_PROP 0x3 /* Property: name off,
++ size, content */
++#define FDT_NOP 0x4 /* nop */
++#define FDT_END 0x9
++
++#define FDT_V1_SIZE (7*sizeof(uint32_t))
++#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
++#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
++#define FDT_V16_SIZE FDT_V3_SIZE
++#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
++
++#endif /* _FDT_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt_ro.c powerpc.git/arch/powerpc/boot/libfdt/fdt_ro.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt_ro.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt_ro.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,583 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++#define CHECK_HEADER(fdt) \
++ { \
++ int err; \
++ if ((err = fdt_check_header(fdt)) != 0) \
++ return err; \
++ }
++
++static int nodename_eq(const void *fdt, int offset,
++ const char *s, int len)
++{
++ const char *p = fdt_offset_ptr(fdt, offset, len+1);
++
++ if (! p)
++ /* short match */
++ return 0;
++
++ if (memcmp(p, s, len) != 0)
++ return 0;
++
++ if (p[len] == '\0')
++ return 1;
++ else if (!memchr(s, '@', len) && (p[len] == '@'))
++ return 1;
++ else
++ return 0;
++}
++
++const char *fdt_string(const void *fdt, int stroffset)
++{
++ return (char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
++}
++
++int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
++{
++ CHECK_HEADER(fdt);
++ *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address);
++ *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size);
++ return 0;
++}
++
++int fdt_num_mem_rsv(const void *fdt)
++{
++ int i = 0;
++
++ while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
++ i++;
++ return i;
++}
++
++int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
++ const char *name, int namelen)
++{
++ int level = 0;
++ uint32_t tag;
++ int offset, nextoffset;
++
++ CHECK_HEADER(fdt);
++
++ tag = fdt_next_tag(fdt, parentoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADOFFSET;
++
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++ switch (tag) {
++ case FDT_END:
++ return -FDT_ERR_TRUNCATED;
++
++ case FDT_BEGIN_NODE:
++ level++;
++ if (level != 1)
++ continue;
++ if (nodename_eq(fdt, offset+FDT_TAGSIZE, name, namelen))
++ /* Found it! */
++ return offset;
++ break;
++
++ case FDT_END_NODE:
++ level--;
++ break;
++
++ case FDT_PROP:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ } while (level >= 0);
++
++ return -FDT_ERR_NOTFOUND;
++}
++
++int fdt_subnode_offset(const void *fdt, int parentoffset,
++ const char *name)
++{
++ return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
++}
++
++int fdt_path_offset(const void *fdt, const char *path)
++{
++ const char *end = path + strlen(path);
++ const char *p = path;
++ int offset = 0;
++
++ CHECK_HEADER(fdt);
++
++ if (*path != '/')
++ return -FDT_ERR_BADPATH;
++
++ while (*p) {
++ const char *q;
++
++ while (*p == '/')
++ p++;
++ if (! *p)
++ return offset;
++ q = strchr(p, '/');
++ if (! q)
++ q = end;
++
++ offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
++ if (offset < 0)
++ return offset;
++
++ p = q;
++ }
++
++ return offset;
++}
++
++const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
++{
++ const struct fdt_node_header *nh;
++ int err;
++
++ if ((err = fdt_check_header(fdt)) != 0)
++ goto fail;
++
++ err = -FDT_ERR_BADOFFSET;
++ nh = fdt_offset_ptr(fdt, nodeoffset, sizeof(*nh));
++ if (!nh || (fdt32_to_cpu(nh->tag) != FDT_BEGIN_NODE))
++ goto fail;
++
++ if (len)
++ *len = strlen(nh->name);
++
++ return nh->name;
++
++ fail:
++ if (len)
++ *len = err;
++ return NULL;
++}
++
++const struct fdt_property *fdt_get_property(const void *fdt,
++ int nodeoffset,
++ const char *name, int *lenp)
++{
++ uint32_t tag;
++ const struct fdt_property *prop;
++ int namestroff;
++ int offset, nextoffset;
++ int err;
++
++ if ((err = fdt_check_header(fdt)) != 0)
++ goto fail;
++
++ err = -FDT_ERR_BADOFFSET;
++ if (nodeoffset % FDT_TAGSIZE)
++ goto fail;
++
++ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ goto fail;
++
++ do {
++ offset = nextoffset;
++
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++ switch (tag) {
++ case FDT_END:
++ err = -FDT_ERR_TRUNCATED;
++ goto fail;
++
++ case FDT_BEGIN_NODE:
++ case FDT_END_NODE:
++ case FDT_NOP:
++ break;
++
++ case FDT_PROP:
++ err = -FDT_ERR_BADSTRUCTURE;
++ prop = fdt_offset_ptr(fdt, offset, sizeof(*prop));
++ if (! prop)
++ goto fail;
++ namestroff = fdt32_to_cpu(prop->nameoff);
++ if (streq(fdt_string(fdt, namestroff), name)) {
++ /* Found it! */
++ int len = fdt32_to_cpu(prop->len);
++ prop = fdt_offset_ptr(fdt, offset,
++ sizeof(*prop)+len);
++ if (! prop)
++ goto fail;
++
++ if (lenp)
++ *lenp = len;
++
++ return prop;
++ }
++ break;
++
++ default:
++ err = -FDT_ERR_BADSTRUCTURE;
++ goto fail;
++ }
++ } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE));
++
++ err = -FDT_ERR_NOTFOUND;
++ fail:
++ if (lenp)
++ *lenp = err;
++ return NULL;
++}
++
++const void *fdt_getprop(const void *fdt, int nodeoffset,
++ const char *name, int *lenp)
++{
++ const struct fdt_property *prop;
++
++ prop = fdt_get_property(fdt, nodeoffset, name, lenp);
++ if (! prop)
++ return NULL;
++
++ return prop->data;
++}
++
++uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
++{
++ const uint32_t *php;
++ int len;
++
++ php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
++ if (!php || (len != sizeof(*php)))
++ return 0;
++
++ return fdt32_to_cpu(*php);
++}
++
++int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
++{
++ uint32_t tag;
++ int p = 0, overflow = 0;
++ int offset, nextoffset, namelen;
++ const char *name;
++
++ CHECK_HEADER(fdt);
++
++ tag = fdt_next_tag(fdt, 0, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADSTRUCTURE;
++
++ if (buflen < 2)
++ return -FDT_ERR_NOSPACE;
++ buf[0] = '/';
++ p = 1;
++
++ while (nextoffset <= nodeoffset) {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++ switch (tag) {
++ case FDT_END:
++ return -FDT_ERR_BADOFFSET;
++
++ case FDT_BEGIN_NODE:
++ name = fdt_get_name(fdt, offset, &namelen);
++ if (!name)
++ return namelen;
++ if (overflow || ((p + namelen + 1) > buflen)) {
++ overflow++;
++ break;
++ }
++ memcpy(buf + p, name, namelen);
++ p += namelen;
++ buf[p++] = '/';
++ break;
++
++ case FDT_END_NODE:
++ if (overflow) {
++ overflow--;
++ break;
++ }
++ do {
++ p--;
++ } while (buf[p-1] != '/');
++ break;
++
++ case FDT_PROP:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ }
++
++ if (overflow)
++ return -FDT_ERR_NOSPACE;
++
++ if (p > 1) /* special case so that root path is "/", not "" */
++ p--;
++ buf[p] = '\0';
++ return p;
++}
++
++int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
++ int supernodedepth, int *nodedepth)
++{
++ int level = -1;
++ uint32_t tag;
++ int offset, nextoffset = 0;
++ int supernodeoffset = -FDT_ERR_INTERNAL;
++
++ CHECK_HEADER(fdt);
++
++ if (supernodedepth < 0)
++ return -FDT_ERR_NOTFOUND;
++
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++ switch (tag) {
++ case FDT_END:
++ return -FDT_ERR_BADOFFSET;
++
++ case FDT_BEGIN_NODE:
++ level++;
++ if (level == supernodedepth)
++ supernodeoffset = offset;
++ break;
++
++ case FDT_END_NODE:
++ level--;
++ break;
++
++ case FDT_PROP:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ } while (offset < nodeoffset);
++
++ if (nodedepth)
++ *nodedepth = level;
++
++ if (supernodedepth > level)
++ return -FDT_ERR_NOTFOUND;
++ return supernodeoffset;
++}
++
++int fdt_node_depth(const void *fdt, int nodeoffset)
++{
++ int nodedepth;
++ int err;
++
++ err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth);
++ if (err)
++ return (err < 0) ? err : -FDT_ERR_INTERNAL;
++ return nodedepth;
++}
++
++int fdt_parent_offset(const void *fdt, int nodeoffset)
++{
++ int nodedepth = fdt_node_depth(fdt, nodeoffset);
++
++ if (nodedepth < 0)
++ return nodedepth;
++ return fdt_supernode_atdepth_offset(fdt, nodeoffset,
++ nodedepth - 1, NULL);
++}
++
++int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
++ const char *propname,
++ const void *propval, int proplen)
++{
++ uint32_t tag;
++ int offset, nextoffset;
++ const void *val;
++ int len;
++
++ CHECK_HEADER(fdt);
++
++ if (startoffset >= 0) {
++ tag = fdt_next_tag(fdt, startoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADOFFSET;
++ } else {
++ nextoffset = 0;
++ }
++
++ /* FIXME: The algorithm here is pretty horrible: we scan each
++ * property of a node in fdt_getprop(), then if that didn't
++ * find what we want, we scan over them again making our way
++ * to the next node. Still it's the easiest to implement
++ * approach; performance can come later. */
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++ switch (tag) {
++ case FDT_BEGIN_NODE:
++ val = fdt_getprop(fdt, offset, propname, &len);
++ if (val
++ && (len == proplen)
++ && (memcmp(val, propval, len) == 0))
++ return offset;
++ break;
++
++ case FDT_PROP:
++ case FDT_END:
++ case FDT_END_NODE:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ } while (tag != FDT_END);
++
++ return -FDT_ERR_NOTFOUND;
++}
++
++int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
++{
++ if ((phandle == 0) || (phandle == -1))
++ return -FDT_ERR_BADPHANDLE;
++ phandle = cpu_to_fdt32(phandle);
++ return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
++ &phandle, sizeof(phandle));
++}
++
++int _stringlist_contains(const void *strlist, int listlen, const char *str)
++{
++ int len = strlen(str);
++ const void *p;
++
++ while (listlen >= len) {
++ if (memcmp(str, strlist, len+1) == 0)
++ return 1;
++ p = memchr(strlist, '\0', listlen);
++ if (!p)
++ return 0; /* malformed strlist.. */
++ listlen -= (p-strlist) + 1;
++ strlist = p + 1;
++ }
++ return 0;
++}
++
++int fdt_node_check_compatible(const void *fdt, int nodeoffset,
++ const char *compatible)
++{
++ const void *prop;
++ int len;
++
++ prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
++ if (!prop)
++ return len;
++ if (_stringlist_contains(prop, len, compatible))
++ return 0;
++ else
++ return 1;
++}
++
++int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
++ const char *compatible)
++{
++ uint32_t tag;
++ int offset, nextoffset;
++ int err;
++
++ CHECK_HEADER(fdt);
++
++ if (startoffset >= 0) {
++ tag = fdt_next_tag(fdt, startoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADOFFSET;
++ } else {
++ nextoffset = 0;
++ }
++
++ /* FIXME: The algorithm here is pretty horrible: we scan each
++ * property of a node in fdt_node_check_compatible(), then if
++ * that didn't find what we want, we scan over them again
++ * making our way to the next node. Still it's the easiest to
++ * implement approach; performance can come later. */
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++ switch (tag) {
++ case FDT_BEGIN_NODE:
++ err = fdt_node_check_compatible(fdt, offset,
++ compatible);
++ if ((err < 0)
++ && (err != -FDT_ERR_NOTFOUND))
++ return err;
++ else if (err == 0)
++ return offset;
++ break;
++
++ case FDT_PROP:
++ case FDT_END:
++ case FDT_END_NODE:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ } while (tag != FDT_END);
++
++ return -FDT_ERR_NOTFOUND;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt_rw.c powerpc.git/arch/powerpc/boot/libfdt/fdt_rw.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt_rw.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt_rw.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,447 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++static int _blocks_misordered(const void *fdt,
++ int mem_rsv_size, int struct_size)
++{
++ return (fdt_off_mem_rsvmap(fdt) < ALIGN(sizeof(struct fdt_header), 8))
++ || (fdt_off_dt_struct(fdt) <
++ (fdt_off_mem_rsvmap(fdt) + mem_rsv_size))
++ || (fdt_off_dt_strings(fdt) <
++ (fdt_off_dt_struct(fdt) + struct_size))
++ || (fdt_totalsize(fdt) <
++ (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
++}
++
++static int rw_check_header(void *fdt)
++{
++ int err;
++
++ if ((err = fdt_check_header(fdt)))
++ return err;
++ if (fdt_version(fdt) < 17)
++ return -FDT_ERR_BADVERSION;
++ if (_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
++ fdt_size_dt_struct(fdt)))
++ return -FDT_ERR_BADLAYOUT;
++ if (fdt_version(fdt) > 17)
++ fdt_set_version(fdt, 17);
++
++ return 0;
++}
++
++#define RW_CHECK_HEADER(fdt) \
++ { \
++ int err; \
++ if ((err = rw_check_header(fdt)) != 0) \
++ return err; \
++ }
++
++static inline int _blob_data_size(void *fdt)
++{
++ return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
++}
++
++static int _blob_splice(void *fdt, void *p, int oldlen, int newlen)
++{
++ void *end = fdt + _blob_data_size(fdt);
++
++ if (((p + oldlen) < p) || ((p + oldlen) > end))
++ return -FDT_ERR_BADOFFSET;
++ if ((end - oldlen + newlen) > (fdt + fdt_totalsize(fdt)))
++ return -FDT_ERR_NOSPACE;
++ memmove(p + newlen, p + oldlen, end - p - oldlen);
++ return 0;
++}
++
++static int _blob_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
++ int oldn, int newn)
++{
++ int delta = (newn - oldn) * sizeof(*p);
++ int err;
++ err = _blob_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
++ if (err)
++ return err;
++ fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
++ fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
++ return 0;
++}
++
++static int _blob_splice_struct(void *fdt, void *p,
++ int oldlen, int newlen)
++{
++ int delta = newlen - oldlen;
++ int err;
++
++ if ((err = _blob_splice(fdt, p, oldlen, newlen)))
++ return err;
++
++ fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
++ fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
++ return 0;
++}
++
++static int _blob_splice_string(void *fdt, int newlen)
++{
++ void *p = fdt + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
++ int err;
++
++ if ((err = _blob_splice(fdt, p, 0, newlen)))
++ return err;
++
++ fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
++ return 0;
++}
++
++static int _find_add_string(void *fdt, const char *s)
++{
++ char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
++ const char *p;
++ char *new;
++ int len = strlen(s) + 1;
++ int err;
++
++ p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
++ if (p)
++ /* found it */
++ return (p - strtab);
++
++ new = strtab + fdt_size_dt_strings(fdt);
++ err = _blob_splice_string(fdt, len);
++ if (err)
++ return err;
++
++ memcpy(new, s, len);
++ return (new - strtab);
++}
++
++int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
++{
++ struct fdt_reserve_entry *re;
++ int err;
++
++ if ((err = rw_check_header(fdt)))
++ return err;
++
++ re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
++ err = _blob_splice_mem_rsv(fdt, re, 0, 1);
++ if (err)
++ return err;
++
++ re->address = cpu_to_fdt64(address);
++ re->size = cpu_to_fdt64(size);
++ return 0;
++}
++
++int fdt_del_mem_rsv(void *fdt, int n)
++{
++ struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
++ int err;
++
++ if ((err = rw_check_header(fdt)))
++ return err;
++ if (n >= fdt_num_mem_rsv(fdt))
++ return -FDT_ERR_NOTFOUND;
++
++ err = _blob_splice_mem_rsv(fdt, re, 1, 0);
++ if (err)
++ return err;
++ return 0;
++}
++
++static int _resize_property(void *fdt, int nodeoffset, const char *name, int len,
++ struct fdt_property **prop)
++{
++ int oldlen;
++ int err;
++
++ *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
++ if (! (*prop))
++ return oldlen;
++
++ if ((err = _blob_splice_struct(fdt, (*prop)->data,
++ ALIGN(oldlen, FDT_TAGSIZE),
++ ALIGN(len, FDT_TAGSIZE))))
++ return err;
++
++ (*prop)->len = cpu_to_fdt32(len);
++ return 0;
++}
++
++static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
++ struct fdt_property **prop)
++{
++ uint32_t tag;
++ int proplen;
++ int nextoffset;
++ int namestroff;
++ int err;
++
++ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADOFFSET;
++
++ namestroff = _find_add_string(fdt, name);
++ if (namestroff < 0)
++ return namestroff;
++
++ *prop = _fdt_offset_ptr_w(fdt, nextoffset);
++ proplen = sizeof(**prop) + ALIGN(len, FDT_TAGSIZE);
++
++ err = _blob_splice_struct(fdt, *prop, 0, proplen);
++ if (err)
++ return err;
++
++ (*prop)->tag = cpu_to_fdt32(FDT_PROP);
++ (*prop)->nameoff = cpu_to_fdt32(namestroff);
++ (*prop)->len = cpu_to_fdt32(len);
++ return 0;
++}
++
++int fdt_setprop(void *fdt, int nodeoffset, const char *name,
++ const void *val, int len)
++{
++ struct fdt_property *prop;
++ int err;
++
++ if ((err = rw_check_header(fdt)))
++ return err;
++
++ err = _resize_property(fdt, nodeoffset, name, len, &prop);
++ if (err == -FDT_ERR_NOTFOUND)
++ err = _add_property(fdt, nodeoffset, name, len, &prop);
++ if (err)
++ return err;
++
++ memcpy(prop->data, val, len);
++ return 0;
++}
++
++int fdt_delprop(void *fdt, int nodeoffset, const char *name)
++{
++ struct fdt_property *prop;
++ int len, proplen;
++
++ RW_CHECK_HEADER(fdt);
++
++ prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
++ if (! prop)
++ return len;
++
++ proplen = sizeof(*prop) + ALIGN(len, FDT_TAGSIZE);
++ return _blob_splice_struct(fdt, prop, proplen, 0);
++}
++
++int fdt_add_subnode_namelen(void *fdt, int parentoffset,
++ const char *name, int namelen)
++{
++ struct fdt_node_header *nh;
++ int offset, nextoffset;
++ int nodelen;
++ int err;
++ uint32_t tag;
++ uint32_t *endtag;
++
++ RW_CHECK_HEADER(fdt);
++
++ offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
++ if (offset >= 0)
++ return -FDT_ERR_EXISTS;
++ else if (offset != -FDT_ERR_NOTFOUND)
++ return offset;
++
++ /* Try to place the new node after the parent's properties */
++ fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++ } while (tag == FDT_PROP);
++
++ nh = _fdt_offset_ptr_w(fdt, offset);
++ nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
++
++ err = _blob_splice_struct(fdt, nh, 0, nodelen);
++ if (err)
++ return err;
++
++ nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
++ memset(nh->name, 0, ALIGN(namelen+1, FDT_TAGSIZE));
++ memcpy(nh->name, name, namelen);
++ endtag = (uint32_t *)((void *)nh + nodelen - FDT_TAGSIZE);
++ *endtag = cpu_to_fdt32(FDT_END_NODE);
++
++ return offset;
++}
++
++int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
++{
++ return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
++}
++
++int fdt_del_node(void *fdt, int nodeoffset)
++{
++ int endoffset;
++
++ RW_CHECK_HEADER(fdt);
++
++ endoffset = _fdt_node_end_offset(fdt, nodeoffset);
++ if (endoffset < 0)
++ return endoffset;
++
++ return _blob_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
++ endoffset - nodeoffset, 0);
++}
++
++static void _packblocks(const void *fdt, void *buf,
++ int mem_rsv_size, int struct_size)
++{
++ int mem_rsv_off, struct_off, strings_off;
++
++ mem_rsv_off = ALIGN(sizeof(struct fdt_header), 8);
++ struct_off = mem_rsv_off + mem_rsv_size;
++ strings_off = struct_off + struct_size;
++
++ memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size);
++ fdt_set_off_mem_rsvmap(buf, mem_rsv_off);
++
++ memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
++ fdt_set_off_dt_struct(buf, struct_off);
++ fdt_set_size_dt_struct(buf, struct_size);
++
++ memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
++ fdt_size_dt_strings(fdt));
++ fdt_set_off_dt_strings(buf, strings_off);
++ fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt));
++}
++
++int fdt_open_into(const void *fdt, void *buf, int bufsize)
++{
++ int err;
++ int mem_rsv_size, struct_size;
++ int newsize;
++ void *tmp;
++
++ err = fdt_check_header(fdt);
++ if (err)
++ return err;
++
++ mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
++ * sizeof(struct fdt_reserve_entry);
++
++ if (fdt_version(fdt) >= 17) {
++ struct_size = fdt_size_dt_struct(fdt);
++ } else {
++ struct_size = 0;
++ while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
++ ;
++ }
++
++ if (!_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
++ /* no further work necessary */
++ err = fdt_move(fdt, buf, bufsize);
++ if (err)
++ return err;
++ fdt_set_version(buf, 17);
++ fdt_set_size_dt_struct(buf, struct_size);
++ fdt_set_totalsize(buf, bufsize);
++ return 0;
++ }
++
++ /* Need to reorder */
++ newsize = ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
++ + struct_size + fdt_size_dt_strings(fdt);
++
++ if (bufsize < newsize)
++ return -FDT_ERR_NOSPACE;
++
++ if (((buf + newsize) <= fdt)
++ || (buf >= (fdt + fdt_totalsize(fdt)))) {
++ tmp = buf;
++ } else {
++ tmp = (void *)fdt + fdt_totalsize(fdt);
++ if ((tmp + newsize) > (buf + bufsize))
++ return -FDT_ERR_NOSPACE;
++ }
++
++ _packblocks(fdt, tmp, mem_rsv_size, struct_size);
++ memmove(buf, tmp, newsize);
++
++ fdt_set_magic(buf, FDT_MAGIC);
++ fdt_set_totalsize(buf, bufsize);
++ fdt_set_version(buf, 17);
++ fdt_set_last_comp_version(buf, 16);
++ fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
++
++ return 0;
++}
++
++int fdt_pack(void *fdt)
++{
++ int mem_rsv_size;
++ int err;
++
++ err = rw_check_header(fdt);
++ if (err)
++ return err;
++
++ mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
++ * sizeof(struct fdt_reserve_entry);
++ _packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
++ fdt_set_totalsize(fdt, _blob_data_size(fdt));
++
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt_strerror.c powerpc.git/arch/powerpc/boot/libfdt/fdt_strerror.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt_strerror.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt_strerror.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,96 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++struct errtabent {
++ const char *str;
++};
++
++#define ERRTABENT(val) \
++ [(val)] = { .str = #val, }
++
++static struct errtabent errtable[] = {
++ ERRTABENT(FDT_ERR_NOTFOUND),
++ ERRTABENT(FDT_ERR_EXISTS),
++ ERRTABENT(FDT_ERR_NOSPACE),
++
++ ERRTABENT(FDT_ERR_BADOFFSET),
++ ERRTABENT(FDT_ERR_BADPATH),
++ ERRTABENT(FDT_ERR_BADSTATE),
++
++ ERRTABENT(FDT_ERR_TRUNCATED),
++ ERRTABENT(FDT_ERR_BADMAGIC),
++ ERRTABENT(FDT_ERR_BADVERSION),
++ ERRTABENT(FDT_ERR_BADSTRUCTURE),
++ ERRTABENT(FDT_ERR_BADLAYOUT),
++};
++#define ERRTABSIZE (sizeof(errtable) / sizeof(errtable[0]))
++
++const char *fdt_strerror(int errval)
++{
++ if (errval > 0)
++ return "<valid offset/length>";
++ else if (errval == 0)
++ return "<no error>";
++ else if (errval > -ERRTABSIZE) {
++ const char *s = errtable[-errval].str;
++
++ if (s)
++ return s;
++ }
++
++ return "<unknown error>";
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt_sw.c powerpc.git/arch/powerpc/boot/libfdt/fdt_sw.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt_sw.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt_sw.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,258 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++static int check_header_sw(void *fdt)
++{
++ if (fdt_magic(fdt) != SW_MAGIC)
++ return -FDT_ERR_BADMAGIC;
++ return 0;
++}
++
++static void *grab_space(void *fdt, int len)
++{
++ int offset = fdt_size_dt_struct(fdt);
++ int spaceleft;
++
++ spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
++ - fdt_size_dt_strings(fdt);
++
++ if ((offset + len < offset) || (offset + len > spaceleft))
++ return NULL;
++
++ fdt_set_size_dt_struct(fdt, offset + len);
++ return fdt_offset_ptr_w(fdt, offset, len);
++}
++
++int fdt_create(void *buf, int bufsize)
++{
++ void *fdt = buf;
++
++ if (bufsize < sizeof(struct fdt_header))
++ return -FDT_ERR_NOSPACE;
++
++ memset(buf, 0, bufsize);
++
++ fdt_set_magic(fdt, SW_MAGIC);
++ fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
++ fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
++ fdt_set_totalsize(fdt, bufsize);
++
++ fdt_set_off_mem_rsvmap(fdt, ALIGN(sizeof(struct fdt_header),
++ sizeof(struct fdt_reserve_entry)));
++ fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
++ fdt_set_off_dt_strings(fdt, bufsize);
++
++ return 0;
++}
++
++int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
++{
++ struct fdt_reserve_entry *re;
++ int err = check_header_sw(fdt);
++ int offset;
++
++ if (err)
++ return err;
++ if (fdt_size_dt_struct(fdt))
++ return -FDT_ERR_BADSTATE;
++
++ offset = fdt_off_dt_struct(fdt);
++ if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
++ return -FDT_ERR_NOSPACE;
++
++ re = (struct fdt_reserve_entry *)(fdt + offset);
++ re->address = cpu_to_fdt64(addr);
++ re->size = cpu_to_fdt64(size);
++
++ fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
++
++ return 0;
++}
++
++int fdt_finish_reservemap(void *fdt)
++{
++ return fdt_add_reservemap_entry(fdt, 0, 0);
++}
++
++int fdt_begin_node(void *fdt, const char *name)
++{
++ struct fdt_node_header *nh;
++ int err = check_header_sw(fdt);
++ int namelen = strlen(name) + 1;
++
++ if (err)
++ return err;
++
++ nh = grab_space(fdt, sizeof(*nh) + ALIGN(namelen, FDT_TAGSIZE));
++ if (! nh)
++ return -FDT_ERR_NOSPACE;
++
++ nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
++ memcpy(nh->name, name, namelen);
++ return 0;
++}
++
++int fdt_end_node(void *fdt)
++{
++ uint32_t *en;
++ int err = check_header_sw(fdt);
++
++ if (err)
++ return err;
++
++ en = grab_space(fdt, FDT_TAGSIZE);
++ if (! en)
++ return -FDT_ERR_NOSPACE;
++
++ *en = cpu_to_fdt32(FDT_END_NODE);
++ return 0;
++}
++
++static int find_add_string(void *fdt, const char *s)
++{
++ char *strtab = (char *)fdt + fdt_totalsize(fdt);
++ const char *p;
++ int strtabsize = fdt_size_dt_strings(fdt);
++ int len = strlen(s) + 1;
++ int struct_top, offset;
++
++ p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
++ if (p)
++ return p - strtab;
++
++ /* Add it */
++ offset = -strtabsize - len;
++ struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
++ if (fdt_totalsize(fdt) + offset < struct_top)
++ return 0; /* no more room :( */
++
++ memcpy(strtab + offset, s, len);
++ fdt_set_size_dt_strings(fdt, strtabsize + len);
++ return offset;
++}
++
++int fdt_property(void *fdt, const char *name, const void *val, int len)
++{
++ struct fdt_property *prop;
++ int err = check_header_sw(fdt);
++ int nameoff;
++
++ if (err)
++ return err;
++
++ nameoff = find_add_string(fdt, name);
++ if (nameoff == 0)
++ return -FDT_ERR_NOSPACE;
++
++ prop = grab_space(fdt, sizeof(*prop) + ALIGN(len, FDT_TAGSIZE));
++ if (! prop)
++ return -FDT_ERR_NOSPACE;
++
++ prop->tag = cpu_to_fdt32(FDT_PROP);
++ prop->nameoff = cpu_to_fdt32(nameoff);
++ prop->len = cpu_to_fdt32(len);
++ memcpy(prop->data, val, len);
++ return 0;
++}
++
++int fdt_finish(void *fdt)
++{
++ int err = check_header_sw(fdt);
++ char *p = (char *)fdt;
++ uint32_t *end;
++ int oldstroffset, newstroffset;
++ uint32_t tag;
++ int offset, nextoffset;
++
++ if (err)
++ return err;
++
++ /* Add terminator */
++ end = grab_space(fdt, sizeof(*end));
++ if (! end)
++ return -FDT_ERR_NOSPACE;
++ *end = cpu_to_fdt32(FDT_END);
++
++ /* Relocate the string table */
++ oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
++ newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
++ memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
++ fdt_set_off_dt_strings(fdt, newstroffset);
++
++ /* Walk the structure, correcting string offsets */
++ offset = 0;
++ while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
++ if (tag == FDT_PROP) {
++ struct fdt_property *prop =
++ fdt_offset_ptr_w(fdt, offset, sizeof(*prop));
++ int nameoff;
++
++ if (! prop)
++ return -FDT_ERR_BADSTRUCTURE;
++
++ nameoff = fdt32_to_cpu(prop->nameoff);
++ nameoff += fdt_size_dt_strings(fdt);
++ prop->nameoff = cpu_to_fdt32(nameoff);
++ }
++ offset = nextoffset;
++ }
++
++ /* Finally, adjust the header */
++ fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
++ fdt_set_magic(fdt, FDT_MAGIC);
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/fdt_wip.c powerpc.git/arch/powerpc/boot/libfdt/fdt_wip.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt/fdt_wip.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/fdt_wip.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,144 @@
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include "libfdt_env.h"
++
++#include <fdt.h>
++#include <libfdt.h>
++
++#include "libfdt_internal.h"
++
++int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
++ const void *val, int len)
++{
++ void *propval;
++ int proplen;
++
++ propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
++ if (! propval)
++ return proplen;
++
++ if (proplen != len)
++ return -FDT_ERR_NOSPACE;
++
++ memcpy(propval, val, len);
++ return 0;
++}
++
++static void nop_region(void *start, int len)
++{
++ uint32_t *p;
++
++ for (p = start; (void *)p < (start + len); p++)
++ *p = cpu_to_fdt32(FDT_NOP);
++}
++
++int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
++{
++ struct fdt_property *prop;
++ int len;
++
++ prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
++ if (! prop)
++ return len;
++
++ nop_region(prop, len + sizeof(*prop));
++
++ return 0;
++}
++
++int _fdt_node_end_offset(void *fdt, int nodeoffset)
++{
++ int level = 0;
++ uint32_t tag;
++ int offset, nextoffset;
++
++ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
++ if (tag != FDT_BEGIN_NODE)
++ return -FDT_ERR_BADOFFSET;
++ do {
++ offset = nextoffset;
++ tag = fdt_next_tag(fdt, offset, &nextoffset);
++
++ switch (tag) {
++ case FDT_END:
++ return offset;
++
++ case FDT_BEGIN_NODE:
++ level++;
++ break;
++
++ case FDT_END_NODE:
++ level--;
++ break;
++
++ case FDT_PROP:
++ case FDT_NOP:
++ break;
++
++ default:
++ return -FDT_ERR_BADSTRUCTURE;
++ }
++ } while (level >= 0);
++
++ return nextoffset;
++}
++
++int fdt_nop_node(void *fdt, int nodeoffset)
++{
++ int endoffset;
++
++ endoffset = _fdt_node_end_offset(fdt, nodeoffset);
++ if (endoffset < 0)
++ return endoffset;
++
++ nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), endoffset - nodeoffset);
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/libfdt.h powerpc.git/arch/powerpc/boot/libfdt/libfdt.h
+--- linux-2.6.24/arch/powerpc/boot/libfdt/libfdt.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/libfdt.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,721 @@
++#ifndef _LIBFDT_H
++#define _LIBFDT_H
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <libfdt_env.h>
++#include <fdt.h>
++
++#define FDT_FIRST_SUPPORTED_VERSION 0x10
++#define FDT_LAST_SUPPORTED_VERSION 0x11
++
++/* Error codes: informative error codes */
++#define FDT_ERR_NOTFOUND 1
++ /* FDT_ERR_NOTFOUND: The requested node or property does not exist */
++#define FDT_ERR_EXISTS 2
++ /* FDT_ERR_EXISTS: Attemped to create a node or property which
++ * already exists */
++#define FDT_ERR_NOSPACE 3
++ /* FDT_ERR_NOSPACE: Operation needed to expand the device
++ * tree, but its buffer did not have sufficient space to
++ * contain the expanded tree. Use fdt_open_into() to move the
++ * device tree to a buffer with more space. */
++
++/* Error codes: codes for bad parameters */
++#define FDT_ERR_BADOFFSET 4
++ /* FDT_ERR_BADOFFSET: Function was passed a structure block
++ * offset which is out-of-bounds, or which points to an
++ * unsuitable part of the structure for the operation. */
++#define FDT_ERR_BADPATH 5
++ /* FDT_ERR_BADPATH: Function was passed a badly formatted path
++ * (e.g. missing a leading / for a function which requires an
++ * absolute path) */
++#define FDT_ERR_BADPHANDLE 6
++ /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
++ * value. phandle values of 0 and -1 are not permitted. */
++#define FDT_ERR_BADSTATE 7
++ /* FDT_ERR_BADSTATE: Function was passed an incomplete device
++ * tree created by the sequential-write functions, which is
++ * not sufficiently complete for the requested operation. */
++
++/* Error codes: codes for bad device tree blobs */
++#define FDT_ERR_TRUNCATED 8
++ /* FDT_ERR_TRUNCATED: Structure block of the given device tree
++ * ends without an FDT_END tag. */
++#define FDT_ERR_BADMAGIC 9
++ /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
++ * device tree at all - it is missing the flattened device
++ * tree magic number. */
++#define FDT_ERR_BADVERSION 10
++ /* FDT_ERR_BADVERSION: Given device tree has a version which
++ * can't be handled by the requested operation. For
++ * read-write functions, this may mean that fdt_open_into() is
++ * required to convert the tree to the expected version. */
++#define FDT_ERR_BADSTRUCTURE 11
++ /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
++ * structure block or other serious error (e.g. misnested
++ * nodes, or subnodes preceding properties). */
++#define FDT_ERR_BADLAYOUT 12
++ /* FDT_ERR_BADLAYOUT: For read-write functions, the given
++ * device tree has it's sub-blocks in an order that the
++ * function can't handle (memory reserve map, then structure,
++ * then strings). Use fdt_open_into() to reorganize the tree
++ * into a form suitable for the read-write operations. */
++
++/* "Can't happen" error indicating a bug in libfdt */
++#define FDT_ERR_INTERNAL 13
++ /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
++ * Should never be returned, if it is, it indicates a bug in
++ * libfdt itself. */
++
++#define FDT_ERR_MAX 13
++
++/**********************************************************************/
++/* Low-level functions (you probably don't need these) */
++/**********************************************************************/
++
++const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
++static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
++{
++ return (void *)fdt_offset_ptr(fdt, offset, checklen);
++}
++
++uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
++
++/**********************************************************************/
++/* General functions */
++/**********************************************************************/
++
++#define fdt_get_header(fdt, field) \
++ (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
++#define fdt_magic(fdt) (fdt_get_header(fdt, magic))
++#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize))
++#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct))
++#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings))
++#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap))
++#define fdt_version(fdt) (fdt_get_header(fdt, version))
++#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version))
++#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys))
++#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings))
++#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct))
++
++#define __fdt_set_hdr(name) \
++ static inline void fdt_set_##name(void *fdt, uint32_t val) \
++ { \
++ struct fdt_header *fdth = fdt; \
++ fdth->name = cpu_to_fdt32(val); \
++ }
++__fdt_set_hdr(magic);
++__fdt_set_hdr(totalsize);
++__fdt_set_hdr(off_dt_struct);
++__fdt_set_hdr(off_dt_strings);
++__fdt_set_hdr(off_mem_rsvmap);
++__fdt_set_hdr(version);
++__fdt_set_hdr(last_comp_version);
++__fdt_set_hdr(boot_cpuid_phys);
++__fdt_set_hdr(size_dt_strings);
++__fdt_set_hdr(size_dt_struct);
++#undef __fdt_set_hdr
++
++/**
++ * fdt_check_header - sanity check a device tree or possible device tree
++ * @fdt: pointer to data which might be a flattened device tree
++ *
++ * fdt_check_header() checks that the given buffer contains what
++ * appears to be a flattened device tree with sane information in its
++ * header.
++ *
++ * returns:
++ * 0, if the buffer appears to contain a valid device tree
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE, standard meanings, as above
++ */
++int fdt_check_header(const void *fdt);
++
++/**
++ * fdt_move - move a device tree around in memory
++ * @fdt: pointer to the device tree to move
++ * @buf: pointer to memory where the device is to be moved
++ * @bufsize: size of the memory space at buf
++ *
++ * fdt_move() relocates, if possible, the device tree blob located at
++ * fdt to the buffer at buf of size bufsize. The buffer may overlap
++ * with the existing device tree blob at fdt. Therefore,
++ * fdt_move(fdt, fdt, fdt_totalsize(fdt))
++ * should always succeed.
++ *
++ * returns:
++ * 0, on success
++ * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE, standard meanings
++ */
++int fdt_move(const void *fdt, void *buf, int bufsize);
++
++/**********************************************************************/
++/* Read-only functions */
++/**********************************************************************/
++
++/**
++ * fdt_string - retreive a string from the strings block of a device tree
++ * @fdt: pointer to the device tree blob
++ * @stroffset: offset of the string within the strings block (native endian)
++ *
++ * fdt_string() retrieves a pointer to a single string from the
++ * strings block of the device tree blob at fdt.
++ *
++ * returns:
++ * a pointer to the string, on success
++ * NULL, if stroffset is out of bounds
++ */
++const char *fdt_string(const void *fdt, int stroffset);
++
++/**
++ * fdt_num_mem_rsv - retreive the number of memory reserve map entries
++ * @fdt: pointer to the device tree blob
++ *
++ * Returns the number of entries in the device tree blob's memory
++ * reservation map. This does not include the terminating 0,0 entry
++ * or any other (0,0) entries reserved for expansion.
++ *
++ * returns:
++ * the number of entries
++ */
++int fdt_num_mem_rsv(const void *fdt);
++
++/**
++ * fdt_get_mem_rsv - retreive one memory reserve map entry
++ * @fdt: pointer to the device tree blob
++ * @address, @size: pointers to 64-bit variables
++ *
++ * On success, *address and *size will contain the address and size of
++ * the n-th reserve map entry from the device tree blob, in
++ * native-endian format.
++ *
++ * returns:
++ * 0, on success
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE, standard meanings
++ */
++int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
++
++/**
++ * fdt_subnode_offset_namelen - find a subnode based on substring
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ * @namelen: number of characters of name to consider
++ *
++ * Identical to fdt_subnode_offset(), but only examine the first
++ * namelen characters of name for matching the subnode name. This is
++ * useful for finding subnodes based on a portion of a larger string,
++ * such as a full path.
++ */
++int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
++ const char *name, int namelen);
++/**
++ * fdt_subnode_offset - find a subnode of a given node
++ * @fdt: pointer to the device tree blob
++ * @parentoffset: structure block offset of a node
++ * @name: name of the subnode to locate
++ *
++ * fdt_subnode_offset() finds a subnode of the node at structure block
++ * offset parentoffset with the given name. name may include a unit
++ * address, in which case fdt_subnode_offset() will find the subnode
++ * with that unit address, or the unit address may be omitted, in
++ * which case fdt_subnode_offset() will find an arbitrary subnode
++ * whose name excluding unit address matches the given name.
++ *
++ * returns:
++ * structure block offset of the requested subnode (>=0), on success
++ * -FDT_ERR_NOTFOUND, if the requested subnode does not exist
++ * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE,
++ * -FDT_ERR_TRUNCATED, standard meanings.
++ */
++int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
++
++/**
++ * fdt_path_offset - find a tree node by its full path
++ * @fdt: pointer to the device tree blob
++ * @path: full path of the node to locate
++ *
++ * fdt_path_offset() finds a node of a given path in the device tree.
++ * Each path component may omit the unit address portion, but the
++ * results of this are undefined if any such path component is
++ * ambiguous (that is if there are multiple nodes at the relevant
++ * level matching the given component, differentiated only by unit
++ * address).
++ *
++ * returns:
++ * structure block offset of the node with the requested path (>=0), on success
++ * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
++ * -FDT_ERR_NOTFOUND, if the requested node does not exist
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE,
++ * -FDT_ERR_TRUNCATED, standard meanings.
++ */
++int fdt_path_offset(const void *fdt, const char *path);
++
++/**
++ * fdt_get_name - retreive the name of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: structure block offset of the starting node
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_get_name() retrieves the name (including unit address) of the
++ * device tree node at structure block offset nodeoffset. If lenp is
++ * non-NULL, the length of this name is also returned, in the integer
++ * pointed to by lenp.
++ *
++ * returns:
++ * pointer to the node's name, on success
++ * If lenp is non-NULL, *lenp contains the length of that name (>=0)
++ * NULL, on error
++ * if lenp is non-NULL *lenp contains an error code (<0):
++ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE, standard meanings
++ */
++const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
++
++/**
++ * fdt_get_property - find a given property in a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to find
++ * @name: name of the property to find
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_get_property() retrieves a pointer to the fdt_property
++ * structure within the device tree blob corresponding to the property
++ * named 'name' of the node at offset nodeoffset. If lenp is
++ * non-NULL, the length of the property value also returned, in the
++ * integer pointed to by lenp.
++ *
++ * returns:
++ * pointer to the structure representing the property
++ * if lenp is non-NULL, *lenp contains the length of the property
++ * value (>=0)
++ * NULL, on error
++ * if lenp is non-NULL, *lenp contains an error code (<0):
++ * -FDT_ERR_NOTFOUND, node does not have named property
++ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE,
++ * -FDT_ERR_TRUNCATED, standard meanings
++ */
++const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
++ const char *name, int *lenp);
++static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
++ const char *name,
++ int *lenp)
++{
++ return (struct fdt_property *)fdt_get_property(fdt, nodeoffset,
++ name, lenp);
++}
++
++/**
++ * fdt_getprop - retrieve the value of a given property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose property to find
++ * @name: name of the property to find
++ * @lenp: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_getprop() retrieves a pointer to the value of the property
++ * named 'name' of the node at offset nodeoffset (this will be a
++ * pointer to within the device blob itself, not a copy of the value).
++ * If lenp is non-NULL, the length of the property value also
++ * returned, in the integer pointed to by lenp.
++ *
++ * returns:
++ * pointer to the property's value
++ * if lenp is non-NULL, *lenp contains the length of the property
++ * value (>=0)
++ * NULL, on error
++ * if lenp is non-NULL, *lenp contains an error code (<0):
++ * -FDT_ERR_NOTFOUND, node does not have named property
++ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE,
++ * -FDT_ERR_TRUNCATED, standard meanings
++ */
++const void *fdt_getprop(const void *fdt, int nodeoffset,
++ const char *name, int *lenp);
++static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
++ const char *name, int *lenp)
++{
++ return (void *)fdt_getprop(fdt, nodeoffset, name, lenp);
++}
++
++/**
++ * fdt_get_phandle - retreive the phandle of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: structure block offset of the node
++ *
++ * fdt_get_phandle() retrieves the phandle of the device tree node at
++ * structure block offset nodeoffset.
++ *
++ * returns:
++ * the phandle of the node at nodeoffset, on succes (!= 0, != -1)
++ * 0, if the node has no phandle, or another error occurs
++ */
++uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_get_path - determine the full path of a node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose path to find
++ * @buf: character buffer to contain the returned path (will be overwritten)
++ * @buflen: size of the character buffer at buf
++ *
++ * fdt_get_path() computes the full path of the node at offset
++ * nodeoffset, and records that path in the buffer at buf.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++ * 0, on success
++ * buf contains the absolute path of the node at
++ * nodeoffset, as a NUL-terminated string.
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
++ * characters and will not fit in the given buffer.
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
++
++/**
++ * fdt_supernode_atdepth_offset - find a specific ancestor of a node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ * @supernodedepth: depth of the ancestor to find
++ * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
++ *
++ * fdt_supernode_atdepth_offset() finds an ancestor of the given node
++ * at a specific depth from the root (where the root itself has depth
++ * 0, its immediate subnodes depth 1 and so forth). So
++ * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
++ * will always return 0, the offset of the root node. If the node at
++ * nodeoffset has depth D, then:
++ * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
++ * will return nodeoffset itself.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++
++ * structure block offset of the node at node offset's ancestor
++ * of depth supernodedepth (>=0), on success
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++* -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
++ int supernodedepth, int *nodedepth);
++
++/**
++ * fdt_node_depth - find the depth of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ *
++ * fdt_node_depth() finds the depth of a given node. The root node
++ * has depth 0, its immediate subnodes depth 1 and so forth.
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset.
++ *
++ * returns:
++ * depth of the node at nodeoffset (>=0), on success
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_depth(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_parent_offset - find the parent of a given node
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of the node whose parent to find
++ *
++ * fdt_parent_offset() locates the parent node of a given node (that
++ * is, it finds the offset of the node which contains the node at
++ * nodeoffset as a subnode).
++ *
++ * NOTE: This function is expensive, as it must scan the device tree
++ * structure from the start to nodeoffset, *twice*.
++ *
++ * returns:
++ * stucture block offset of the parent of the node at nodeoffset
++ * (>=0), on success
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_parent_offset(const void *fdt, int nodeoffset);
++
++/**
++ * fdt_node_offset_by_prop_value - find nodes with a given property value
++ * @fdt: pointer to the device tree blob
++ * @startoffset: only find nodes after this offset
++ * @propname: property name to check
++ * @propval: property value to search for
++ * @proplen: length of the value in propval
++ *
++ * fdt_node_offset_by_prop_value() returns the offset of the first
++ * node after startoffset, which has a property named propname whose
++ * value is of length proplen and has value equal to propval; or if
++ * startoffset is -1, the very first such node in the tree.
++ *
++ * To iterate through all nodes matching the criterion, the following
++ * idiom can be used:
++ * offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
++ * propval, proplen);
++ * while (offset != -FDT_ERR_NOTFOUND) {
++ * // other code here
++ * offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
++ * propval, proplen);
++ * }
++ *
++ * Note the -1 in the first call to the function, if 0 is used here
++ * instead, the function will never locate the root node, even if it
++ * matches the criterion.
++ *
++ * returns:
++ * structure block offset of the located node (>= 0, >startoffset),
++ * on success
++ * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
++ * tree after startoffset
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
++ const char *propname,
++ const void *propval, int proplen);
++
++/**
++ * fdt_node_offset_by_phandle - find the node with a given phandle
++ * @fdt: pointer to the device tree blob
++ * @phandle: phandle value
++ *
++ * fdt_node_offset_by_prop_value() returns the offset of the node
++ * which has the given phandle value. If there is more than one node
++ * in the tree with the given phandle (an invalid tree), results are
++ * undefined.
++ *
++ * returns:
++ * structure block offset of the located node (>= 0), on success
++ * -FDT_ERR_NOTFOUND, no node with that phandle exists
++ * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
++
++/**
++ * fdt_node_check_compatible: check a node's compatible property
++ * @fdt: pointer to the device tree blob
++ * @nodeoffset: offset of a tree node
++ * @compatible: string to match against
++ *
++ *
++ * fdt_node_check_compatible() returns 0 if the given node contains a
++ * 'compatible' property with the given string as one of its elements,
++ * it returns non-zero otherwise, or on error.
++ *
++ * returns:
++ * 0, if the node has a 'compatible' property listing the given string
++ * 1, if the node has a 'compatible' property, but it does not list
++ * the given string
++ * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
++ * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_check_compatible(const void *fdt, int nodeoffset,
++ const char *compatible);
++
++/**
++ * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
++ * @fdt: pointer to the device tree blob
++ * @startoffset: only find nodes after this offset
++ * @compatible: 'compatible' string to match against
++ *
++ * fdt_node_offset_by_compatible() returns the offset of the first
++ * node after startoffset, which has a 'compatible' property which
++ * lists the given compatible string; or if startoffset is -1, the
++ * very first such node in the tree.
++ *
++ * To iterate through all nodes matching the criterion, the following
++ * idiom can be used:
++ * offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
++ * while (offset != -FDT_ERR_NOTFOUND) {
++ * // other code here
++ * offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
++ * }
++ *
++ * Note the -1 in the first call to the function, if 0 is used here
++ * instead, the function will never locate the root node, even if it
++ * matches the criterion.
++ *
++ * returns:
++ * structure block offset of the located node (>= 0, >startoffset),
++ * on success
++ * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
++ * tree after startoffset
++ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
++ * -FDT_ERR_BADMAGIC,
++ * -FDT_ERR_BADVERSION,
++ * -FDT_ERR_BADSTATE,
++ * -FDT_ERR_BADSTRUCTURE, standard meanings
++ */
++int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
++ const char *compatible);
++
++/**********************************************************************/
++/* Write-in-place functions */
++/**********************************************************************/
++
++int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
++ const void *val, int len);
++static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
++ const char *name, uint32_t val)
++{
++ val = cpu_to_fdt32(val);
++ return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
++}
++
++int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
++int fdt_nop_node(void *fdt, int nodeoffset);
++
++/**********************************************************************/
++/* Sequential write functions */
++/**********************************************************************/
++
++int fdt_create(void *buf, int bufsize);
++int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
++int fdt_finish_reservemap(void *fdt);
++int fdt_begin_node(void *fdt, const char *name);
++int fdt_property(void *fdt, const char *name, const void *val, int len);
++static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
++{
++ val = cpu_to_fdt32(val);
++ return fdt_property(fdt, name, &val, sizeof(val));
++}
++#define fdt_property_string(fdt, name, str) \
++ fdt_property(fdt, name, str, strlen(str)+1)
++int fdt_end_node(void *fdt);
++int fdt_finish(void *fdt);
++
++/**********************************************************************/
++/* Read-write functions */
++/**********************************************************************/
++
++int fdt_open_into(const void *fdt, void *buf, int bufsize);
++int fdt_pack(void *fdt);
++
++int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
++int fdt_del_mem_rsv(void *fdt, int n);
++
++int fdt_setprop(void *fdt, int nodeoffset, const char *name,
++ const void *val, int len);
++static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
++ uint32_t val)
++{
++ val = cpu_to_fdt32(val);
++ return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
++}
++#define fdt_setprop_string(fdt, nodeoffset, name, str) \
++ fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
++int fdt_delprop(void *fdt, int nodeoffset, const char *name);
++int fdt_add_subnode_namelen(void *fdt, int parentoffset,
++ const char *name, int namelen);
++int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
++int fdt_del_node(void *fdt, int nodeoffset);
++
++/**********************************************************************/
++/* Debugging / informational functions */
++/**********************************************************************/
++
++const char *fdt_strerror(int errval);
++
++#endif /* _LIBFDT_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt/libfdt_internal.h powerpc.git/arch/powerpc/boot/libfdt/libfdt_internal.h
+--- linux-2.6.24/arch/powerpc/boot/libfdt/libfdt_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt/libfdt_internal.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,89 @@
++#ifndef _LIBFDT_INTERNAL_H
++#define _LIBFDT_INTERNAL_H
++/*
++ * libfdt - Flat Device Tree manipulation
++ * Copyright (C) 2006 David Gibson, IBM Corporation.
++ *
++ * libfdt is dual licensed: you can use it either under the terms of
++ * the GPL, or the BSD license, at your option.
++ *
++ * a) This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ *
++ * Alternatively,
++ *
++ * b) Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ * 2. Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
++ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
++ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#include <fdt.h>
++
++#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
++#define PALIGN(p, a) ((void *)ALIGN((unsigned long)(p), (a)))
++
++#define memeq(p, q, n) (memcmp((p), (q), (n)) == 0)
++#define streq(p, q) (strcmp((p), (q)) == 0)
++
++uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
++const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
++int _fdt_node_end_offset(void *fdt, int nodeoffset);
++
++static inline const void *_fdt_offset_ptr(const void *fdt, int offset)
++{
++ return fdt + fdt_off_dt_struct(fdt) + offset;
++}
++
++static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
++{
++ return (void *)_fdt_offset_ptr(fdt, offset);
++}
++
++static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n)
++{
++ const struct fdt_reserve_entry *rsv_table =
++ fdt + fdt_off_mem_rsvmap(fdt);
++
++ return rsv_table + n;
++}
++static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
++{
++ return (void *)_fdt_mem_rsv(fdt, n);
++}
++
++#define SW_MAGIC (~FDT_MAGIC)
++
++#endif /* _LIBFDT_INTERNAL_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt-wrapper.c powerpc.git/arch/powerpc/boot/libfdt-wrapper.c
+--- linux-2.6.24/arch/powerpc/boot/libfdt-wrapper.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt-wrapper.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,184 @@
++/*
++ * This file does the necessary interface mapping between the bootwrapper
++ * device tree operations and the interface provided by shared source
++ * files flatdevicetree.[ch].
++ *
++ * Copyright 2007 David Gibson, IBM Corporation.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ */
++
++#include <stddef.h>
++#include <stdio.h>
++#include <page.h>
++#include <libfdt.h>
++#include "ops.h"
++
++#define DEBUG 0
++#define BAD_ERROR(err) (((err) < 0) \
++ && ((err) != -FDT_ERR_NOTFOUND) \
++ && ((err) != -FDT_ERR_EXISTS))
++
++#define check_err(err) \
++ ({ \
++ if (BAD_ERROR(err) || ((err < 0) && DEBUG)) \
++ printf("%s():%d %s\n\r", __FUNCTION__, __LINE__, \
++ fdt_strerror(err)); \
++ if (BAD_ERROR(err)) \
++ exit(); \
++ (err < 0) ? -1 : 0; \
++ })
++
++#define offset_devp(off) \
++ ({ \
++ int _offset = (off); \
++ check_err(_offset) ? NULL : (void *)(_offset+1); \
++ })
++
++#define devp_offset_find(devp) (((int)(devp))-1)
++#define devp_offset(devp) (devp ? ((int)(devp))-1 : 0)
++
++static void *fdt;
++static void *buf; /* = NULL */
++
++#define EXPAND_GRANULARITY 1024
++
++static void expand_buf(int minexpand)
++{
++ int size = fdt_totalsize(fdt);
++ int rc;
++
++ size = _ALIGN(size + minexpand, EXPAND_GRANULARITY);
++ buf = platform_ops.realloc(buf, size);
++ if (!buf)
++ fatal("Couldn't find %d bytes to expand device tree\n\r", size);
++ rc = fdt_open_into(fdt, buf, size);
++ if (rc != 0)
++ fatal("Couldn't expand fdt into new buffer: %s\n\r",
++ fdt_strerror(rc));
++
++ fdt = buf;
++}
++
++static void *fdt_wrapper_finddevice(const char *path)
++{
++ return offset_devp(fdt_path_offset(fdt, path));
++}
++
++static int fdt_wrapper_getprop(const void *devp, const char *name,
++ void *buf, const int buflen)
++{
++ const void *p;
++ int len;
++
++ p = fdt_getprop(fdt, devp_offset(devp), name, &len);
++ if (!p)
++ return check_err(len);
++ memcpy(buf, p, min(len, buflen));
++ return len;
++}
++
++static int fdt_wrapper_setprop(const void *devp, const char *name,
++ const void *buf, const int len)
++{
++ int rc;
++
++ rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
++ if (rc == -FDT_ERR_NOSPACE) {
++ expand_buf(len + 16);
++ rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
++ }
++
++ return check_err(rc);
++}
++
++static void *fdt_wrapper_get_parent(const void *devp)
++{
++ return offset_devp(fdt_parent_offset(fdt, devp_offset(devp)));
++}
++
++static void *fdt_wrapper_create_node(const void *devp, const char *name)
++{
++ int offset;
++
++ offset = fdt_add_subnode(fdt, devp_offset(devp), name);
++ if (offset == -FDT_ERR_NOSPACE) {
++ expand_buf(strlen(name) + 16);
++ offset = fdt_add_subnode(fdt, devp_offset(devp), name);
++ }
++
++ return offset_devp(offset);
++}
++
++static void *fdt_wrapper_find_node_by_prop_value(const void *prev,
++ const char *name,
++ const char *val,
++ int len)
++{
++ int offset = fdt_node_offset_by_prop_value(fdt, devp_offset_find(prev),
++ name, val, len);
++ return offset_devp(offset);
++}
++
++static char *fdt_wrapper_get_path(const void *devp, char *buf, int len)
++{
++ int rc;
++
++ rc = fdt_get_path(fdt, devp_offset(devp), buf, len);
++ if (check_err(rc))
++ return NULL;
++ return buf;
++}
++
++static unsigned long fdt_wrapper_finalize(void)
++{
++ int rc;
++
++ rc = fdt_pack(fdt);
++ if (rc != 0)
++ fatal("Couldn't pack flat tree: %s\n\r",
++ fdt_strerror(rc));
++ return (unsigned long)fdt;
++}
++
++void fdt_init(void *blob)
++{
++ int err;
++
++ dt_ops.finddevice = fdt_wrapper_finddevice;
++ dt_ops.getprop = fdt_wrapper_getprop;
++ dt_ops.setprop = fdt_wrapper_setprop;
++ dt_ops.get_parent = fdt_wrapper_get_parent;
++ dt_ops.create_node = fdt_wrapper_create_node;
++ dt_ops.find_node_by_prop_value = fdt_wrapper_find_node_by_prop_value;
++ dt_ops.get_path = fdt_wrapper_get_path;
++ dt_ops.finalize = fdt_wrapper_finalize;
++
++ /* Make sure the dt blob is the right version and so forth */
++ fdt = blob;
++ err = fdt_open_into(fdt, fdt, fdt_totalsize(blob));
++ if (err == -FDT_ERR_NOSPACE) {
++ int bufsize = fdt_totalsize(fdt) + 4;
++ buf = malloc(bufsize);
++ err = fdt_open_into(fdt, buf, bufsize);
++ }
++
++ if (err != 0)
++ fatal("fdt_init(): %s\n\r", fdt_strerror(err));
++
++ if (buf)
++ fdt = buf;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/libfdt_env.h powerpc.git/arch/powerpc/boot/libfdt_env.h
+--- linux-2.6.24/arch/powerpc/boot/libfdt_env.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/libfdt_env.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,17 @@
++#ifndef _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
++#define _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
++
++#include <types.h>
++#include <string.h>
++
++typedef u32 uint32_t;
++typedef u64 uint64_t;
++
++#define fdt16_to_cpu(x) (x)
++#define cpu_to_fdt16(x) (x)
++#define fdt32_to_cpu(x) (x)
++#define cpu_to_fdt32(x) (x)
++#define fdt64_to_cpu(x) (x)
++#define cpu_to_fdt64(x) (x)
++
++#endif /* _ARCH_POWERPC_BOOT_LIBFDT_ENV_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/main.c powerpc.git/arch/powerpc/boot/main.c
+--- linux-2.6.24/arch/powerpc/boot/main.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/main.c 2008-01-28 20:25:49.000000000 +0100
+@@ -16,7 +16,6 @@
+ #include "stdio.h"
+ #include "ops.h"
+ #include "gunzip_util.h"
+-#include "flatdevtree.h"
+ #include "reg.h"
+
+ static struct gunzip_state gzstate;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ops.h powerpc.git/arch/powerpc/boot/ops.h
+--- linux-2.6.24/arch/powerpc/boot/ops.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ops.h 2008-01-28 20:25:49.000000000 +0100
+@@ -79,7 +79,7 @@
+ extern struct loader_info loader_info;
+
+ void start(void);
+-int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
++void fdt_init(void *blob);
+ int serial_console_init(void);
+ int ns16550_console_init(void *devp, struct serial_console_data *scdp);
+ int mpsc_console_init(void *devp, struct serial_console_data *scdp);
+@@ -159,9 +159,23 @@
+ return find_node_by_prop_value_str(prev, "device_type", type);
+ }
+
++static inline void *find_node_by_alias(const char *alias)
++{
++ void *devp = finddevice("/aliases");
++
++ if (devp) {
++ char path[MAX_PATH_LEN];
++ if (getprop(devp, alias, path, MAX_PATH_LEN) > 0)
++ return finddevice(path);
++ }
++
++ return NULL;
++}
++
+ void dt_fixup_memory(u64 start, u64 size);
+ void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq);
+ void dt_fixup_clock(const char *path, u32 freq);
++void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr);
+ void dt_fixup_mac_address(u32 index, const u8 *addr);
+ void __dt_fixup_mac_addresses(u32 startindex, ...);
+ #define dt_fixup_mac_addresses(...) \
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/prpmc2800.c powerpc.git/arch/powerpc/boot/prpmc2800.c
+--- linux-2.6.24/arch/powerpc/boot/prpmc2800.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/prpmc2800.c 2008-01-28 20:25:49.000000000 +0100
+@@ -547,8 +547,7 @@
+ if (!dtb)
+ exit();
+ memmove(dtb, _dtb_start, dt_size);
+- if (ft_init(dtb, dt_size, 16))
+- exit();
++ fdt_init(dtb);
+
+ bridge_base = mv64x60_get_bridge_base();
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/ps3.c powerpc.git/arch/powerpc/boot/ps3.c
+--- linux-2.6.24/arch/powerpc/boot/ps3.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/ps3.c 2008-01-28 20:25:49.000000000 +0100
+@@ -131,7 +131,7 @@
+ printf("\n-- PS3 bootwrapper --\n");
+
+ simple_alloc_init(_end, heapsize, 32, 64);
+- ft_init(_dtb_start, 0, 4);
++ fdt_init(_dtb_start);
+
+ chosen = finddevice("/chosen");
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/redboot-8xx.c powerpc.git/arch/powerpc/boot/redboot-8xx.c
+--- linux-2.6.24/arch/powerpc/boot/redboot-8xx.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/redboot-8xx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,58 @@
++/*
++ * RedBoot firmware support
++ *
++ * Author: Scott Wood <scottwood@freescale.com>
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#include "ops.h"
++#include "stdio.h"
++#include "redboot.h"
++#include "fsl-soc.h"
++#include "io.h"
++
++static bd_t bd;
++BSS_STACK(4096);
++
++#define MHZ(x) ((x + 500000) / 1000000)
++
++static void platform_fixups(void)
++{
++ void *node;
++
++ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
++ dt_fixup_mac_addresses(bd.bi_enetaddr);
++ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 16, bd.bi_busfreq);
++
++ node = finddevice("/soc/cpm/brg");
++ if (node) {
++ printf("BRG clock-frequency <- 0x%x (%dMHz)\r\n",
++ bd.bi_busfreq, MHZ(bd.bi_busfreq));
++ setprop(node, "clock-frequency", &bd.bi_busfreq, 4);
++ }
++}
++
++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7)
++{
++ memcpy(&bd, (char *)r3, sizeof(bd));
++
++ if (bd.bi_tag != 0x42444944)
++ return;
++
++ simple_alloc_init(_end,
++ bd.bi_memstart + bd.bi_memsize - (unsigned long)_end,
++ 32, 64);
++
++ fdt_init(_dtb_start);
++ serial_console_init();
++ platform_ops.fixups = platform_fixups;
++
++ loader_info.cmdline = (char *)bd.bi_cmdline;
++ loader_info.cmdline_len = strlen((char *)bd.bi_cmdline);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/redboot.h powerpc.git/arch/powerpc/boot/redboot.h
+--- linux-2.6.24/arch/powerpc/boot/redboot.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/redboot.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,56 @@
++#ifndef _PPC_REDBOOT_H
++#define _PPC_REDBOOT_H
++
++//=========================================================================
++// include/asm-ppc/redboot.h
++// Copyright (c) 2002, 2003 Gary Thomas (<gary@mlbassoc.com>
++// Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
++
++//
++// Board specific details, as provided by RedBoot
++//
++
++/* A Board Information structure that is given to a program when
++ * RedBoot starts it up. Note: not all fields make sense for all
++ * architectures and it's up to the platform specific code to fill
++ * in the details.
++ */
++typedef struct bd_info {
++ unsigned int bi_tag; /* Should be 0x42444944 "BDID" */
++ unsigned int bi_size; /* Size of this structure */
++ unsigned int bi_revision; /* revision of this structure */
++ unsigned int bi_bdate; /* bootstrap date, i.e. 0x19971106 */
++ unsigned int bi_memstart; /* Memory start address */
++ unsigned int bi_memsize; /* Memory (end) size in bytes */
++ unsigned int bi_intfreq; /* Internal Freq, in Hz */
++ unsigned int bi_busfreq; /* Bus Freq, in Hz */
++ unsigned int bi_cpmfreq; /* CPM Freq, in Hz */
++ unsigned int bi_brgfreq; /* BRG Freq, in Hz */
++ unsigned int bi_vco; /* VCO Out from PLL */
++ unsigned int bi_pci_freq; /* PCI Freq, in Hz */
++ unsigned int bi_baudrate; /* Default console baud rate */
++ unsigned int bi_immr; /* IMMR when called from boot rom */
++ unsigned char bi_enetaddr[6];
++ unsigned int bi_flashbase; /* Physical address of FLASH memory */
++ unsigned int bi_flashsize; /* Length of FLASH memory */
++ int bi_flashwidth; /* Width (8,16,32,64) */
++ unsigned char *bi_cmdline; /* Pointer to command line */
++ unsigned char bi_esa[3][6]; /* Ethernet station addresses */
++ unsigned int bi_ramdisk_begin, bi_ramdisk_end;
++ struct { /* Information about [main] video screen */
++ short x_res; /* Horizontal resolution in pixels */
++ short y_res; /* Vertical resolution in pixels */
++ short bpp; /* Bits/pixel */
++ short mode; /* Type of pixels (packed, indexed) */
++ unsigned long fb; /* Pointer to frame buffer (pixel) memory */
++ } bi_video;
++ void (*bi_cputc)(char); /* Write a character to the RedBoot console */
++ char (*bi_cgetc)(void); /* Read a character from the RedBoot console */
++ int (*bi_ctstc)(void); /* Test for input on the RedBoot console */
++} bd_t;
++
++#define BI_REV 0x0102 /* Version 1.02 */
++
++#define bi_pci_busfreq bi_pci_freq
++#define bi_immr_base bi_immr
++#endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/reg.h powerpc.git/arch/powerpc/boot/reg.h
+--- linux-2.6.24/arch/powerpc/boot/reg.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/reg.h 2008-01-28 20:25:49.000000000 +0100
+@@ -16,6 +16,14 @@
+ return pvr;
+ }
+
++#define __stringify_1(x) #x
++#define __stringify(x) __stringify_1(x)
++
++#define mfspr(rn) ({unsigned long rval; \
++ asm volatile("mfspr %0," __stringify(rn) \
++ : "=r" (rval)); rval; })
++#define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v))
++
+ register void *__stack_pointer asm("r1");
+ #define get_sp() (__stack_pointer)
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/serial.c powerpc.git/arch/powerpc/boot/serial.c
+--- linux-2.6.24/arch/powerpc/boot/serial.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/serial.c 2008-01-28 20:25:49.000000000 +0100
+@@ -128,7 +128,8 @@
+ rc = cpm_console_init(devp, &serial_cd);
+ else if (dt_is_compatible(devp, "mpc5200-psc-uart"))
+ rc = mpc5200_psc_console_init(devp, &serial_cd);
+- else if (dt_is_compatible(devp, "xilinx,uartlite"))
++ else if (dt_is_compatible(devp, "xlnx,opb-uartlite-1.00.b") ||
++ dt_is_compatible(devp, "xlnx,xps-uartlite-1.00.a"))
+ rc = uartlite_console_init(devp, &serial_cd);
+
+ /* Add other serial console driver calls here */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/treeboot-walnut.c powerpc.git/arch/powerpc/boot/treeboot-walnut.c
+--- linux-2.6.24/arch/powerpc/boot/treeboot-walnut.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/treeboot-walnut.c 2008-01-28 20:25:49.000000000 +0100
+@@ -20,55 +20,6 @@
+
+ BSS_STACK(4096);
+
+-void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
+-{
+- u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
+- u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
+- u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
+- u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
+- u32 fwdv, fbdv, cbdv, opdv, epdv, udiv;
+-
+- fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
+- fbdv = (pllmr & 0x1e000000) >> 25;
+- cbdv = ((pllmr & 0x00060000) >> 17) + 1;
+- opdv = ((pllmr & 0x00018000) >> 15) + 1;
+- epdv = ((pllmr & 0x00001800) >> 13) + 2;
+- udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
+-
+- m = fwdv * fbdv * cbdv;
+-
+- cpu = sysclk * m / fwdv;
+- plb = cpu / cbdv;
+- opb = plb / opdv;
+- ebc = plb / epdv;
+-
+- if (cpc0_cr0 & 0x80) {
+- /* uart0 uses the external clock */
+- uart0 = ser_clk;
+- } else {
+- uart0 = cpu / udiv;
+- }
+-
+- if (cpc0_cr0 & 0x40) {
+- /* uart1 uses the external clock */
+- uart1 = ser_clk;
+- } else {
+- uart1 = cpu / udiv;
+- }
+-
+- /* setup the timebase clock to tick at the cpu frequency */
+- cpc0_cr1 = cpc0_cr1 & ~0x00800000;
+- mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
+- tb = cpu;
+-
+- dt_fixup_cpu_clocks(cpu, tb, 0);
+- dt_fixup_clock("/plb", plb);
+- dt_fixup_clock("/plb/opb", opb);
+- dt_fixup_clock("/plb/ebc", ebc);
+- dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
+- dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
+-}
+-
+ static void walnut_flashsel_fixup(void)
+ {
+ void *devp, *sram;
+@@ -112,7 +63,7 @@
+ #define WALNUT_OPENBIOS_MAC_OFF 0xfffffe0b
+ static void walnut_fixups(void)
+ {
+- ibm4xx_fixup_memsize();
++ ibm4xx_sdram_fixup_memsize();
+ ibm405gp_fixup_clocks(33330000, 0xa8c000);
+ ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
+ ibm4xx_fixup_ebc_ranges("/plb/ebc");
+@@ -128,6 +79,6 @@
+ simple_alloc_init(_end, avail_ram, 32, 32);
+ platform_ops.fixups = walnut_fixups;
+ platform_ops.exit = ibm40x_dbcr_reset;
+- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
++ fdt_init(_dtb_start);
+ serial_console_init();
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/boot/wrapper powerpc.git/arch/powerpc/boot/wrapper
+--- linux-2.6.24/arch/powerpc/boot/wrapper 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/boot/wrapper 2008-01-28 20:25:49.000000000 +0100
+@@ -45,6 +45,7 @@
+
+ # directory for object and other files used by this script
+ object=arch/powerpc/boot
++objbin=$object
+
+ # directory for working files
+ tmpdir=.
+@@ -95,6 +96,7 @@
+ shift
+ [ "$#" -gt 0 ] || usage
+ object="$1"
++ objbin="$1"
+ ;;
+ -W)
+ shift
+@@ -116,10 +118,13 @@
+ done
+
+ if [ -n "$dts" ]; then
++ if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then
++ dts="$object/dts/$dts"
++ fi
+ if [ -z "$dtb" ]; then
+ dtb="$platform.dtb"
+ fi
+- dtc -O dtb -o "$dtb" -b 0 -V 16 "$dts"
++ $object/dtc -O dtb -o "$dtb" -b 0 "$dts"
+ fi
+
+ if [ -z "$kernel" ]; then
+@@ -163,7 +168,7 @@
+ ksection=.kernel:vmlinux.bin
+ isection=.kernel:initrd
+ ;;
+-ep88xc)
++ep88xc|ep405|redboot*|ep8248e)
+ platformo="$object/fixed-head.o $object/$platform.o"
+ binary=y
+ ;;
+@@ -246,11 +251,11 @@
+ # post-processing needed for some platforms
+ case "$platform" in
+ pseries|chrp)
+- $object/addnote "$ofile"
++ $objbin/addnote "$ofile"
+ ;;
+ coff)
+ ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
+- $object/hack-coff "$ofile"
++ $objbin/hack-coff "$ofile"
+ ;;
+ cuboot*)
+ gzip -f -9 "$ofile"
+@@ -259,7 +264,7 @@
+ ;;
+ treeboot*)
+ mv "$ofile" "$ofile.elf"
+- $object/mktree "$ofile.elf" "$ofile" "$base" "$entry"
++ $objbin/mktree "$ofile.elf" "$ofile" "$base" "$entry"
+ if [ -z "$cacheit" ]; then
+ rm -f "$ofile.elf"
+ fi
+@@ -287,8 +292,6 @@
+ overlay_dest="256"
+ overlay_size="256"
+
+- rm -f "$object/otheros.bld"
+-
+ ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
+
+ dd if="$ofile.bin" of="$ofile.bin" conv=notrunc \
+@@ -299,6 +302,8 @@
+ skip=$system_reset_overlay seek=$overlay_dest \
+ count=$overlay_size bs=1
+
+- gzip --force -9 --stdout "$ofile.bin" > "$object/otheros.bld"
++ odir="$(dirname "$ofile.bin")"
++ rm -f "$odir/otheros.bld"
++ gzip --force -9 --stdout "$ofile.bin" > "$odir/otheros.bld"
+ ;;
+ esac
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/adder875-redboot_defconfig powerpc.git/arch/powerpc/configs/adder875-redboot_defconfig
+--- linux-2.6.24/arch/powerpc/configs/adder875-redboot_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/adder875-redboot_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,798 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Thu Jan 17 16:17:38 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++CONFIG_PPC_8xx=y
++# CONFIG_40x is not set
++# CONFIG_44x is not set
++# CONFIG_E200 is not set
++CONFIG_8xx=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_OF=y
++# CONFIG_PPC_UDBG_16550 is not set
++# CONFIG_GENERIC_TBSYNC is not set
++CONFIG_AUDIT_ARCH=y
++CONFIG_GENERIC_BUG=y
++# CONFIG_DEFAULT_UIMAGE is not set
++CONFIG_REDBOOT=y
++# CONFIG_PPC_DCR_NATIVE is not set
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++# CONFIG_SYSCTL_SYSCALL is not set
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++# CONFIG_ELF_CORE is not set
++# CONFIG_BASE_FULL is not set
++# CONFIG_FUTEX is not set
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++# CONFIG_VM_EVENT_COUNTERS is not set
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=1
++# CONFIG_MODULES is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++CONFIG_IOSCHED_DEADLINE=y
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++CONFIG_CPM1=y
++# CONFIG_MPC8XXFADS is not set
++# CONFIG_MPC86XADS is not set
++# CONFIG_MPC885ADS is not set
++# CONFIG_PPC_EP88XC is not set
++CONFIG_PPC_ADDER875=y
++
++#
++# MPC8xx CPM Options
++#
++
++#
++# Generic MPC8xx Options
++#
++CONFIG_8xx_COPYBACK=y
++# CONFIG_8xx_CPU6 is not set
++CONFIG_8xx_CPU15=y
++CONFIG_NO_UCODE_PATCH=y
++# CONFIG_USB_SOF_UCODE_PATCH is not set
++# CONFIG_I2C_SPI_UCODE_PATCH is not set
++# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++CONFIG_PPC_CPM_NEW_BINDING=y
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_CPM=y
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++CONFIG_HZ_1000=y
++CONFIG_HZ=1000
++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_MATH_EMULATION is not set
++# CONFIG_8XX_MINIMAL_FPEMU is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++# CONFIG_PROC_DEVICETREE is not set
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++# CONFIG_SECCOMP is not set
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="adder875-redboot.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_FSL_SOC=y
++# CONFIG_PCI is not set
++# CONFIG_PCI_DOMAINS is not set
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_PCI_QSPAN is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD 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_CONSISTENT_START=0xfd000000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x00400000
++
++#
++# 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=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP 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=y
++# 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++# CONFIG_MTD_PARTITIONS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_CFI_FLAGADM is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++# CONFIG_BLK_DEV is not set
++# CONFIG_MISC_DEVICES is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++CONFIG_DAVICOM_PHY=y
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++CONFIG_FS_ENET=y
++# CONFIG_FS_ENET_HAS_SCC is not set
++CONFIG_FS_ENET_HAS_FEC=y
++CONFIG_FS_ENET_MDIO_FEC=y
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP 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
++# CONFIG_ISDN is not set
++# 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=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_EVDEV is not set
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_LIFEBOOK=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_VSXXXAA 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=y
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 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_CPM=y
++CONFIG_SERIAL_CPM_CONSOLE=y
++# CONFIG_SERIAL_CPM_SCC1 is not set
++# CONFIG_SERIAL_CPM_SCC2 is not set
++# CONFIG_SERIAL_CPM_SCC3 is not set
++# CONFIG_SERIAL_CPM_SCC4 is not set
++CONFIG_SERIAL_CPM_SMC1=y
++CONFIG_SERIAL_CPM_SMC2=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=y
++# CONFIG_NVRAM is not set
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=y
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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 is not set
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# 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_JFFS2_FS is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# 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
++# CONFIG_NLS is not set
++# CONFIG_DLM is not set
++# CONFIG_UCC_SLOW is not set
++
++#
++# Library routines
++#
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
++# CONFIG_CRC32 is not set
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++# CONFIG_CRYPTO is not set
++# CONFIG_PPC_CLOCK is not set
++CONFIG_PPC_LIB_RHEAP=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/adder875-uboot_defconfig powerpc.git/arch/powerpc/configs/adder875-uboot_defconfig
+--- linux-2.6.24/arch/powerpc/configs/adder875-uboot_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/adder875-uboot_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,798 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Thu Jan 17 16:17:18 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++CONFIG_PPC_8xx=y
++# CONFIG_40x is not set
++# CONFIG_44x is not set
++# CONFIG_E200 is not set
++CONFIG_8xx=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_OF=y
++# CONFIG_PPC_UDBG_16550 is not set
++# CONFIG_GENERIC_TBSYNC is not set
++CONFIG_AUDIT_ARCH=y
++CONFIG_GENERIC_BUG=y
++# CONFIG_DEFAULT_UIMAGE is not set
++CONFIG_REDBOOT=y
++# CONFIG_PPC_DCR_NATIVE is not set
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_SWAP is not set
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++# CONFIG_SYSCTL_SYSCALL is not set
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++# CONFIG_ELF_CORE is not set
++# CONFIG_BASE_FULL is not set
++# CONFIG_FUTEX is not set
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++# CONFIG_VM_EVENT_COUNTERS is not set
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=1
++# CONFIG_MODULES is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++CONFIG_IOSCHED_DEADLINE=y
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++CONFIG_CPM1=y
++# CONFIG_MPC8XXFADS is not set
++# CONFIG_MPC86XADS is not set
++# CONFIG_MPC885ADS is not set
++# CONFIG_PPC_EP88XC is not set
++CONFIG_PPC_ADDER875=y
++
++#
++# MPC8xx CPM Options
++#
++
++#
++# Generic MPC8xx Options
++#
++CONFIG_8xx_COPYBACK=y
++# CONFIG_8xx_CPU6 is not set
++CONFIG_8xx_CPU15=y
++CONFIG_NO_UCODE_PATCH=y
++# CONFIG_USB_SOF_UCODE_PATCH is not set
++# CONFIG_I2C_SPI_UCODE_PATCH is not set
++# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++CONFIG_PPC_CPM_NEW_BINDING=y
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_CPM=y
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++CONFIG_HZ_1000=y
++CONFIG_HZ=1000
++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_MATH_EMULATION is not set
++# CONFIG_8XX_MINIMAL_FPEMU is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++# CONFIG_PROC_DEVICETREE is not set
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++# CONFIG_SECCOMP is not set
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="adder875-uboot.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_FSL_SOC=y
++# CONFIG_PCI is not set
++# CONFIG_PCI_DOMAINS is not set
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_PCI_QSPAN is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD 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_CONSISTENT_START=0xfd000000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x00400000
++
++#
++# 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=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP 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=y
++# 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++# CONFIG_MTD_PARTITIONS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_CFI_FLAGADM is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++# CONFIG_BLK_DEV is not set
++# CONFIG_MISC_DEVICES is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++CONFIG_DAVICOM_PHY=y
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++CONFIG_FS_ENET=y
++# CONFIG_FS_ENET_HAS_SCC is not set
++CONFIG_FS_ENET_HAS_FEC=y
++CONFIG_FS_ENET_MDIO_FEC=y
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP 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
++# CONFIG_ISDN is not set
++# 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=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_EVDEV is not set
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++CONFIG_KEYBOARD_ATKBD=y
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_LIFEBOOK=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_VSXXXAA 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=y
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 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_CPM=y
++CONFIG_SERIAL_CPM_CONSOLE=y
++# CONFIG_SERIAL_CPM_SCC1 is not set
++# CONFIG_SERIAL_CPM_SCC2 is not set
++# CONFIG_SERIAL_CPM_SCC3 is not set
++# CONFIG_SERIAL_CPM_SCC4 is not set
++CONFIG_SERIAL_CPM_SMC1=y
++CONFIG_SERIAL_CPM_SMC2=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=y
++# CONFIG_NVRAM is not set
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=y
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++# CONFIG_EXT2_FS is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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 is not set
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# 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_JFFS2_FS is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# 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
++# CONFIG_NLS is not set
++# CONFIG_DLM is not set
++# CONFIG_UCC_SLOW is not set
++
++#
++# Library routines
++#
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
++# CONFIG_CRC32 is not set
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++# CONFIG_CRYPTO is not set
++# CONFIG_PPC_CLOCK is not set
++CONFIG_PPC_LIB_RHEAP=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/bamboo_defconfig powerpc.git/arch/powerpc/configs/bamboo_defconfig
+--- linux-2.6.24/arch/powerpc/configs/bamboo_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/bamboo_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:48:04 2007
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 10:49:50 2007
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -131,6 +131,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
+
+ #
+ # Platform support
+@@ -143,6 +144,9 @@
+ CONFIG_BAMBOO=y
+ # CONFIG_EBONY is not set
+ # CONFIG_SEQUOIA is not set
++# CONFIG_TAISHAN is not set
++# CONFIG_KATMAI is not set
++# CONFIG_RAINIER is not set
+ CONFIG_440EP=y
+ CONFIG_IBM440EP_ERR42=y
+ # CONFIG_MPIC is not set
+@@ -372,9 +376,7 @@
+ # CONFIG_FIREWIRE is not set
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+-CONFIG_MACINTOSH_DRIVERS=y
+-# CONFIG_MAC_EMUMOUSEBTN is not set
+-# CONFIG_WINDFARM is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+@@ -736,19 +738,7 @@
+ # CONFIG_KGDB is not set
+ # CONFIG_XMON is not set
+ # CONFIG_BDI_SWITCH is not set
+-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=y
+-# CONFIG_PPC_EARLY_DEBUG_CPM is not set
+-CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
+-CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x0
++# CONFIG_PPC_EARLY_DEBUG is not set
+
+ #
+ # Security options
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/celleb_defconfig powerpc.git/arch/powerpc/configs/celleb_defconfig
+--- linux-2.6.24/arch/powerpc/configs/celleb_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/celleb_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -50,7 +50,8 @@
+ 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_PPC_DCR_MMIO=y
++CONFIG_PPC_DCR=y
+ CONFIG_PPC_OF_PLATFORM_PCI=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+@@ -148,7 +149,7 @@
+ CONFIG_PPC_CELLEB=y
+ # CONFIG_PPC_PS3 is not set
+ CONFIG_PPC_CELL=y
+-# CONFIG_PPC_CELL_NATIVE is not set
++CONFIG_PPC_CELL_NATIVE=y
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
+
+ #
+@@ -157,13 +158,19 @@
+ CONFIG_SPU_FS=y
+ CONFIG_SPU_FS_64K_LS=y
+ CONFIG_SPU_BASE=y
++CONFIG_CBE_RAS=y
++# CONFIG_CBE_THERM is not set
+ # CONFIG_PQ2ADS is not set
++CONFIG_PPC_NATIVE=y
++CONFIG_UDBG_RTAS_CONSOLE=y
+ CONFIG_PPC_UDBG_BEAT=y
+-# CONFIG_MPIC is not set
++CONFIG_MPIC=y
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+ # CONFIG_U3_DART is not set
+-# CONFIG_PPC_RTAS is not set
++CONFIG_PPC_RTAS=y
++# CONFIG_RTAS_ERROR_LOGGING is not set
++# CONFIG_RTAS_PROC is not set
+ # CONFIG_MMIO_NVRAM is not set
+ # CONFIG_PPC_MPC106 is not set
+ # CONFIG_PPC_970_NAP is not set
+@@ -593,10 +600,11 @@
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
+-# CONFIG_IBM_NEW_EMAC_ZMII is not set
+-# CONFIG_IBM_NEW_EMAC_RGMII is not set
+-# CONFIG_IBM_NEW_EMAC_TAH is not set
+-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_IBM_NEW_EMAC is not set
++CONFIG_IBM_NEW_EMAC_ZMII=y
++CONFIG_IBM_NEW_EMAC_RGMII=y
++CONFIG_IBM_NEW_EMAC_TAH=y
++CONFIG_IBM_NEW_EMAC_EMAC4=y
+ # CONFIG_NET_PCI is not set
+ # CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
+@@ -741,6 +749,7 @@
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ CONFIG_HVC_DRIVER=y
++CONFIG_HVC_RTAS=y
+ CONFIG_HVC_BEAT=y
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+@@ -822,6 +831,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
++# CONFIG_WATCHDOG_RTAS is not set
+
+ #
+ # PCI-based Watchdog Cards
+@@ -1245,17 +1255,7 @@
+ CONFIG_IRQSTACKS=y
+ # CONFIG_VIRQ_DEBUG is not set
+ # CONFIG_BOOTX_TEXT is not set
+-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=y
+-# CONFIG_PPC_EARLY_DEBUG_44x is not set
+-# CONFIG_PPC_EARLY_DEBUG_CPM is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
+
+ #
+ # Security options
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/ebony_defconfig powerpc.git/arch/powerpc/configs/ebony_defconfig
+--- linux-2.6.24/arch/powerpc/configs/ebony_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/ebony_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:48:11 2007
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:16:26 2007
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -130,6 +130,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
+
+ #
+ # Platform support
+@@ -142,6 +143,9 @@
+ # CONFIG_BAMBOO is not set
+ CONFIG_EBONY=y
+ # CONFIG_SEQUOIA is not set
++# CONFIG_TAISHAN is not set
++# CONFIG_KATMAI is not set
++# CONFIG_RAINIER is not set
+ CONFIG_440GP=y
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/ep405_defconfig powerpc.git/arch/powerpc/configs/ep405_defconfig
+--- linux-2.6.24/arch/powerpc/configs/ep405_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/ep405_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,952 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:17:13 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++CONFIG_40x=y
++# CONFIG_44x is not set
++# CONFIG_E200 is not set
++CONFIG_4xx=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++CONFIG_EP405=y
++# CONFIG_KILAUEA is not set
++# CONFIG_MAKALU is not set
++# CONFIG_WALNUT is not set
++# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
++CONFIG_405GP=y
++CONFIG_IBM405_ERR77=y
++CONFIG_IBM405_ERR51=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_MATH_EMULATION is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="ep405.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x00400000
++
++#
++# 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 is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++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
++CONFIG_CONNECTOR=y
++CONFIG_PROC_EVENTS=y
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=m
++CONFIG_MTD_BLOCK=m
++# CONFIG_MTD_BLOCK_RO is not set
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++CONFIG_MTD_JEDECPROBE=y
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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_UB is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=35000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_XILINX_SYSACE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=128
++CONFIG_IBM_NEW_EMAC_TXB=64
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++CONFIG_IBM_NEW_EMAC_ZMII=y
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
++CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 is not set
++CONFIG_NETDEV_10000=y
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_CHELSIO_T3 is not set
++# CONFIG_IXGBE is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++# CONFIG_NETXEN_NIC is not set
++# CONFIG_NIU is not set
++# CONFIG_MLX4_CORE is not set
++# CONFIG_TEHUTI is not set
++# CONFIG_TR is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET 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_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_PCI=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++CONFIG_SERIAL_8250_EXTENDED=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# 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
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB_ARCH_HAS_EHCI=y
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++CONFIG_USB_OHCI_HCD=y
++CONFIG_USB_OHCI_HCD_PPC_OF=y
++CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
++CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
++CONFIG_USB_OHCI_HCD_PCI=y
++CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
++CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# may also be needed; see USB_STORAGE Help for more information
++#
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++
++#
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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_JFFS2_FS is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_NLS is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_KPROBES is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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=y
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/ep8248e_defconfig powerpc.git/arch/powerpc/configs/ep8248e_defconfig
+--- linux-2.6.24/arch/powerpc/configs/ep8248e_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/ep8248e_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,821 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Fri Jan 11 14:02:06 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++CONFIG_6xx=y
++# CONFIG_PPC_85xx 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_PPC_FPU=y
++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_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_OF=y
++# CONFIG_PPC_UDBG_16550 is not set
++# 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"
++
++#
++# General setup
++#
++# CONFIG_EXPERIMENTAL is not set
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++CONFIG_KALLSYMS_ALL=y
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++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_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
++# CONFIG_MODULES is not set
++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=y
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++CONFIG_DEFAULT_DEADLINE=y
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="deadline"
++
++#
++# Platform support
++#
++# CONFIG_PPC_MULTIPLATFORM is not set
++CONFIG_PPC_82xx=y
++# CONFIG_PPC_83xx is not set
++# CONFIG_PPC_86xx is not set
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_MPC8272_ADS is not set
++# CONFIG_PQ2FADS is not set
++CONFIG_EP8248E=y
++# CONFIG_PQ2ADS is not set
++CONFIG_8260=y
++CONFIG_8272=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2=y
++CONFIG_PPC_CPM_NEW_BINDING=y
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_CPM=y
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++CONFIG_PREEMPT_NONE=y
++# CONFIG_PREEMPT_VOLUNTARY is not set
++# CONFIG_PREEMPT is not set
++CONFIG_BINFMT_ELF=y
++CONFIG_BINFMT_MISC=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_ARCH_POPULATES_NODE_MAP=y
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++# CONFIG_SECCOMP is not set
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="ep8248e.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_FSL_SOC=y
++# CONFIG_PCI is not set
++# CONFIG_PCI_DOMAINS is not set
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++# CONFIG_PCCARD 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=0xc0000000
++CONFIG_BOOT_LOAD=0x00400000
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# 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=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE is not set
++CONFIG_SYN_COOKIES=y
++# 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=y
++CONFIG_INET_XFRM_MODE_TRANSPORT=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO 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_IP_VS is not set
++CONFIG_IPV6=y
++# CONFIG_IPV6_PRIVACY is not set
++# CONFIG_IPV6_ROUTER_PREF is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=y
++CONFIG_INET6_XFRM_MODE_TUNNEL=y
++CONFIG_INET6_XFRM_MODE_BEET=y
++CONFIG_IPV6_SIT=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_NETWORK_SECMARK is not set
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++
++#
++# Core Netfilter Configuration
++#
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK_ENABLED is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NETFILTER_XTABLES is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_IP_NF_QUEUE is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES 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_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
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++# CONFIG_MTD_PARTITIONS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++CONFIG_MTD_CFI_ADV_OPTIONS=y
++CONFIG_MTD_CFI_NOSWAP=y
++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
++CONFIG_MTD_CFI_GEOMETRY=y
++# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++# CONFIG_MTD_CFI_I1 is not set
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_OTP is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_RAM is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_MISC_DEVICES is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++CONFIG_DAVICOM_PHY=y
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_FIXED_PHY is not set
++CONFIG_MDIO_BITBANG=y
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++CONFIG_FS_ENET=y
++# CONFIG_FS_ENET_HAS_SCC is not set
++CONFIG_FS_ENET_HAS_FCC=y
++# CONFIG_FS_ENET_MDIO_FCC is not set
++CONFIG_NETDEV_1000=y
++CONFIG_NETDEV_10000=y
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 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_CPM=y
++CONFIG_SERIAL_CPM_CONSOLE=y
++CONFIG_SERIAL_CPM_SCC1=y
++# CONFIG_SERIAL_CPM_SCC2 is not set
++# CONFIG_SERIAL_CPM_SCC3 is not set
++CONFIG_SERIAL_CPM_SCC4=y
++# CONFIG_SERIAL_CPM_SMC1 is not set
++# CONFIG_SERIAL_CPM_SMC2 is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=y
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# 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_JBD=y
++# 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_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=y
++# CONFIG_AUTOFS_FS is not set
++CONFIG_AUTOFS4_FS=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_JFFS2_FS is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_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
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# 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=y
++# 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
++# CONFIG_UCC_SLOW is not set
++
++#
++# Library routines
++#
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
++# CONFIG_CRC32 is not set
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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_SCHED_DEBUG 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=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_KGDB_CONSOLE is not set
++CONFIG_BDI_SWITCH=y
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_HW is not set
++# CONFIG_PPC_CLOCK is not set
++CONFIG_PPC_LIB_RHEAP=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/katmai_defconfig powerpc.git/arch/powerpc/configs/katmai_defconfig
+--- linux-2.6.24/arch/powerpc/configs/katmai_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/katmai_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,790 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:17:43 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_40x is not set
++CONFIG_44x=y
++# CONFIG_E200 is not set
++CONFIG_4xx=y
++CONFIG_BOOKE=y
++CONFIG_PTE_64BIT=y
++CONFIG_PHYS_64BIT=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_PPC4xx_PCI_EXPRESS=y
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_BAMBOO is not set
++# CONFIG_EBONY is not set
++# CONFIG_SEQUOIA is not set
++# CONFIG_TAISHAN is not set
++CONFIG_KATMAI=y
++# CONFIG_RAINIER is not set
++CONFIG_440SPe=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_MATH_EMULATION is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_RESOURCES_64BIT=y
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE=""
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="katmai.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x01000000
++
++#
++# 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 is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++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
++CONFIG_CONNECTOR=y
++CONFIG_PROC_EVENTS=y
++# CONFIG_MTD is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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=35000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_XILINX_SYSACE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++CONFIG_MACINTOSH_DRIVERS=y
++# CONFIG_MAC_EMUMOUSEBTN is not set
++# CONFIG_WINDFARM is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=128
++CONFIG_IBM_NEW_EMAC_TXB=64
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++CONFIG_IBM_NEW_EMAC_EMAC4=y
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
++CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 is not set
++CONFIG_NETDEV_10000=y
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_CHELSIO_T3 is not set
++# CONFIG_IXGBE is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++# CONFIG_NETXEN_NIC is not set
++# CONFIG_NIU is not set
++# CONFIG_MLX4_CORE is not set
++# CONFIG_TEHUTI 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_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT 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=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# 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
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++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
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_NLS is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_KPROBES is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES 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_KGDB is not set
++# CONFIG_XMON is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/kilauea_defconfig powerpc.git/arch/powerpc/configs/kilauea_defconfig
+--- linux-2.6.24/arch/powerpc/configs/kilauea_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/kilauea_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:48:20 2007
++# Linux kernel version: 2.6.24-rc6
++# Thu Jan 3 14:21:31 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -40,7 +40,7 @@
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+-# CONFIG_PPC_UDBG_16550 is not set
++CONFIG_PPC_UDBG_16550=y
+ # CONFIG_GENERIC_TBSYNC is not set
+ CONFIG_AUDIT_ARCH=y
+ CONFIG_GENERIC_BUG=y
+@@ -125,6 +125,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_PPC4xx_PCI_EXPRESS=y
+
+ #
+ # Platform support
+@@ -134,9 +135,12 @@
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PQ2ADS is not set
++# CONFIG_EP405 is not set
+ CONFIG_KILAUEA=y
++# CONFIG_MAKALU is not set
+ # CONFIG_WALNUT is not set
+ # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
++CONFIG_405EX=y
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -199,11 +203,17 @@
+ # Bus options
+ #
+ CONFIG_ZONE_DMA=y
+-# CONFIG_PCI is not set
+-# CONFIG_PCI_DOMAINS is not set
+-# CONFIG_PCI_SYSCALL is not set
+-# CONFIG_ARCH_SUPPORTS_MSI is not set
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
+ # CONFIG_PCCARD is not set
++# CONFIG_HOTPLUG_PCI is not set
+
+ #
+ # Advanced setup
+@@ -368,11 +378,13 @@
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ # CONFIG_MTD_PHYSMAP is not set
+ CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
+ # CONFIG_MTD_PLATRAM is not set
+
+ #
+ # Self-contained MTD device drivers
+ #
++# CONFIG_MTD_PMC551 is not set
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -395,9 +407,14 @@
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_FD is not set
++# 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=35000
+@@ -417,6 +434,14 @@
+ # CONFIG_SCSI_NETLINK is not set
+ # CONFIG_ATA is not set
+ # CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
+ # CONFIG_MACINTOSH_DRIVERS is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_NETDEVICES_MULTIQUEUE is not set
+@@ -426,9 +451,33 @@
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+ # CONFIG_VETH is not set
+-# CONFIG_NET_ETHERNET is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=256
++CONFIG_IBM_NEW_EMAC_TXB=256
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++CONFIG_IBM_NEW_EMAC_RGMII=y
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++CONFIG_IBM_NEW_EMAC_EMAC4=y
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
+ # CONFIG_NETDEV_1000 is not set
+ # CONFIG_NETDEV_10000 is not set
++# CONFIG_TR is not set
+
+ #
+ # Wireless LAN
+@@ -436,6 +485,8 @@
+ # 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_SHAPER is not set
+@@ -467,6 +518,7 @@
+ #
+ CONFIG_SERIAL_8250=y
+ CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_PCI=y
+ CONFIG_SERIAL_8250_NR_UARTS=4
+ CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+ CONFIG_SERIAL_8250_EXTENDED=y
+@@ -481,6 +533,7 @@
+ # 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
+@@ -490,8 +543,10 @@
+ # CONFIG_NVRAM is not set
+ # CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
+
+ #
+@@ -525,6 +580,8 @@
+ #
+ # Graphics support
+ #
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
+ # CONFIG_VGASTATE is not set
+ # CONFIG_VIDEO_OUTPUT_CONTROL is not set
+ # CONFIG_FB is not set
+@@ -542,6 +599,7 @@
+ # CONFIG_USB_SUPPORT is not set
+ # CONFIG_MMC is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/lite5200_defconfig powerpc.git/arch/powerpc/configs/lite5200_defconfig
+--- linux-2.6.24/arch/powerpc/configs/lite5200_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/lite5200_defconfig 1970-01-01 01:00:00.000000000 +0100
+@@ -1,847 +0,0 @@
+-#
+-# Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:48:24 2007
+-#
+-# CONFIG_PPC64 is not set
+-
+-#
+-# Processor support
+-#
+-CONFIG_6xx=y
+-# CONFIG_PPC_85xx 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_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_WORD_SIZE=32
+-CONFIG_PPC_MERGE=y
+-CONFIG_MMU=y
+-CONFIG_GENERIC_CMOS_UPDATE=y
+-CONFIG_GENERIC_TIME=y
+-CONFIG_GENERIC_TIME_VSYSCALL=y
+-CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
+-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_OF=y
+-# CONFIG_PPC_UDBG_16550 is not set
+-# 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"
+-
+-#
+-# General setup
+-#
+-CONFIG_EXPERIMENTAL=y
+-CONFIG_BROKEN_ON_SMP=y
+-CONFIG_INIT_ENV_ARG_LIMIT=32
+-CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
+-CONFIG_SWAP=y
+-CONFIG_SYSVIPC=y
+-CONFIG_SYSVIPC_SYSCTL=y
+-# CONFIG_POSIX_MQUEUE is not set
+-# CONFIG_BSD_PROCESS_ACCT is not set
+-# CONFIG_TASKSTATS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+-# CONFIG_AUDIT is not set
+-# CONFIG_IKCONFIG is not set
+-CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_CGROUPS is not set
+-# CONFIG_FAIR_GROUP_SCHED is not set
+-CONFIG_SYSFS_DEPRECATED=y
+-# CONFIG_RELAY is not set
+-CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+-CONFIG_SYSCTL=y
+-CONFIG_EMBEDDED=y
+-# CONFIG_SYSCTL_SYSCALL is not set
+-# CONFIG_KALLSYMS is not set
+-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 is not set
+-CONFIG_SIGNALFD=y
+-CONFIG_EVENTFD=y
+-CONFIG_SHMEM=y
+-CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_SLUB_DEBUG=y
+-# CONFIG_SLAB is not set
+-CONFIG_SLUB=y
+-# CONFIG_SLOB is not set
+-CONFIG_RT_MUTEXES=y
+-# CONFIG_TINY_SHMEM is not set
+-CONFIG_BASE_SMALL=0
+-CONFIG_MODULES=y
+-CONFIG_MODULE_UNLOAD=y
+-# CONFIG_MODULE_FORCE_UNLOAD is not set
+-# CONFIG_MODVERSIONS is not set
+-# CONFIG_MODULE_SRCVERSION_ALL is not set
+-# CONFIG_KMOD is not set
+-CONFIG_BLOCK=y
+-# CONFIG_LBD is not set
+-# CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_LSF is not set
+-# CONFIG_BLK_DEV_BSG is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-CONFIG_DEFAULT_AS=y
+-# CONFIG_DEFAULT_DEADLINE is not set
+-# CONFIG_DEFAULT_CFQ is not set
+-# CONFIG_DEFAULT_NOOP is not set
+-CONFIG_DEFAULT_IOSCHED="anticipatory"
+-
+-#
+-# Platform support
+-#
+-CONFIG_PPC_MULTIPLATFORM=y
+-# CONFIG_PPC_82xx is not set
+-# CONFIG_PPC_83xx is not set
+-# CONFIG_PPC_86xx is not set
+-CONFIG_CLASSIC32=y
+-# CONFIG_PPC_CHRP is not set
+-CONFIG_PPC_MPC52xx=y
+-CONFIG_PPC_MPC5200=y
+-CONFIG_PPC_MPC5200_BUGFIX=y
+-# CONFIG_PPC_EFIKA is not set
+-CONFIG_PPC_LITE5200=y
+-# CONFIG_PPC_PMAC is not set
+-# CONFIG_PPC_CELL is not set
+-# CONFIG_PPC_CELL_NATIVE is not set
+-# CONFIG_PQ2ADS is not set
+-# CONFIG_EMBEDDED6xx is not set
+-# CONFIG_MPIC is not set
+-# CONFIG_MPIC_WEIRD is not set
+-# CONFIG_PPC_I8259 is not set
+-# 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_TAU is not set
+-# CONFIG_CPM2 is not set
+-# CONFIG_FSL_ULI1575 is not set
+-CONFIG_PPC_BESTCOMM=y
+-CONFIG_PPC_BESTCOMM_ATA=y
+-CONFIG_PPC_BESTCOMM_FEC=y
+-CONFIG_PPC_BESTCOMM_GEN_BD=y
+-
+-#
+-# Kernel options
+-#
+-# CONFIG_HIGHMEM is not set
+-CONFIG_TICK_ONESHOT=y
+-CONFIG_NO_HZ=y
+-CONFIG_HIGH_RES_TIMERS=y
+-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+-# CONFIG_HZ_100 is not set
+-CONFIG_HZ_250=y
+-# CONFIG_HZ_300 is not set
+-# CONFIG_HZ_1000 is not set
+-CONFIG_HZ=250
+-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_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_SPARSEMEM_VMEMMAP_ENABLE is not set
+-CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_RESOURCES_64BIT is not set
+-CONFIG_ZONE_DMA_FLAG=1
+-CONFIG_BOUNCE=y
+-CONFIG_VIRT_TO_BUS=y
+-CONFIG_PROC_DEVICETREE=y
+-# CONFIG_CMDLINE_BOOL is not set
+-CONFIG_PM=y
+-# CONFIG_PM_LEGACY is not set
+-# CONFIG_PM_DEBUG is not set
+-CONFIG_PM_SLEEP=y
+-CONFIG_SUSPEND_UP_POSSIBLE=y
+-CONFIG_SUSPEND=y
+-CONFIG_HIBERNATION_UP_POSSIBLE=y
+-# CONFIG_HIBERNATION is not set
+-CONFIG_SECCOMP=y
+-CONFIG_WANT_DEVICE_TREE=y
+-CONFIG_DEVICE_TREE=""
+-CONFIG_ISA_DMA_API=y
+-
+-#
+-# Bus options
+-#
+-CONFIG_ZONE_DMA=y
+-CONFIG_GENERIC_ISA_DMA=y
+-# CONFIG_PPC_INDIRECT_PCI is not set
+-CONFIG_FSL_SOC=y
+-CONFIG_PCI=y
+-CONFIG_PCI_DOMAINS=y
+-CONFIG_PCI_SYSCALL=y
+-# CONFIG_PCIEPORTBUS is not set
+-CONFIG_ARCH_SUPPORTS_MSI=y
+-# CONFIG_PCI_MSI is not set
+-CONFIG_PCI_LEGACY=y
+-# CONFIG_PCI_DEBUG is not set
+-# 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=0xc0000000
+-CONFIG_BOOT_LOAD=0x00800000
+-
+-#
+-# Networking
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-CONFIG_UNIX=y
+-CONFIG_XFRM=y
+-CONFIG_XFRM_USER=m
+-# CONFIG_XFRM_SUB_POLICY is not set
+-# CONFIG_XFRM_MIGRATE is not set
+-# 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=y
+-CONFIG_IP_PNP_DHCP=y
+-CONFIG_IP_PNP_BOOTP=y
+-# CONFIG_IP_PNP_RARP 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=y
+-# 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=y
+-CONFIG_INET_XFRM_MODE_TUNNEL=y
+-CONFIG_INET_XFRM_MODE_BEET=y
+-# CONFIG_INET_LRO 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
+-# 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
+-# CONFIG_NET_9P is not set
+-
+-#
+-# Device Drivers
+-#
+-
+-#
+-# Generic Driver Options
+-#
+-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+-CONFIG_STANDALONE=y
+-CONFIG_PREVENT_FIRMWARE_BUILD=y
+-# CONFIG_FW_LOADER is not set
+-# CONFIG_DEBUG_DRIVER is not set
+-# CONFIG_DEBUG_DEVRES is not set
+-# CONFIG_SYS_HYPERVISOR is not set
+-# CONFIG_CONNECTOR is not set
+-# CONFIG_MTD is not set
+-CONFIG_OF_DEVICE=y
+-# CONFIG_PARPORT is not set
+-CONFIG_BLK_DEV=y
+-# CONFIG_BLK_DEV_FD is not set
+-# 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=y
+-# CONFIG_BLK_DEV_CRYPTOLOOP 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=32768
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+-# CONFIG_CDROM_PKTCDVD is not set
+-# CONFIG_ATA_OVER_ETH is not set
+-CONFIG_MISC_DEVICES=y
+-# CONFIG_PHANTOM is not set
+-# CONFIG_EEPROM_93CX6 is not set
+-# CONFIG_SGI_IOC4 is not set
+-# CONFIG_TIFM_CORE is not set
+-# CONFIG_IDE is not set
+-
+-#
+-# SCSI device support
+-#
+-# CONFIG_RAID_ATTRS is not set
+-CONFIG_SCSI=y
+-CONFIG_SCSI_DMA=y
+-# CONFIG_SCSI_TGT is not set
+-# CONFIG_SCSI_NETLINK is not set
+-# CONFIG_SCSI_PROC_FS is not set
+-
+-#
+-# SCSI support type (disk, tape, CD-ROM)
+-#
+-# CONFIG_BLK_DEV_SD is not set
+-# CONFIG_CHR_DEV_ST is not set
+-# CONFIG_CHR_DEV_OSST is not set
+-# CONFIG_BLK_DEV_SR is not set
+-# 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 is not set
+-# CONFIG_SCSI_FC_ATTRS is not set
+-# CONFIG_SCSI_ISCSI_ATTRS is not set
+-# CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+-CONFIG_SCSI_LOWLEVEL=y
+-# 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_ADVANSYS 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 is not set
+-# CONFIG_SCSI_IPR is not set
+-# 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=y
+-# CONFIG_ATA_NONSTANDARD is not set
+-# CONFIG_SATA_AHCI is not set
+-# CONFIG_SATA_SVW is not set
+-# CONFIG_ATA_PIIX is not set
+-# CONFIG_SATA_MV is not set
+-# CONFIG_SATA_NV is not set
+-# CONFIG_PDC_ADMA is not set
+-# CONFIG_SATA_QSTOR is not set
+-# CONFIG_SATA_PROMISE is not set
+-# CONFIG_SATA_SX4 is not set
+-# CONFIG_SATA_SIL is not set
+-# CONFIG_SATA_SIL24 is not set
+-# CONFIG_SATA_SIS is not set
+-# CONFIG_SATA_ULI is not set
+-# CONFIG_SATA_VIA is not set
+-# CONFIG_SATA_VITESSE is not set
+-# CONFIG_SATA_INIC162X is not set
+-# CONFIG_PATA_ALI is not set
+-# CONFIG_PATA_AMD is not set
+-# CONFIG_PATA_ARTOP is not set
+-# CONFIG_PATA_ATIIXP is not set
+-# CONFIG_PATA_CMD640_PCI is not set
+-# CONFIG_PATA_CMD64X is not set
+-# CONFIG_PATA_CS5520 is not set
+-# CONFIG_PATA_CS5530 is not set
+-# CONFIG_PATA_CYPRESS is not set
+-# CONFIG_PATA_EFAR is not set
+-# CONFIG_ATA_GENERIC is not set
+-# CONFIG_PATA_HPT366 is not set
+-# CONFIG_PATA_HPT37X is not set
+-# CONFIG_PATA_HPT3X2N is not set
+-# CONFIG_PATA_HPT3X3 is not set
+-# CONFIG_PATA_IT821X is not set
+-# CONFIG_PATA_IT8213 is not set
+-# CONFIG_PATA_JMICRON is not set
+-# CONFIG_PATA_TRIFLEX is not set
+-# CONFIG_PATA_MARVELL is not set
+-CONFIG_PATA_MPC52xx=y
+-# CONFIG_PATA_MPIIX is not set
+-# CONFIG_PATA_OLDPIIX is not set
+-# CONFIG_PATA_NETCELL is not set
+-# CONFIG_PATA_NS87410 is not set
+-# CONFIG_PATA_NS87415 is not set
+-# CONFIG_PATA_OPTI is not set
+-# CONFIG_PATA_OPTIDMA is not set
+-# CONFIG_PATA_PDC_OLD is not set
+-# CONFIG_PATA_RADISYS is not set
+-# CONFIG_PATA_RZ1000 is not set
+-# CONFIG_PATA_SC1200 is not set
+-# CONFIG_PATA_SERVERWORKS is not set
+-# CONFIG_PATA_PDC2027X is not set
+-# CONFIG_PATA_SIL680 is not set
+-# CONFIG_PATA_SIS is not set
+-# CONFIG_PATA_VIA is not set
+-# CONFIG_PATA_WINBOND is not set
+-# CONFIG_PATA_PLATFORM is not set
+-# CONFIG_MD is not set
+-# CONFIG_FUSION is not set
+-
+-#
+-# IEEE 1394 (FireWire) support
+-#
+-# CONFIG_FIREWIRE is not set
+-# CONFIG_IEEE1394 is not set
+-# CONFIG_I2O is not set
+-# CONFIG_MACINTOSH_DRIVERS is not set
+-CONFIG_NETDEVICES=y
+-# CONFIG_NETDEVICES_MULTIQUEUE is not set
+-# CONFIG_DUMMY is not set
+-# CONFIG_BONDING is not set
+-# CONFIG_MACVLAN is not set
+-# CONFIG_EQUALIZER is not set
+-# CONFIG_TUN is not set
+-# CONFIG_VETH is not set
+-# CONFIG_IP1000 is not set
+-# CONFIG_ARCNET is not set
+-# CONFIG_NET_ETHERNET is not set
+-CONFIG_NETDEV_1000=y
+-# CONFIG_ACENIC is not set
+-# CONFIG_DL2K is not set
+-# CONFIG_E1000 is not set
+-# CONFIG_E1000E is not set
+-# CONFIG_NS83820 is not set
+-# CONFIG_HAMACHI is not set
+-# CONFIG_YELLOWFIN is not set
+-# CONFIG_R8169 is not set
+-# CONFIG_SIS190 is not set
+-# CONFIG_SKGE is not set
+-# CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+-# CONFIG_VIA_VELOCITY is not set
+-# CONFIG_TIGON3 is not set
+-# CONFIG_BNX2 is not set
+-# CONFIG_MV643XX_ETH is not set
+-# CONFIG_QLA3XXX is not set
+-# CONFIG_ATL1 is not set
+-CONFIG_NETDEV_10000=y
+-# CONFIG_CHELSIO_T1 is not set
+-# CONFIG_CHELSIO_T3 is not set
+-# CONFIG_IXGBE is not set
+-# CONFIG_IXGB is not set
+-# CONFIG_S2IO is not set
+-# CONFIG_MYRI10GE is not set
+-# CONFIG_NETXEN_NIC is not set
+-# CONFIG_NIU is not set
+-# CONFIG_MLX4_CORE is not set
+-# CONFIG_TEHUTI 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
+-# CONFIG_ISDN is not set
+-# CONFIG_PHONE is not set
+-
+-#
+-# Input device support
+-#
+-# CONFIG_INPUT is not set
+-
+-#
+-# Hardware I/O ports
+-#
+-# CONFIG_SERIO is not set
+-# CONFIG_GAMEPORT is not set
+-
+-#
+-# Character devices
+-#
+-# CONFIG_VT is not set
+-# CONFIG_SERIAL_NONSTANDARD is not set
+-
+-#
+-# Serial drivers
+-#
+-# CONFIG_SERIAL_8250 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_MPC52xx=y
+-CONFIG_SERIAL_MPC52xx_CONSOLE=y
+-CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=9600
+-# CONFIG_SERIAL_JSM is not set
+-CONFIG_UNIX98_PTYS=y
+-CONFIG_LEGACY_PTYS=y
+-CONFIG_LEGACY_PTY_COUNT=256
+-# CONFIG_IPMI_HANDLER is not set
+-# CONFIG_HW_RANDOM is not set
+-# CONFIG_NVRAM is not set
+-# CONFIG_GEN_RTC is not set
+-# CONFIG_R3964 is not set
+-# CONFIG_APPLICOM is not set
+-# CONFIG_RAW_DRIVER is not set
+-# 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
+-# CONFIG_W1 is not set
+-# CONFIG_POWER_SUPPLY is not set
+-# CONFIG_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-
+-#
+-# Sonics Silicon Backplane
+-#
+-CONFIG_SSB_POSSIBLE=y
+-# CONFIG_SSB 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_AGP is not set
+-# CONFIG_DRM is not set
+-# CONFIG_VGASTATE is not set
+-CONFIG_VIDEO_OUTPUT_CONTROL=m
+-# CONFIG_FB is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+-
+-#
+-# Sound
+-#
+-# CONFIG_SOUND is not set
+-CONFIG_USB_SUPPORT=y
+-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
+-# CONFIG_NEW_LEDS is not set
+-# CONFIG_INFINIBAND is not set
+-# CONFIG_EDAC is not set
+-# CONFIG_RTC_CLASS is not set
+-
+-#
+-# Userspace I/O
+-#
+-# CONFIG_UIO is not set
+-
+-#
+-# 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=y
+-# CONFIG_EXT3_FS_POSIX_ACL is not set
+-# CONFIG_EXT3_FS_SECURITY is not set
+-# CONFIG_EXT4DEV_FS is not set
+-CONFIG_JBD=y
+-CONFIG_FS_MBCACHE=y
+-# 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=y
+-# 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_MSDOS_FS is not set
+-# CONFIG_VFAT_FS is not set
+-# 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_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
+-CONFIG_NETWORK_FILESYSTEMS=y
+-# 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
+-
+-#
+-# Partition Types
+-#
+-# CONFIG_PARTITION_ADVANCED is not set
+-CONFIG_MSDOS_PARTITION=y
+-# CONFIG_NLS is not set
+-# CONFIG_DLM is not set
+-# CONFIG_UCC_SLOW is not set
+-
+-#
+-# Library routines
+-#
+-# CONFIG_CRC_CCITT is not set
+-# CONFIG_CRC16 is not set
+-# CONFIG_CRC_ITU_T is not set
+-# CONFIG_CRC32 is not set
+-# CONFIG_CRC7 is not set
+-# CONFIG_LIBCRC32C is not set
+-CONFIG_PLIST=y
+-CONFIG_HAS_IOMEM=y
+-CONFIG_HAS_IOPORT=y
+-CONFIG_HAS_DMA=y
+-# CONFIG_INSTRUMENTATION is not set
+-
+-#
+-# Kernel hacking
+-#
+-CONFIG_PRINTK_TIME=y
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+-CONFIG_ENABLE_MUST_CHECK=y
+-# CONFIG_MAGIC_SYSRQ is not set
+-# 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=y
+-CONFIG_SCHED_DEBUG=y
+-# CONFIG_SCHEDSTATS is not set
+-# CONFIG_TIMER_STATS is not set
+-# CONFIG_SLUB_DEBUG_ON 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=y
+-# CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-CONFIG_FORCED_INLINING=y
+-# CONFIG_BOOT_PRINTK_DELAY is not set
+-# CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SAMPLES is not set
+-# CONFIG_DEBUG_STACKOVERFLOW is not set
+-# CONFIG_DEBUG_STACK_USAGE is not set
+-# CONFIG_DEBUG_PAGEALLOC is not set
+-# CONFIG_DEBUGGER is not set
+-# CONFIG_BDI_SWITCH is not set
+-# CONFIG_BOOTX_TEXT is not set
+-# CONFIG_PPC_EARLY_DEBUG is not set
+-
+-#
+-# Security options
+-#
+-# CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+-# CONFIG_CRYPTO is not set
+-CONFIG_PPC_CLOCK=y
+-CONFIG_PPC_LIB_RHEAP=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/makalu_defconfig powerpc.git/arch/powerpc/configs/makalu_defconfig
+--- linux-2.6.24/arch/powerpc/configs/makalu_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/makalu_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,812 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:18:32 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++CONFIG_40x=y
++# CONFIG_44x is not set
++# CONFIG_E200 is not set
++CONFIG_4xx=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++# CONFIG_FAIR_GROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_PPC4xx_PCI_EXPRESS=y
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_EP405 is not set
++# CONFIG_KILAUEA is not set
++CONFIG_MAKALU=y
++# CONFIG_WALNUT is not set
++# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
++CONFIG_405EX=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_MATH_EMULATION is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="kilauea.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x00400000
++
++#
++# 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 is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++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
++CONFIG_CONNECTOR=y
++CONFIG_PROC_EVENTS=y
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=m
++CONFIG_MTD_BLOCK=m
++# CONFIG_MTD_BLOCK_RO is not set
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++CONFIG_MTD_JEDECPROBE=y
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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=35000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_XILINX_SYSACE is not set
++# CONFIG_MISC_DEVICES is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=256
++CONFIG_IBM_NEW_EMAC_TXB=256
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++CONFIG_IBM_NEW_EMAC_RGMII=y
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++CONFIG_IBM_NEW_EMAC_EMAC4=y
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 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_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_PCI=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++CONFIG_SERIAL_8250_EXTENDED=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# 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
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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_JFFS2_FS is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_NLS is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++# CONFIG_INSTRUMENTATION is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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=y
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/mpc5200_defconfig powerpc.git/arch/powerpc/configs/mpc5200_defconfig
+--- linux-2.6.24/arch/powerpc/configs/mpc5200_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/mpc5200_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,1286 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Fri Jan 18 14:19:54 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++CONFIG_6xx=y
++# CONFIG_PPC_85xx 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_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_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_OF=y
++# CONFIG_PPC_UDBG_16550 is not set
++# 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"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++# CONFIG_SYSCTL_SYSCALL is not set
++# CONFIG_KALLSYMS is not set
++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 is not set
++CONFIG_SIGNALFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++
++#
++# Platform support
++#
++CONFIG_PPC_MULTIPLATFORM=y
++# CONFIG_PPC_82xx is not set
++# CONFIG_PPC_83xx is not set
++# CONFIG_PPC_86xx is not set
++CONFIG_CLASSIC32=y
++# CONFIG_PPC_CHRP is not set
++CONFIG_PPC_MPC52xx=y
++CONFIG_PPC_MPC5200=y
++CONFIG_PPC_MPC5200_BUGFIX=y
++CONFIG_PPC_MPC5200_SIMPLE=y
++CONFIG_PPC_EFIKA=y
++CONFIG_PPC_LITE5200=y
++# CONFIG_PPC_PMAC is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_EMBEDDED6xx is not set
++CONFIG_PPC_NATIVE=y
++# CONFIG_UDBG_RTAS_CONSOLE is not set
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++CONFIG_PPC_RTAS=y
++# CONFIG_RTAS_ERROR_LOGGING is not set
++CONFIG_RTAS_PROC=y
++# 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_TAU is not set
++# CONFIG_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_PPC_BESTCOMM=y
++CONFIG_PPC_BESTCOMM_ATA=y
++CONFIG_PPC_BESTCOMM_FEC=y
++CONFIG_PPC_BESTCOMM_GEN_BD=y
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++# CONFIG_CMDLINE_BOOL is not set
++CONFIG_PM=y
++# CONFIG_PM_LEGACY is not set
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_SLEEP=y
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_SUSPEND=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++# CONFIG_HIBERNATION is not set
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE=""
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_GENERIC_ISA_DMA=y
++# CONFIG_PPC_INDIRECT_PCI is not set
++CONFIG_FSL_SOC=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_BOOT_LOAD=0x00800000
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++CONFIG_XFRM_USER=m
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# 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=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP 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=y
++# 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=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++CONFIG_MTD_CONCAT=y
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++CONFIG_MTD_RAM=y
++CONFIG_MTD_ROM=y
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++# CONFIG_BLK_DEV_UB is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=32768
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++CONFIG_SCSI_TGT=y
++# 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 is not set
++CONFIG_CHR_DEV_SG=y
++# 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 is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# 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_ADVANSYS 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 is not set
++# CONFIG_SCSI_IPR is not set
++# 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=y
++# CONFIG_ATA_NONSTANDARD is not set
++# CONFIG_SATA_AHCI is not set
++# CONFIG_SATA_SVW is not set
++# CONFIG_ATA_PIIX is not set
++# CONFIG_SATA_MV is not set
++# CONFIG_SATA_NV is not set
++# CONFIG_PDC_ADMA is not set
++# CONFIG_SATA_QSTOR is not set
++# CONFIG_SATA_PROMISE is not set
++# CONFIG_SATA_SX4 is not set
++# CONFIG_SATA_SIL is not set
++# CONFIG_SATA_SIL24 is not set
++# CONFIG_SATA_SIS is not set
++# CONFIG_SATA_ULI is not set
++# CONFIG_SATA_VIA is not set
++# CONFIG_SATA_VITESSE is not set
++# CONFIG_SATA_INIC162X is not set
++# CONFIG_PATA_ALI is not set
++# CONFIG_PATA_AMD is not set
++# CONFIG_PATA_ARTOP is not set
++# CONFIG_PATA_ATIIXP is not set
++# CONFIG_PATA_CMD640_PCI is not set
++# CONFIG_PATA_CMD64X is not set
++# CONFIG_PATA_CS5520 is not set
++# CONFIG_PATA_CS5530 is not set
++# CONFIG_PATA_CYPRESS is not set
++# CONFIG_PATA_EFAR is not set
++# CONFIG_ATA_GENERIC is not set
++# CONFIG_PATA_HPT366 is not set
++# CONFIG_PATA_HPT37X is not set
++# CONFIG_PATA_HPT3X2N is not set
++# CONFIG_PATA_HPT3X3 is not set
++# CONFIG_PATA_IT821X is not set
++# CONFIG_PATA_IT8213 is not set
++# CONFIG_PATA_JMICRON is not set
++# CONFIG_PATA_TRIFLEX is not set
++# CONFIG_PATA_MARVELL is not set
++CONFIG_PATA_MPC52xx=y
++# CONFIG_PATA_MPIIX is not set
++# CONFIG_PATA_OLDPIIX is not set
++# CONFIG_PATA_NETCELL is not set
++# CONFIG_PATA_NS87410 is not set
++# CONFIG_PATA_NS87415 is not set
++# CONFIG_PATA_OPTI is not set
++# CONFIG_PATA_OPTIDMA is not set
++# CONFIG_PATA_PDC_OLD is not set
++# CONFIG_PATA_RADISYS is not set
++# CONFIG_PATA_RZ1000 is not set
++# CONFIG_PATA_SC1200 is not set
++# CONFIG_PATA_SERVERWORKS is not set
++# CONFIG_PATA_PDC2027X is not set
++# CONFIG_PATA_SIL680 is not set
++# CONFIG_PATA_SIS is not set
++# CONFIG_PATA_VIA is not set
++# CONFIG_PATA_WINBOND is not set
++CONFIG_PATA_PLATFORM=y
++# CONFIG_PATA_OF_PLATFORM is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
++CONFIG_FEC_MPC52xx=y
++CONFIG_FEC_MPC52xx_MDIO=y
++# 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
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET 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
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 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_MPC52xx=y
++CONFIG_SERIAL_MPC52xx_CONSOLE=y
++CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_HVC_RTAS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_I810 is not set
++# CONFIG_I2C_PIIX4 is not set
++CONFIG_I2C_MPC=y
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_PROSAVAGE is not set
++# CONFIG_I2C_SAVAGE4 is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++# CONFIG_I2C_VOODOO3 is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_M41T00 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_AD7418 is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ADT7470 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_I5K_AMB is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_MAX6650 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_SIS5595 is not set
++# CONFIG_SENSORS_DME1737 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_VIA686A is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_VT8231 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++# CONFIG_MPC5200_WDT is not set
++# CONFIG_WATCHDOG_RTAS is not set
++
++#
++# PCI-based Watchdog Cards
++#
++# CONFIG_PCIPCWATCHDOG is not set
++# CONFIG_WDTPCI is not set
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++# CONFIG_USB_DABUSB is not set
++
++#
++# Graphics support
++#
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB_ARCH_HAS_EHCI=y
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++# CONFIG_USB_DEVICE_CLASS is not set
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_SUSPEND is not set
++# CONFIG_USB_PERSIST is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_ISP116X_HCD is not set
++CONFIG_USB_OHCI_HCD=y
++CONFIG_USB_OHCI_HCD_PPC_SOC=y
++CONFIG_USB_OHCI_HCD_PPC_OF=y
++CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
++# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
++CONFIG_USB_OHCI_HCD_PCI=y
++CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
++CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# may also be needed; see USB_STORAGE Help for more information
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++
++#
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++# CONFIG_MMC is not set
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=y
++
++#
++# LED drivers
++#
++
++#
++# LED Triggers
++#
++CONFIG_LEDS_TRIGGERS=y
++CONFIG_LEDS_TRIGGER_TIMER=y
++# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# 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=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++CONFIG_FS_MBCACHE=y
++# 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=y
++# 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=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# 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_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_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++# CONFIG_SUNRPC_BIND34 is not set
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# 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 is not set
++CONFIG_NLS_ISO8859_1=y
++# 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 is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++# CONFIG_INSTRUMENTATION is not set
++
++#
++# Kernel hacking
++#
++CONFIG_PRINTK_TIME=y
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++# CONFIG_MAGIC_SYSRQ is not set
++# 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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_BOOTX_TEXT is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++CONFIG_PPC_CLOCK=y
++CONFIG_PPC_LIB_RHEAP=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/mpc8313_rdb_defconfig powerpc.git/arch/powerpc/configs/mpc8313_rdb_defconfig
+--- linux-2.6.24/arch/powerpc/configs/mpc8313_rdb_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/mpc8313_rdb_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:48:31 2007
++# Linux kernel version: 2.6.24-rc6
++# Thu Jan 17 16:35:55 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -144,6 +144,7 @@
+ # CONFIG_MPC834x_MDS is not set
+ # CONFIG_MPC834x_ITX is not set
+ # CONFIG_MPC836x_MDS is not set
++# CONFIG_MPC837x_MDS is not set
+ CONFIG_PPC_MPC831x=y
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+@@ -336,15 +337,16 @@
+ CONFIG_MTD=y
+ # CONFIG_MTD_DEBUG is not set
+ # CONFIG_MTD_CONCAT is not set
+-# CONFIG_MTD_PARTITIONS is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++# CONFIG_MTD_CMDLINE_PARTS is not set
+
+ #
+ # User Modules And Translation Layers
+ #
+ CONFIG_MTD_CHAR=y
+-# CONFIG_MTD_BLKDEVS is not set
+-# CONFIG_MTD_BLOCK is not set
+-# CONFIG_MTD_BLOCK_RO is not set
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
+ # CONFIG_INFTL is not set
+@@ -381,11 +383,8 @@
+ # Mapping drivers for chip access
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-CONFIG_MTD_PHYSMAP=y
+-CONFIG_MTD_PHYSMAP_START=0xfe000000
+-CONFIG_MTD_PHYSMAP_LEN=0x1000000
+-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+-# CONFIG_MTD_PHYSMAP_OF is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
+ # CONFIG_MTD_INTEL_VR_NOR is not set
+ # CONFIG_MTD_PLATRAM is not set
+
+@@ -406,7 +405,16 @@
+ # CONFIG_MTD_DOC2000 is not set
+ # CONFIG_MTD_DOC2001 is not set
+ # CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
++CONFIG_MTD_NAND=y
++CONFIG_MTD_NAND_VERIFY_WRITE=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++CONFIG_MTD_NAND_IDS=y
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_CAFE is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++# CONFIG_MTD_ALAUDA is not set
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+@@ -1178,7 +1186,17 @@
+ # CONFIG_BEFS_FS is not set
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+-# CONFIG_JFFS2_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+@@ -1242,6 +1260,8 @@
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ # CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
+ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/mpc834x_itx_defconfig powerpc.git/arch/powerpc/configs/mpc834x_itx_defconfig
+--- linux-2.6.24/arch/powerpc/configs/mpc834x_itx_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/mpc834x_itx_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -570,7 +570,8 @@
+ # CONFIG_PATA_SIS is not set
+ # CONFIG_PATA_VIA is not set
+ # CONFIG_PATA_WINBOND is not set
+-# CONFIG_PATA_PLATFORM is not set
++CONFIG_PATA_PLATFORM=y
++CONFIG_PATA_OF_PLATFORM=y
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+ CONFIG_MD_LINEAR=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/mpc837x_mds_defconfig powerpc.git/arch/powerpc/configs/mpc837x_mds_defconfig
+--- linux-2.6.24/arch/powerpc/configs/mpc837x_mds_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/mpc837x_mds_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,878 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.23
++# Wed Oct 10 16:31:39 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++CONFIG_6xx=y
++# CONFIG_PPC_85xx 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_83xx=y
++CONFIG_PPC_FPU=y
++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_ARCH_NO_VIRT_TO_BUS is not set
++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_OF=y
++CONFIG_PPC_UDBG_16550=y
++# CONFIG_GENERIC_TBSYNC is not set
++CONFIG_AUDIT_ARCH=y
++CONFIG_GENERIC_BUG=y
++CONFIG_DEFAULT_UIMAGE=y
++# CONFIG_PPC_DCR_NATIVE is not set
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++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 is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++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 is not set
++CONFIG_SIGNALFD=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
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++
++#
++# Platform support
++#
++# CONFIG_PPC_MULTIPLATFORM is not set
++# CONFIG_EMBEDDED6xx is not set
++# CONFIG_PPC_82xx is not set
++CONFIG_PPC_83xx=y
++# CONFIG_PPC_86xx is not set
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_MPC8313_RDB is not set
++# CONFIG_MPC832x_MDS is not set
++# CONFIG_MPC832x_RDB is not set
++# CONFIG_MPC834x_MDS is not set
++# CONFIG_MPC834x_ITX is not set
++# CONFIG_MPC836x_MDS is not set
++CONFIG_MPC837x_MDS=y
++CONFIG_PPC_MPC837x=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_FSL_SERDES=y
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_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_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++# CONFIG_CMDLINE_BOOL is not set
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE=""
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_GENERIC_ISA_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_FSL_SOC=y
++# CONFIG_PCI is not set
++# CONFIG_PCI_DOMAINS is not set
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD 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_XFRM=y
++CONFIG_XFRM_USER=m
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# 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=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP 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=y
++# 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=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_MTD is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=32768
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=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 is not set
++CONFIG_CHR_DEV_SG=y
++# 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 is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_SCSI_DEBUG is not set
++CONFIG_ATA=y
++# CONFIG_ATA_NONSTANDARD is not set
++CONFIG_SATA_FSL=y
++# CONFIG_PATA_PLATFORM is not set
++# CONFIG_MD is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++CONFIG_MARVELL_PHY=y
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++# CONFIG_SMSC_PHY is not set
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_FIXED_PHY is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_NETDEV_1000=y
++CONFIG_GIANFAR=y
++# CONFIG_GFAR_NAPI is not set
++CONFIG_NETDEV_10000=y
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP 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
++# CONFIG_ISDN is not set
++# 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 is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++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_OF_PLATFORM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++CONFIG_83xx_WDT=y
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++CONFIG_I2C_MPC=y
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_M41T00 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_ABITUGURU is not set
++# CONFIG_SENSORS_ABITUGURU3 is not set
++# CONFIG_SENSORS_AD7418 is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ASB100 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_FSCHER is not set
++# CONFIG_SENSORS_FSCPOS is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_MAX6650 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_DME1737 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP 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=y
++
++#
++# Graphics support
++#
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_FB_IBM_GXT4500 is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
++# CONFIG_HID_DEBUG is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++# CONFIG_USB_ARCH_HAS_OHCI is not set
++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
++# CONFIG_NEW_LEDS is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# DMA Engine support
++#
++# CONFIG_DMA_ENGINE is not set
++
++#
++# DMA Clients
++#
++
++#
++# DMA Devices
++#
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# 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=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++# CONFIG_JBD_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++# CONFIG_SUNRPC_BIND34 is not set
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# 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 is not set
++
++#
++# 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_CRC7 is not set
++# 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=y
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_KERNEL is not set
++# CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=m
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++CONFIG_CRYPTO_HW=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/mpc8610_hpcd_defconfig powerpc.git/arch/powerpc/configs/mpc8610_hpcd_defconfig
+--- linux-2.6.24/arch/powerpc/configs/mpc8610_hpcd_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/mpc8610_hpcd_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -696,7 +696,7 @@
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+-CONFIG_SERIAL_OF_PLATFORM=y
++# CONFIG_SERIAL_OF_PLATFORM is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+@@ -708,7 +708,60 @@
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+-# CONFIG_I2C is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_CHARDEV is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_I810 is not set
++# CONFIG_I2C_PIIX4 is not set
++CONFIG_I2C_MPC=y
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_PROSAVAGE is not set
++# CONFIG_I2C_SAVAGE4 is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++# CONFIG_I2C_VOODOO3 is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_M41T00 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
+
+ #
+ # SPI support
+@@ -763,7 +816,119 @@
+ #
+ # Sound
+ #
+-# CONFIG_SOUND is not set
++CONFIG_SOUND=y
++
++#
++# Advanced Linux Sound Architecture
++#
++CONFIG_SND=y
++CONFIG_SND_TIMER=y
++CONFIG_SND_PCM=y
++# CONFIG_SND_SEQUENCER is not set
++CONFIG_SND_OSSEMUL=y
++CONFIG_SND_MIXER_OSS=y
++CONFIG_SND_PCM_OSS=y
++# CONFIG_SND_PCM_OSS_PLUGINS is not set
++# CONFIG_SND_DYNAMIC_MINORS is not set
++# CONFIG_SND_SUPPORT_OLD_API is not set
++CONFIG_SND_VERBOSE_PROCFS=y
++# CONFIG_SND_VERBOSE_PRINTK is not set
++# CONFIG_SND_DEBUG is not set
++
++#
++# Generic devices
++#
++# CONFIG_SND_DUMMY is not set
++# CONFIG_SND_MTPAV is not set
++# CONFIG_SND_SERIAL_U16550 is not set
++# CONFIG_SND_MPU401 is not set
++
++#
++# PCI devices
++#
++# CONFIG_SND_AD1889 is not set
++# CONFIG_SND_ALS300 is not set
++# CONFIG_SND_ALS4000 is not set
++# CONFIG_SND_ALI5451 is not set
++# CONFIG_SND_ATIIXP is not set
++# CONFIG_SND_ATIIXP_MODEM is not set
++# CONFIG_SND_AU8810 is not set
++# CONFIG_SND_AU8820 is not set
++# CONFIG_SND_AU8830 is not set
++# CONFIG_SND_AZT3328 is not set
++# CONFIG_SND_BT87X is not set
++# CONFIG_SND_CA0106 is not set
++# CONFIG_SND_CMIPCI is not set
++# CONFIG_SND_CS4281 is not set
++# CONFIG_SND_CS46XX is not set
++# CONFIG_SND_CS5530 is not set
++# CONFIG_SND_DARLA20 is not set
++# CONFIG_SND_GINA20 is not set
++# CONFIG_SND_LAYLA20 is not set
++# CONFIG_SND_DARLA24 is not set
++# CONFIG_SND_GINA24 is not set
++# CONFIG_SND_LAYLA24 is not set
++# CONFIG_SND_MONA is not set
++# CONFIG_SND_MIA is not set
++# CONFIG_SND_ECHO3G is not set
++# CONFIG_SND_INDIGO is not set
++# CONFIG_SND_INDIGOIO is not set
++# CONFIG_SND_INDIGODJ is not set
++# CONFIG_SND_EMU10K1 is not set
++# CONFIG_SND_EMU10K1X is not set
++# CONFIG_SND_ENS1370 is not set
++# CONFIG_SND_ENS1371 is not set
++# CONFIG_SND_ES1938 is not set
++# CONFIG_SND_ES1968 is not set
++# CONFIG_SND_FM801 is not set
++# CONFIG_SND_HDA_INTEL is not set
++# CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
++# CONFIG_SND_ICE1712 is not set
++# CONFIG_SND_ICE1724 is not set
++# CONFIG_SND_INTEL8X0 is not set
++# CONFIG_SND_INTEL8X0M is not set
++# CONFIG_SND_KORG1212 is not set
++# CONFIG_SND_MAESTRO3 is not set
++# CONFIG_SND_MIXART is not set
++# CONFIG_SND_NM256 is not set
++# CONFIG_SND_PCXHR is not set
++# CONFIG_SND_RIPTIDE is not set
++# CONFIG_SND_RME32 is not set
++# CONFIG_SND_RME96 is not set
++# CONFIG_SND_RME9652 is not set
++# CONFIG_SND_SONICVIBES is not set
++# CONFIG_SND_TRIDENT is not set
++# CONFIG_SND_VIA82XX is not set
++# CONFIG_SND_VIA82XX_MODEM is not set
++# CONFIG_SND_VX222 is not set
++# CONFIG_SND_YMFPCI is not set
++
++#
++# ALSA PowerMac devices
++#
++
++#
++# ALSA PowerPC devices
++#
++
++#
++# System on Chip audio support
++#
++CONFIG_SND_SOC=y
++
++#
++# SoC Audio support for SuperH
++#
++
++#
++# ALSA SoC audio for Freescale SOCs
++#
++CONFIG_SND_SOC_MPC8610=y
++CONFIG_SND_SOC_MPC8610_HPCD=y
++CONFIG_SND_SOC_CS4270=y
++CONFIG_SND_SOC_CS4270_VD33_ERRATA=y
++
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/pasemi_defconfig powerpc.git/arch/powerpc/configs/pasemi_defconfig
+--- linux-2.6.24/arch/powerpc/configs/pasemi_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/pasemi_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:49:03 2007
++# Linux kernel version: 2.6.24-rc6
++# Tue Jan 15 10:26:10 2008
+ #
+ CONFIG_PPC64=y
+
+@@ -152,7 +152,6 @@
+ CONFIG_PPC_PASEMI_IOMMU=y
+ # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
+ CONFIG_PPC_PASEMI_MDIO=y
+-CONFIG_ELECTRA_IDE=y
+ # CONFIG_PPC_CELLEB is not set
+ # CONFIG_PPC_PS3 is not set
+ # CONFIG_PPC_CELL is not set
+@@ -256,7 +255,7 @@
+ CONFIG_PCI_SYSCALL=y
+ # CONFIG_PCIEPORTBUS is not set
+ CONFIG_ARCH_SUPPORTS_MSI=y
+-# CONFIG_PCI_MSI is not set
++CONFIG_PCI_MSI=y
+ CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+ CONFIG_PCCARD=y
+@@ -663,7 +662,26 @@
+ # CONFIG_PATA_VIA is not set
+ # CONFIG_PATA_WINBOND is not set
+ CONFIG_PATA_PLATFORM=y
+-# CONFIG_MD is not set
++CONFIG_PATA_OF_PLATFORM=y
++CONFIG_MD=y
++CONFIG_BLK_DEV_MD=y
++CONFIG_MD_LINEAR=y
++CONFIG_MD_RAID0=y
++CONFIG_MD_RAID1=y
++CONFIG_MD_RAID10=y
++CONFIG_MD_RAID456=y
++CONFIG_MD_RAID5_RESHAPE=y
++# CONFIG_MD_MULTIPATH is not set
++# CONFIG_MD_FAULTY is not set
++CONFIG_BLK_DEV_DM=y
++# CONFIG_DM_DEBUG is not set
++CONFIG_DM_CRYPT=y
++# CONFIG_DM_SNAPSHOT is not set
++# CONFIG_DM_MIRROR is not set
++# CONFIG_DM_ZERO is not set
++# CONFIG_DM_MULTIPATH is not set
++# CONFIG_DM_DELAY is not set
++# CONFIG_DM_UEVENT is not set
+ # CONFIG_FUSION is not set
+
+ #
+@@ -1686,6 +1704,10 @@
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_XOR_BLOCKS=y
++CONFIG_ASYNC_CORE=y
++CONFIG_ASYNC_MEMCPY=y
++CONFIG_ASYNC_XOR=y
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/ppc64_defconfig powerpc.git/arch/powerpc/configs/ppc64_defconfig
+--- linux-2.6.24/arch/powerpc/configs/ppc64_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/ppc64_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+ # Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:49:07 2007
++# Fri Dec 21 14:47:29 2007
+ #
+ CONFIG_PPC64=y
+
+@@ -211,7 +211,7 @@
+ CONFIG_MPIC_U3_HT_IRQS=y
+ CONFIG_MPIC_BROKEN_REGREAD=y
+ CONFIG_IBMVIO=y
+-# CONFIG_IBMEBUS is not set
++CONFIG_IBMEBUS=y
+ # CONFIG_PPC_MPC106 is not set
+ CONFIG_PPC_970_NAP=y
+ CONFIG_PPC_INDIRECT_IO=y
+@@ -375,7 +375,7 @@
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
+-# CONFIG_INET_LRO is not set
++CONFIG_INET_LRO=m
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+ # CONFIG_TCP_CONG_ADVANCED is not set
+@@ -929,6 +929,7 @@
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+ # CONFIG_CHELSIO_T3 is not set
++CONFIG_EHEA=m
+ # CONFIG_IXGBE is not set
+ CONFIG_IXGB=m
+ # CONFIG_IXGB_NAPI is not set
+@@ -1558,6 +1559,7 @@
+ CONFIG_INFINIBAND_MTHCA=m
+ CONFIG_INFINIBAND_MTHCA_DEBUG=y
+ # CONFIG_INFINIBAND_IPATH is not set
++CONFIG_INFINIBAND_EHCA=m
+ # CONFIG_INFINIBAND_AMSO1100 is not set
+ # CONFIG_MLX4_INFINIBAND is not set
+ CONFIG_INFINIBAND_IPOIB=m
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/ps3_defconfig powerpc.git/arch/powerpc/configs/ps3_defconfig
+--- linux-2.6.24/arch/powerpc/configs/ps3_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/ps3_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Tue Dec 4 22:49:57 2007
++# Linux kernel version: 2.6.24-rc8
++# Wed Jan 16 14:31:21 2008
+ #
+ CONFIG_PPC64=y
+
+@@ -103,6 +103,7 @@
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
++CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+@@ -154,7 +155,6 @@
+ # CONFIG_PS3_ADVANCED is not set
+ CONFIG_PS3_HTAB_SIZE=20
+ # CONFIG_PS3_DYNAMIC_DMA is not set
+-CONFIG_PS3_USE_LPAR_ADDR=y
+ CONFIG_PS3_VUART=y
+ CONFIG_PS3_PS3AV=y
+ CONFIG_PS3_SYS_MANAGER=y
+@@ -162,6 +162,7 @@
+ CONFIG_PS3_DISK=y
+ CONFIG_PS3_ROM=y
+ CONFIG_PS3_FLASH=y
++CONFIG_PS3_LPM=m
+ CONFIG_PPC_CELL=y
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
+@@ -225,7 +226,7 @@
+ # CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPARSEMEM_EXTREME=y
+ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+-CONFIG_SPARSEMEM_VMEMMAP=y
++# CONFIG_SPARSEMEM_VMEMMAP is not set
+ CONFIG_MEMORY_HOTPLUG=y
+ CONFIG_MEMORY_HOTPLUG_SPARSE=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+@@ -338,7 +339,26 @@
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
+ # CONFIG_IRDA is not set
+-# CONFIG_BT is not set
++CONFIG_BT=m
++CONFIG_BT_L2CAP=m
++CONFIG_BT_SCO=m
++CONFIG_BT_RFCOMM=m
++CONFIG_BT_RFCOMM_TTY=y
++CONFIG_BT_BNEP=m
++CONFIG_BT_BNEP_MC_FILTER=y
++CONFIG_BT_BNEP_PROTO_FILTER=y
++CONFIG_BT_HIDP=m
++
++#
++# Bluetooth device drivers
++#
++CONFIG_BT_HCIUSB=m
++CONFIG_BT_HCIUSB_SCO=y
++# CONFIG_BT_HCIUART is not set
++# CONFIG_BT_HCIBCM203X is not set
++# CONFIG_BT_HCIBPA10X is not set
++# CONFIG_BT_HCIBFUSB is not set
++# CONFIG_BT_HCIVHCI is not set
+ # CONFIG_AF_RXRPC is not set
+
+ #
+@@ -666,14 +686,14 @@
+ #
+ # Sound
+ #
+-CONFIG_SOUND=y
++CONFIG_SOUND=m
+
+ #
+ # Advanced Linux Sound Architecture
+ #
+-CONFIG_SND=y
+-CONFIG_SND_TIMER=y
+-CONFIG_SND_PCM=y
++CONFIG_SND=m
++CONFIG_SND_TIMER=m
++CONFIG_SND_PCM=m
+ # CONFIG_SND_SEQUENCER is not set
+ # CONFIG_SND_MIXER_OSS is not set
+ # CONFIG_SND_PCM_OSS is not set
+@@ -702,7 +722,7 @@
+ #
+ # ALSA PowerPC devices
+ #
+-CONFIG_SND_PS3=y
++CONFIG_SND_PS3=m
+ CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
+
+ #
+@@ -747,7 +767,7 @@
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+-CONFIG_USB=y
++CONFIG_USB=m
+ # CONFIG_USB_DEBUG is not set
+
+ #
+@@ -761,13 +781,13 @@
+ #
+ # USB Host Controller Drivers
+ #
+-CONFIG_USB_EHCI_HCD=y
++CONFIG_USB_EHCI_HCD=m
+ # CONFIG_USB_EHCI_SPLIT_ISO is not set
+ # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
+ # CONFIG_USB_ISP116X_HCD is not set
+-CONFIG_USB_OHCI_HCD=y
++CONFIG_USB_OHCI_HCD=m
+ # CONFIG_USB_OHCI_HCD_PPC_OF is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+ CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
+@@ -1033,7 +1053,8 @@
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
+ CONFIG_INSTRUMENTATION=y
+-# CONFIG_PROFILING is not set
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
+ # CONFIG_KPROBES is not set
+ # CONFIG_MARKERS is not set
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/rainier_defconfig powerpc.git/arch/powerpc/configs/rainier_defconfig
+--- linux-2.6.24/arch/powerpc/configs/rainier_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/rainier_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,873 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:22:40 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_40x is not set
++CONFIG_44x=y
++# CONFIG_E200 is not set
++CONFIG_4xx=y
++CONFIG_BOOKE=y
++CONFIG_PTE_64BIT=y
++CONFIG_PHYS_64BIT=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_BAMBOO is not set
++# CONFIG_EBONY is not set
++# CONFIG_SEQUOIA is not set
++# CONFIG_TAISHAN is not set
++# CONFIG_KATMAI is not set
++CONFIG_RAINIER=y
++CONFIG_440GRX=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_MATH_EMULATION=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_RESOURCES_64BIT=y
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE=""
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="rainier.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x01000000
++
++#
++# 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 is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++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
++CONFIG_CONNECTOR=y
++CONFIG_PROC_EVENTS=y
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++# CONFIG_MTD_BLKDEVS is not set
++# CONFIG_MTD_BLOCK is not set
++# CONFIG_MTD_BLOCK_RO is not set
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++CONFIG_MTD_JEDECPROBE=y
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++CONFIG_MTD_CFI_INTELEXT=y
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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=35000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_XILINX_SYSACE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++CONFIG_MACINTOSH_DRIVERS=y
++# CONFIG_MAC_EMUMOUSEBTN is not set
++# CONFIG_WINDFARM is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_NET_ETHERNET is not set
++CONFIG_IBM_NEW_EMAC_ZMII=y
++CONFIG_IBM_NEW_EMAC_RGMII=y
++CONFIG_IBM_NEW_EMAC_EMAC4=y
++CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 is not set
++CONFIG_NETDEV_10000=y
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_CHELSIO_T3 is not set
++# CONFIG_IXGBE is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++# CONFIG_NETXEN_NIC is not set
++# CONFIG_NIU is not set
++# CONFIG_MLX4_CORE is not set
++# CONFIG_TEHUTI 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_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT 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=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# 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
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++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
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_NLS is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_KPROBES is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES 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_KGDB is not set
++# CONFIG_XMON is not set
++# CONFIG_BDI_SWITCH is not set
++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=y
++# CONFIG_PPC_EARLY_DEBUG_40x is not set
++# CONFIG_PPC_EARLY_DEBUG_CPM is not set
++CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
++CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/sequoia_defconfig powerpc.git/arch/powerpc/configs/sequoia_defconfig
+--- linux-2.6.24/arch/powerpc/configs/sequoia_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/sequoia_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:49:17 2007
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:23:22 2007
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -129,6 +129,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
+
+ #
+ # Platform support
+@@ -141,8 +142,10 @@
+ # CONFIG_BAMBOO is not set
+ # CONFIG_EBONY is not set
+ CONFIG_SEQUOIA=y
++# CONFIG_TAISHAN is not set
++# CONFIG_KATMAI is not set
++# CONFIG_RAINIER is not set
+ CONFIG_440EPX=y
+-CONFIG_440A=y
+ # CONFIG_MPIC is not set
+ # CONFIG_MPIC_WEIRD is not set
+ # CONFIG_PPC_I8259 is not set
+@@ -446,9 +449,7 @@
+ # CONFIG_FIREWIRE is not set
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+-CONFIG_MACINTOSH_DRIVERS=y
+-# CONFIG_MAC_EMUMOUSEBTN is not set
+-# CONFIG_WINDFARM is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+@@ -459,10 +460,28 @@
+ # CONFIG_VETH is not set
+ # CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+-# CONFIG_NET_ETHERNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=128
++CONFIG_IBM_NEW_EMAC_TXB=64
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
+ CONFIG_IBM_NEW_EMAC_ZMII=y
+ CONFIG_IBM_NEW_EMAC_RGMII=y
++# CONFIG_IBM_NEW_EMAC_TAH is not set
+ CONFIG_IBM_NEW_EMAC_EMAC4=y
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
+ # CONFIG_ACENIC is not set
+ # CONFIG_DL2K is not set
+@@ -811,6 +830,7 @@
+ # CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
+ # CONFIG_PPC_EARLY_DEBUG_BEAT is not set
+ CONFIG_PPC_EARLY_DEBUG_44x=y
++# CONFIG_PPC_EARLY_DEBUG_40x is not set
+ # CONFIG_PPC_EARLY_DEBUG_CPM is not set
+ CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
+ CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/storcenter_defconfig powerpc.git/arch/powerpc/configs/storcenter_defconfig
+--- linux-2.6.24/arch/powerpc/configs/storcenter_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/storcenter_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,1174 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Tue Jan 8 09:33:54 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++CONFIG_6xx=y
++# CONFIG_PPC_85xx 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_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_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++# CONFIG_KALLSYMS is not set
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++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_PPC_82xx is not set
++# CONFIG_PPC_83xx is not set
++# CONFIG_PPC_86xx is not set
++CONFIG_CLASSIC32=y
++# 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_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++CONFIG_EMBEDDED6xx=y
++# CONFIG_LINKSTATION is not set
++CONFIG_STORCENTER=y
++# CONFIG_MPC7448HPC2 is not set
++# CONFIG_PPC_HOLLY is not set
++# CONFIG_PPC_PRPMC2800 is not set
++CONFIG_MPC10X_BRIDGE=y
++CONFIG_MPC10X_OPENPIC=y
++# CONFIG_MPC10X_STORE_GATHERING is not set
++CONFIG_MPIC=y
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_TAU is not set
++# CONFIG_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++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=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++# CONFIG_KEXEC is not set
++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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttyS0,115200"
++# CONFIG_PM is not set
++CONFIG_SUSPEND_UP_POSSIBLE=y
++CONFIG_HIBERNATION_UP_POSSIBLE=y
++# CONFIG_SECCOMP is not set
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="storcenter.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_GENERIC_ISA_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_FSL_SOC=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# 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=0xc0000000
++CONFIG_BOOT_LOAD=0x00800000
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=m
++# 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=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_FW_LOADER is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++# CONFIG_MTD_CMDLINE_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++CONFIG_FTL=y
++CONFIG_NFTL=y
++CONFIG_NFTL_RW=y
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=y
++CONFIG_MTD_PHYSMAP_START=0xFF800000
++CONFIG_MTD_PHYSMAP_LEN=0x00800000
++CONFIG_MTD_PHYSMAP_BANKWIDTH=1
++# CONFIG_MTD_PHYSMAP_OF is not set
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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_UB is not set
++# CONFIG_BLK_DEV_RAM is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++CONFIG_IDE=y
++CONFIG_IDE_MAX_HWIFS=4
++CONFIG_BLK_DEV_IDE=y
++
++#
++# Please see Documentation/ide.txt for help/info on IDE drives
++#
++# CONFIG_BLK_DEV_IDE_SATA is not set
++CONFIG_BLK_DEV_IDEDISK=y
++CONFIG_IDEDISK_MULTI_MODE=y
++# CONFIG_BLK_DEV_IDECD is not set
++# CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++# CONFIG_BLK_DEV_IDESCSI is not set
++# CONFIG_IDE_TASK_IOCTL is not set
++CONFIG_IDE_PROC_FS=y
++
++#
++# IDE chipset support/bugfixes
++#
++CONFIG_IDE_GENERIC=y
++# CONFIG_BLK_DEV_PLATFORM is not set
++
++#
++# PCI IDE chipsets support
++#
++CONFIG_BLK_DEV_IDEPCI=y
++# CONFIG_IDEPCI_SHARE_IRQ is not set
++CONFIG_IDEPCI_PCIBUS_ORDER=y
++# CONFIG_BLK_DEV_GENERIC is not set
++# CONFIG_BLK_DEV_OPTI621 is not set
++CONFIG_BLK_DEV_IDEDMA_PCI=y
++# CONFIG_BLK_DEV_AEC62XX is not set
++# CONFIG_BLK_DEV_ALI15X3 is not set
++# CONFIG_BLK_DEV_AMD74XX is not set
++# CONFIG_BLK_DEV_CMD64X is not set
++# CONFIG_BLK_DEV_TRIFLEX is not set
++# CONFIG_BLK_DEV_CY82C693 is not set
++# CONFIG_BLK_DEV_CS5520 is not set
++# CONFIG_BLK_DEV_CS5530 is not set
++# CONFIG_BLK_DEV_HPT34X is not set
++# CONFIG_BLK_DEV_HPT366 is not set
++# CONFIG_BLK_DEV_JMICRON is not set
++# CONFIG_BLK_DEV_SC1200 is not set
++# CONFIG_BLK_DEV_PIIX is not set
++# CONFIG_BLK_DEV_IT8213 is not set
++# CONFIG_BLK_DEV_IT821X is not set
++# CONFIG_BLK_DEV_NS87415 is not set
++# CONFIG_BLK_DEV_PDC202XX_OLD is not set
++# CONFIG_BLK_DEV_PDC202XX_NEW is not set
++# CONFIG_BLK_DEV_SVWKS is not set
++# CONFIG_BLK_DEV_SIIMAGE is not set
++# CONFIG_BLK_DEV_SL82C105 is not set
++# CONFIG_BLK_DEV_SLC90E66 is not set
++# CONFIG_BLK_DEV_TRM290 is not set
++CONFIG_BLK_DEV_VIA82CXXX=y
++# CONFIG_BLK_DEV_TC86C001 is not set
++# CONFIG_IDE_ARM is not set
++CONFIG_BLK_DEV_IDEDMA=y
++CONFIG_IDE_ARCH_OBSOLETE_INIT=y
++# CONFIG_BLK_DEV_HD is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=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 is not set
++# 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_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# 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_ADVANSYS 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 is not set
++# 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
++CONFIG_MD=y
++CONFIG_BLK_DEV_MD=y
++CONFIG_MD_LINEAR=y
++CONFIG_MD_RAID0=y
++CONFIG_MD_RAID1=y
++# CONFIG_MD_RAID10 is not set
++CONFIG_MD_RAID456=y
++CONFIG_MD_RAID5_RESHAPE=y
++# CONFIG_MD_MULTIPATH is not set
++# CONFIG_MD_FAULTY is not set
++# CONFIG_BLK_DEV_DM is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++CONFIG_DUMMY=m
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_NET_ETHERNET is not set
++CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++CONFIG_R8169=y
++# CONFIG_R8169_NAPI is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_MV643XX_ETH is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 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
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET 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
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT 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=2
++CONFIG_SERIAL_8250_RUNTIME_UARTS=2
++# 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 is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=m
++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_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_I810 is not set
++# CONFIG_I2C_PIIX4 is not set
++CONFIG_I2C_MPC=y
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_PROSAVAGE is not set
++# CONFIG_I2C_SAVAGE4 is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++# CONFIG_I2C_VOODOO3 is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_M41T00 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB_ARCH_HAS_EHCI=y
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++CONFIG_USB_EHCI_HCD=y
++# CONFIG_USB_EHCI_SPLIT_ISO is not set
++# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
++# CONFIG_USB_EHCI_TT_NEWSCHED is not set
++# CONFIG_USB_ISP116X_HCD is not set
++CONFIG_USB_OHCI_HCD=y
++# CONFIG_USB_OHCI_HCD_PPC_OF is not set
++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++# CONFIG_USB_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# may also be needed; see USB_STORAGE Help for more information
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++# CONFIG_USB_MON is not set
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_SISUSBVGA is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++
++#
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++CONFIG_RTC_LIB=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_HCTOSYS=y
++CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
++# CONFIG_RTC_DEBUG is not set
++
++#
++# RTC interfaces
++#
++CONFIG_RTC_INTF_SYSFS=y
++CONFIG_RTC_INTF_PROC=y
++CONFIG_RTC_INTF_DEV=y
++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
++# CONFIG_RTC_DRV_TEST is not set
++
++#
++# I2C RTC drivers
++#
++CONFIG_RTC_DRV_DS1307=y
++# CONFIG_RTC_DRV_DS1374 is not set
++# CONFIG_RTC_DRV_DS1672 is not set
++# CONFIG_RTC_DRV_MAX6900 is not set
++# CONFIG_RTC_DRV_RS5C372 is not set
++# CONFIG_RTC_DRV_ISL1208 is not set
++# CONFIG_RTC_DRV_X1205 is not set
++# CONFIG_RTC_DRV_PCF8563 is not set
++# CONFIG_RTC_DRV_PCF8583 is not set
++# CONFIG_RTC_DRV_M41T80 is not set
++
++#
++# SPI RTC drivers
++#
++
++#
++# Platform RTC drivers
++#
++# CONFIG_RTC_DRV_CMOS is not set
++# CONFIG_RTC_DRV_DS1553 is not set
++# CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_DS1742 is not set
++# CONFIG_RTC_DRV_M48T86 is not set
++# CONFIG_RTC_DRV_M48T59 is not set
++# CONFIG_RTC_DRV_V3020 is not set
++
++#
++# on-CPU RTC drivers
++#
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# 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=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++CONFIG_XFS_FS=m
++# CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
++# CONFIG_XFS_POSIX_ACL is not set
++# CONFIG_XFS_RT 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN 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
++# CONFIG_NETWORK_FILESYSTEMS 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
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="utf8"
++CONFIG_NLS_CODEPAGE_437=y
++# 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 is not set
++CONFIG_NLS_ISO8859_1=y
++# 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
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++# CONFIG_ENABLE_WARN_DEPRECATED is not set
++# CONFIG_ENABLE_MUST_CHECK is not set
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_KERNEL is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_DEBUG_BUGVERBOSE is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_BOOTX_TEXT is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_XOR_BLOCKS=y
++CONFIG_ASYNC_CORE=y
++CONFIG_ASYNC_MEMCPY=y
++CONFIG_ASYNC_XOR=y
++# CONFIG_CRYPTO is not set
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/taishan_defconfig powerpc.git/arch/powerpc/configs/taishan_defconfig
+--- linux-2.6.24/arch/powerpc/configs/taishan_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/taishan_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,790 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:23:39 2007
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_40x is not set
++CONFIG_44x=y
++# CONFIG_E200 is not set
++CONFIG_4xx=y
++CONFIG_BOOKE=y
++CONFIG_PTE_64BIT=y
++CONFIG_PHYS_64BIT=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++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_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLUB_DEBUG=y
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_BAMBOO is not set
++# CONFIG_EBONY is not set
++# CONFIG_SEQUOIA is not set
++CONFIG_TAISHAN=y
++# CONFIG_KATMAI is not set
++# CONFIG_RAINIER is not set
++CONFIG_440GX=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++# CONFIG_HZ_300 is not set
++# CONFIG_HZ_1000 is not set
++CONFIG_HZ=250
++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_MATH_EMULATION is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_RESOURCES_64BIT=y
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE=""
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="taishan.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++# 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x01000000
++
++#
++# 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 is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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_LRO 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++CONFIG_STANDALONE=y
++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
++CONFIG_CONNECTOR=y
++CONFIG_PROC_EVENTS=y
++# CONFIG_MTD is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD is not set
++# 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=35000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++# CONFIG_XILINX_SYSACE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++# CONFIG_SCSI is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++CONFIG_MACINTOSH_DRIVERS=y
++# CONFIG_MAC_EMUMOUSEBTN is not set
++# CONFIG_WINDFARM is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++# CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=128
++CONFIG_IBM_NEW_EMAC_TXB=64
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++CONFIG_IBM_NEW_EMAC_ZMII=y
++CONFIG_IBM_NEW_EMAC_RGMII=y
++CONFIG_IBM_NEW_EMAC_TAH=y
++CONFIG_IBM_NEW_EMAC_EMAC4=y
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
++CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 is not set
++CONFIG_NETDEV_10000=y
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_CHELSIO_T3 is not set
++# CONFIG_IXGBE is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++# CONFIG_NETXEN_NIC is not set
++# CONFIG_NIU is not set
++# CONFIG_MLX4_CORE is not set
++# CONFIG_TEHUTI 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_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT 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=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# 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
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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=y
++
++#
++# Graphics support
++#
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++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
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# 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_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=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_NLS is not set
++# 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_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_KPROBES is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++# CONFIG_SLUB_DEBUG_ON 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_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES 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_KGDB is not set
++# CONFIG_XMON is not set
++# CONFIG_BDI_SWITCH is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=y
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/walnut_defconfig powerpc.git/arch/powerpc/configs/walnut_defconfig
+--- linux-2.6.24/arch/powerpc/configs/walnut_defconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/walnut_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc4
+-# Thu Dec 6 16:49:33 2007
++# Linux kernel version: 2.6.24-rc6
++# Mon Dec 24 11:23:58 2007
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -40,7 +40,7 @@
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+-# CONFIG_PPC_UDBG_16550 is not set
++CONFIG_PPC_UDBG_16550=y
+ # CONFIG_GENERIC_TBSYNC is not set
+ CONFIG_AUDIT_ARCH=y
+ CONFIG_GENERIC_BUG=y
+@@ -127,6 +127,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++# CONFIG_PPC4xx_PCI_EXPRESS is not set
+
+ #
+ # Platform support
+@@ -136,7 +137,9 @@
+ # CONFIG_PPC_CELL is not set
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PQ2ADS is not set
++# CONFIG_EP405 is not set
+ # CONFIG_KILAUEA is not set
++# CONFIG_MAKALU is not set
+ CONFIG_WALNUT=y
+ # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
+ CONFIG_405GP=y
+@@ -204,11 +207,17 @@
+ # Bus options
+ #
+ CONFIG_ZONE_DMA=y
+-# CONFIG_PCI is not set
+-# CONFIG_PCI_DOMAINS is not set
+-# CONFIG_PCI_SYSCALL is not set
+-# CONFIG_ARCH_SUPPORTS_MSI is not set
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_SYSCALL=y
++# CONFIG_PCIEPORTBUS is not set
++CONFIG_ARCH_SUPPORTS_MSI=y
++# CONFIG_PCI_MSI is not set
++# CONFIG_PCI_LEGACY is not set
++# CONFIG_PCI_DEBUG is not set
+ # CONFIG_PCCARD is not set
++# CONFIG_HOTPLUG_PCI is not set
+
+ #
+ # Advanced setup
+@@ -373,11 +382,13 @@
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ # CONFIG_MTD_PHYSMAP is not set
+ CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_INTEL_VR_NOR is not set
+ # CONFIG_MTD_PLATRAM is not set
+
+ #
+ # Self-contained MTD device drivers
+ #
++# CONFIG_MTD_PMC551 is not set
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -400,9 +411,14 @@
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_FD is not set
++# 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=35000
+@@ -411,7 +427,10 @@
+ # CONFIG_ATA_OVER_ETH is not set
+ # CONFIG_XILINX_SYSACE is not set
+ CONFIG_MISC_DEVICES=y
++# CONFIG_PHANTOM is not set
+ # CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
+ # CONFIG_IDE is not set
+
+ #
+@@ -423,6 +442,14 @@
+ # CONFIG_SCSI_NETLINK is not set
+ # CONFIG_ATA is not set
+ # CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
+ # CONFIG_MACINTOSH_DRIVERS is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_NETDEVICES_MULTIQUEUE is not set
+@@ -432,9 +459,17 @@
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+ # CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
++# CONFIG_ARCNET is not set
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+ # CONFIG_MII is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
+ CONFIG_IBM_NEW_EMAC=y
+ CONFIG_IBM_NEW_EMAC_RXB=128
+ CONFIG_IBM_NEW_EMAC_TXB=64
+@@ -446,9 +481,38 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_NET_PCI is not set
+ # CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_E1000E is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++# CONFIG_QLA3XXX is not set
++# CONFIG_ATL1 is not set
+ CONFIG_NETDEV_10000=y
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_CHELSIO_T3 is not set
++# CONFIG_IXGBE is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++# CONFIG_NETXEN_NIC is not set
++# CONFIG_NIU is not set
++# CONFIG_MLX4_CORE is not set
++# CONFIG_TEHUTI is not set
++# CONFIG_TR is not set
+
+ #
+ # Wireless LAN
+@@ -456,6 +520,8 @@
+ # 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_SHAPER is not set
+@@ -487,6 +553,7 @@
+ #
+ CONFIG_SERIAL_8250=y
+ CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_PCI=y
+ CONFIG_SERIAL_8250_NR_UARTS=4
+ CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+ CONFIG_SERIAL_8250_EXTENDED=y
+@@ -501,6 +568,7 @@
+ # 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
+@@ -510,8 +578,10 @@
+ # CONFIG_NVRAM is not set
+ # CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
++CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
+
+ #
+@@ -545,6 +615,8 @@
+ #
+ # Graphics support
+ #
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
+ # CONFIG_VGASTATE is not set
+ CONFIG_VIDEO_OUTPUT_CONTROL=m
+ # CONFIG_FB is not set
+@@ -560,9 +632,10 @@
+ #
+ # CONFIG_SOUND is not set
+ CONFIG_USB_SUPPORT=y
+-# CONFIG_USB_ARCH_HAS_HCD is not set
+-# CONFIG_USB_ARCH_HAS_OHCI is not set
+-# CONFIG_USB_ARCH_HAS_EHCI is not set
++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'
+@@ -574,6 +647,7 @@
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
+ # CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
+ # CONFIG_EDAC is not set
+ # CONFIG_RTC_CLASS is not set
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/configs/warp_defconfig powerpc.git/arch/powerpc/configs/warp_defconfig
+--- linux-2.6.24/arch/powerpc/configs/warp_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/configs/warp_defconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,1057 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24-rc6
++# Tue Jan 8 12:23:23 2008
++#
++# CONFIG_PPC64 is not set
++
++#
++# Processor support
++#
++# CONFIG_6xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_40x is not set
++CONFIG_44x=y
++# CONFIG_E200 is not set
++CONFIG_PPC_FPU=y
++CONFIG_4xx=y
++CONFIG_BOOKE=y
++CONFIG_PTE_64BIT=y
++CONFIG_PHYS_64BIT=y
++# CONFIG_PPC_MM_SLICES is not set
++CONFIG_NOT_COHERENT_CACHE=y
++CONFIG_PPC32=y
++CONFIG_WORD_SIZE=32
++CONFIG_PPC_MERGE=y
++CONFIG_MMU=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_TIME_VSYSCALL=y
++CONFIG_GENERIC_CLOCKEVENTS=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_ARCH_NO_VIRT_TO_BUS is not set
++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_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=y
++# CONFIG_PPC_DCR_MMIO is not set
++CONFIG_PPC_DCR=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION="-pika"
++# CONFIG_LOCALVERSION_AUTO is not set
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++# CONFIG_IKCONFIG is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++CONFIG_BLK_DEV_INITRD=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++# CONFIG_HOTPLUG is not set
++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_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
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++CONFIG_BLOCK=y
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++
++#
++# Platform support
++#
++# CONFIG_PPC_MPC52xx is not set
++# CONFIG_PPC_MPC5200 is not set
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_BAMBOO is not set
++# CONFIG_EBONY is not set
++# CONFIG_SEQUOIA is not set
++# CONFIG_TAISHAN is not set
++# CONFIG_KATMAI is not set
++# CONFIG_RAINIER is not set
++CONFIG_WARP=y
++CONFIG_440EP=y
++CONFIG_IBM440EP_ERR42=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_PPC_I8259 is not set
++# 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_CPM2 is not set
++# CONFIG_FSL_ULI1575 is not set
++
++#
++# Kernel options
++#
++# CONFIG_HIGHMEM is not set
++# CONFIG_TICK_ONESHOT is not set
++# CONFIG_NO_HZ is not set
++# CONFIG_HIGH_RES_TIMERS is not set
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++# CONFIG_HZ_100 is not set
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_300 is not set
++CONFIG_HZ_1000=y
++CONFIG_HZ=1000
++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_MATH_EMULATION is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++CONFIG_RESOURCES_64BIT=y
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++CONFIG_PROC_DEVICETREE=y
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="ip=on"
++CONFIG_SECCOMP=y
++CONFIG_WANT_DEVICE_TREE=y
++CONFIG_DEVICE_TREE="warp.dts"
++CONFIG_ISA_DMA_API=y
++
++#
++# Bus options
++#
++CONFIG_ZONE_DMA=y
++# CONFIG_PCI is not set
++# CONFIG_PCI_DOMAINS is not set
++# CONFIG_PCI_SYSCALL is not set
++# CONFIG_ARCH_SUPPORTS_MSI 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=0xc0000000
++CONFIG_CONSISTENT_START=0xff100000
++CONFIG_CONSISTENT_SIZE=0x00200000
++CONFIG_BOOT_LOAD=0x01000000
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE 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=y
++CONFIG_INET_XFRM_MODE_TUNNEL=y
++CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_LRO 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_IP_VS 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=y
++# CONFIG_NETFILTER_DEBUG is not set
++
++#
++# Core Netfilter Configuration
++#
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK_ENABLED is not set
++# CONFIG_NF_CONNTRACK is not set
++# CONFIG_NETFILTER_XTABLES is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_IP_NF_QUEUE is not set
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES 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=y
++# 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
++# 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
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++# CONFIG_STANDALONE is not set
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++# CONFIG_MTD_CMDLINE_PARTS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++CONFIG_MTD_OOPS=m
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++CONFIG_MTD_PHYSMAP_OF=y
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++CONFIG_MTD_NAND=y
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++CONFIG_MTD_NAND_ECC_SMC=y
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++CONFIG_MTD_NAND_IDS=y
++CONFIG_MTD_NAND_NDFC=y
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++# CONFIG_MTD_NAND_PLATFORM is not set
++# CONFIG_MTD_ALAUDA is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++CONFIG_OF_DEVICE=y
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_FD 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_UB 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
++# CONFIG_XILINX_SYSACE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=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 is not set
++# 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 is not set
++
++#
++# SCSI Transports
++#
++CONFIG_SCSI_SPI_ATTRS=y
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_MACINTOSH_DRIVERS is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_IBM_NEW_EMAC=y
++CONFIG_IBM_NEW_EMAC_RXB=128
++CONFIG_IBM_NEW_EMAC_TXB=64
++CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
++CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
++CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
++# CONFIG_IBM_NEW_EMAC_DEBUG is not set
++CONFIG_IBM_NEW_EMAC_ZMII=y
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++# CONFIG_USB_PEGASUS is not set
++# CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP 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
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++# CONFIG_INPUT is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++CONFIG_SERIAL_8250_EXTENDED=y
++# CONFIG_SERIAL_8250_MANY_PORTS is not set
++CONFIG_SERIAL_8250_SHARE_IRQ=y
++# CONFIG_SERIAL_8250_DETECT_IRQ is not set
++# CONFIG_SERIAL_8250_RSA 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_OF_PLATFORM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_IPMI_HANDLER is not set
++CONFIG_HW_RANDOM=y
++# CONFIG_NVRAM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_CHARDEV is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++CONFIG_I2C_IBM_IIC=y
++# CONFIG_I2C_MPC is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_DS1682 is not set
++CONFIG_SENSORS_EEPROM=y
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_M41T00 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++CONFIG_SENSORS_AD7414=y
++# CONFIG_SENSORS_AD7418 is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ADT7470 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_MAX6650 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_DME1737 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB 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_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB_ARCH_HAS_EHCI is not set
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++# CONFIG_USB_DEVICEFS is not set
++CONFIG_USB_DEVICE_CLASS=y
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++# CONFIG_USB_ISP116X_HCD is not set
++CONFIG_USB_OHCI_HCD=y
++CONFIG_USB_OHCI_HCD_PPC_OF=y
++CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
++# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
++CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
++CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
++CONFIG_USB_OHCI_LITTLE_ENDIAN=y
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# may also be needed; see USB_STORAGE Help for more information
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++
++#
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++CONFIG_MMC=m
++# CONFIG_MMC_DEBUG is not set
++# CONFIG_MMC_UNSAFE_RESUME is not set
++
++#
++# MMC/SD Card Drivers
++#
++CONFIG_MMC_BLOCK=m
++CONFIG_MMC_BLOCK_BOUNCE=y
++# CONFIG_SDIO_UART is not set
++
++#
++# MMC/SD Host Controller Drivers
++#
++# CONFIG_MMC_WBSD is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_EDAC is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_EXT4DEV_FS 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=y
++# 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=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++# 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 is not set
++# CONFIG_HUGETLB_PAGE is not set
++# 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_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++CONFIG_CRAMFS=y
++# 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
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 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
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++CONFIG_NLS_CODEPAGE_850=y
++# 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=y
++# 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=y
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++# CONFIG_UCC_SLOW is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=y
++# CONFIG_CRC16 is not set
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
++# CONFIG_INSTRUMENTATION is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++CONFIG_ENABLE_MUST_CHECK=y
++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=y
++# CONFIG_SCHED_DEBUG 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=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++# CONFIG_DEBUG_STACKOVERFLOW is not set
++# CONFIG_DEBUG_STACK_USAGE is not set
++# CONFIG_DEBUG_PAGEALLOC is not set
++# CONFIG_DEBUGGER is not set
++CONFIG_BDI_SWITCH=y
++# CONFIG_PPC_EARLY_DEBUG is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++# CONFIG_CRYPTO is not set
++# CONFIG_PPC_CLOCK is not set
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/Makefile powerpc.git/arch/powerpc/kernel/Makefile
+--- linux-2.6.24/arch/powerpc/kernel/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -3,7 +3,7 @@
+ #
+
+ ifeq ($(CONFIG_PPC64),y)
+-EXTRA_CFLAGS += -mno-minimal-toc
++CFLAGS_prom_init.o += -mno-minimal-toc
+ endif
+ ifeq ($(CONFIG_PPC32),y)
+ CFLAGS_prom_init.o += -fPIC
+@@ -70,6 +70,7 @@
+ obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
+ pci-common.o
+ obj-$(CONFIG_PCI_MSI) += msi.o
++obj-$(CONFIG_RAPIDIO) += rio.o
+ obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o \
+ machine_kexec_$(CONFIG_WORD_SIZE).o
+ obj-$(CONFIG_AUDIT) += audit.o
+@@ -91,3 +92,13 @@
+
+ extra-$(CONFIG_PPC_FPU) += fpu.o
+ extra-$(CONFIG_PPC64) += entry_64.o
++
++extra-y += systbl_chk.i
++$(obj)/systbl.o: systbl_chk
++
++quiet_cmd_systbl_chk = CALL $<
++ cmd_systbl_chk = $(CONFIG_SHELL) $< $(obj)/systbl_chk.i
++
++PHONY += systbl_chk
++systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i
++ $(call cmd,systbl_chk)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/btext.c powerpc.git/arch/powerpc/kernel/btext.c
+--- linux-2.6.24/arch/powerpc/kernel/btext.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/btext.c 2008-01-28 20:25:49.000000000 +0100
+@@ -236,7 +236,7 @@
+ if (rc == 0 || !allow_nonstdout)
+ return rc;
+
+- for (np = NULL; (np = of_find_node_by_type(np, "display"));) {
++ for_each_node_by_type(np, "display") {
+ if (of_get_property(np, "linux,opened", NULL)) {
+ printk("trying %s ...\n", np->full_name);
+ rc = btext_initialize(np);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/cpu_setup_44x.S powerpc.git/arch/powerpc/kernel/cpu_setup_44x.S
+--- linux-2.6.24/arch/powerpc/kernel/cpu_setup_44x.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/cpu_setup_44x.S 2008-01-28 20:25:49.000000000 +0100
+@@ -23,11 +23,24 @@
+ mflr r4
+ bl __init_fpu_44x
+ bl __plb_disable_wrp
++ bl __fixup_440A_mcheck
+ mtlr r4
+ blr
+ _GLOBAL(__setup_cpu_440grx)
+- b __plb_disable_wrp
++ mflr r4
++ bl __plb_disable_wrp
++ bl __fixup_440A_mcheck
++ mtlr r4
++ blr
++_GLOBAL(__setup_cpu_440gx)
++_GLOBAL(__setup_cpu_440spe)
++ b __fixup_440A_mcheck
+
++ /* Temporary fixup for arch/ppc until we kill the whole thing */
++#ifndef CONFIG_PPC_MERGE
++_GLOBAL(__fixup_440A_mcheck)
++ blr
++#endif
+
+ /* enable APU between CPU and FPU */
+ _GLOBAL(__init_fpu_44x)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/cputable.c powerpc.git/arch/powerpc/kernel/cputable.c
+--- linux-2.6.24/arch/powerpc/kernel/cputable.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/cputable.c 2008-01-28 20:25:49.000000000 +0100
+@@ -33,7 +33,9 @@
+ #ifdef CONFIG_PPC32
+ extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
++extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
++extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
+@@ -85,6 +87,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/power3",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "power3",
+ },
+ { /* Power3+ */
+@@ -99,6 +102,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/power3",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "power3",
+ },
+ { /* Northstar */
+@@ -113,6 +117,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/rs64",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "rs64",
+ },
+ { /* Pulsar */
+@@ -127,6 +132,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/rs64",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "rs64",
+ },
+ { /* I-star */
+@@ -141,6 +147,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/rs64",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "rs64",
+ },
+ { /* S-star */
+@@ -155,6 +162,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/rs64",
+ .oprofile_type = PPC_OPROFILE_RS64,
++ .machine_check = machine_check_generic,
+ .platform = "rs64",
+ },
+ { /* Power4 */
+@@ -169,6 +177,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/power4",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "power4",
+ },
+ { /* Power4+ */
+@@ -183,6 +192,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/power4",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "power4",
+ },
+ { /* PPC970 */
+@@ -200,6 +210,7 @@
+ .cpu_restore = __restore_cpu_ppc970,
+ .oprofile_cpu_type = "ppc64/970",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc970",
+ },
+ { /* PPC970FX */
+@@ -217,6 +228,7 @@
+ .cpu_restore = __restore_cpu_ppc970,
+ .oprofile_cpu_type = "ppc64/970",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc970",
+ },
+ { /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
+@@ -234,6 +246,7 @@
+ .cpu_restore = __restore_cpu_ppc970,
+ .oprofile_cpu_type = "ppc64/970MP",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc970",
+ },
+ { /* PPC970MP */
+@@ -251,6 +264,7 @@
+ .cpu_restore = __restore_cpu_ppc970,
+ .oprofile_cpu_type = "ppc64/970MP",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc970",
+ },
+ { /* PPC970GX */
+@@ -267,6 +281,7 @@
+ .cpu_setup = __setup_cpu_ppc970,
+ .oprofile_cpu_type = "ppc64/970",
+ .oprofile_type = PPC_OPROFILE_POWER4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc970",
+ },
+ { /* Power5 GR */
+@@ -286,6 +301,7 @@
+ */
+ .oprofile_mmcra_sihv = MMCRA_SIHV,
+ .oprofile_mmcra_sipr = MMCRA_SIPR,
++ .machine_check = machine_check_generic,
+ .platform = "power5",
+ },
+ { /* Power5++ */
+@@ -301,6 +317,7 @@
+ .oprofile_type = PPC_OPROFILE_POWER4,
+ .oprofile_mmcra_sihv = MMCRA_SIHV,
+ .oprofile_mmcra_sipr = MMCRA_SIPR,
++ .machine_check = machine_check_generic,
+ .platform = "power5+",
+ },
+ { /* Power5 GS */
+@@ -317,6 +334,7 @@
+ .oprofile_type = PPC_OPROFILE_POWER4,
+ .oprofile_mmcra_sihv = MMCRA_SIHV,
+ .oprofile_mmcra_sipr = MMCRA_SIPR,
++ .machine_check = machine_check_generic,
+ .platform = "power5+",
+ },
+ { /* POWER6 in P5+ mode; 2.04-compliant processor */
+@@ -327,6 +345,7 @@
+ .cpu_user_features = COMMON_USER_POWER5_PLUS,
+ .icache_bsize = 128,
+ .dcache_bsize = 128,
++ .machine_check = machine_check_generic,
+ .platform = "power5+",
+ },
+ { /* Power6 */
+@@ -346,6 +365,7 @@
+ .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR,
+ .oprofile_mmcra_clear = POWER6_MMCRA_THRM |
+ POWER6_MMCRA_OTHER,
++ .machine_check = machine_check_generic,
+ .platform = "power6x",
+ },
+ { /* 2.05-compliant processor, i.e. Power6 "architected" mode */
+@@ -356,6 +376,7 @@
+ .cpu_user_features = COMMON_USER_POWER6,
+ .icache_bsize = 128,
+ .dcache_bsize = 128,
++ .machine_check = machine_check_generic,
+ .platform = "power6",
+ },
+ { /* Cell Broadband Engine */
+@@ -372,6 +393,7 @@
+ .pmc_type = PPC_PMC_IBM,
+ .oprofile_cpu_type = "ppc64/cell-be",
+ .oprofile_type = PPC_OPROFILE_CELL,
++ .machine_check = machine_check_generic,
+ .platform = "ppc-cell-be",
+ },
+ { /* PA Semi PA6T */
+@@ -388,6 +410,7 @@
+ .cpu_restore = __restore_cpu_pa6t,
+ .oprofile_cpu_type = "ppc64/pa6t",
+ .oprofile_type = PPC_OPROFILE_PA6T,
++ .machine_check = machine_check_generic,
+ .platform = "pa6t",
+ },
+ { /* default match */
+@@ -400,6 +423,7 @@
+ .dcache_bsize = 128,
+ .num_pmcs = 6,
+ .pmc_type = PPC_PMC_IBM,
++ .machine_check = machine_check_generic,
+ .platform = "power4",
+ }
+ #endif /* CONFIG_PPC64 */
+@@ -414,6 +438,7 @@
+ PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_generic,
+ .platform = "ppc601",
+ },
+ { /* 603 */
+@@ -425,6 +450,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* 603e */
+@@ -436,6 +462,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* 603ev */
+@@ -447,6 +474,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* 604 */
+@@ -459,6 +487,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 2,
+ .cpu_setup = __setup_cpu_604,
++ .machine_check = machine_check_generic,
+ .platform = "ppc604",
+ },
+ { /* 604e */
+@@ -471,6 +500,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_604,
++ .machine_check = machine_check_generic,
+ .platform = "ppc604",
+ },
+ { /* 604r */
+@@ -483,6 +513,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_604,
++ .machine_check = machine_check_generic,
+ .platform = "ppc604",
+ },
+ { /* 604ev */
+@@ -495,6 +526,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_604,
++ .machine_check = machine_check_generic,
+ .platform = "ppc604",
+ },
+ { /* 740/750 (0x4202, don't support TAU ?) */
+@@ -507,6 +539,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750CX (80100 and 8010x?) */
+@@ -519,6 +552,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750cx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750CX (82201 and 82202) */
+@@ -531,6 +565,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750cx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750CXe (82214) */
+@@ -543,6 +578,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750cx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750CXe "Gekko" (83214) */
+@@ -555,6 +591,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750cx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750CL */
+@@ -567,6 +604,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 745/755 */
+@@ -579,6 +617,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750FX rev 1.x */
+@@ -591,6 +630,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750FX rev 2.0 must disable HID0[DPM] */
+@@ -603,6 +643,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750FX (All revs except 2.0) */
+@@ -615,6 +656,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750fx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 750GX */
+@@ -627,6 +669,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750fx,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 740/750 (L2CR bit need fixup for 740) */
+@@ -639,6 +682,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_750,
++ .machine_check = machine_check_generic,
+ .platform = "ppc750",
+ },
+ { /* 7400 rev 1.1 ? (no TAU) */
+@@ -652,6 +696,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_7400,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7400",
+ },
+ { /* 7400 */
+@@ -665,6 +710,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_7400,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7400",
+ },
+ { /* 7410 */
+@@ -678,6 +724,7 @@
+ .dcache_bsize = 32,
+ .num_pmcs = 4,
+ .cpu_setup = __setup_cpu_7410,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7400",
+ },
+ { /* 7450 2.0 - no doze/nap */
+@@ -693,6 +740,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7450 2.1 */
+@@ -708,6 +756,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7450 2.3 and newer */
+@@ -723,6 +772,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7455 rev 1.x */
+@@ -738,6 +788,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7455 rev 2.0 */
+@@ -753,6 +804,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7455 others */
+@@ -768,6 +820,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7447/7457 Rev 1.0 */
+@@ -783,6 +836,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7447/7457 Rev 1.1 */
+@@ -798,6 +852,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7447/7457 Rev 1.2 and later */
+@@ -812,6 +867,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7447A */
+@@ -827,6 +883,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 7448 */
+@@ -842,6 +899,7 @@
+ .cpu_setup = __setup_cpu_745x,
+ .oprofile_cpu_type = "ppc/7450",
+ .oprofile_type = PPC_OPROFILE_G4,
++ .machine_check = machine_check_generic,
+ .platform = "ppc7450",
+ },
+ { /* 82xx (8240, 8245, 8260 are all 603e cores) */
+@@ -853,6 +911,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* All G2_LE (603e core, plus some) have the same pvr */
+@@ -864,6 +923,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* e300c1 (a 603e core, plus some) on 83xx */
+@@ -875,6 +935,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ { /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
+@@ -886,9 +947,10 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+- { /* e300c3 on 83xx */
++ { /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
+ .pvr_mask = 0x7fff0000,
+ .pvr_value = 0x00850000,
+ .cpu_name = "e300c3",
+@@ -899,6 +961,18 @@
+ .cpu_setup = __setup_cpu_603,
+ .platform = "ppc603",
+ },
++ { /* e300c4 (e300c1, plus one IU) */
++ .pvr_mask = 0x7fff0000,
++ .pvr_value = 0x00860000,
++ .cpu_name = "e300c4",
++ .cpu_features = CPU_FTRS_E300,
++ .cpu_user_features = COMMON_USER,
++ .icache_bsize = 32,
++ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_603,
++ .machine_check = machine_check_generic,
++ .platform = "ppc603",
++ },
+ { /* default match, we assume split I/D cache & TB (non-601)... */
+ .pvr_mask = 0x00000000,
+ .pvr_value = 0x00000000,
+@@ -907,6 +981,7 @@
+ .cpu_user_features = COMMON_USER,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_generic,
+ .platform = "ppc603",
+ },
+ #endif /* CLASSIC_PPC */
+@@ -933,6 +1008,7 @@
+ .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
+ .icache_bsize = 16,
+ .dcache_bsize = 16,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc403",
+ },
+ { /* 403GCX */
+@@ -944,6 +1020,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB,
+ .icache_bsize = 16,
+ .dcache_bsize = 16,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc403",
+ },
+ { /* 403G ?? */
+@@ -954,6 +1031,7 @@
+ .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
+ .icache_bsize = 16,
+ .dcache_bsize = 16,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc403",
+ },
+ { /* 405GP */
+@@ -965,6 +1043,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* STB 03xxx */
+@@ -976,6 +1055,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* STB 04xxx */
+@@ -987,6 +1067,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* NP405L */
+@@ -998,6 +1079,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* NP4GS3 */
+@@ -1009,6 +1091,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* NP405H */
+@@ -1020,6 +1103,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* 405GPr */
+@@ -1031,6 +1115,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* STBx25xx */
+@@ -1042,6 +1127,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* 405LP */
+@@ -1052,6 +1138,7 @@
+ .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* Xilinx Virtex-II Pro */
+@@ -1063,6 +1150,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* Xilinx Virtex-4 FX */
+@@ -1074,6 +1162,7 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* 405EP */
+@@ -1085,17 +1174,31 @@
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+ { /* 405EX */
+- .pvr_mask = 0xffff0000,
+- .pvr_value = 0x12910000,
++ .pvr_mask = 0xffff0004,
++ .pvr_value = 0x12910004,
+ .cpu_name = "405EX",
+ .cpu_features = CPU_FTRS_40X,
+ .cpu_user_features = PPC_FEATURE_32 |
+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
++ .platform = "ppc405",
++ },
++ { /* 405EXr */
++ .pvr_mask = 0xffff0004,
++ .pvr_value = 0x12910000,
++ .cpu_name = "405EXr",
++ .cpu_features = CPU_FTRS_40X,
++ .cpu_user_features = PPC_FEATURE_32 |
++ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
++ .icache_bsize = 32,
++ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc405",
+ },
+
+@@ -1109,6 +1212,7 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440",
+ },
+ { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
+@@ -1120,6 +1224,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440ep,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440",
+ },
+ {
+@@ -1130,6 +1235,19 @@
+ .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
++ .platform = "ppc440",
++ },
++ { /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */
++ .pvr_mask = 0xf0000ff7,
++ .pvr_value = 0x400008d4,
++ .cpu_name = "440EP Rev. C",
++ .cpu_features = CPU_FTRS_44X,
++ .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
++ .icache_bsize = 32,
++ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440ep,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440",
+ },
+ { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
+@@ -1141,6 +1259,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440ep,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440",
+ },
+ { /* 440GRX */
+@@ -1152,6 +1271,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440grx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */
+@@ -1163,6 +1283,7 @@
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .cpu_setup = __setup_cpu_440epx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440GP Rev. B */
+@@ -1173,6 +1294,7 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440gp",
+ },
+ { /* 440GP Rev. C */
+@@ -1183,6 +1305,7 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440gp",
+ },
+ { /* 440GX Rev. A */
+@@ -1193,6 +1316,8 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440gx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440GX Rev. B */
+@@ -1203,6 +1328,8 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440gx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440GX Rev. C */
+@@ -1213,6 +1340,8 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440gx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440GX Rev. F */
+@@ -1223,6 +1352,8 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440gx,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440SP Rev. A */
+@@ -1233,6 +1364,7 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_4xx,
+ .platform = "ppc440",
+ },
+ { /* 440SPe Rev. A */
+@@ -1243,6 +1375,8 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440spe,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ { /* 440SPe Rev. B */
+@@ -1253,10 +1387,13 @@
+ .cpu_user_features = COMMON_USER_BOOKE,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
++ .cpu_setup = __setup_cpu_440spe,
++ .machine_check = machine_check_440A,
+ .platform = "ppc440",
+ },
+ #endif /* CONFIG_44x */
+ #ifdef CONFIG_FSL_BOOKE
++#ifdef CONFIG_E200
+ { /* e200z5 */
+ .pvr_mask = 0xfff00000,
+ .pvr_value = 0x81000000,
+@@ -1267,6 +1404,7 @@
+ PPC_FEATURE_HAS_EFP_SINGLE |
+ PPC_FEATURE_UNIFIED_CACHE,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_e200,
+ .platform = "ppc5554",
+ },
+ { /* e200z6 */
+@@ -1280,8 +1418,10 @@
+ PPC_FEATURE_HAS_EFP_SINGLE_COMP |
+ PPC_FEATURE_UNIFIED_CACHE,
+ .dcache_bsize = 32,
++ .machine_check = machine_check_e200,
+ .platform = "ppc5554",
+ },
++#elif defined(CONFIG_E500)
+ { /* e500 */
+ .pvr_mask = 0xffff0000,
+ .pvr_value = 0x80200000,
+@@ -1296,6 +1436,7 @@
+ .num_pmcs = 4,
+ .oprofile_cpu_type = "ppc/e500",
+ .oprofile_type = PPC_OPROFILE_BOOKE,
++ .machine_check = machine_check_e500,
+ .platform = "ppc8540",
+ },
+ { /* e500v2 */
+@@ -1313,9 +1454,11 @@
+ .num_pmcs = 4,
+ .oprofile_cpu_type = "ppc/e500",
+ .oprofile_type = PPC_OPROFILE_BOOKE,
++ .machine_check = machine_check_e500,
+ .platform = "ppc8548",
+ },
+ #endif
++#endif
+ #if !CLASSIC_PPC
+ { /* default match */
+ .pvr_mask = 0x00000000,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/crash.c powerpc.git/arch/powerpc/kernel/crash.c
+--- linux-2.6.24/arch/powerpc/kernel/crash.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/crash.c 2008-01-28 20:25:49.000000000 +0100
+@@ -32,6 +32,8 @@
+ #include <asm/lmb.h>
+ #include <asm/firmware.h>
+ #include <asm/smp.h>
++#include <asm/system.h>
++#include <asm/setjmp.h>
+
+ #ifdef DEBUG
+ #include <asm/udbg.h>
+@@ -45,6 +47,11 @@
+ static cpumask_t cpus_in_crash = CPU_MASK_NONE;
+ cpumask_t cpus_in_sr = CPU_MASK_NONE;
+
++#define CRASH_HANDLER_MAX 1
++/* NULL terminated list of shutdown handles */
++static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX+1];
++static DEFINE_SPINLOCK(crash_handlers_lock);
++
+ #ifdef CONFIG_SMP
+ static atomic_t enter_on_soft_reset = ATOMIC_INIT(0);
+
+@@ -285,9 +292,72 @@
+ }
+ #endif /* CONFIG_SPU_BASE */
+
++/*
++ * Register a function to be called on shutdown. Only use this if you
++ * can't reset your device in the second kernel.
++ */
++int crash_shutdown_register(crash_shutdown_t handler)
++{
++ unsigned int i, rc;
++
++ spin_lock(&crash_handlers_lock);
++ for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
++ if (!crash_shutdown_handles[i]) {
++ /* Insert handle at first empty entry */
++ crash_shutdown_handles[i] = handler;
++ rc = 0;
++ break;
++ }
++
++ if (i == CRASH_HANDLER_MAX) {
++ printk(KERN_ERR "Crash shutdown handles full, "
++ "not registered.\n");
++ rc = 1;
++ }
++
++ spin_unlock(&crash_handlers_lock);
++ return rc;
++}
++EXPORT_SYMBOL(crash_shutdown_register);
++
++int crash_shutdown_unregister(crash_shutdown_t handler)
++{
++ unsigned int i, rc;
++
++ spin_lock(&crash_handlers_lock);
++ for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
++ if (crash_shutdown_handles[i] == handler)
++ break;
++
++ if (i == CRASH_HANDLER_MAX) {
++ printk(KERN_ERR "Crash shutdown handle not found\n");
++ rc = 1;
++ } else {
++ /* Shift handles down */
++ for (; crash_shutdown_handles[i]; i++)
++ crash_shutdown_handles[i] =
++ crash_shutdown_handles[i+1];
++ rc = 0;
++ }
++
++ spin_unlock(&crash_handlers_lock);
++ return rc;
++}
++EXPORT_SYMBOL(crash_shutdown_unregister);
++
++static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
++
++static int handle_fault(struct pt_regs *regs)
++{
++ longjmp(crash_shutdown_buf, 1);
++ return 0;
++}
++
+ void default_machine_crash_shutdown(struct pt_regs *regs)
+ {
+- unsigned int irq;
++ unsigned int i;
++ int (*old_handler)(struct pt_regs *regs);
++
+
+ /*
+ * This function is only called after the system
+@@ -301,15 +371,36 @@
+ */
+ hard_irq_disable();
+
+- for_each_irq(irq) {
+- struct irq_desc *desc = irq_desc + irq;
++ for_each_irq(i) {
++ struct irq_desc *desc = irq_desc + i;
+
+ if (desc->status & IRQ_INPROGRESS)
+- desc->chip->eoi(irq);
++ desc->chip->eoi(i);
+
+ if (!(desc->status & IRQ_DISABLED))
+- desc->chip->disable(irq);
++ desc->chip->disable(i);
++ }
++
++ /*
++ * Call registered shutdown routines savely. Swap out
++ * __debugger_fault_handler, and replace on exit.
++ */
++ old_handler = __debugger_fault_handler;
++ __debugger_fault_handler = handle_fault;
++ for (i = 0; crash_shutdown_handles[i]; i++) {
++ if (setjmp(crash_shutdown_buf) == 0) {
++ /*
++ * Insert syncs and delay to ensure
++ * instructions in the dangerous region don't
++ * leak away from this protected region.
++ */
++ asm volatile("sync; isync");
++ /* dangerous region */
++ crash_shutdown_handles[i]();
++ asm volatile("sync; isync");
++ }
+ }
++ __debugger_fault_handler = old_handler;
+
+ /*
+ * Make a note of crashing cpu. Will be used in machine_kexec
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/dma_64.c powerpc.git/arch/powerpc/kernel/dma_64.c
+--- linux-2.6.24/arch/powerpc/kernel/dma_64.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/dma_64.c 2008-01-28 20:25:49.000000000 +0100
+@@ -112,10 +112,16 @@
+ /*
+ * Generic direct DMA implementation
+ *
+- * This implementation supports a global offset that can be applied if
+- * the address at which memory is visible to devices is not 0.
++ * This implementation supports a per-device offset that can be applied if
++ * the address at which memory is visible to devices is not 0. Platform code
++ * can set archdata.dma_data to an unsigned long holding the offset. By
++ * default the offset is zero.
+ */
+-unsigned long dma_direct_offset;
++
++static unsigned long get_dma_direct_offset(struct device *dev)
++{
++ return (unsigned long)dev->archdata.dma_data;
++}
+
+ static void *dma_direct_alloc_coherent(struct device *dev, size_t size,
+ dma_addr_t *dma_handle, gfp_t flag)
+@@ -124,13 +130,12 @@
+ void *ret;
+ int node = dev->archdata.numa_node;
+
+- /* TODO: Maybe use the numa node here too ? */
+ page = alloc_pages_node(node, flag, get_order(size));
+ if (page == NULL)
+ return NULL;
+ ret = page_address(page);
+ memset(ret, 0, size);
+- *dma_handle = virt_to_abs(ret) | dma_direct_offset;
++ *dma_handle = virt_to_abs(ret) + get_dma_direct_offset(dev);
+
+ return ret;
+ }
+@@ -145,7 +150,7 @@
+ size_t size,
+ enum dma_data_direction direction)
+ {
+- return virt_to_abs(ptr) | dma_direct_offset;
++ return virt_to_abs(ptr) + get_dma_direct_offset(dev);
+ }
+
+ static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr,
+@@ -161,7 +166,7 @@
+ int i;
+
+ for_each_sg(sgl, sg, nents, i) {
+- sg->dma_address = sg_phys(sg) | dma_direct_offset;
++ sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev);
+ sg->dma_length = sg->length;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/head_44x.S powerpc.git/arch/powerpc/kernel/head_44x.S
+--- linux-2.6.24/arch/powerpc/kernel/head_44x.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/head_44x.S 2008-01-28 20:25:49.000000000 +0100
+@@ -289,11 +289,8 @@
+ CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
+
+ /* Machine Check Interrupt */
+-#ifdef CONFIG_440A
+- MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
+-#else
+ CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
+-#endif
++ MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception)
+
+ /* Data Storage Interrupt */
+ START_EXCEPTION(DataStorage)
+@@ -674,6 +671,15 @@
+ */
+
+ /*
++ * Adjust the machine check IVOR on 440A cores
++ */
++_GLOBAL(__fixup_440A_mcheck)
++ li r3,MachineCheckA@l
++ mtspr SPRN_IVOR1,r3
++ sync
++ blr
++
++/*
+ * extern void giveup_altivec(struct task_struct *prev)
+ *
+ * The 44x core does not have an AltiVec unit.
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/head_booke.h powerpc.git/arch/powerpc/kernel/head_booke.h
+--- linux-2.6.24/arch/powerpc/kernel/head_booke.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/head_booke.h 2008-01-28 20:25:49.000000000 +0100
+@@ -166,7 +166,7 @@
+ mfspr r5,SPRN_ESR; \
+ stw r5,_ESR(r11); \
+ addi r3,r1,STACK_FRAME_OVERHEAD; \
+- EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
++ EXC_XFER_TEMPLATE(hdlr, n+4, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
+ NOCOPY, mcheck_transfer_to_handler, \
+ ret_from_mcheck_exc)
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/head_fsl_booke.S powerpc.git/arch/powerpc/kernel/head_fsl_booke.S
+--- linux-2.6.24/arch/powerpc/kernel/head_fsl_booke.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/head_fsl_booke.S 2008-01-28 20:25:49.000000000 +0100
+@@ -73,8 +73,8 @@
+ /* We try to not make any assumptions about how the boot loader
+ * setup or used the TLBs. We invalidate all mappings from the
+ * boot loader and load a single entry in TLB1[0] to map the
+- * first 16M of kernel memory. Any boot info passed from the
+- * bootloader needs to live in this first 16M.
++ * first 64M of kernel memory. Any boot info passed from the
++ * bootloader needs to live in this first 64M.
+ *
+ * Requirement on bootloader:
+ * - The page we're executing in needs to reside in TLB1 and
+@@ -167,7 +167,7 @@
+ mtspr SPRN_MAS0,r7
+ tlbre
+
+- /* Just modify the entry ID and EPN for the temp mapping */
++ /* Just modify the entry ID, EPN and RPN for the temp mapping */
+ lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */
+ rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */
+ mtspr SPRN_MAS0,r7
+@@ -177,9 +177,12 @@
+ ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_4K))@l
+ mtspr SPRN_MAS1,r6
+ mfspr r6,SPRN_MAS2
+- li r7,0 /* temp EPN = 0 */
++ lis r7,PHYSICAL_START@h
+ rlwimi r7,r6,0,20,31
+ mtspr SPRN_MAS2,r7
++ mfspr r6,SPRN_MAS3
++ rlwimi r7,r6,0,20,31
++ mtspr SPRN_MAS3,r7
+ tlbwe
+
+ xori r6,r4,1
+@@ -222,11 +225,11 @@
+ lis r6,0x1000 /* Set MAS0(TLBSEL) = TLB1(1), ESEL = 0 */
+ mtspr SPRN_MAS0,r6
+ lis r6,(MAS1_VALID|MAS1_IPROT)@h
+- ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_16M))@l
++ ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_64M))@l
+ mtspr SPRN_MAS1,r6
+ li r7,0
+- lis r6,KERNELBASE@h
+- ori r6,r6,KERNELBASE@l
++ lis r6,PAGE_OFFSET@h
++ ori r6,r6,PAGE_OFFSET@l
+ rlwimi r6,r7,0,20,31
+ mtspr SPRN_MAS2,r6
+ li r7,(MAS3_SX|MAS3_SW|MAS3_SR)
+@@ -234,6 +237,9 @@
+ tlbwe
+
+ /* 7. Jump to KERNELBASE mapping */
++ lis r6,KERNELBASE@h
++ ori r6,r6,KERNELBASE@l
++ rlwimi r6,r7,0,20,31
+ lis r7,MSR_KERNEL@h
+ ori r7,r7,MSR_KERNEL@l
+ bl 1f /* Find our address */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/ibmebus.c powerpc.git/arch/powerpc/kernel/ibmebus.c
+--- linux-2.6.24/arch/powerpc/kernel/ibmebus.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/ibmebus.c 2008-01-28 20:25:49.000000000 +0100
+@@ -41,6 +41,7 @@
+ #include <linux/kobject.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/interrupt.h>
++#include <linux/of.h>
+ #include <linux/of_platform.h>
+ #include <asm/ibmebus.h>
+ #include <asm/abs_addr.h>
+@@ -52,7 +53,7 @@
+ struct bus_type ibmebus_bus_type;
+
+ /* These devices will automatically be added to the bus during init */
+-static struct of_device_id builtin_matches[] = {
++static struct of_device_id __initdata builtin_matches[] = {
+ { .compatible = "IBM,lhca" },
+ { .compatible = "IBM,lhea" },
+ {},
+@@ -171,7 +172,7 @@
+
+ root = of_find_node_by_path("/");
+
+- for (child = NULL; (child = of_get_next_child(root, child)); ) {
++ for_each_child_of_node(root, child) {
+ if (!of_match_node(matches, child))
+ continue;
+
+@@ -197,16 +198,13 @@
+ /* If the driver uses devices that ibmebus doesn't know, add them */
+ ibmebus_create_devices(drv->match_table);
+
+- drv->driver.name = drv->name;
+- drv->driver.bus = &ibmebus_bus_type;
+-
+- return driver_register(&drv->driver);
++ return of_register_driver(drv, &ibmebus_bus_type);
+ }
+ EXPORT_SYMBOL(ibmebus_register_driver);
+
+ void ibmebus_unregister_driver(struct of_platform_driver *drv)
+ {
+- driver_unregister(&drv->driver);
++ of_unregister_driver(drv);
+ }
+ EXPORT_SYMBOL(ibmebus_unregister_driver);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/iommu.c powerpc.git/arch/powerpc/kernel/iommu.c
+--- linux-2.6.24/arch/powerpc/kernel/iommu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/iommu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -532,16 +532,14 @@
+ return tbl;
+ }
+
+-void iommu_free_table(struct device_node *dn)
++void iommu_free_table(struct iommu_table *tbl, const char *node_name)
+ {
+- struct pci_dn *pdn = dn->data;
+- struct iommu_table *tbl = pdn->iommu_table;
+ unsigned long bitmap_sz, i;
+ unsigned int order;
+
+ if (!tbl || !tbl->it_map) {
+ printk(KERN_ERR "%s: expected TCE map for %s\n", __FUNCTION__,
+- dn->full_name);
++ node_name);
+ return;
+ }
+
+@@ -550,7 +548,7 @@
+ for (i = 0; i < (tbl->it_size/64); i++) {
+ if (tbl->it_map[i] != 0) {
+ printk(KERN_WARNING "%s: Unexpected TCEs for %s\n",
+- __FUNCTION__, dn->full_name);
++ __FUNCTION__, node_name);
+ break;
+ }
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/isa-bridge.c powerpc.git/arch/powerpc/kernel/isa-bridge.c
+--- linux-2.6.24/arch/powerpc/kernel/isa-bridge.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/isa-bridge.c 2008-01-28 20:25:49.000000000 +0100
+@@ -108,7 +108,7 @@
+ if (size > 0x10000)
+ size = 0x10000;
+
+- printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
++ printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
+ "mapping 64k\n");
+
+ __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
+@@ -116,7 +116,7 @@
+ return;
+
+ inval_range:
+- printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
++ printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
+ "mapping 64k\n");
+ __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
+ 0x10000, _PAGE_NO_CACHE|_PAGE_GUARDED);
+@@ -145,7 +145,7 @@
+ for_each_node_by_type(np, "isa") {
+ /* Look for our hose being a parent */
+ for (parent = of_get_parent(np); parent;) {
+- if (parent == hose->arch_data) {
++ if (parent == hose->dn) {
+ of_node_put(parent);
+ break;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/legacy_serial.c powerpc.git/arch/powerpc/kernel/legacy_serial.c
+--- linux-2.6.24/arch/powerpc/kernel/legacy_serial.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/legacy_serial.c 2008-01-28 20:25:49.000000000 +0100
+@@ -307,7 +307,7 @@
+ }
+
+ /* First fill our array with SOC ports */
+- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
++ for_each_compatible_node(np, "serial", "ns16550") {
+ struct device_node *soc = of_get_parent(np);
+ if (soc && !strcmp(soc->type, "soc")) {
+ index = add_legacy_soc_port(np, np);
+@@ -318,7 +318,7 @@
+ }
+
+ /* First fill our array with ISA ports */
+- for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
++ for_each_node_by_type(np, "serial") {
+ struct device_node *isa = of_get_parent(np);
+ if (isa && !strcmp(isa->name, "isa")) {
+ index = add_legacy_isa_port(np, isa);
+@@ -329,7 +329,7 @@
+ }
+
+ /* First fill our array with tsi-bridge ports */
+- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
++ for_each_compatible_node(np, "serial", "ns16550") {
+ struct device_node *tsi = of_get_parent(np);
+ if (tsi && !strcmp(tsi->type, "tsi-bridge")) {
+ index = add_legacy_soc_port(np, np);
+@@ -340,7 +340,7 @@
+ }
+
+ /* First fill our array with opb bus ports */
+- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
++ for_each_compatible_node(np, "serial", "ns16550") {
+ struct device_node *opb = of_get_parent(np);
+ if (opb && (!strcmp(opb->type, "opb") ||
+ of_device_is_compatible(opb, "ibm,opb"))) {
+@@ -474,7 +474,7 @@
+
+ /*
+ * Before we register the platfrom serial devices, we need
+- * to fixup their interrutps and their IO ports.
++ * to fixup their interrupts and their IO ports.
+ */
+ DBG("Fixing serial ports interrupts and IO ports ...\n");
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/lparcfg.c powerpc.git/arch/powerpc/kernel/lparcfg.c
+--- linux-2.6.24/arch/powerpc/kernel/lparcfg.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/lparcfg.c 2008-01-28 20:25:49.000000000 +0100
+@@ -41,7 +41,6 @@
+ /* #define LPARCFG_DEBUG */
+
+ static struct proc_dir_entry *proc_ppc64_lparcfg;
+-#define LPARCFG_BUFF_SIZE 4096
+
+ /*
+ * Track sum of all purrs across all processors. This is used to further
+@@ -595,13 +594,6 @@
+ ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
+ if (ent) {
+ ent->proc_fops = &lparcfg_fops;
+- ent->data = kmalloc(LPARCFG_BUFF_SIZE, GFP_KERNEL);
+- if (!ent->data) {
+- printk(KERN_ERR
+- "Failed to allocate buffer for lparcfg\n");
+- remove_proc_entry("lparcfg", ent->parent);
+- return -ENOMEM;
+- }
+ } else {
+ printk(KERN_ERR "Failed to create ppc64/lparcfg\n");
+ return -EIO;
+@@ -613,10 +605,8 @@
+
+ void __exit lparcfg_cleanup(void)
+ {
+- if (proc_ppc64_lparcfg) {
+- kfree(proc_ppc64_lparcfg->data);
++ if (proc_ppc64_lparcfg)
+ remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent);
+- }
+ }
+
+ module_init(lparcfg_init);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/misc.S powerpc.git/arch/powerpc/kernel/misc.S
+--- linux-2.6.24/arch/powerpc/kernel/misc.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/misc.S 2008-01-28 20:25:49.000000000 +0100
+@@ -8,12 +8,17 @@
+ * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
+ * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
+ *
++ * setjmp/longjmp code by Paul Mackerras.
++ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+ #include <asm/ppc_asm.h>
++#include <asm/unistd.h>
++#include <asm/asm-compat.h>
++#include <asm/asm-offsets.h>
+
+ .text
+
+@@ -43,3 +48,71 @@
+ add r3,r3,r5
+ mtlr r0
+ blr
++
++_GLOBAL(kernel_execve)
++ li r0,__NR_execve
++ sc
++ bnslr
++ neg r3,r3
++ blr
++
++_GLOBAL(setjmp)
++ mflr r0
++ PPC_STL r0,0(r3)
++ PPC_STL r1,SZL(r3)
++ PPC_STL r2,2*SZL(r3)
++ mfcr r0
++ PPC_STL r0,3*SZL(r3)
++ PPC_STL r13,4*SZL(r3)
++ PPC_STL r14,5*SZL(r3)
++ PPC_STL r15,6*SZL(r3)
++ PPC_STL r16,7*SZL(r3)
++ PPC_STL r17,8*SZL(r3)
++ PPC_STL r18,9*SZL(r3)
++ PPC_STL r19,10*SZL(r3)
++ PPC_STL r20,11*SZL(r3)
++ PPC_STL r21,12*SZL(r3)
++ PPC_STL r22,13*SZL(r3)
++ PPC_STL r23,14*SZL(r3)
++ PPC_STL r24,15*SZL(r3)
++ PPC_STL r25,16*SZL(r3)
++ PPC_STL r26,17*SZL(r3)
++ PPC_STL r27,18*SZL(r3)
++ PPC_STL r28,19*SZL(r3)
++ PPC_STL r29,20*SZL(r3)
++ PPC_STL r30,21*SZL(r3)
++ PPC_STL r31,22*SZL(r3)
++ li r3,0
++ blr
++
++_GLOBAL(longjmp)
++ PPC_LCMPI r4,0
++ bne 1f
++ li r4,1
++1: PPC_LL r13,4*SZL(r3)
++ PPC_LL r14,5*SZL(r3)
++ PPC_LL r15,6*SZL(r3)
++ PPC_LL r16,7*SZL(r3)
++ PPC_LL r17,8*SZL(r3)
++ PPC_LL r18,9*SZL(r3)
++ PPC_LL r19,10*SZL(r3)
++ PPC_LL r20,11*SZL(r3)
++ PPC_LL r21,12*SZL(r3)
++ PPC_LL r22,13*SZL(r3)
++ PPC_LL r23,14*SZL(r3)
++ PPC_LL r24,15*SZL(r3)
++ PPC_LL r25,16*SZL(r3)
++ PPC_LL r26,17*SZL(r3)
++ PPC_LL r27,18*SZL(r3)
++ PPC_LL r28,19*SZL(r3)
++ PPC_LL r29,20*SZL(r3)
++ PPC_LL r30,21*SZL(r3)
++ PPC_LL r31,22*SZL(r3)
++ PPC_LL r0,3*SZL(r3)
++ mtcrf 0x38,r0
++ PPC_LL r0,0(r3)
++ PPC_LL r1,SZL(r3)
++ PPC_LL r2,2*SZL(r3)
++ mtlr r0
++ mr r3,r4
++ blr
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/misc_32.S powerpc.git/arch/powerpc/kernel/misc_32.S
+--- linux-2.6.24/arch/powerpc/kernel/misc_32.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/misc_32.S 2008-01-28 20:25:49.000000000 +0100
+@@ -206,6 +206,45 @@
+ isync
+ blr /* Done */
+
++#ifdef CONFIG_40x
++
++/*
++ * Do an IO access in real mode
++ */
++_GLOBAL(real_readb)
++ mfmsr r7
++ ori r0,r7,MSR_DR
++ xori r0,r0,MSR_DR
++ sync
++ mtmsr r0
++ sync
++ isync
++ lbz r3,0(r3)
++ sync
++ mtmsr r7
++ sync
++ isync
++ blr
++
++ /*
++ * Do an IO access in real mode
++ */
++_GLOBAL(real_writeb)
++ mfmsr r7
++ ori r0,r7,MSR_DR
++ xori r0,r0,MSR_DR
++ sync
++ mtmsr r0
++ sync
++ isync
++ stb r3,0(r4)
++ sync
++ mtmsr r7
++ sync
++ isync
++ blr
++
++#endif /* CONFIG_40x */
+
+ /*
+ * Flush MMU TLB
+@@ -793,13 +832,6 @@
+ addi r1,r1,16
+ blr
+
+-_GLOBAL(kernel_execve)
+- li r0,__NR_execve
+- sc
+- bnslr
+- neg r3,r3
+- blr
+-
+ /*
+ * This routine is just here to keep GCC happy - sigh...
+ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/misc_64.S powerpc.git/arch/powerpc/kernel/misc_64.S
+--- linux-2.6.24/arch/powerpc/kernel/misc_64.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/misc_64.S 2008-01-28 20:25:49.000000000 +0100
+@@ -518,13 +518,6 @@
+
+ #endif /* CONFIG_ALTIVEC */
+
+-_GLOBAL(kernel_execve)
+- li r0,__NR_execve
+- sc
+- bnslr
+- neg r3,r3
+- blr
+-
+ /* kexec_wait(phys_cpu)
+ *
+ * wait for the flag to change, indicating this kernel is going away but
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/module_32.c powerpc.git/arch/powerpc/kernel/module_32.c
+--- linux-2.6.24/arch/powerpc/kernel/module_32.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/module_32.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <linux/kernel.h>
+ #include <linux/cache.h>
+ #include <linux/bug.h>
++#include <linux/sort.h>
+
+ #include "setup.h"
+
+@@ -54,22 +55,60 @@
+ addend) */
+ static unsigned int count_relocs(const Elf32_Rela *rela, unsigned int num)
+ {
+- unsigned int i, j, ret = 0;
++ unsigned int i, r_info, r_addend, _count_relocs;
+
+- /* Sure, this is order(n^2), but it's usually short, and not
+- time critical */
+- for (i = 0; i < num; i++) {
+- for (j = 0; j < i; j++) {
+- /* If this addend appeared before, it's
+- already been counted */
+- if (ELF32_R_SYM(rela[i].r_info)
+- == ELF32_R_SYM(rela[j].r_info)
+- && rela[i].r_addend == rela[j].r_addend)
+- break;
++ _count_relocs = 0;
++ r_info = 0;
++ r_addend = 0;
++ for (i = 0; i < num; i++)
++ /* Only count 24-bit relocs, others don't need stubs */
++ if (ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
++ (r_info != ELF32_R_SYM(rela[i].r_info) ||
++ r_addend != rela[i].r_addend)) {
++ _count_relocs++;
++ r_info = ELF32_R_SYM(rela[i].r_info);
++ r_addend = rela[i].r_addend;
+ }
+- if (j == i) ret++;
++
++ return _count_relocs;
++}
++
++static int relacmp(const void *_x, const void *_y)
++{
++ const Elf32_Rela *x, *y;
++
++ y = (Elf32_Rela *)_x;
++ x = (Elf32_Rela *)_y;
++
++ /* Compare the entire r_info (as opposed to ELF32_R_SYM(r_info) only) to
++ * make the comparison cheaper/faster. It won't affect the sorting or
++ * the counting algorithms' performance
++ */
++ if (x->r_info < y->r_info)
++ return -1;
++ else if (x->r_info > y->r_info)
++ return 1;
++ else if (x->r_addend < y->r_addend)
++ return -1;
++ else if (x->r_addend > y->r_addend)
++ return 1;
++ else
++ return 0;
++}
++
++static void relaswap(void *_x, void *_y, int size)
++{
++ uint32_t *x, *y, tmp;
++ int i;
++
++ y = (uint32_t *)_x;
++ x = (uint32_t *)_y;
++
++ for (i = 0; i < sizeof(Elf32_Rela) / sizeof(uint32_t); i++) {
++ tmp = x[i];
++ x[i] = y[i];
++ y[i] = tmp;
+ }
+- return ret;
+ }
+
+ /* Get the potential trampolines size required of the init and
+@@ -100,6 +139,16 @@
+ DEBUGP("Ptr: %p. Number: %u\n",
+ (void *)hdr + sechdrs[i].sh_offset,
+ sechdrs[i].sh_size / sizeof(Elf32_Rela));
++
++ /* Sort the relocation information based on a symbol and
++ * addend key. This is a stable O(n*log n) complexity
++ * alogrithm but it will reduce the complexity of
++ * count_relocs() to linear complexity O(n)
++ */
++ sort((void *)hdr + sechdrs[i].sh_offset,
++ sechdrs[i].sh_size / sizeof(Elf32_Rela),
++ sizeof(Elf32_Rela), relacmp, relaswap);
++
+ ret += count_relocs((void *)hdr
+ + sechdrs[i].sh_offset,
+ sechdrs[i].sh_size
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/module_64.c powerpc.git/arch/powerpc/kernel/module_64.c
+--- linux-2.6.24/arch/powerpc/kernel/module_64.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/module_64.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <asm/module.h>
+ #include <asm/uaccess.h>
+ #include <asm/firmware.h>
++#include <linux/sort.h>
+
+ #include "setup.h"
+
+@@ -81,25 +82,23 @@
+ different addend) */
+ static unsigned int count_relocs(const Elf64_Rela *rela, unsigned int num)
+ {
+- unsigned int i, j, ret = 0;
++ unsigned int i, r_info, r_addend, _count_relocs;
+
+ /* FIXME: Only count external ones --RR */
+- /* Sure, this is order(n^2), but it's usually short, and not
+- time critical */
+- for (i = 0; i < num; i++) {
++ _count_relocs = 0;
++ r_info = 0;
++ r_addend = 0;
++ for (i = 0; i < num; i++)
+ /* Only count 24-bit relocs, others don't need stubs */
+- if (ELF64_R_TYPE(rela[i].r_info) != R_PPC_REL24)
+- continue;
+- for (j = 0; j < i; j++) {
+- /* If this addend appeared before, it's
+- already been counted */
+- if (rela[i].r_info == rela[j].r_info
+- && rela[i].r_addend == rela[j].r_addend)
+- break;
++ if (ELF64_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
++ (r_info != ELF64_R_SYM(rela[i].r_info) ||
++ r_addend != rela[i].r_addend)) {
++ _count_relocs++;
++ r_info = ELF64_R_SYM(rela[i].r_info);
++ r_addend = rela[i].r_addend;
+ }
+- if (j == i) ret++;
+- }
+- return ret;
++
++ return _count_relocs;
+ }
+
+ void *module_alloc(unsigned long size)
+@@ -118,6 +117,44 @@
+ table entries. */
+ }
+
++static int relacmp(const void *_x, const void *_y)
++{
++ const Elf64_Rela *x, *y;
++
++ y = (Elf64_Rela *)_x;
++ x = (Elf64_Rela *)_y;
++
++ /* Compare the entire r_info (as opposed to ELF64_R_SYM(r_info) only) to
++ * make the comparison cheaper/faster. It won't affect the sorting or
++ * the counting algorithms' performance
++ */
++ if (x->r_info < y->r_info)
++ return -1;
++ else if (x->r_info > y->r_info)
++ return 1;
++ else if (x->r_addend < y->r_addend)
++ return -1;
++ else if (x->r_addend > y->r_addend)
++ return 1;
++ else
++ return 0;
++}
++
++static void relaswap(void *_x, void *_y, int size)
++{
++ uint64_t *x, *y, tmp;
++ int i;
++
++ y = (uint64_t *)_x;
++ x = (uint64_t *)_y;
++
++ for (i = 0; i < sizeof(Elf64_Rela) / sizeof(uint64_t); i++) {
++ tmp = x[i];
++ x[i] = y[i];
++ y[i] = tmp;
++ }
++}
++
+ /* Get size of potential trampolines required. */
+ static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
+ const Elf64_Shdr *sechdrs)
+@@ -133,6 +170,16 @@
+ DEBUGP("Ptr: %p. Number: %lu\n",
+ (void *)sechdrs[i].sh_addr,
+ sechdrs[i].sh_size / sizeof(Elf64_Rela));
++
++ /* Sort the relocation information based on a symbol and
++ * addend key. This is a stable O(n*log n) complexity
++ * alogrithm but it will reduce the complexity of
++ * count_relocs() to linear complexity O(n)
++ */
++ sort((void *)sechdrs[i].sh_addr,
++ sechdrs[i].sh_size / sizeof(Elf64_Rela),
++ sizeof(Elf64_Rela), relacmp, relaswap);
++
+ relocs += count_relocs((void *)sechdrs[i].sh_addr,
+ sechdrs[i].sh_size
+ / sizeof(Elf64_Rela));
+@@ -343,7 +390,7 @@
+ /* Simply set it */
+ *(u32 *)location = value;
+ break;
+-
++
+ case R_PPC64_ADDR64:
+ /* Simply set it */
+ *(unsigned long *)location = value;
+@@ -399,7 +446,7 @@
+ }
+
+ /* Only replace bits 2 through 26 */
+- *(uint32_t *)location
++ *(uint32_t *)location
+ = (*(uint32_t *)location & ~0x03fffffc)
+ | (value & 0x03fffffc);
+ break;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/of_device.c powerpc.git/arch/powerpc/kernel/of_device.c
+--- linux-2.6.24/arch/powerpc/kernel/of_device.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/of_device.c 2008-01-28 20:25:49.000000000 +0100
+@@ -5,10 +5,10 @@
+ #include <linux/module.h>
+ #include <linux/mod_devicetable.h>
+ #include <linux/slab.h>
++#include <linux/of_device.h>
+
+ #include <asm/errno.h>
+ #include <asm/dcr.h>
+-#include <asm/of_device.h>
+
+ static void of_device_make_bus_id(struct of_device *dev)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/of_platform.c powerpc.git/arch/powerpc/kernel/of_platform.c
+--- linux-2.6.24/arch/powerpc/kernel/of_platform.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/of_platform.c 2008-01-28 20:25:49.000000000 +0100
+@@ -19,6 +19,7 @@
+ #include <linux/mod_devicetable.h>
+ #include <linux/slab.h>
+ #include <linux/pci.h>
++#include <linux/of.h>
+ #include <linux/of_device.h>
+ #include <linux/of_platform.h>
+
+@@ -40,7 +41,7 @@
+ * a bus type in the list
+ */
+
+-static struct of_device_id of_default_bus_ids[] = {
++static const struct of_device_id of_default_bus_ids[] = {
+ { .type = "soc", },
+ { .compatible = "soc", },
+ { .type = "spider", },
+@@ -64,26 +65,6 @@
+
+ postcore_initcall(of_bus_driver_init);
+
+-int of_register_platform_driver(struct of_platform_driver *drv)
+-{
+- /* initialize common driver fields */
+- if (!drv->driver.name)
+- drv->driver.name = drv->name;
+- if (!drv->driver.owner)
+- drv->driver.owner = drv->owner;
+- drv->driver.bus = &of_platform_bus_type;
+-
+- /* register with core */
+- return driver_register(&drv->driver);
+-}
+-EXPORT_SYMBOL(of_register_platform_driver);
+-
+-void of_unregister_platform_driver(struct of_platform_driver *drv)
+-{
+- driver_unregister(&drv->driver);
+-}
+-EXPORT_SYMBOL(of_unregister_platform_driver);
+-
+ struct of_device* of_platform_device_create(struct device_node *np,
+ const char *bus_id,
+ struct device *parent)
+@@ -120,15 +101,15 @@
+ * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
+ * disallow recursive creation of child busses
+ */
+-static int of_platform_bus_create(struct device_node *bus,
+- struct of_device_id *matches,
++static int of_platform_bus_create(const struct device_node *bus,
++ const struct of_device_id *matches,
+ struct device *parent)
+ {
+ struct device_node *child;
+ struct of_device *dev;
+ int rc = 0;
+
+- for (child = NULL; (child = of_get_next_child(bus, child)); ) {
++ for_each_child_of_node(bus, child) {
+ pr_debug(" create child: %s\n", child->full_name);
+ dev = of_platform_device_create(child, NULL, parent);
+ if (dev == NULL)
+@@ -157,7 +138,7 @@
+ */
+
+ int of_platform_bus_probe(struct device_node *root,
+- struct of_device_id *matches,
++ const struct of_device_id *matches,
+ struct device *parent)
+ {
+ struct device_node *child;
+@@ -190,7 +171,7 @@
+ rc = of_platform_bus_create(root, matches, &dev->dev);
+ goto bail;
+ }
+- for (child = NULL; (child = of_get_next_child(root, child)); ) {
++ for_each_child_of_node(root, child) {
+ if (!of_match_node(matches, child))
+ continue;
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/pci-common.c powerpc.git/arch/powerpc/kernel/pci-common.c
+--- linux-2.6.24/arch/powerpc/kernel/pci-common.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/pci-common.c 2008-01-28 20:25:49.000000000 +0100
+@@ -48,32 +48,26 @@
+ static DEFINE_SPINLOCK(hose_spinlock);
+
+ /* XXX kill that some day ... */
+-int global_phb_number; /* Global phb counter */
++static int global_phb_number; /* Global phb counter */
+
+-extern struct list_head hose_list;
++/* ISA Memory physical address */
++resource_size_t isa_mem_base;
+
+-/*
+- * pci_controller(phb) initialized common variables.
+- */
+-static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
+-{
+- memset(hose, 0, sizeof(struct pci_controller));
+-
+- spin_lock(&hose_spinlock);
+- hose->global_number = global_phb_number++;
+- list_add_tail(&hose->list_node, &hose_list);
+- spin_unlock(&hose_spinlock);
+-}
++/* Default PCI flags is 0 */
++unsigned int ppc_pci_flags;
+
+-struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
++struct pci_controller *pcibios_alloc_controller(struct device_node *dev)
+ {
+ struct pci_controller *phb;
+
+- phb = alloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
++ phb = zalloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
+ if (phb == NULL)
+ return NULL;
+- pci_setup_pci_controller(phb);
+- phb->arch_data = dev;
++ spin_lock(&hose_spinlock);
++ phb->global_number = global_phb_number++;
++ list_add_tail(&phb->list_node, &hose_list);
++ spin_unlock(&hose_spinlock);
++ phb->dn = dev;
+ phb->is_dynamic = mem_init_done;
+ #ifdef CONFIG_PPC64
+ if (dev) {
+@@ -126,15 +120,10 @@
+ */
+ int pci_domain_nr(struct pci_bus *bus)
+ {
+- if (firmware_has_feature(FW_FEATURE_ISERIES))
+- return 0;
+- else {
+- struct pci_controller *hose = pci_bus_to_host(bus);
++ struct pci_controller *hose = pci_bus_to_host(bus);
+
+- return hose->global_number;
+- }
++ return hose->global_number;
+ }
+-
+ EXPORT_SYMBOL(pci_domain_nr);
+
+ #ifdef CONFIG_PPC_OF
+@@ -153,7 +142,7 @@
+ while(node) {
+ struct pci_controller *hose, *tmp;
+ list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
+- if (hose->arch_data == node)
++ if (hose->dn == node)
+ return hose;
+ node = node->parent;
+ }
+@@ -201,6 +190,20 @@
+ struct of_irq oirq;
+ unsigned int virq;
+
++ /* The current device-tree that iSeries generates from the HV
++ * PCI informations doesn't contain proper interrupt routing,
++ * and all the fallback would do is print out crap, so we
++ * don't attempt to resolve the interrupts here at all, some
++ * iSeries specific fixup does it.
++ *
++ * In the long run, we will hopefully fix the generated device-tree
++ * instead.
++ */
++#ifdef CONFIG_PPC_ISERIES
++ if (firmware_has_feature(FW_FEATURE_ISERIES))
++ return -1;
++#endif
++
+ DBG("Try to map irq for %s...\n", pci_name(pci_dev));
+
+ #ifdef DEBUG
+@@ -222,10 +225,11 @@
+ if (pin == 0)
+ return -1;
+ if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) ||
+- line == 0xff) {
++ line == 0xff || line == 0) {
+ return -1;
+ }
+- DBG(" -> no map ! Using irq line %d from PCI config\n", line);
++ DBG(" -> no map ! Using line %d (pin %d) from PCI config\n",
++ line, pin);
+
+ virq = irq_create_mapping(NULL, line);
+ if (virq != NO_IRQ)
+@@ -475,3 +479,717 @@
+ *start = rsrc->start - offset;
+ *end = rsrc->end - offset;
+ }
++
++/**
++ * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
++ * @hose: newly allocated pci_controller to be setup
++ * @dev: device node of the host bridge
++ * @primary: set if primary bus (32 bits only, soon to be deprecated)
++ *
++ * This function will parse the "ranges" property of a PCI host bridge device
++ * node and setup the resource mapping of a pci controller based on its
++ * content.
++ *
++ * Life would be boring if it wasn't for a few issues that we have to deal
++ * with here:
++ *
++ * - We can only cope with one IO space range and up to 3 Memory space
++ * ranges. However, some machines (thanks Apple !) tend to split their
++ * space into lots of small contiguous ranges. So we have to coalesce.
++ *
++ * - We can only cope with all memory ranges having the same offset
++ * between CPU addresses and PCI addresses. Unfortunately, some bridges
++ * are setup for a large 1:1 mapping along with a small "window" which
++ * maps PCI address 0 to some arbitrary high address of the CPU space in
++ * order to give access to the ISA memory hole.
++ * The way out of here that I've chosen for now is to always set the
++ * offset based on the first resource found, then override it if we
++ * have a different offset and the previous was set by an ISA hole.
++ *
++ * - Some busses have IO space not starting at 0, which causes trouble with
++ * the way we do our IO resource renumbering. The code somewhat deals with
++ * it for 64 bits but I would expect problems on 32 bits.
++ *
++ * - Some 32 bits platforms such as 4xx can have physical space larger than
++ * 32 bits so we need to use 64 bits values for the parsing
++ */
++void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
++ struct device_node *dev,
++ int primary)
++{
++ const u32 *ranges;
++ int rlen;
++ int pna = of_n_addr_cells(dev);
++ int np = pna + 5;
++ int memno = 0, isa_hole = -1;
++ u32 pci_space;
++ unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size;
++ unsigned long long isa_mb = 0;
++ struct resource *res;
++
++ printk(KERN_INFO "PCI host bridge %s %s ranges:\n",
++ dev->full_name, primary ? "(primary)" : "");
++
++ /* Get ranges property */
++ ranges = of_get_property(dev, "ranges", &rlen);
++ if (ranges == NULL)
++ return;
++
++ /* Parse it */
++ while ((rlen -= np * 4) >= 0) {
++ /* Read next ranges element */
++ pci_space = ranges[0];
++ pci_addr = of_read_number(ranges + 1, 2);
++ cpu_addr = of_translate_address(dev, ranges + 3);
++ size = of_read_number(ranges + pna + 3, 2);
++ ranges += np;
++ if (cpu_addr == OF_BAD_ADDR || size == 0)
++ continue;
++
++ /* Now consume following elements while they are contiguous */
++ for (; rlen >= np * sizeof(u32);
++ ranges += np, rlen -= np * 4) {
++ if (ranges[0] != pci_space)
++ break;
++ pci_next = of_read_number(ranges + 1, 2);
++ cpu_next = of_translate_address(dev, ranges + 3);
++ if (pci_next != pci_addr + size ||
++ cpu_next != cpu_addr + size)
++ break;
++ size += of_read_number(ranges + pna + 3, 2);
++ }
++
++ /* Act based on address space type */
++ res = NULL;
++ switch ((pci_space >> 24) & 0x3) {
++ case 1: /* PCI IO space */
++ printk(KERN_INFO
++ " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
++ cpu_addr, cpu_addr + size - 1, pci_addr);
++
++ /* We support only one IO range */
++ if (hose->pci_io_size) {
++ printk(KERN_INFO
++ " \\--> Skipped (too many) !\n");
++ continue;
++ }
++#ifdef CONFIG_PPC32
++ /* On 32 bits, limit I/O space to 16MB */
++ if (size > 0x01000000)
++ size = 0x01000000;
++
++ /* 32 bits needs to map IOs here */
++ hose->io_base_virt = ioremap(cpu_addr, size);
++
++ /* Expect trouble if pci_addr is not 0 */
++ if (primary)
++ isa_io_base =
++ (unsigned long)hose->io_base_virt;
++#endif /* CONFIG_PPC32 */
++ /* pci_io_size and io_base_phys always represent IO
++ * space starting at 0 so we factor in pci_addr
++ */
++ hose->pci_io_size = pci_addr + size;
++ hose->io_base_phys = cpu_addr - pci_addr;
++
++ /* Build resource */
++ res = &hose->io_resource;
++ res->flags = IORESOURCE_IO;
++ res->start = pci_addr;
++ break;
++ case 2: /* PCI Memory space */
++ printk(KERN_INFO
++ " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
++ cpu_addr, cpu_addr + size - 1, pci_addr,
++ (pci_space & 0x40000000) ? "Prefetch" : "");
++
++ /* We support only 3 memory ranges */
++ if (memno >= 3) {
++ printk(KERN_INFO
++ " \\--> Skipped (too many) !\n");
++ continue;
++ }
++ /* Handles ISA memory hole space here */
++ if (pci_addr == 0) {
++ isa_mb = cpu_addr;
++ isa_hole = memno;
++ if (primary || isa_mem_base == 0)
++ isa_mem_base = cpu_addr;
++ }
++
++ /* We get the PCI/Mem offset from the first range or
++ * the, current one if the offset came from an ISA
++ * hole. If they don't match, bugger.
++ */
++ if (memno == 0 ||
++ (isa_hole >= 0 && pci_addr != 0 &&
++ hose->pci_mem_offset == isa_mb))
++ hose->pci_mem_offset = cpu_addr - pci_addr;
++ else if (pci_addr != 0 &&
++ hose->pci_mem_offset != cpu_addr - pci_addr) {
++ printk(KERN_INFO
++ " \\--> Skipped (offset mismatch) !\n");
++ continue;
++ }
++
++ /* Build resource */
++ res = &hose->mem_resources[memno++];
++ res->flags = IORESOURCE_MEM;
++ if (pci_space & 0x40000000)
++ res->flags |= IORESOURCE_PREFETCH;
++ res->start = cpu_addr;
++ break;
++ }
++ if (res != NULL) {
++ res->name = dev->full_name;
++ res->end = res->start + size - 1;
++ res->parent = NULL;
++ res->sibling = NULL;
++ res->child = NULL;
++ }
++ }
++
++ /* Out of paranoia, let's put the ISA hole last if any */
++ if (isa_hole >= 0 && memno > 0 && isa_hole != (memno-1)) {
++ struct resource tmp = hose->mem_resources[isa_hole];
++ hose->mem_resources[isa_hole] = hose->mem_resources[memno-1];
++ hose->mem_resources[memno-1] = tmp;
++ }
++}
++
++/* Decide whether to display the domain number in /proc */
++int pci_proc_domain(struct pci_bus *bus)
++{
++ struct pci_controller *hose = pci_bus_to_host(bus);
++#ifdef CONFIG_PPC64
++ return hose->buid != 0;
++#else
++ if (!(ppc_pci_flags & PPC_PCI_ENABLE_PROC_DOMAINS))
++ return 0;
++ if (ppc_pci_flags & PPC_PCI_COMPAT_DOMAIN_0)
++ return hose->global_number != 0;
++ return 1;
++#endif
++}
++
++void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
++ struct resource *res)
++{
++ resource_size_t offset = 0, mask = (resource_size_t)-1;
++ struct pci_controller *hose = pci_bus_to_host(dev->bus);
++
++ if (!hose)
++ return;
++ if (res->flags & IORESOURCE_IO) {
++ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
++ mask = 0xffffffffu;
++ } else if (res->flags & IORESOURCE_MEM)
++ offset = hose->pci_mem_offset;
++
++ region->start = (res->start - offset) & mask;
++ region->end = (res->end - offset) & mask;
++}
++EXPORT_SYMBOL(pcibios_resource_to_bus);
++
++void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
++ struct pci_bus_region *region)
++{
++ resource_size_t offset = 0, mask = (resource_size_t)-1;
++ struct pci_controller *hose = pci_bus_to_host(dev->bus);
++
++ if (!hose)
++ return;
++ if (res->flags & IORESOURCE_IO) {
++ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
++ mask = 0xffffffffu;
++ } else if (res->flags & IORESOURCE_MEM)
++ offset = hose->pci_mem_offset;
++ res->start = (region->start + offset) & mask;
++ res->end = (region->end + offset) & mask;
++}
++EXPORT_SYMBOL(pcibios_bus_to_resource);
++
++/* Fixup a bus resource into a linux resource */
++static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
++{
++ struct pci_controller *hose = pci_bus_to_host(dev->bus);
++ resource_size_t offset = 0, mask = (resource_size_t)-1;
++
++ if (res->flags & IORESOURCE_IO) {
++ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
++ mask = 0xffffffffu;
++ } else if (res->flags & IORESOURCE_MEM)
++ offset = hose->pci_mem_offset;
++
++ res->start = (res->start + offset) & mask;
++ res->end = (res->end + offset) & mask;
++
++ pr_debug("PCI:%s %016llx-%016llx\n",
++ pci_name(dev),
++ (unsigned long long)res->start,
++ (unsigned long long)res->end);
++}
++
++
++/* This header fixup will do the resource fixup for all devices as they are
++ * probed, but not for bridge ranges
++ */
++static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
++{
++ struct pci_controller *hose = pci_bus_to_host(dev->bus);
++ int i;
++
++ if (!hose) {
++ printk(KERN_ERR "No host bridge for PCI dev %s !\n",
++ pci_name(dev));
++ return;
++ }
++ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
++ struct resource *res = dev->resource + i;
++ if (!res->flags)
++ continue;
++ if (res->end == 0xffffffff) {
++ pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n",
++ pci_name(dev), i,
++ (unsigned long long)res->start,
++ (unsigned long long)res->end,
++ (unsigned int)res->flags);
++ res->end -= res->start;
++ res->start = 0;
++ res->flags |= IORESOURCE_UNSET;
++ continue;
++ }
++
++ pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n",
++ pci_name(dev), i,
++ (unsigned long long)res->start,\
++ (unsigned long long)res->end,
++ (unsigned int)res->flags);
++
++ fixup_resource(res, dev);
++ }
++
++ /* Call machine specific resource fixup */
++ if (ppc_md.pcibios_fixup_resources)
++ ppc_md.pcibios_fixup_resources(dev);
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
++
++static void __devinit __pcibios_fixup_bus(struct pci_bus *bus)
++{
++ struct pci_controller *hose = pci_bus_to_host(bus);
++ struct pci_dev *dev = bus->self;
++
++ pr_debug("PCI: Fixup bus %d (%s)\n", bus->number, dev ? pci_name(dev) : "PHB");
++
++ /* Fixup PCI<->PCI bridges. Host bridges are handled separately, for
++ * now differently between 32 and 64 bits.
++ */
++ if (dev != NULL) {
++ struct resource *res;
++ int i;
++
++ for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
++ if ((res = bus->resource[i]) == NULL)
++ continue;
++ if (!res->flags)
++ continue;
++ if (i >= 3 && bus->self->transparent)
++ continue;
++ /* On PowerMac, Apple leaves bridge windows open over
++ * an inaccessible region of memory space (0...fffff)
++ * which is somewhat bogus, but that's what they think
++ * means disabled...
++ *
++ * We clear those to force them to be reallocated later
++ *
++ * We detect such regions by the fact that the base is
++ * equal to the pci_mem_offset of the host bridge and
++ * their size is smaller than 1M.
++ */
++ if (res->flags & IORESOURCE_MEM &&
++ res->start == hose->pci_mem_offset &&
++ res->end < 0x100000) {
++ printk(KERN_INFO
++ "PCI: Closing bogus Apple Firmware"
++ " region %d on bus 0x%02x\n",
++ i, bus->number);
++ res->flags = 0;
++ continue;
++ }
++
++ pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n",
++ pci_name(dev), i,
++ (unsigned long long)res->start,\
++ (unsigned long long)res->end,
++ (unsigned int)res->flags);
++
++ fixup_resource(res, dev);
++ }
++ }
++
++ /* Additional setup that is different between 32 and 64 bits for now */
++ pcibios_do_bus_setup(bus);
++
++ /* Platform specific bus fixups */
++ if (ppc_md.pcibios_fixup_bus)
++ ppc_md.pcibios_fixup_bus(bus);
++
++ /* Read default IRQs and fixup if necessary */
++ list_for_each_entry(dev, &bus->devices, bus_list) {
++ pci_read_irq_line(dev);
++ if (ppc_md.pci_irq_fixup)
++ ppc_md.pci_irq_fixup(dev);
++ }
++}
++
++void __devinit pcibios_fixup_bus(struct pci_bus *bus)
++{
++ /* When called from the generic PCI probe, read PCI<->PCI bridge
++ * bases before proceeding
++ */
++ if (bus->self != NULL)
++ pci_read_bridge_bases(bus);
++ __pcibios_fixup_bus(bus);
++}
++EXPORT_SYMBOL(pcibios_fixup_bus);
++
++/* When building a bus from the OF tree rather than probing, we need a
++ * slightly different version of the fixup which doesn't read the
++ * bridge bases using config space accesses
++ */
++void __devinit pcibios_fixup_of_probed_bus(struct pci_bus *bus)
++{
++ __pcibios_fixup_bus(bus);
++}
++
++static int skip_isa_ioresource_align(struct pci_dev *dev)
++{
++ if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
++ !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
++ return 1;
++ return 0;
++}
++
++/*
++ * We need to avoid collisions with `mirrored' VGA ports
++ * and other strange ISA hardware, so we always want the
++ * addresses to be allocated in the 0x000-0x0ff region
++ * modulo 0x400.
++ *
++ * Why? Because some silly external IO cards only decode
++ * the low 10 bits of the IO address. The 0x00-0xff region
++ * is reserved for motherboard devices that decode all 16
++ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
++ * but we want to try to avoid allocating at 0x2900-0x2bff
++ * which might have be mirrored at 0x0100-0x03ff..
++ */
++void pcibios_align_resource(void *data, struct resource *res,
++ resource_size_t size, resource_size_t align)
++{
++ struct pci_dev *dev = data;
++
++ if (res->flags & IORESOURCE_IO) {
++ resource_size_t start = res->start;
++
++ if (skip_isa_ioresource_align(dev))
++ return;
++ if (start & 0x300) {
++ start = (start + 0x3ff) & ~0x3ff;
++ res->start = start;
++ }
++ }
++}
++EXPORT_SYMBOL(pcibios_align_resource);
++
++/*
++ * Reparent resource children of pr that conflict with res
++ * under res, and make res replace those children.
++ */
++static int __init reparent_resources(struct resource *parent,
++ struct resource *res)
++{
++ struct resource *p, **pp;
++ struct resource **firstpp = NULL;
++
++ for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
++ if (p->end < res->start)
++ continue;
++ if (res->end < p->start)
++ break;
++ if (p->start < res->start || p->end > res->end)
++ return -1; /* not completely contained */
++ if (firstpp == NULL)
++ firstpp = pp;
++ }
++ if (firstpp == NULL)
++ return -1; /* didn't find any conflicting entries? */
++ res->parent = parent;
++ res->child = *firstpp;
++ res->sibling = *pp;
++ *firstpp = res;
++ *pp = NULL;
++ for (p = res->child; p != NULL; p = p->sibling) {
++ p->parent = res;
++ DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
++ p->name,
++ (unsigned long long)p->start,
++ (unsigned long long)p->end, res->name);
++ }
++ return 0;
++}
++
++/*
++ * Handle resources of PCI devices. If the world were perfect, we could
++ * just allocate all the resource regions and do nothing more. It isn't.
++ * On the other hand, we cannot just re-allocate all devices, as it would
++ * require us to know lots of host bridge internals. So we attempt to
++ * keep as much of the original configuration as possible, but tweak it
++ * when it's found to be wrong.
++ *
++ * Known BIOS problems we have to work around:
++ * - I/O or memory regions not configured
++ * - regions configured, but not enabled in the command register
++ * - bogus I/O addresses above 64K used
++ * - expansion ROMs left enabled (this may sound harmless, but given
++ * the fact the PCI specs explicitly allow address decoders to be
++ * shared between expansion ROMs and other resource regions, it's
++ * at least dangerous)
++ *
++ * Our solution:
++ * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
++ * This gives us fixed barriers on where we can allocate.
++ * (2) Allocate resources for all enabled devices. If there is
++ * a collision, just mark the resource as unallocated. Also
++ * disable expansion ROMs during this step.
++ * (3) Try to allocate resources for disabled devices. If the
++ * resources were assigned correctly, everything goes well,
++ * if they weren't, they won't disturb allocation of other
++ * resources.
++ * (4) Assign new addresses to resources which were either
++ * not configured at all or misconfigured. If explicitly
++ * requested by the user, configure expansion ROM address
++ * as well.
++ */
++
++static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
++{
++ struct pci_bus *bus;
++ int i;
++ struct resource *res, *pr;
++
++ /* Depth-First Search on bus tree */
++ list_for_each_entry(bus, bus_list, node) {
++ for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
++ if ((res = bus->resource[i]) == NULL || !res->flags
++ || res->start > res->end)
++ continue;
++ if (bus->parent == NULL)
++ pr = (res->flags & IORESOURCE_IO) ?
++ &ioport_resource : &iomem_resource;
++ else {
++ /* Don't bother with non-root busses when
++ * re-assigning all resources. We clear the
++ * resource flags as if they were colliding
++ * and as such ensure proper re-allocation
++ * later.
++ */
++ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
++ goto clear_resource;
++ pr = pci_find_parent_resource(bus->self, res);
++ if (pr == res) {
++ /* this happens when the generic PCI
++ * code (wrongly) decides that this
++ * bridge is transparent -- paulus
++ */
++ continue;
++ }
++ }
++
++ DBG("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx "
++ "[0x%x], parent %p (%s)\n",
++ bus->self ? pci_name(bus->self) : "PHB",
++ bus->number, i,
++ (unsigned long long)res->start,
++ (unsigned long long)res->end,
++ (unsigned int)res->flags,
++ pr, (pr && pr->name) ? pr->name : "nil");
++
++ if (pr && !(pr->flags & IORESOURCE_UNSET)) {
++ if (request_resource(pr, res) == 0)
++ continue;
++ /*
++ * Must be a conflict with an existing entry.
++ * Move that entry (or entries) under the
++ * bridge resource and try again.
++ */
++ if (reparent_resources(pr, res) == 0)
++ continue;
++ }
++ printk(KERN_WARNING
++ "PCI: Cannot allocate resource region "
++ "%d of PCI bridge %d, will remap\n",
++ i, bus->number);
++clear_resource:
++ res->flags = 0;
++ }
++ pcibios_allocate_bus_resources(&bus->children);
++ }
++}
++
++static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
++{
++ struct resource *pr, *r = &dev->resource[idx];
++
++ DBG("PCI: Allocating %s: Resource %d: %016llx..%016llx [%x]\n",
++ pci_name(dev), idx,
++ (unsigned long long)r->start,
++ (unsigned long long)r->end,
++ (unsigned int)r->flags);
++
++ pr = pci_find_parent_resource(dev, r);
++ if (!pr || (pr->flags & IORESOURCE_UNSET) ||
++ request_resource(pr, r) < 0) {
++ printk(KERN_WARNING "PCI: Cannot allocate resource region %d"
++ " of device %s, will remap\n", idx, pci_name(dev));
++ if (pr)
++ DBG("PCI: parent is %p: %016llx-%016llx [%x]\n", pr,
++ (unsigned long long)pr->start,
++ (unsigned long long)pr->end,
++ (unsigned int)pr->flags);
++ /* We'll assign a new address later */
++ r->flags |= IORESOURCE_UNSET;
++ r->end -= r->start;
++ r->start = 0;
++ }
++}
++
++static void __init pcibios_allocate_resources(int pass)
++{
++ struct pci_dev *dev = NULL;
++ int idx, disabled;
++ u16 command;
++ struct resource *r;
++
++ for_each_pci_dev(dev) {
++ pci_read_config_word(dev, PCI_COMMAND, &command);
++ for (idx = 0; idx < 6; idx++) {
++ r = &dev->resource[idx];
++ if (r->parent) /* Already allocated */
++ continue;
++ if (!r->flags || (r->flags & IORESOURCE_UNSET))
++ continue; /* Not assigned at all */
++ if (r->flags & IORESOURCE_IO)
++ disabled = !(command & PCI_COMMAND_IO);
++ else
++ disabled = !(command & PCI_COMMAND_MEMORY);
++ if (pass == disabled)
++ alloc_resource(dev, idx);
++ }
++ if (pass)
++ continue;
++ r = &dev->resource[PCI_ROM_RESOURCE];
++ if (r->flags & IORESOURCE_ROM_ENABLE) {
++ /* Turn the ROM off, leave the resource region,
++ * but keep it unregistered.
++ */
++ u32 reg;
++ DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
++ r->flags &= ~IORESOURCE_ROM_ENABLE;
++ pci_read_config_dword(dev, dev->rom_base_reg, &reg);
++ pci_write_config_dword(dev, dev->rom_base_reg,
++ reg & ~PCI_ROM_ADDRESS_ENABLE);
++ }
++ }
++}
++
++void __init pcibios_resource_survey(void)
++{
++ /* Allocate and assign resources. If we re-assign everything, then
++ * we skip the allocate phase
++ */
++ pcibios_allocate_bus_resources(&pci_root_buses);
++
++ if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
++ pcibios_allocate_resources(0);
++ pcibios_allocate_resources(1);
++ }
++
++ if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
++ DBG("PCI: Assigning unassigned resouces...\n");
++ pci_assign_unassigned_resources();
++ }
++
++ /* Call machine dependent fixup */
++ if (ppc_md.pcibios_fixup)
++ ppc_md.pcibios_fixup();
++}
++
++#ifdef CONFIG_HOTPLUG
++/* This is used by the pSeries hotplug driver to allocate resource
++ * of newly plugged busses. We can try to consolidate with the
++ * rest of the code later, for now, keep it as-is
++ */
++void __devinit pcibios_claim_one_bus(struct pci_bus *bus)
++{
++ struct pci_dev *dev;
++ struct pci_bus *child_bus;
++
++ list_for_each_entry(dev, &bus->devices, bus_list) {
++ int i;
++
++ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
++ struct resource *r = &dev->resource[i];
++
++ if (r->parent || !r->start || !r->flags)
++ continue;
++ pci_claim_resource(dev, i);
++ }
++ }
++
++ list_for_each_entry(child_bus, &bus->children, node)
++ pcibios_claim_one_bus(child_bus);
++}
++EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
++#endif /* CONFIG_HOTPLUG */
++
++int pcibios_enable_device(struct pci_dev *dev, int mask)
++{
++ u16 cmd, old_cmd;
++ int idx;
++ struct resource *r;
++
++ if (ppc_md.pcibios_enable_device_hook)
++ if (ppc_md.pcibios_enable_device_hook(dev))
++ return -EINVAL;
++
++ pci_read_config_word(dev, PCI_COMMAND, &cmd);
++ old_cmd = cmd;
++ for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
++ /* Only set up the requested stuff */
++ if (!(mask & (1 << idx)))
++ continue;
++ r = &dev->resource[idx];
++ if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
++ continue;
++ if ((idx == PCI_ROM_RESOURCE) &&
++ (!(r->flags & IORESOURCE_ROM_ENABLE)))
++ continue;
++ if (r->parent == NULL) {
++ printk(KERN_ERR "PCI: Device %s not available because"
++ " of resource collisions\n", pci_name(dev));
++ return -EINVAL;
++ }
++ if (r->flags & IORESOURCE_IO)
++ cmd |= PCI_COMMAND_IO;
++ if (r->flags & IORESOURCE_MEM)
++ cmd |= PCI_COMMAND_MEMORY;
++ }
++ if (cmd != old_cmd) {
++ printk("PCI: Enabling device %s (%04x -> %04x)\n",
++ pci_name(dev), old_cmd, cmd);
++ pci_write_config_word(dev, PCI_COMMAND, cmd);
++ }
++ return 0;
++}
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/pci_32.c powerpc.git/arch/powerpc/kernel/pci_32.c
+--- linux-2.6.24/arch/powerpc/kernel/pci_32.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/pci_32.c 2008-01-28 20:25:49.000000000 +0100
+@@ -13,6 +13,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/irq.h>
+ #include <linux/list.h>
++#include <linux/of.h>
+
+ #include <asm/processor.h>
+ #include <asm/io.h>
+@@ -32,19 +33,12 @@
+ #endif
+
+ unsigned long isa_io_base = 0;
+-unsigned long isa_mem_base = 0;
+ unsigned long pci_dram_offset = 0;
+ int pcibios_assign_bus_offset = 1;
+
+ void pcibios_make_OF_bus_map(void);
+
+-static int pci_relocate_bridge_resource(struct pci_bus *bus, int i);
+-static int probe_resource(struct pci_bus *parent, struct resource *pr,
+- struct resource *res, struct resource **conflict);
+-static void update_bridge_base(struct pci_bus *bus, int i);
+-static void pcibios_fixup_resources(struct pci_dev* dev);
+ static void fixup_broken_pcnet32(struct pci_dev* dev);
+-static int reparent_resources(struct resource *parent, struct resource *res);
+ static void fixup_cpc710_pci64(struct pci_dev* dev);
+ #ifdef CONFIG_PPC_OF
+ static u8* pci_to_OF_bus_map;
+@@ -53,7 +47,7 @@
+ /* By default, we don't re-assign bus numbers. We do this only on
+ * some pmacs
+ */
+-int pci_assign_all_buses;
++static int pci_assign_all_buses;
+
+ LIST_HEAD(hose_list);
+
+@@ -100,505 +94,6 @@
+ }
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64);
+
+-static void
+-pcibios_fixup_resources(struct pci_dev *dev)
+-{
+- struct pci_controller* hose = (struct pci_controller *)dev->sysdata;
+- int i;
+- unsigned long offset;
+-
+- if (!hose) {
+- printk(KERN_ERR "No hose for PCI dev %s!\n", pci_name(dev));
+- return;
+- }
+- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+- struct resource *res = dev->resource + i;
+- if (!res->flags)
+- continue;
+- if (res->end == 0xffffffff) {
+- DBG("PCI:%s Resource %d [%016llx-%016llx] is unassigned\n",
+- pci_name(dev), i, (u64)res->start, (u64)res->end);
+- res->end -= res->start;
+- res->start = 0;
+- res->flags |= IORESOURCE_UNSET;
+- continue;
+- }
+- offset = 0;
+- if (res->flags & IORESOURCE_MEM) {
+- offset = hose->pci_mem_offset;
+- } else if (res->flags & IORESOURCE_IO) {
+- offset = (unsigned long) hose->io_base_virt
+- - isa_io_base;
+- }
+- if (offset != 0) {
+- res->start += offset;
+- res->end += offset;
+- DBG("Fixup res %d (%lx) of dev %s: %llx -> %llx\n",
+- i, res->flags, pci_name(dev),
+- (u64)res->start - offset, (u64)res->start);
+- }
+- }
+-
+- /* Call machine specific resource fixup */
+- if (ppc_md.pcibios_fixup_resources)
+- ppc_md.pcibios_fixup_resources(dev);
+-}
+-DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
+-
+-void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
+- struct resource *res)
+-{
+- unsigned long offset = 0;
+- struct pci_controller *hose = dev->sysdata;
+-
+- if (hose && res->flags & IORESOURCE_IO)
+- offset = (unsigned long)hose->io_base_virt - isa_io_base;
+- else if (hose && res->flags & IORESOURCE_MEM)
+- offset = hose->pci_mem_offset;
+- region->start = res->start - offset;
+- region->end = res->end - offset;
+-}
+-EXPORT_SYMBOL(pcibios_resource_to_bus);
+-
+-void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+- struct pci_bus_region *region)
+-{
+- unsigned long offset = 0;
+- struct pci_controller *hose = dev->sysdata;
+-
+- if (hose && res->flags & IORESOURCE_IO)
+- offset = (unsigned long)hose->io_base_virt - isa_io_base;
+- else if (hose && res->flags & IORESOURCE_MEM)
+- offset = hose->pci_mem_offset;
+- res->start = region->start + offset;
+- res->end = region->end + offset;
+-}
+-EXPORT_SYMBOL(pcibios_bus_to_resource);
+-
+-/*
+- * We need to avoid collisions with `mirrored' VGA ports
+- * and other strange ISA hardware, so we always want the
+- * addresses to be allocated in the 0x000-0x0ff region
+- * modulo 0x400.
+- *
+- * Why? Because some silly external IO cards only decode
+- * the low 10 bits of the IO address. The 0x00-0xff region
+- * is reserved for motherboard devices that decode all 16
+- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
+- * but we want to try to avoid allocating at 0x2900-0x2bff
+- * which might have be mirrored at 0x0100-0x03ff..
+- */
+-void pcibios_align_resource(void *data, struct resource *res,
+- resource_size_t size, resource_size_t align)
+-{
+- struct pci_dev *dev = data;
+-
+- if (res->flags & IORESOURCE_IO) {
+- resource_size_t start = res->start;
+-
+- if (size > 0x100) {
+- printk(KERN_ERR "PCI: I/O Region %s/%d too large"
+- " (%lld bytes)\n", pci_name(dev),
+- dev->resource - res, (unsigned long long)size);
+- }
+-
+- if (start & 0x300) {
+- start = (start + 0x3ff) & ~0x3ff;
+- res->start = start;
+- }
+- }
+-}
+-EXPORT_SYMBOL(pcibios_align_resource);
+-
+-/*
+- * Handle resources of PCI devices. If the world were perfect, we could
+- * just allocate all the resource regions and do nothing more. It isn't.
+- * On the other hand, we cannot just re-allocate all devices, as it would
+- * require us to know lots of host bridge internals. So we attempt to
+- * keep as much of the original configuration as possible, but tweak it
+- * when it's found to be wrong.
+- *
+- * Known BIOS problems we have to work around:
+- * - I/O or memory regions not configured
+- * - regions configured, but not enabled in the command register
+- * - bogus I/O addresses above 64K used
+- * - expansion ROMs left enabled (this may sound harmless, but given
+- * the fact the PCI specs explicitly allow address decoders to be
+- * shared between expansion ROMs and other resource regions, it's
+- * at least dangerous)
+- *
+- * Our solution:
+- * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
+- * This gives us fixed barriers on where we can allocate.
+- * (2) Allocate resources for all enabled devices. If there is
+- * a collision, just mark the resource as unallocated. Also
+- * disable expansion ROMs during this step.
+- * (3) Try to allocate resources for disabled devices. If the
+- * resources were assigned correctly, everything goes well,
+- * if they weren't, they won't disturb allocation of other
+- * resources.
+- * (4) Assign new addresses to resources which were either
+- * not configured at all or misconfigured. If explicitly
+- * requested by the user, configure expansion ROM address
+- * as well.
+- */
+-
+-static void __init
+-pcibios_allocate_bus_resources(struct list_head *bus_list)
+-{
+- struct pci_bus *bus;
+- int i;
+- struct resource *res, *pr;
+-
+- /* Depth-First Search on bus tree */
+- list_for_each_entry(bus, bus_list, node) {
+- for (i = 0; i < 4; ++i) {
+- if ((res = bus->resource[i]) == NULL || !res->flags
+- || res->start > res->end)
+- continue;
+- if (bus->parent == NULL)
+- pr = (res->flags & IORESOURCE_IO)?
+- &ioport_resource: &iomem_resource;
+- else {
+- pr = pci_find_parent_resource(bus->self, res);
+- if (pr == res) {
+- /* this happens when the generic PCI
+- * code (wrongly) decides that this
+- * bridge is transparent -- paulus
+- */
+- continue;
+- }
+- }
+-
+- DBG("PCI: bridge rsrc %llx..%llx (%lx), parent %p\n",
+- (u64)res->start, (u64)res->end, res->flags, pr);
+- if (pr) {
+- if (request_resource(pr, res) == 0)
+- continue;
+- /*
+- * Must be a conflict with an existing entry.
+- * Move that entry (or entries) under the
+- * bridge resource and try again.
+- */
+- if (reparent_resources(pr, res) == 0)
+- continue;
+- }
+- printk(KERN_ERR "PCI: Cannot allocate resource region "
+- "%d of PCI bridge %d\n", i, bus->number);
+- if (pci_relocate_bridge_resource(bus, i))
+- bus->resource[i] = NULL;
+- }
+- pcibios_allocate_bus_resources(&bus->children);
+- }
+-}
+-
+-/*
+- * Reparent resource children of pr that conflict with res
+- * under res, and make res replace those children.
+- */
+-static int __init
+-reparent_resources(struct resource *parent, struct resource *res)
+-{
+- struct resource *p, **pp;
+- struct resource **firstpp = NULL;
+-
+- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+- if (p->end < res->start)
+- continue;
+- if (res->end < p->start)
+- break;
+- if (p->start < res->start || p->end > res->end)
+- return -1; /* not completely contained */
+- if (firstpp == NULL)
+- firstpp = pp;
+- }
+- if (firstpp == NULL)
+- return -1; /* didn't find any conflicting entries? */
+- res->parent = parent;
+- res->child = *firstpp;
+- res->sibling = *pp;
+- *firstpp = res;
+- *pp = NULL;
+- for (p = res->child; p != NULL; p = p->sibling) {
+- p->parent = res;
+- DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
+- p->name, (u64)p->start, (u64)p->end, res->name);
+- }
+- return 0;
+-}
+-
+-/*
+- * A bridge has been allocated a range which is outside the range
+- * of its parent bridge, so it needs to be moved.
+- */
+-static int __init
+-pci_relocate_bridge_resource(struct pci_bus *bus, int i)
+-{
+- struct resource *res, *pr, *conflict;
+- unsigned long try, size;
+- int j;
+- struct pci_bus *parent = bus->parent;
+-
+- if (parent == NULL) {
+- /* shouldn't ever happen */
+- printk(KERN_ERR "PCI: can't move host bridge resource\n");
+- return -1;
+- }
+- res = bus->resource[i];
+- if (res == NULL)
+- return -1;
+- pr = NULL;
+- for (j = 0; j < 4; j++) {
+- struct resource *r = parent->resource[j];
+- if (!r)
+- continue;
+- if ((res->flags ^ r->flags) & (IORESOURCE_IO | IORESOURCE_MEM))
+- continue;
+- if (!((res->flags ^ r->flags) & IORESOURCE_PREFETCH)) {
+- pr = r;
+- break;
+- }
+- if (res->flags & IORESOURCE_PREFETCH)
+- pr = r;
+- }
+- if (pr == NULL)
+- return -1;
+- size = res->end - res->start;
+- if (pr->start > pr->end || size > pr->end - pr->start)
+- return -1;
+- try = pr->end;
+- for (;;) {
+- res->start = try - size;
+- res->end = try;
+- if (probe_resource(bus->parent, pr, res, &conflict) == 0)
+- break;
+- if (conflict->start <= pr->start + size)
+- return -1;
+- try = conflict->start - 1;
+- }
+- if (request_resource(pr, res)) {
+- DBG(KERN_ERR "PCI: huh? couldn't move to %llx..%llx\n",
+- (u64)res->start, (u64)res->end);
+- return -1; /* "can't happen" */
+- }
+- update_bridge_base(bus, i);
+- printk(KERN_INFO "PCI: bridge %d resource %d moved to %llx..%llx\n",
+- bus->number, i, (unsigned long long)res->start,
+- (unsigned long long)res->end);
+- return 0;
+-}
+-
+-static int __init
+-probe_resource(struct pci_bus *parent, struct resource *pr,
+- struct resource *res, struct resource **conflict)
+-{
+- struct pci_bus *bus;
+- struct pci_dev *dev;
+- struct resource *r;
+- int i;
+-
+- for (r = pr->child; r != NULL; r = r->sibling) {
+- if (r->end >= res->start && res->end >= r->start) {
+- *conflict = r;
+- return 1;
+- }
+- }
+- list_for_each_entry(bus, &parent->children, node) {
+- for (i = 0; i < 4; ++i) {
+- if ((r = bus->resource[i]) == NULL)
+- continue;
+- if (!r->flags || r->start > r->end || r == res)
+- continue;
+- if (pci_find_parent_resource(bus->self, r) != pr)
+- continue;
+- if (r->end >= res->start && res->end >= r->start) {
+- *conflict = r;
+- return 1;
+- }
+- }
+- }
+- list_for_each_entry(dev, &parent->devices, bus_list) {
+- for (i = 0; i < 6; ++i) {
+- r = &dev->resource[i];
+- if (!r->flags || (r->flags & IORESOURCE_UNSET))
+- continue;
+- if (pci_find_parent_resource(dev, r) != pr)
+- continue;
+- if (r->end >= res->start && res->end >= r->start) {
+- *conflict = r;
+- return 1;
+- }
+- }
+- }
+- return 0;
+-}
+-
+-void __init
+-update_bridge_resource(struct pci_dev *dev, struct resource *res)
+-{
+- u8 io_base_lo, io_limit_lo;
+- u16 mem_base, mem_limit;
+- u16 cmd;
+- unsigned long start, end, off;
+- struct pci_controller *hose = dev->sysdata;
+-
+- if (!hose) {
+- printk("update_bridge_base: no hose?\n");
+- return;
+- }
+- pci_read_config_word(dev, PCI_COMMAND, &cmd);
+- pci_write_config_word(dev, PCI_COMMAND,
+- cmd & ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY));
+- if (res->flags & IORESOURCE_IO) {
+- off = (unsigned long) hose->io_base_virt - isa_io_base;
+- start = res->start - off;
+- end = res->end - off;
+- io_base_lo = (start >> 8) & PCI_IO_RANGE_MASK;
+- io_limit_lo = (end >> 8) & PCI_IO_RANGE_MASK;
+- if (end > 0xffff)
+- io_base_lo |= PCI_IO_RANGE_TYPE_32;
+- else
+- io_base_lo |= PCI_IO_RANGE_TYPE_16;
+- pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
+- start >> 16);
+- pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
+- end >> 16);
+- pci_write_config_byte(dev, PCI_IO_BASE, io_base_lo);
+- pci_write_config_byte(dev, PCI_IO_LIMIT, io_limit_lo);
+-
+- } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
+- == IORESOURCE_MEM) {
+- off = hose->pci_mem_offset;
+- mem_base = ((res->start - off) >> 16) & PCI_MEMORY_RANGE_MASK;
+- mem_limit = ((res->end - off) >> 16) & PCI_MEMORY_RANGE_MASK;
+- pci_write_config_word(dev, PCI_MEMORY_BASE, mem_base);
+- pci_write_config_word(dev, PCI_MEMORY_LIMIT, mem_limit);
+-
+- } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
+- == (IORESOURCE_MEM | IORESOURCE_PREFETCH)) {
+- off = hose->pci_mem_offset;
+- mem_base = ((res->start - off) >> 16) & PCI_PREF_RANGE_MASK;
+- mem_limit = ((res->end - off) >> 16) & PCI_PREF_RANGE_MASK;
+- pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, mem_base);
+- pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, mem_limit);
+-
+- } else {
+- DBG(KERN_ERR "PCI: ugh, bridge %s res has flags=%lx\n",
+- pci_name(dev), res->flags);
+- }
+- pci_write_config_word(dev, PCI_COMMAND, cmd);
+-}
+-
+-static void __init
+-update_bridge_base(struct pci_bus *bus, int i)
+-{
+- struct resource *res = bus->resource[i];
+- struct pci_dev *dev = bus->self;
+- update_bridge_resource(dev, res);
+-}
+-
+-static inline void alloc_resource(struct pci_dev *dev, int idx)
+-{
+- struct resource *pr, *r = &dev->resource[idx];
+-
+- DBG("PCI:%s: Resource %d: %016llx-%016llx (f=%lx)\n",
+- pci_name(dev), idx, (u64)r->start, (u64)r->end, r->flags);
+- pr = pci_find_parent_resource(dev, r);
+- if (!pr || request_resource(pr, r) < 0) {
+- printk(KERN_ERR "PCI: Cannot allocate resource region %d"
+- " of device %s\n", idx, pci_name(dev));
+- if (pr)
+- DBG("PCI: parent is %p: %016llx-%016llx (f=%lx)\n",
+- pr, (u64)pr->start, (u64)pr->end, pr->flags);
+- /* We'll assign a new address later */
+- r->flags |= IORESOURCE_UNSET;
+- r->end -= r->start;
+- r->start = 0;
+- }
+-}
+-
+-static void __init
+-pcibios_allocate_resources(int pass)
+-{
+- struct pci_dev *dev = NULL;
+- int idx, disabled;
+- u16 command;
+- struct resource *r;
+-
+- for_each_pci_dev(dev) {
+- pci_read_config_word(dev, PCI_COMMAND, &command);
+- for (idx = 0; idx < 6; idx++) {
+- r = &dev->resource[idx];
+- if (r->parent) /* Already allocated */
+- continue;
+- if (!r->flags || (r->flags & IORESOURCE_UNSET))
+- continue; /* Not assigned at all */
+- if (r->flags & IORESOURCE_IO)
+- disabled = !(command & PCI_COMMAND_IO);
+- else
+- disabled = !(command & PCI_COMMAND_MEMORY);
+- if (pass == disabled)
+- alloc_resource(dev, idx);
+- }
+- if (pass)
+- continue;
+- r = &dev->resource[PCI_ROM_RESOURCE];
+- if (r->flags & IORESOURCE_ROM_ENABLE) {
+- /* Turn the ROM off, leave the resource region, but keep it unregistered. */
+- u32 reg;
+- DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
+- r->flags &= ~IORESOURCE_ROM_ENABLE;
+- pci_read_config_dword(dev, dev->rom_base_reg, &reg);
+- pci_write_config_dword(dev, dev->rom_base_reg,
+- reg & ~PCI_ROM_ADDRESS_ENABLE);
+- }
+- }
+-}
+-
+-static void __init
+-pcibios_assign_resources(void)
+-{
+- struct pci_dev *dev = NULL;
+- int idx;
+- struct resource *r;
+-
+- for_each_pci_dev(dev) {
+- int class = dev->class >> 8;
+-
+- /* Don't touch classless devices and host bridges */
+- if (!class || class == PCI_CLASS_BRIDGE_HOST)
+- continue;
+-
+- for (idx = 0; idx < 6; idx++) {
+- r = &dev->resource[idx];
+-
+- /*
+- * We shall assign a new address to this resource,
+- * either because the BIOS (sic) forgot to do so
+- * or because we have decided the old address was
+- * unusable for some reason.
+- */
+- if ((r->flags & IORESOURCE_UNSET) && r->end &&
+- (!ppc_md.pcibios_enable_device_hook ||
+- !ppc_md.pcibios_enable_device_hook(dev, 1))) {
+- int rc;
+-
+- r->flags &= ~IORESOURCE_UNSET;
+- rc = pci_assign_resource(dev, idx);
+- BUG_ON(rc);
+- }
+- }
+-
+-#if 0 /* don't assign ROMs */
+- r = &dev->resource[PCI_ROM_RESOURCE];
+- r->end -= r->start;
+- r->start = 0;
+- if (r->end)
+- pci_assign_resource(dev, PCI_ROM_RESOURCE);
+-#endif
+- }
+-}
+-
+ #ifdef CONFIG_PPC_OF
+ /*
+ * Functions below are used on OpenFirmware machines.
+@@ -619,7 +114,7 @@
+ } else
+ pci_to_OF_bus_map[pci_bus] = bus_range[0];
+
+- for (node=node->child; node != 0;node = node->sibling) {
++ for_each_child_of_node(node, node) {
+ struct pci_dev* dev;
+ const unsigned int *class_code, *reg;
+
+@@ -662,8 +157,8 @@
+
+ /* For each hose, we begin searching bridges */
+ list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
+- struct device_node* node;
+- node = (struct device_node *)hose->arch_data;
++ struct device_node* node = hose->dn;
++
+ if (!node)
+ continue;
+ make_one_node_map(node, hose->first_busno);
+@@ -688,15 +183,18 @@
+ typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
+
+ static struct device_node*
+-scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
++scan_OF_pci_childs(struct device_node *parent, pci_OF_scan_iterator filter, void* data)
+ {
++ struct device_node *node;
+ struct device_node* sub_node;
+
+- for (; node != 0;node = node->sibling) {
++ for_each_child_of_node(parent, node) {
+ const unsigned int *class_code;
+
+- if (filter(node, data))
++ if (filter(node, data)) {
++ of_node_put(node);
+ return node;
++ }
+
+ /* For PCI<->PCI bridges or CardBus bridges, we go down
+ * Note: some OFs create a parent node "multifunc-device" as
+@@ -708,9 +206,11 @@
+ (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
+ strcmp(node->name, "multifunc-device"))
+ continue;
+- sub_node = scan_OF_pci_childs(node->child, filter, data);
+- if (sub_node)
++ sub_node = scan_OF_pci_childs(node, filter, data);
++ if (sub_node) {
++ of_node_put(node);
+ return sub_node;
++ }
+ }
+ return NULL;
+ }
+@@ -718,11 +218,11 @@
+ static struct device_node *scan_OF_for_pci_dev(struct device_node *parent,
+ unsigned int devfn)
+ {
+- struct device_node *np = NULL;
++ struct device_node *np;
+ const u32 *reg;
+ unsigned int psize;
+
+- while ((np = of_get_next_child(parent, np)) != NULL) {
++ for_each_child_of_node(parent, np) {
+ reg = of_get_property(np, "reg", &psize);
+ if (reg == NULL || psize < 4)
+ continue;
+@@ -742,7 +242,7 @@
+ struct pci_controller *hose = pci_bus_to_host(bus);
+ if (hose == NULL)
+ return NULL;
+- return of_node_get(hose->arch_data);
++ return of_node_get(hose->dn);
+ }
+
+ /* not a root bus, we need to get our parent */
+@@ -812,9 +312,9 @@
+ return -ENODEV;
+ /* Make sure it's really a PCI device */
+ hose = pci_find_hose_for_OF_device(node);
+- if (!hose || !hose->arch_data)
++ if (!hose || !hose->dn)
+ return -ENODEV;
+- if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
++ if (!scan_OF_pci_childs(hose->dn,
+ find_OF_pci_device_filter, (void *)node))
+ return -ENODEV;
+ reg = of_get_property(node, "reg", NULL);
+@@ -843,120 +343,6 @@
+ }
+ EXPORT_SYMBOL(pci_device_from_OF_node);
+
+-void __init
+-pci_process_bridge_OF_ranges(struct pci_controller *hose,
+- struct device_node *dev, int primary)
+-{
+- static unsigned int static_lc_ranges[256] __initdata;
+- const unsigned int *dt_ranges;
+- unsigned int *lc_ranges, *ranges, *prev, size;
+- int rlen = 0, orig_rlen;
+- int memno = 0;
+- struct resource *res;
+- int np, na = of_n_addr_cells(dev);
+- np = na + 5;
+-
+- /* First we try to merge ranges to fix a problem with some pmacs
+- * that can have more than 3 ranges, fortunately using contiguous
+- * addresses -- BenH
+- */
+- dt_ranges = of_get_property(dev, "ranges", &rlen);
+- if (!dt_ranges)
+- return;
+- /* Sanity check, though hopefully that never happens */
+- if (rlen > sizeof(static_lc_ranges)) {
+- printk(KERN_WARNING "OF ranges property too large !\n");
+- rlen = sizeof(static_lc_ranges);
+- }
+- lc_ranges = static_lc_ranges;
+- memcpy(lc_ranges, dt_ranges, rlen);
+- orig_rlen = rlen;
+-
+- /* Let's work on a copy of the "ranges" property instead of damaging
+- * the device-tree image in memory
+- */
+- ranges = lc_ranges;
+- prev = NULL;
+- while ((rlen -= np * sizeof(unsigned int)) >= 0) {
+- if (prev) {
+- if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
+- (prev[2] + prev[na+4]) == ranges[2] &&
+- (prev[na+2] + prev[na+4]) == ranges[na+2]) {
+- prev[na+4] += ranges[na+4];
+- ranges[0] = 0;
+- ranges += np;
+- continue;
+- }
+- }
+- prev = ranges;
+- ranges += np;
+- }
+-
+- /*
+- * The ranges property is laid out as an array of elements,
+- * each of which comprises:
+- * cells 0 - 2: a PCI address
+- * cells 3 or 3+4: a CPU physical address
+- * (size depending on dev->n_addr_cells)
+- * cells 4+5 or 5+6: the size of the range
+- */
+- ranges = lc_ranges;
+- rlen = orig_rlen;
+- while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) {
+- res = NULL;
+- size = ranges[na+4];
+- switch ((ranges[0] >> 24) & 0x3) {
+- case 1: /* I/O space */
+- if (ranges[2] != 0)
+- break;
+- hose->io_base_phys = ranges[na+2];
+- /* limit I/O space to 16MB */
+- if (size > 0x01000000)
+- size = 0x01000000;
+- hose->io_base_virt = ioremap(ranges[na+2], size);
+- if (primary)
+- isa_io_base = (unsigned long) hose->io_base_virt;
+- res = &hose->io_resource;
+- res->flags = IORESOURCE_IO;
+- res->start = ranges[2];
+- DBG("PCI: IO 0x%llx -> 0x%llx\n",
+- (u64)res->start, (u64)res->start + size - 1);
+- break;
+- case 2: /* memory space */
+- memno = 0;
+- if (ranges[1] == 0 && ranges[2] == 0
+- && ranges[na+4] <= (16 << 20)) {
+- /* 1st 16MB, i.e. ISA memory area */
+- if (primary)
+- isa_mem_base = ranges[na+2];
+- memno = 1;
+- }
+- while (memno < 3 && hose->mem_resources[memno].flags)
+- ++memno;
+- if (memno == 0)
+- hose->pci_mem_offset = ranges[na+2] - ranges[2];
+- if (memno < 3) {
+- res = &hose->mem_resources[memno];
+- res->flags = IORESOURCE_MEM;
+- if(ranges[0] & 0x40000000)
+- res->flags |= IORESOURCE_PREFETCH;
+- res->start = ranges[na+2];
+- DBG("PCI: MEM[%d] 0x%llx -> 0x%llx\n", memno,
+- (u64)res->start, (u64)res->start + size - 1);
+- }
+- break;
+- }
+- if (res != NULL) {
+- res->name = dev->full_name;
+- res->end = res->start + size - 1;
+- res->parent = NULL;
+- res->sibling = NULL;
+- res->child = NULL;
+- }
+- ranges += np;
+- }
+-}
+-
+ /* We create the "pci-OF-bus-map" property now so it appears in the
+ * /proc device tree
+ */
+@@ -986,219 +372,7 @@
+ }
+ #endif /* CONFIG_PPC_OF */
+
+-#ifdef CONFIG_PPC_PMAC
+-/*
+- * This set of routines checks for PCI<->PCI bridges that have closed
+- * IO resources and have child devices. It tries to re-open an IO
+- * window on them.
+- *
+- * This is a _temporary_ fix to workaround a problem with Apple's OF
+- * closing IO windows on P2P bridges when the OF drivers of cards
+- * below this bridge don't claim any IO range (typically ATI or
+- * Adaptec).
+- *
+- * A more complete fix would be to use drivers/pci/setup-bus.c, which
+- * involves a working pcibios_fixup_pbus_ranges(), some more care about
+- * ordering when creating the host bus resources, and maybe a few more
+- * minor tweaks
+- */
+-
+-/* Initialize bridges with base/limit values we have collected */
+-static void __init
+-do_update_p2p_io_resource(struct pci_bus *bus, int enable_vga)
+-{
+- struct pci_dev *bridge = bus->self;
+- struct pci_controller* hose = (struct pci_controller *)bridge->sysdata;
+- u32 l;
+- u16 w;
+- struct resource res;
+-
+- if (bus->resource[0] == NULL)
+- return;
+- res = *(bus->resource[0]);
+-
+- DBG("Remapping Bus %d, bridge: %s\n", bus->number, pci_name(bridge));
+- res.start -= ((unsigned long) hose->io_base_virt - isa_io_base);
+- res.end -= ((unsigned long) hose->io_base_virt - isa_io_base);
+- DBG(" IO window: %016llx-%016llx\n", res.start, res.end);
+-
+- /* Set up the top and bottom of the PCI I/O segment for this bus. */
+- pci_read_config_dword(bridge, PCI_IO_BASE, &l);
+- l &= 0xffff000f;
+- l |= (res.start >> 8) & 0x00f0;
+- l |= res.end & 0xf000;
+- pci_write_config_dword(bridge, PCI_IO_BASE, l);
+-
+- if ((l & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
+- l = (res.start >> 16) | (res.end & 0xffff0000);
+- pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, l);
+- }
+-
+- pci_read_config_word(bridge, PCI_COMMAND, &w);
+- w |= PCI_COMMAND_IO;
+- pci_write_config_word(bridge, PCI_COMMAND, w);
+-
+-#if 0 /* Enabling this causes XFree 4.2.0 to hang during PCI probe */
+- if (enable_vga) {
+- pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &w);
+- w |= PCI_BRIDGE_CTL_VGA;
+- pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, w);
+- }
+-#endif
+-}
+-
+-/* This function is pretty basic and actually quite broken for the
+- * general case, it's enough for us right now though. It's supposed
+- * to tell us if we need to open an IO range at all or not and what
+- * size.
+- */
+-static int __init
+-check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga)
+-{
+- struct pci_dev *dev;
+- int i;
+- int rc = 0;
+-
+-#define push_end(res, mask) do { \
+- BUG_ON((mask+1) & mask); \
+- res->end = (res->end + mask) | mask; \
+-} while (0)
+-
+- list_for_each_entry(dev, &bus->devices, bus_list) {
+- u16 class = dev->class >> 8;
+-
+- if (class == PCI_CLASS_DISPLAY_VGA ||
+- class == PCI_CLASS_NOT_DEFINED_VGA)
+- *found_vga = 1;
+- if (class >> 8 == PCI_BASE_CLASS_BRIDGE && dev->subordinate)
+- rc |= check_for_io_childs(dev->subordinate, res, found_vga);
+- if (class == PCI_CLASS_BRIDGE_CARDBUS)
+- push_end(res, 0xfff);
+-
+- for (i=0; i<PCI_NUM_RESOURCES; i++) {
+- struct resource *r;
+- unsigned long r_size;
+-
+- if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI
+- && i >= PCI_BRIDGE_RESOURCES)
+- continue;
+- r = &dev->resource[i];
+- r_size = r->end - r->start;
+- if (r_size < 0xfff)
+- r_size = 0xfff;
+- if (r->flags & IORESOURCE_IO && (r_size) != 0) {
+- rc = 1;
+- push_end(res, r_size);
+- }
+- }
+- }
+-
+- return rc;
+-}
+-
+-/* Here we scan all P2P bridges of a given level that have a closed
+- * IO window. Note that the test for the presence of a VGA card should
+- * be improved to take into account already configured P2P bridges,
+- * currently, we don't see them and might end up configuring 2 bridges
+- * with VGA pass through enabled
+- */
+-static void __init
+-do_fixup_p2p_level(struct pci_bus *bus)
+-{
+- struct pci_bus *b;
+- int i, parent_io;
+- int has_vga = 0;
+-
+- for (parent_io=0; parent_io<4; parent_io++)
+- if (bus->resource[parent_io]
+- && bus->resource[parent_io]->flags & IORESOURCE_IO)
+- break;
+- if (parent_io >= 4)
+- return;
+-
+- list_for_each_entry(b, &bus->children, node) {
+- struct pci_dev *d = b->self;
+- struct pci_controller* hose = (struct pci_controller *)d->sysdata;
+- struct resource *res = b->resource[0];
+- struct resource tmp_res;
+- unsigned long max;
+- int found_vga = 0;
+-
+- memset(&tmp_res, 0, sizeof(tmp_res));
+- tmp_res.start = bus->resource[parent_io]->start;
+-
+- /* We don't let low addresses go through that closed P2P bridge, well,
+- * that may not be necessary but I feel safer that way
+- */
+- if (tmp_res.start == 0)
+- tmp_res.start = 0x1000;
+-
+- if (!list_empty(&b->devices) && res && res->flags == 0 &&
+- res != bus->resource[parent_io] &&
+- (d->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
+- check_for_io_childs(b, &tmp_res, &found_vga)) {
+- u8 io_base_lo;
+-
+- printk(KERN_INFO "Fixing up IO bus %s\n", b->name);
+-
+- if (found_vga) {
+- if (has_vga) {
+- printk(KERN_WARNING "Skipping VGA, already active"
+- " on bus segment\n");
+- found_vga = 0;
+- } else
+- has_vga = 1;
+- }
+- pci_read_config_byte(d, PCI_IO_BASE, &io_base_lo);
+-
+- if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32)
+- max = ((unsigned long) hose->io_base_virt
+- - isa_io_base) + 0xffffffff;
+- else
+- max = ((unsigned long) hose->io_base_virt
+- - isa_io_base) + 0xffff;
+-
+- *res = tmp_res;
+- res->flags = IORESOURCE_IO;
+- res->name = b->name;
+-
+- /* Find a resource in the parent where we can allocate */
+- for (i = 0 ; i < 4; i++) {
+- struct resource *r = bus->resource[i];
+- if (!r)
+- continue;
+- if ((r->flags & IORESOURCE_IO) == 0)
+- continue;
+- DBG("Trying to allocate from %016llx, size %016llx from parent"
+- " res %d: %016llx -> %016llx\n",
+- res->start, res->end, i, r->start, r->end);
+-
+- if (allocate_resource(r, res, res->end + 1, res->start, max,
+- res->end + 1, NULL, NULL) < 0) {
+- DBG("Failed !\n");
+- continue;
+- }
+- do_update_p2p_io_resource(b, found_vga);
+- break;
+- }
+- }
+- do_fixup_p2p_level(b);
+- }
+-}
+-
+-static void
+-pcibios_fixup_p2p_bridges(void)
+-{
+- struct pci_bus *b;
+-
+- list_for_each_entry(b, &pci_root_buses, node)
+- do_fixup_p2p_level(b);
+-}
+-
+-#endif /* CONFIG_PPC_PMAC */
+-
+-static int __init
+-pcibios_init(void)
++static int __init pcibios_init(void)
+ {
+ struct pci_controller *hose, *tmp;
+ struct pci_bus *bus;
+@@ -1206,6 +380,9 @@
+
+ printk(KERN_INFO "PCI: Probing PCI hardware\n");
+
++ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
++ pci_assign_all_buses = 1;
++
+ /* Scan all of the recorded PCI controllers. */
+ list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
+ if (pci_assign_all_buses)
+@@ -1213,9 +390,10 @@
+ hose->last_busno = 0xff;
+ bus = pci_scan_bus_parented(hose->parent, hose->first_busno,
+ hose->ops, hose);
+- if (bus)
++ if (bus) {
+ pci_bus_add_devices(bus);
+- hose->last_busno = bus->subordinate;
++ hose->last_busno = bus->subordinate;
++ }
+ if (pci_assign_all_buses || next_busno <= hose->last_busno)
+ next_busno = hose->last_busno + pcibios_assign_bus_offset;
+ }
+@@ -1228,18 +406,8 @@
+ if (pci_assign_all_buses && have_of)
+ pcibios_make_OF_bus_map();
+
+- /* Call machine dependent fixup */
+- if (ppc_md.pcibios_fixup)
+- ppc_md.pcibios_fixup();
+-
+- /* Allocate and assign resources */
+- pcibios_allocate_bus_resources(&pci_root_buses);
+- pcibios_allocate_resources(0);
+- pcibios_allocate_resources(1);
+-#ifdef CONFIG_PPC_PMAC
+- pcibios_fixup_p2p_bridges();
+-#endif /* CONFIG_PPC_PMAC */
+- pcibios_assign_resources();
++ /* Call common code to handle resource allocation */
++ pcibios_resource_survey();
+
+ /* Call machine dependent post-init code */
+ if (ppc_md.pcibios_after_init)
+@@ -1250,14 +418,14 @@
+
+ subsys_initcall(pcibios_init);
+
+-void pcibios_fixup_bus(struct pci_bus *bus)
++void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
+ {
+ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
+ unsigned long io_offset;
+ struct resource *res;
+- struct pci_dev *dev;
+ int i;
+
++ /* Hookup PHB resources */
+ io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
+ if (bus->parent == NULL) {
+ /* This is a host bridge - fill in its resources */
+@@ -1272,8 +440,8 @@
+ res->end = IO_SPACE_LIMIT;
+ res->flags = IORESOURCE_IO;
+ }
+- res->start += io_offset;
+- res->end += io_offset;
++ res->start = (res->start + io_offset) & 0xffffffffu;
++ res->end = (res->end + io_offset) & 0xffffffffu;
+
+ for (i = 0; i < 3; ++i) {
+ res = &hose->mem_resources[i];
+@@ -1288,35 +456,6 @@
+ }
+ bus->resource[i+1] = res;
+ }
+- } else {
+- /* This is a subordinate bridge */
+- pci_read_bridge_bases(bus);
+-
+- for (i = 0; i < 4; ++i) {
+- if ((res = bus->resource[i]) == NULL)
+- continue;
+- if (!res->flags || bus->self->transparent)
+- continue;
+- if (io_offset && (res->flags & IORESOURCE_IO)) {
+- res->start += io_offset;
+- res->end += io_offset;
+- } else if (hose->pci_mem_offset
+- && (res->flags & IORESOURCE_MEM)) {
+- res->start += hose->pci_mem_offset;
+- res->end += hose->pci_mem_offset;
+- }
+- }
+- }
+-
+- /* Platform specific bus fixups */
+- if (ppc_md.pcibios_fixup_bus)
+- ppc_md.pcibios_fixup_bus(bus);
+-
+- /* Read default IRQs and fixup if necessary */
+- list_for_each_entry(dev, &bus->devices, bus_list) {
+- pci_read_irq_line(dev);
+- if (ppc_md.pci_irq_fixup)
+- ppc_md.pci_irq_fixup(dev);
+ }
+ }
+
+@@ -1328,37 +467,6 @@
+ /* XXX FIXME - update OF device tree node interrupt property */
+ }
+
+-int pcibios_enable_device(struct pci_dev *dev, int mask)
+-{
+- u16 cmd, old_cmd;
+- int idx;
+- struct resource *r;
+-
+- if (ppc_md.pcibios_enable_device_hook)
+- if (ppc_md.pcibios_enable_device_hook(dev, 0))
+- return -EINVAL;
+-
+- pci_read_config_word(dev, PCI_COMMAND, &cmd);
+- old_cmd = cmd;
+- for (idx=0; idx<6; idx++) {
+- r = &dev->resource[idx];
+- if (r->flags & IORESOURCE_UNSET) {
+- printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
+- return -EINVAL;
+- }
+- if (r->flags & IORESOURCE_IO)
+- cmd |= PCI_COMMAND_IO;
+- if (r->flags & IORESOURCE_MEM)
+- cmd |= PCI_COMMAND_MEMORY;
+- }
+- if (cmd != old_cmd) {
+- printk("PCI: Enabling device %s (%04x -> %04x)\n",
+- pci_name(dev), old_cmd, cmd);
+- pci_write_config_word(dev, PCI_COMMAND, cmd);
+- }
+- return 0;
+-}
+-
+ static struct pci_controller*
+ pci_bus_to_hose(int bus)
+ {
+@@ -1381,17 +489,6 @@
+ struct pci_controller* hose;
+ long result = -EOPNOTSUPP;
+
+- /* Argh ! Please forgive me for that hack, but that's the
+- * simplest way to get existing XFree to not lockup on some
+- * G5 machines... So when something asks for bus 0 io base
+- * (bus 0 is HT root), we return the AGP one instead.
+- */
+-#ifdef CONFIG_PPC_PMAC
+- if (machine_is(powermac) && machine_is_compatible("MacRISC4"))
+- if (bus == 0)
+- bus = 0xf0;
+-#endif /* CONFIG_PPC_PMAC */
+-
+ hose = pci_bus_to_hose(bus);
+ if (!hose)
+ return -ENODEV;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/pci_64.c powerpc.git/arch/powerpc/kernel/pci_64.c
+--- linux-2.6.24/arch/powerpc/kernel/pci_64.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/pci_64.c 2008-01-28 20:25:49.000000000 +0100
+@@ -31,7 +31,6 @@
+ #include <asm/byteorder.h>
+ #include <asm/machdep.h>
+ #include <asm/ppc-pci.h>
+-#include <asm/firmware.h>
+
+ #ifdef DEBUG
+ #include <asm/udbg.h>
+@@ -41,10 +40,6 @@
+ #endif
+
+ unsigned long pci_probe_only = 1;
+-int pci_assign_all_buses = 0;
+-
+-static void fixup_resource(struct resource *res, struct pci_dev *dev);
+-static void do_bus_setup(struct pci_bus *bus);
+
+ /* pci_io_base -- the base address from which io bars are offsets.
+ * This is the lowest I/O base address (so bar values are always positive),
+@@ -70,139 +65,31 @@
+ }
+ EXPORT_SYMBOL(get_pci_dma_ops);
+
+-static void fixup_broken_pcnet32(struct pci_dev* dev)
+-{
+- if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
+- dev->vendor = PCI_VENDOR_ID_AMD;
+- pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
+- }
+-}
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
+-
+-void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
+- struct resource *res)
+-{
+- unsigned long offset = 0;
+- struct pci_controller *hose = pci_bus_to_host(dev->bus);
+-
+- if (!hose)
+- return;
+-
+- if (res->flags & IORESOURCE_IO)
+- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
+-
+- if (res->flags & IORESOURCE_MEM)
+- offset = hose->pci_mem_offset;
+-
+- region->start = res->start - offset;
+- region->end = res->end - offset;
+-}
+
+-void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+- struct pci_bus_region *region)
++int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
+ {
+- unsigned long offset = 0;
+- struct pci_controller *hose = pci_bus_to_host(dev->bus);
+-
+- if (!hose)
+- return;
+-
+- if (res->flags & IORESOURCE_IO)
+- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
+-
+- if (res->flags & IORESOURCE_MEM)
+- offset = hose->pci_mem_offset;
+-
+- res->start = region->start + offset;
+- res->end = region->end + offset;
++ return dma_set_mask(&dev->dev, mask);
+ }
+
+-#ifdef CONFIG_HOTPLUG
+-EXPORT_SYMBOL(pcibios_resource_to_bus);
+-EXPORT_SYMBOL(pcibios_bus_to_resource);
+-#endif
+-
+-/*
+- * We need to avoid collisions with `mirrored' VGA ports
+- * and other strange ISA hardware, so we always want the
+- * addresses to be allocated in the 0x000-0x0ff region
+- * modulo 0x400.
+- *
+- * Why? Because some silly external IO cards only decode
+- * the low 10 bits of the IO address. The 0x00-0xff region
+- * is reserved for motherboard devices that decode all 16
+- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
+- * but we want to try to avoid allocating at 0x2900-0x2bff
+- * which might have be mirrored at 0x0100-0x03ff..
+- */
+-void pcibios_align_resource(void *data, struct resource *res,
+- resource_size_t size, resource_size_t align)
++int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
+ {
+- struct pci_dev *dev = data;
+- struct pci_controller *hose = pci_bus_to_host(dev->bus);
+- resource_size_t start = res->start;
+- unsigned long alignto;
+-
+- if (res->flags & IORESOURCE_IO) {
+- unsigned long offset = (unsigned long)hose->io_base_virt -
+- _IO_BASE;
+- /* Make sure we start at our min on all hoses */
+- if (start - offset < PCIBIOS_MIN_IO)
+- start = PCIBIOS_MIN_IO + offset;
+-
+- /*
+- * Put everything into 0x00-0xff region modulo 0x400
+- */
+- if (start & 0x300)
+- start = (start + 0x3ff) & ~0x3ff;
++ int rc;
+
+- } else if (res->flags & IORESOURCE_MEM) {
+- /* Make sure we start at our min on all hoses */
+- if (start - hose->pci_mem_offset < PCIBIOS_MIN_MEM)
+- start = PCIBIOS_MIN_MEM + hose->pci_mem_offset;
++ rc = dma_set_mask(&dev->dev, mask);
++ dev->dev.coherent_dma_mask = dev->dma_mask;
+
+- /* Align to multiple of size of minimum base. */
+- alignto = max(0x1000UL, align);
+- start = ALIGN(start, alignto);
+- }
+-
+- res->start = start;
++ return rc;
+ }
+
+-void __devinit pcibios_claim_one_bus(struct pci_bus *b)
++static void fixup_broken_pcnet32(struct pci_dev* dev)
+ {
+- struct pci_dev *dev;
+- struct pci_bus *child_bus;
+-
+- list_for_each_entry(dev, &b->devices, bus_list) {
+- int i;
+-
+- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+- struct resource *r = &dev->resource[i];
+-
+- if (r->parent || !r->start || !r->flags)
+- continue;
+- pci_claim_resource(dev, i);
+- }
++ if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
++ dev->vendor = PCI_VENDOR_ID_AMD;
++ pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
+ }
+-
+- list_for_each_entry(child_bus, &b->children, node)
+- pcibios_claim_one_bus(child_bus);
+ }
+-#ifdef CONFIG_HOTPLUG
+-EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
+-#endif
+-
+-static void __init pcibios_claim_of_setup(void)
+-{
+- struct pci_bus *b;
+-
+- if (firmware_has_feature(FW_FEATURE_ISERIES))
+- return;
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
+
+- list_for_each_entry(b, &pci_root_buses, node)
+- pcibios_claim_one_bus(b);
+-}
+
+ static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
+ {
+@@ -270,7 +157,6 @@
+ res->end = base + size - 1;
+ res->flags = flags;
+ res->name = pci_name(dev);
+- fixup_resource(res, dev);
+ }
+ }
+
+@@ -339,16 +225,17 @@
+ EXPORT_SYMBOL(of_create_pci_dev);
+
+ void __devinit of_scan_bus(struct device_node *node,
+- struct pci_bus *bus)
++ struct pci_bus *bus)
+ {
+- struct device_node *child = NULL;
++ struct device_node *child;
+ const u32 *reg;
+ int reglen, devfn;
+ struct pci_dev *dev;
+
+ DBG("of_scan_bus(%s) bus no %d... \n", node->full_name, bus->number);
+
+- while ((child = of_get_next_child(node, child)) != NULL) {
++ /* Scan direct children */
++ for_each_child_of_node(node, child) {
+ DBG(" * %s\n", child->full_name);
+ reg = of_get_property(child, "reg", &reglen);
+ if (reg == NULL || reglen < 20)
+@@ -359,19 +246,26 @@
+ dev = of_create_pci_dev(child, bus, devfn);
+ if (!dev)
+ continue;
+- DBG("dev header type: %x\n", dev->hdr_type);
++ DBG(" dev header type: %x\n", dev->hdr_type);
++ }
+
++ /* Ally all fixups */
++ pcibios_fixup_of_probed_bus(bus);
++
++ /* Now scan child busses */
++ list_for_each_entry(dev, &bus->devices, bus_list) {
+ if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
+- dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
+- of_scan_pci_bridge(child, dev);
++ dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
++ struct device_node *child = pci_device_to_OF_node(dev);
++ if (dev)
++ of_scan_pci_bridge(child, dev);
++ }
+ }
+-
+- do_bus_setup(bus);
+ }
+ EXPORT_SYMBOL(of_scan_bus);
+
+ void __devinit of_scan_pci_bridge(struct device_node *node,
+- struct pci_dev *dev)
++ struct pci_dev *dev)
+ {
+ struct pci_bus *bus;
+ const u32 *busrange, *ranges;
+@@ -441,7 +335,6 @@
+ res->start = of_read_number(&ranges[1], 2);
+ res->end = res->start + size - 1;
+ res->flags = flags;
+- fixup_resource(res, dev);
+ }
+ sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),
+ bus->number);
+@@ -462,12 +355,12 @@
+ void __devinit scan_phb(struct pci_controller *hose)
+ {
+ struct pci_bus *bus;
+- struct device_node *node = hose->arch_data;
++ struct device_node *node = hose->dn;
+ int i, mode;
+- struct resource *res;
+
+- DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
++ DBG("PCI: Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
+
++ /* Create an empty bus for the toplevel */
+ bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
+ if (bus == NULL) {
+ printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
+@@ -477,27 +370,27 @@
+ bus->secondary = hose->first_busno;
+ hose->bus = bus;
+
+- if (!firmware_has_feature(FW_FEATURE_ISERIES))
+- pcibios_map_io_space(bus);
+-
+- bus->resource[0] = res = &hose->io_resource;
+- if (res->flags && request_resource(&ioport_resource, res)) {
+- printk(KERN_ERR "Failed to request PCI IO region "
+- "on PCI domain %04x\n", hose->global_number);
+- DBG("res->start = 0x%016lx, res->end = 0x%016lx\n",
+- res->start, res->end);
+- }
++ /* Get some IO space for the new PHB */
++ pcibios_map_io_space(bus);
+
++ /* Wire up PHB bus resources */
++ DBG("PCI: PHB IO resource = %016lx-%016lx [%lx]\n",
++ hose->io_resource.start, hose->io_resource.end,
++ hose->io_resource.flags);
++ bus->resource[0] = &hose->io_resource;
+ for (i = 0; i < 3; ++i) {
+- res = &hose->mem_resources[i];
+- bus->resource[i+1] = res;
+- if (res->flags && request_resource(&iomem_resource, res))
+- printk(KERN_ERR "Failed to request PCI memory region "
+- "on PCI domain %04x\n", hose->global_number);
+- }
++ DBG("PCI: PHB MEM resource %d = %016lx-%016lx [%lx]\n", i,
++ hose->mem_resources[i].start,
++ hose->mem_resources[i].end,
++ hose->mem_resources[i].flags);
++ bus->resource[i+1] = &hose->mem_resources[i];
++ }
++ DBG("PCI: PHB MEM offset = %016lx\n", hose->pci_mem_offset);
++ DBG("PCI: PHB IO offset = %08lx\n",
++ (unsigned long)hose->io_base_virt - _IO_BASE);
+
++ /* Get probe mode and perform scan */
+ mode = PCI_PROBE_NORMAL;
+-
+ if (node && ppc_md.pci_probe_mode)
+ mode = ppc_md.pci_probe_mode(bus);
+ DBG(" probe mode: %d\n", mode);
+@@ -514,15 +407,15 @@
+ {
+ struct pci_controller *hose, *tmp;
+
++ printk(KERN_INFO "PCI: Probing PCI hardware\n");
++
+ /* For now, override phys_mem_access_prot. If we need it,
+ * later, we may move that initialization to each ppc_md
+ */
+ ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
+
+- if (firmware_has_feature(FW_FEATURE_ISERIES))
+- iSeries_pcibios_init();
+-
+- printk(KERN_DEBUG "PCI: Probing PCI hardware\n");
++ if (pci_probe_only)
++ ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
+
+ /* Scan all of the recorded PCI controllers. */
+ list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
+@@ -530,19 +423,8 @@
+ pci_bus_add_devices(hose->bus);
+ }
+
+- if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
+- if (pci_probe_only)
+- pcibios_claim_of_setup();
+- else
+- /* FIXME: `else' will be removed when
+- pci_assign_unassigned_resources() is able to work
+- correctly with [partially] allocated PCI tree. */
+- pci_assign_unassigned_resources();
+- }
+-
+- /* Call machine dependent final fixup */
+- if (ppc_md.pcibios_fixup)
+- ppc_md.pcibios_fixup();
++ /* Call common code to handle resource allocation */
++ pcibios_resource_survey();
+
+ printk(KERN_DEBUG "PCI: Probing PCI hardware done\n");
+
+@@ -551,141 +433,6 @@
+
+ subsys_initcall(pcibios_init);
+
+-int pcibios_enable_device(struct pci_dev *dev, int mask)
+-{
+- u16 cmd, oldcmd;
+- int i;
+-
+- pci_read_config_word(dev, PCI_COMMAND, &cmd);
+- oldcmd = cmd;
+-
+- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+- struct resource *res = &dev->resource[i];
+-
+- /* Only set up the requested stuff */
+- if (!(mask & (1<<i)))
+- continue;
+-
+- if (res->flags & IORESOURCE_IO)
+- cmd |= PCI_COMMAND_IO;
+- if (res->flags & IORESOURCE_MEM)
+- cmd |= PCI_COMMAND_MEMORY;
+- }
+-
+- if (cmd != oldcmd) {
+- printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",
+- pci_name(dev), cmd);
+- /* Enable the appropriate bits in the PCI command register. */
+- pci_write_config_word(dev, PCI_COMMAND, cmd);
+- }
+- return 0;
+-}
+-
+-/* Decide whether to display the domain number in /proc */
+-int pci_proc_domain(struct pci_bus *bus)
+-{
+- if (firmware_has_feature(FW_FEATURE_ISERIES))
+- return 0;
+- else {
+- struct pci_controller *hose = pci_bus_to_host(bus);
+- return hose->buid != 0;
+- }
+-}
+-
+-void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
+- struct device_node *dev, int prim)
+-{
+- const unsigned int *ranges;
+- unsigned int pci_space;
+- unsigned long size;
+- int rlen = 0;
+- int memno = 0;
+- struct resource *res;
+- int np, na = of_n_addr_cells(dev);
+- unsigned long pci_addr, cpu_phys_addr;
+-
+- np = na + 5;
+-
+- /* From "PCI Binding to 1275"
+- * The ranges property is laid out as an array of elements,
+- * each of which comprises:
+- * cells 0 - 2: a PCI address
+- * cells 3 or 3+4: a CPU physical address
+- * (size depending on dev->n_addr_cells)
+- * cells 4+5 or 5+6: the size of the range
+- */
+- ranges = of_get_property(dev, "ranges", &rlen);
+- if (ranges == NULL)
+- return;
+- hose->io_base_phys = 0;
+- while ((rlen -= np * sizeof(unsigned int)) >= 0) {
+- res = NULL;
+- pci_space = ranges[0];
+- pci_addr = ((unsigned long)ranges[1] << 32) | ranges[2];
+- cpu_phys_addr = of_translate_address(dev, &ranges[3]);
+- size = ((unsigned long)ranges[na+3] << 32) | ranges[na+4];
+- ranges += np;
+- if (size == 0)
+- continue;
+-
+- /* Now consume following elements while they are contiguous */
+- while (rlen >= np * sizeof(unsigned int)) {
+- unsigned long addr, phys;
+-
+- if (ranges[0] != pci_space)
+- break;
+- addr = ((unsigned long)ranges[1] << 32) | ranges[2];
+- phys = ranges[3];
+- if (na >= 2)
+- phys = (phys << 32) | ranges[4];
+- if (addr != pci_addr + size ||
+- phys != cpu_phys_addr + size)
+- break;
+-
+- size += ((unsigned long)ranges[na+3] << 32)
+- | ranges[na+4];
+- ranges += np;
+- rlen -= np * sizeof(unsigned int);
+- }
+-
+- switch ((pci_space >> 24) & 0x3) {
+- case 1: /* I/O space */
+- hose->io_base_phys = cpu_phys_addr - pci_addr;
+- /* handle from 0 to top of I/O window */
+- hose->pci_io_size = pci_addr + size;
+-
+- res = &hose->io_resource;
+- res->flags = IORESOURCE_IO;
+- res->start = pci_addr;
+- DBG("phb%d: IO 0x%lx -> 0x%lx\n", hose->global_number,
+- res->start, res->start + size - 1);
+- break;
+- case 2: /* memory space */
+- memno = 0;
+- while (memno < 3 && hose->mem_resources[memno].flags)
+- ++memno;
+-
+- if (memno == 0)
+- hose->pci_mem_offset = cpu_phys_addr - pci_addr;
+- if (memno < 3) {
+- res = &hose->mem_resources[memno];
+- res->flags = IORESOURCE_MEM;
+- res->start = cpu_phys_addr;
+- DBG("phb%d: MEM 0x%lx -> 0x%lx\n", hose->global_number,
+- res->start, res->start + size - 1);
+- }
+- break;
+- }
+- if (res != NULL) {
+- res->name = dev->full_name;
+- res->end = res->start + size - 1;
+- res->parent = NULL;
+- res->sibling = NULL;
+- res->child = NULL;
+- }
+- }
+-}
+-
+ #ifdef CONFIG_HOTPLUG
+
+ int pcibios_unmap_io_space(struct pci_bus *bus)
+@@ -719,8 +466,7 @@
+ if (hose->io_base_alloc == 0)
+ return 0;
+
+- DBG("IO unmapping for PHB %s\n",
+- ((struct device_node *)hose->arch_data)->full_name);
++ DBG("IO unmapping for PHB %s\n", hose->dn->full_name);
+ DBG(" alloc=0x%p\n", hose->io_base_alloc);
+
+ /* This is a PHB, we fully unmap the IO area */
+@@ -779,8 +525,7 @@
+ hose->io_base_virt = (void __iomem *)(area->addr +
+ hose->io_base_phys - phys_page);
+
+- DBG("IO mapping for PHB %s\n",
+- ((struct device_node *)hose->arch_data)->full_name);
++ DBG("IO mapping for PHB %s\n", hose->dn->full_name);
+ DBG(" phys=0x%016lx, virt=0x%p (alloc=0x%p)\n",
+ hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc);
+ DBG(" size=0x%016lx (alloc=0x%016lx)\n",
+@@ -803,51 +548,13 @@
+ }
+ EXPORT_SYMBOL_GPL(pcibios_map_io_space);
+
+-static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
+-{
+- struct pci_controller *hose = pci_bus_to_host(dev->bus);
+- unsigned long offset;
+-
+- if (res->flags & IORESOURCE_IO) {
+- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
+- res->start += offset;
+- res->end += offset;
+- } else if (res->flags & IORESOURCE_MEM) {
+- res->start += hose->pci_mem_offset;
+- res->end += hose->pci_mem_offset;
+- }
+-}
+-
+-void __devinit pcibios_fixup_device_resources(struct pci_dev *dev,
+- struct pci_bus *bus)
+-{
+- /* Update device resources. */
+- int i;
+-
+- DBG("%s: Fixup resources:\n", pci_name(dev));
+- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+- struct resource *res = &dev->resource[i];
+- if (!res->flags)
+- continue;
+-
+- DBG(" 0x%02x < %08lx:0x%016lx...0x%016lx\n",
+- i, res->flags, res->start, res->end);
+-
+- fixup_resource(res, dev);
+-
+- DBG(" > %08lx:0x%016lx...0x%016lx\n",
+- res->flags, res->start, res->end);
+- }
+-}
+-EXPORT_SYMBOL(pcibios_fixup_device_resources);
+-
+ void __devinit pcibios_setup_new_device(struct pci_dev *dev)
+ {
+ struct dev_archdata *sd = &dev->dev.archdata;
+
+ sd->of_node = pci_device_to_OF_node(dev);
+
+- DBG("PCI device %s OF node: %s\n", pci_name(dev),
++ DBG("PCI: device %s OF node: %s\n", pci_name(dev),
+ sd->of_node ? sd->of_node->full_name : "<none>");
+
+ sd->dma_ops = pci_dma_ops;
+@@ -861,7 +568,7 @@
+ }
+ EXPORT_SYMBOL(pcibios_setup_new_device);
+
+-static void __devinit do_bus_setup(struct pci_bus *bus)
++void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
+ {
+ struct pci_dev *dev;
+
+@@ -870,42 +577,7 @@
+
+ list_for_each_entry(dev, &bus->devices, bus_list)
+ pcibios_setup_new_device(dev);
+-
+- /* Read default IRQs and fixup if necessary */
+- list_for_each_entry(dev, &bus->devices, bus_list) {
+- pci_read_irq_line(dev);
+- if (ppc_md.pci_irq_fixup)
+- ppc_md.pci_irq_fixup(dev);
+- }
+-}
+-
+-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+-{
+- struct pci_dev *dev = bus->self;
+- struct device_node *np;
+-
+- np = pci_bus_to_OF_node(bus);
+-
+- DBG("pcibios_fixup_bus(%s)\n", np ? np->full_name : "<???>");
+-
+- if (dev && pci_probe_only &&
+- (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
+- /* This is a subordinate bridge */
+-
+- pci_read_bridge_bases(bus);
+- pcibios_fixup_device_resources(dev, bus);
+- }
+-
+- do_bus_setup(bus);
+-
+- if (!pci_probe_only)
+- return;
+-
+- list_for_each_entry(dev, &bus->devices, bus_list)
+- if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
+- pcibios_fixup_device_resources(dev, bus);
+ }
+-EXPORT_SYMBOL(pcibios_fixup_bus);
+
+ unsigned long pci_address_to_pio(phys_addr_t address)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/pci_dn.c powerpc.git/arch/powerpc/kernel/pci_dn.c
+--- linux-2.6.24/arch/powerpc/kernel/pci_dn.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/pci_dn.c 2008-01-28 20:25:49.000000000 +0100
+@@ -56,11 +56,6 @@
+ pdn->busno = (regs[0] >> 16) & 0xff;
+ pdn->devfn = (regs[0] >> 8) & 0xff;
+ }
+- if (firmware_has_feature(FW_FEATURE_ISERIES)) {
+- const u32 *busp = of_get_property(dn, "linux,subbus", NULL);
+- if (busp)
+- pdn->bussubno = *busp;
+- }
+
+ pdn->pci_ext_config_space = (type && *type == 1);
+ return NULL;
+@@ -133,7 +128,7 @@
+ */
+ void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
+ {
+- struct device_node * dn = (struct device_node *) phb->arch_data;
++ struct device_node *dn = phb->dn;
+ struct pci_dn *pdn;
+
+ /* PHB nodes themselves must not match */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/ppc_ksyms.c powerpc.git/arch/powerpc/kernel/ppc_ksyms.c
+--- linux-2.6.24/arch/powerpc/kernel/ppc_ksyms.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/ppc_ksyms.c 2008-01-28 20:25:49.000000000 +0100
+@@ -59,6 +59,7 @@
+ extern int sys_sigreturn(struct pt_regs *regs);
+
+ EXPORT_SYMBOL(clear_pages);
++EXPORT_SYMBOL(copy_page);
+ EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
+ EXPORT_SYMBOL(DMA_MODE_READ);
+ EXPORT_SYMBOL(DMA_MODE_WRITE);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/prom.c powerpc.git/arch/powerpc/kernel/prom.c
+--- linux-2.6.24/arch/powerpc/kernel/prom.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/prom.c 2008-01-28 20:25:49.000000000 +0100
+@@ -583,6 +583,20 @@
+ ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
+ }
+
++#ifdef CONFIG_PPC64
++static void __init check_cpu_slb_size(unsigned long node)
++{
++ u32 *slb_size_ptr;
++
++ slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
++ if (slb_size_ptr != NULL) {
++ mmu_slb_size = *slb_size_ptr;
++ }
++}
++#else
++#define check_cpu_slb_size(node) do { } while(0)
++#endif
++
+ static struct feature_property {
+ const char *name;
+ u32 min_value;
+@@ -600,6 +614,29 @@
+ #endif /* CONFIG_PPC64 */
+ };
+
++#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
++static inline void identical_pvr_fixup(unsigned long node)
++{
++ unsigned int pvr;
++ char *model = of_get_flat_dt_prop(node, "model", NULL);
++
++ /*
++ * Since 440GR(x)/440EP(x) processors have the same pvr,
++ * we check the node path and set bit 28 in the cur_cpu_spec
++ * pvr for EP(x) processor version. This bit is always 0 in
++ * the "real" pvr. Then we call identify_cpu again with
++ * the new logical pvr to enable FPU support.
++ */
++ if (model && strstr(model, "440EP")) {
++ pvr = cur_cpu_spec->pvr_value | 0x8;
++ identify_cpu(0, pvr);
++ DBG("Using logical pvr %x for %s\n", pvr, model);
++ }
++}
++#else
++#define identical_pvr_fixup(node) do { } while(0)
++#endif
++
+ static void __init check_cpu_feature_properties(unsigned long node)
+ {
+ unsigned long i;
+@@ -697,22 +734,13 @@
+ prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
+ if (prop && (*prop & 0xff000000) == 0x0f000000)
+ identify_cpu(0, *prop);
+-#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
+- /*
+- * Since 440GR(x)/440EP(x) processors have the same pvr,
+- * we check the node path and set bit 28 in the cur_cpu_spec
+- * pvr for EP(x) processor version. This bit is always 0 in
+- * the "real" pvr. Then we call identify_cpu again with
+- * the new logical pvr to enable FPU support.
+- */
+- if (strstr(uname, "440EP")) {
+- identify_cpu(0, cur_cpu_spec->pvr_value | 0x8);
+- }
+-#endif
++
++ identical_pvr_fixup(node);
+ }
+
+ check_cpu_feature_properties(node);
+ check_cpu_pa_features(node);
++ check_cpu_slb_size(node);
+
+ #ifdef CONFIG_PPC_PSERIES
+ if (nthreads > 1)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/prom_parse.c powerpc.git/arch/powerpc/kernel/prom_parse.c
+--- linux-2.6.24/arch/powerpc/kernel/prom_parse.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/prom_parse.c 2008-01-28 20:25:49.000000000 +0100
+@@ -273,7 +273,7 @@
+ #else
+ struct pci_controller *host;
+ host = pci_bus_to_host(pdev->bus);
+- ppnode = host ? host->arch_data : NULL;
++ ppnode = host ? host->dn : NULL;
+ #endif
+ /* No node for host bridge ? give up */
+ if (ppnode == NULL)
+@@ -419,7 +419,7 @@
+
+ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
+ struct of_bus *pbus, u32 *addr,
+- int na, int ns, int pna)
++ int na, int ns, int pna, const char *rprop)
+ {
+ const u32 *ranges;
+ unsigned int rlen;
+@@ -438,7 +438,7 @@
+ * to translate addresses that aren't supposed to be translated in
+ * the first place. --BenH.
+ */
+- ranges = of_get_property(parent, "ranges", &rlen);
++ ranges = of_get_property(parent, rprop, &rlen);
+ if (ranges == NULL || rlen == 0) {
+ offset = of_read_number(addr, na);
+ memset(addr, 0, pna * 4);
+@@ -481,7 +481,8 @@
+ * that can be mapped to a cpu physical address). This is not really specified
+ * that way, but this is traditionally the way IBM at least do things
+ */
+-u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
++u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,
++ const char *rprop)
+ {
+ struct device_node *parent = NULL;
+ struct of_bus *bus, *pbus;
+@@ -540,7 +541,7 @@
+ pbus->name, pna, pns, parent->full_name);
+
+ /* Apply bus translation */
+- if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
++ if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
+ break;
+
+ /* Complete the move up one level */
+@@ -556,8 +557,19 @@
+
+ return result;
+ }
++
++u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
++{
++ return __of_translate_address(dev, in_addr, "ranges");
++}
+ EXPORT_SYMBOL(of_translate_address);
+
++u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr)
++{
++ return __of_translate_address(dev, in_addr, "dma-ranges");
++}
++EXPORT_SYMBOL(of_translate_dma_address);
++
+ const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
+ unsigned int *flags)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/rio.c powerpc.git/arch/powerpc/kernel/rio.c
+--- linux-2.6.24/arch/powerpc/kernel/rio.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/rio.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,52 @@
++/*
++ * RapidIO PPC32 support
++ *
++ * Copyright 2005 MontaVista Software, Inc.
++ * Matt Porter <mporter@kernel.crashing.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/rio.h>
++
++#include <asm/rio.h>
++
++/**
++ * platform_rio_init - Do platform specific RIO init
++ *
++ * Any platform specific initialization of RapdIO
++ * hardware is done here as well as registration
++ * of any active master ports in the system.
++ */
++void __attribute__ ((weak))
++ platform_rio_init(void)
++{
++ printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
++}
++
++/**
++ * ppc_rio_init - Do PPC32 RIO init
++ *
++ * Calls platform-specific RIO init code and then calls
++ * rio_init_mports() to initialize any master ports that
++ * have been registered with the RIO subsystem.
++ */
++static int __init ppc_rio_init(void)
++{
++ printk(KERN_INFO "RIO: RapidIO init\n");
++
++ /* Platform specific initialization */
++ platform_rio_init();
++
++ /* Enumerate all registered ports */
++ rio_init_mports();
++
++ return 0;
++}
++
++subsys_initcall(ppc_rio_init);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/rtas_pci.c powerpc.git/arch/powerpc/kernel/rtas_pci.c
+--- linux-2.6.24/arch/powerpc/kernel/rtas_pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/rtas_pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -260,7 +260,7 @@
+
+ int __devinit rtas_setup_phb(struct pci_controller *phb)
+ {
+- struct device_node *dev = phb->arch_data;
++ struct device_node *dev = phb->dn;
+
+ if (is_python(dev))
+ python_countermeasures(dev);
+@@ -280,10 +280,7 @@
+ struct pci_controller *phb;
+ struct device_node *root = of_find_node_by_path("/");
+
+- for (node = of_get_next_child(root, NULL);
+- node != NULL;
+- node = of_get_next_child(root, node)) {
+-
++ for_each_child_of_node(root, node) {
+ if (node->type == NULL || (strcmp(node->type, "pci") != 0 &&
+ strcmp(node->type, "pciex") != 0))
+ continue;
+@@ -311,10 +308,12 @@
+ if (prop)
+ pci_probe_only = *prop;
+
++#ifdef CONFIG_PPC32 /* Will be made generic soon */
+ prop = of_get_property(of_chosen,
+ "linux,pci-assign-all-buses", NULL);
+- if (prop)
+- pci_assign_all_buses = *prop;
++ if (prop && *prop)
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
++#endif /* CONFIG_PPC32 */
+ }
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/setup-common.c powerpc.git/arch/powerpc/kernel/setup-common.c
+--- linux-2.6.24/arch/powerpc/kernel/setup-common.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/setup-common.c 2008-01-28 20:25:49.000000000 +0100
+@@ -33,6 +33,7 @@
+ #include <linux/serial.h>
+ #include <linux/serial_8250.h>
+ #include <linux/debugfs.h>
++#include <linux/percpu.h>
+ #include <asm/io.h>
+ #include <asm/prom.h>
+ #include <asm/processor.h>
+@@ -57,6 +58,7 @@
+ #include <asm/mmu.h>
+ #include <asm/lmb.h>
+ #include <asm/xmon.h>
++#include <asm/cputhreads.h>
+
+ #include "setup.h"
+
+@@ -327,6 +329,31 @@
+
+ #ifdef CONFIG_SMP
+
++int threads_per_core, threads_shift;
++cpumask_t threads_core_mask;
++
++static void __init cpu_init_thread_core_maps(int tpc)
++{
++ int i;
++
++ threads_per_core = tpc;
++ threads_core_mask = CPU_MASK_NONE;
++
++ /* This implementation only supports power of 2 number of threads
++ * for simplicity and performance
++ */
++ threads_shift = ilog2(tpc);
++ BUG_ON(tpc != (1 << threads_shift));
++
++ for (i = 0; i < tpc; i++)
++ cpu_set(i, threads_core_mask);
++
++ printk(KERN_INFO "CPU maps initialized for %d thread%s per core\n",
++ tpc, tpc > 1 ? "s" : "");
++ printk(KERN_DEBUG " (thread shift is %d)\n", threads_shift);
++}
++
++
+ /**
+ * setup_cpu_maps - initialize the following cpu maps:
+ * cpu_possible_map
+@@ -350,22 +377,32 @@
+ {
+ struct device_node *dn = NULL;
+ int cpu = 0;
++ int nthreads = 1;
++
++ DBG("smp_setup_cpu_maps()\n");
+
+ while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
+ const int *intserv;
+- int j, len = sizeof(u32), nthreads = 1;
++ int j, len;
++
++ DBG(" * %s...\n", dn->full_name);
+
+ intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s",
+ &len);
+- if (intserv)
++ if (intserv) {
+ nthreads = len / sizeof(int);
+- else {
++ DBG(" ibm,ppc-interrupt-server#s -> %d threads\n",
++ nthreads);
++ } else {
++ DBG(" no ibm,ppc-interrupt-server#s -> 1 thread\n");
+ intserv = of_get_property(dn, "reg", NULL);
+ if (!intserv)
+ intserv = &cpu; /* assume logical == phys */
+ }
+
+ for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
++ DBG(" thread %d -> cpu %d (hard id %d)\n",
++ j, cpu, intserv[j]);
+ cpu_set(cpu, cpu_present_map);
+ set_hard_smp_processor_id(cpu, intserv[j]);
+ cpu_set(cpu, cpu_possible_map);
+@@ -373,6 +410,12 @@
+ }
+ }
+
++ /* If no SMT supported, nthreads is forced to 1 */
++ if (!cpu_has_feature(CPU_FTR_SMT)) {
++ DBG(" SMT disabled ! nthreads forced to 1\n");
++ nthreads = 1;
++ }
++
+ #ifdef CONFIG_PPC64
+ /*
+ * On pSeries LPAR, we need to know how many cpus
+@@ -395,7 +438,7 @@
+
+ /* Double maxcpus for processors which have SMT capability */
+ if (cpu_has_feature(CPU_FTR_SMT))
+- maxcpus *= 2;
++ maxcpus *= nthreads;
+
+ if (maxcpus > NR_CPUS) {
+ printk(KERN_WARNING
+@@ -412,9 +455,16 @@
+ out:
+ of_node_put(dn);
+ }
+-
+ vdso_data->processorCount = num_present_cpus();
+ #endif /* CONFIG_PPC64 */
++
++ /* Initialize CPU <=> thread mapping/
++ *
++ * WARNING: We assume that the number of threads is the same for
++ * every CPU in the system. If that is not the case, then some code
++ * here will have to be reworked
++ */
++ cpu_init_thread_core_maps(nthreads);
+ }
+
+ /*
+@@ -424,17 +474,19 @@
+ */
+ void __init smp_setup_cpu_sibling_map(void)
+ {
+-#if defined(CONFIG_PPC64)
+- int cpu;
++#ifdef CONFIG_PPC64
++ int i, cpu, base;
+
+- /*
+- * Do the sibling map; assume only two threads per processor.
+- */
+ for_each_possible_cpu(cpu) {
+- cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
+- if (cpu_has_feature(CPU_FTR_SMT))
+- cpu_set(cpu ^ 0x1, per_cpu(cpu_sibling_map, cpu));
++ DBG("Sibling map for CPU %d:", cpu);
++ base = cpu_first_thread_in_core(cpu);
++ for (i = 0; i < threads_per_core; i++) {
++ cpu_set(base + i, per_cpu(cpu_sibling_map, cpu));
++ DBG(" %d", base + i);
++ }
++ DBG("\n");
+ }
++
+ #endif /* CONFIG_PPC64 */
+ }
+ #endif /* CONFIG_SMP */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/signal_32.c powerpc.git/arch/powerpc/kernel/signal_32.c
+--- linux-2.6.24/arch/powerpc/kernel/signal_32.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/signal_32.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,13 +24,12 @@
+ #include <linux/signal.h>
+ #include <linux/errno.h>
+ #include <linux/elf.h>
++#include <linux/ptrace.h>
+ #ifdef CONFIG_PPC64
+ #include <linux/syscalls.h>
+ #include <linux/compat.h>
+-#include <linux/ptrace.h>
+ #else
+ #include <linux/wait.h>
+-#include <linux/ptrace.h>
+ #include <linux/unistd.h>
+ #include <linux/stddef.h>
+ #include <linux/tty.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/smp.c powerpc.git/arch/powerpc/kernel/smp.c
+--- linux-2.6.24/arch/powerpc/kernel/smp.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/smp.c 2008-01-28 20:25:49.000000000 +0100
+@@ -76,6 +76,8 @@
+
+ int smt_enabled_at_boot = 1;
+
++static int ipi_fail_ok;
++
+ static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
+
+ #ifdef CONFIG_PPC64
+@@ -181,12 +183,13 @@
+ * <wait> If true, wait (atomically) until function has completed on other CPUs.
+ * [RETURNS] 0 on success, else a negative status code. Does not return until
+ * remote CPUs are nearly ready to execute <<func>> or are or have executed.
++ * <map> is a cpu map of the cpus to send IPI to.
+ *
+ * You must not call this function with disabled interrupts or from a
+ * hardware interrupt handler or from a bottom half handler.
+ */
+-int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
+- int wait, cpumask_t map)
++static int __smp_call_function_map(void (*func) (void *info), void *info,
++ int nonatomic, int wait, cpumask_t map)
+ {
+ struct call_data_struct data;
+ int ret = -1, num_cpus;
+@@ -203,8 +206,6 @@
+ if (wait)
+ atomic_set(&data.finished, 0);
+
+- spin_lock(&call_lock);
+-
+ /* remove 'self' from the map */
+ if (cpu_isset(smp_processor_id(), map))
+ cpu_clear(smp_processor_id(), map);
+@@ -231,7 +232,8 @@
+ printk("smp_call_function on cpu %d: other cpus not "
+ "responding (%d)\n", smp_processor_id(),
+ atomic_read(&data.started));
+- debugger(NULL);
++ if (!ipi_fail_ok)
++ debugger(NULL);
+ goto out;
+ }
+ }
+@@ -258,14 +260,18 @@
+ out:
+ call_data = NULL;
+ HMT_medium();
+- spin_unlock(&call_lock);
+ return ret;
+ }
+
+ static int __smp_call_function(void (*func)(void *info), void *info,
+ int nonatomic, int wait)
+ {
+- return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
++ int ret;
++ spin_lock(&call_lock);
++ ret =__smp_call_function_map(func, info, nonatomic, wait,
++ cpu_online_map);
++ spin_unlock(&call_lock);
++ return ret;
+ }
+
+ int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
+@@ -278,8 +284,8 @@
+ }
+ EXPORT_SYMBOL(smp_call_function);
+
+-int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int nonatomic,
+- int wait)
++int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
++ int nonatomic, int wait)
+ {
+ cpumask_t map = CPU_MASK_NONE;
+ int ret = 0;
+@@ -291,9 +297,11 @@
+ return -EINVAL;
+
+ cpu_set(cpu, map);
+- if (cpu != get_cpu())
+- ret = smp_call_function_map(func,info,nonatomic,wait,map);
+- else {
++ if (cpu != get_cpu()) {
++ spin_lock(&call_lock);
++ ret = __smp_call_function_map(func, info, nonatomic, wait, map);
++ spin_unlock(&call_lock);
++ } else {
+ local_irq_disable();
+ func(info);
+ local_irq_enable();
+@@ -305,7 +313,22 @@
+
+ void smp_send_stop(void)
+ {
+- __smp_call_function(stop_this_cpu, NULL, 1, 0);
++ int nolock;
++
++ /* It's OK to fail sending the IPI, since the alternative is to
++ * be stuck forever waiting on the other CPU to take the interrupt.
++ *
++ * It's better to at least continue and go through reboot, since this
++ * function is usually called at panic or reboot time in the first
++ * place.
++ */
++ ipi_fail_ok = 1;
++
++ /* Don't deadlock in case we got called through panic */
++ nolock = !spin_trylock(&call_lock);
++ __smp_call_function_map(stop_this_cpu, NULL, 1, 0, cpu_online_map);
++ if (!nolock)
++ spin_unlock(&call_lock);
+ }
+
+ void smp_call_function_interrupt(void)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/systbl_chk.c powerpc.git/arch/powerpc/kernel/systbl_chk.c
+--- linux-2.6.24/arch/powerpc/kernel/systbl_chk.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/systbl_chk.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,58 @@
++/*
++ * This file, when run through CPP produces a list of syscall numbers
++ * in the order of systbl.h. That way we can check for gaps and syscalls
++ * that are out of order.
++ *
++ * Unfortunately, we cannot check for the correct ordering of entries
++ * using SYSX().
++ *
++ * Copyright © IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ */
++#include <asm/unistd.h>
++
++#define SYSCALL(func) __NR_##func
++#define COMPAT_SYS(func) __NR_##func
++#define PPC_SYS(func) __NR_##func
++#ifdef CONFIG_PPC64
++#define OLDSYS(func) -1
++#define SYS32ONLY(func) -1
++#else
++#define OLDSYS(func) __NR_old##func
++#define SYS32ONLY(func) __NR_##func
++#endif
++#define SYSX(f, f3264, f32) -1
++
++#define SYSCALL_SPU(func) SYSCALL(func)
++#define COMPAT_SYS_SPU(func) COMPAT_SYS(func)
++#define PPC_SYS_SPU(func) PPC_SYS(func)
++#define SYSX_SPU(f, f3264, f32) SYSX(f, f3264, f32)
++
++/* Just insert a marker for ni_syscalls */
++#define __NR_ni_syscall -1
++
++/*
++ * These are the known exceptions.
++ * Hopefully, there will be no more.
++ */
++#define __NR_llseek __NR__llseek
++#undef __NR_umount
++#define __NR_umount __NR_umount2
++#define __NR_old_getrlimit __NR_getrlimit
++#define __NR_newstat __NR_stat
++#define __NR_newlstat __NR_lstat
++#define __NR_newfstat __NR_fstat
++#define __NR_newuname __NR_uname
++#define __NR_sysctl __NR__sysctl
++#define __NR_olddebug_setcontext __NR_sys_debug_setcontext
++
++/* We call sys_ugetrlimit for syscall number __NR_getrlimit */
++#define getrlimit ugetrlimit
++
++START_TABLE
++#include <asm/systbl.h>
++END_TABLE __NR_syscalls
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/systbl_chk.sh powerpc.git/arch/powerpc/kernel/systbl_chk.sh
+--- linux-2.6.24/arch/powerpc/kernel/systbl_chk.sh 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/systbl_chk.sh 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,33 @@
++#!/bin/sh
++#
++# Just process the CPP output from systbl_chk.c and complain
++# if anything is out of order.
++#
++# Copyright © 2008 IBM Corporation
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License
++# as published by the Free Software Foundation; either version
++# 2 of the License, or (at your option) any later version.
++
++awk 'BEGIN { num = -1; } # Ignore the beginning of the file
++ /^#/ { next; }
++ /^[ \t]*$/ { next; }
++ /^START_TABLE/ { num = 0; next; }
++ /^END_TABLE/ {
++ if (num != $2) {
++ printf "__NR_syscalls (%s) is not one more than the last syscall (%s)\n",
++ $2, num - 1;
++ exit(1);
++ }
++ num = -1; # Ignore the rest of the file
++ }
++ {
++ if (num == -1) next;
++ if (($1 != -1) && ($1 != num)) {
++ printf "Syscall %s out of order (expected %s)\n",
++ $1, num;
++ exit(1);
++ };
++ num++;
++ }' "$1"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/time.c powerpc.git/arch/powerpc/kernel/time.c
+--- linux-2.6.24/arch/powerpc/kernel/time.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/time.c 2008-01-28 20:25:49.000000000 +0100
+@@ -116,9 +116,12 @@
+ .features = CLOCK_EVT_FEAT_ONESHOT,
+ };
+
+-static DEFINE_PER_CPU(struct clock_event_device, decrementers);
+-void init_decrementer_clockevent(void);
+-static DEFINE_PER_CPU(u64, decrementer_next_tb);
++struct decrementer_clock {
++ struct clock_event_device event;
++ u64 next_tb;
++};
++
++static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
+
+ #ifdef CONFIG_PPC_ISERIES
+ static unsigned long __initdata iSeries_recal_titan;
+@@ -216,7 +219,11 @@
+ */
+ static u64 read_spurr(u64 purr)
+ {
+- if (cpu_has_feature(CPU_FTR_SPURR))
++ /*
++ * cpus without PURR won't have a SPURR
++ * We already know the former when we use this, so tell gcc
++ */
++ if (cpu_has_feature(CPU_FTR_PURR) && cpu_has_feature(CPU_FTR_SPURR))
+ return mfspr(SPRN_SPURR);
+ return purr;
+ }
+@@ -227,29 +234,30 @@
+ */
+ void account_system_vtime(struct task_struct *tsk)
+ {
+- u64 now, nowscaled, delta, deltascaled;
++ u64 now, nowscaled, delta, deltascaled, sys_time;
+ unsigned long flags;
+
+ local_irq_save(flags);
+ now = read_purr();
+- delta = now - get_paca()->startpurr;
+- get_paca()->startpurr = now;
+ nowscaled = read_spurr(now);
++ delta = now - get_paca()->startpurr;
+ deltascaled = nowscaled - get_paca()->startspurr;
++ get_paca()->startpurr = now;
+ get_paca()->startspurr = nowscaled;
+ if (!in_interrupt()) {
+ /* deltascaled includes both user and system time.
+ * Hence scale it based on the purr ratio to estimate
+ * the system time */
++ sys_time = get_paca()->system_time;
+ if (get_paca()->user_time)
+- deltascaled = deltascaled * get_paca()->system_time /
+- (get_paca()->system_time + get_paca()->user_time);
+- delta += get_paca()->system_time;
++ deltascaled = deltascaled * sys_time /
++ (sys_time + get_paca()->user_time);
++ delta += sys_time;
+ get_paca()->system_time = 0;
+ }
+ account_system_time(tsk, 0, delta);
+- get_paca()->purrdelta = delta;
+ account_system_time_scaled(tsk, deltascaled);
++ get_paca()->purrdelta = delta;
+ get_paca()->spurrdelta = deltascaled;
+ local_irq_restore(flags);
+ }
+@@ -326,11 +334,9 @@
+ s64 stolen;
+ struct cpu_purr_data *pme;
+
+- if (!cpu_has_feature(CPU_FTR_PURR))
+- return;
+- pme = &per_cpu(cpu_purr_data, smp_processor_id());
++ pme = &__get_cpu_var(cpu_purr_data);
+ if (!pme->initialized)
+- return; /* this can happen in early boot */
++ return; /* !CPU_FTR_PURR or early in early boot */
+ tb = mftb();
+ purr = mfspr(SPRN_PURR);
+ stolen = (tb - pme->tb) - (purr - pme->purr);
+@@ -353,7 +359,7 @@
+ if (!cpu_has_feature(CPU_FTR_PURR))
+ return;
+ local_irq_save(flags);
+- pme = &per_cpu(cpu_purr_data, smp_processor_id());
++ pme = &__get_cpu_var(cpu_purr_data);
+ pme->tb = mftb();
+ pme->purr = mfspr(SPRN_PURR);
+ pme->initialized = 1;
+@@ -556,8 +562,8 @@
+ void timer_interrupt(struct pt_regs * regs)
+ {
+ struct pt_regs *old_regs;
+- int cpu = smp_processor_id();
+- struct clock_event_device *evt = &per_cpu(decrementers, cpu);
++ struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
++ struct clock_event_device *evt = &decrementer->event;
+ u64 now;
+
+ /* Ensure a positive value is written to the decrementer, or else
+@@ -570,9 +576,9 @@
+ #endif
+
+ now = get_tb_or_rtc();
+- if (now < per_cpu(decrementer_next_tb, cpu)) {
++ if (now < decrementer->next_tb) {
+ /* not time for this event yet */
+- now = per_cpu(decrementer_next_tb, cpu) - now;
++ now = decrementer->next_tb - now;
+ if (now <= DECREMENTER_MAX)
+ set_dec((int)now);
+ return;
+@@ -623,6 +629,45 @@
+ set_dec(ticks);
+ }
+
++#ifdef CONFIG_SUSPEND
++void generic_suspend_disable_irqs(void)
++{
++ preempt_disable();
++
++ /* Disable the decrementer, so that it doesn't interfere
++ * with suspending.
++ */
++
++ set_dec(0x7fffffff);
++ local_irq_disable();
++ set_dec(0x7fffffff);
++}
++
++void generic_suspend_enable_irqs(void)
++{
++ wakeup_decrementer();
++
++ local_irq_enable();
++ preempt_enable();
++}
++
++/* Overrides the weak version in kernel/power/main.c */
++void arch_suspend_disable_irqs(void)
++{
++ if (ppc_md.suspend_disable_irqs)
++ ppc_md.suspend_disable_irqs();
++ generic_suspend_disable_irqs();
++}
++
++/* Overrides the weak version in kernel/power/main.c */
++void arch_suspend_enable_irqs(void)
++{
++ generic_suspend_enable_irqs();
++ if (ppc_md.suspend_enable_irqs)
++ ppc_md.suspend_enable_irqs();
++}
++#endif
++
+ #ifdef CONFIG_SMP
+ void __init smp_space_timers(unsigned int max_cpus)
+ {
+@@ -811,7 +856,7 @@
+ static int decrementer_set_next_event(unsigned long evt,
+ struct clock_event_device *dev)
+ {
+- __get_cpu_var(decrementer_next_tb) = get_tb_or_rtc() + evt;
++ __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
+ set_dec(evt);
+ return 0;
+ }
+@@ -825,7 +870,7 @@
+
+ static void register_decrementer_clockevent(int cpu)
+ {
+- struct clock_event_device *dec = &per_cpu(decrementers, cpu);
++ struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
+
+ *dec = decrementer_clockevent;
+ dec->cpumask = cpumask_of_cpu(cpu);
+@@ -836,7 +881,7 @@
+ clockevents_register_device(dec);
+ }
+
+-void init_decrementer_clockevent(void)
++static void __init init_decrementer_clockevent(void)
+ {
+ int cpu = smp_processor_id();
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/traps.c powerpc.git/arch/powerpc/kernel/traps.c
+--- linux-2.6.24/arch/powerpc/kernel/traps.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/traps.c 2008-01-28 20:25:49.000000000 +0100
+@@ -334,18 +334,25 @@
+ #define clear_single_step(regs) ((regs)->msr &= ~MSR_SE)
+ #endif
+
+-static int generic_machine_check_exception(struct pt_regs *regs)
++#if defined(CONFIG_4xx)
++int machine_check_4xx(struct pt_regs *regs)
+ {
+ unsigned long reason = get_mc_reason(regs);
+
+-#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
+ if (reason & ESR_IMCP) {
+ printk("Instruction");
+ mtspr(SPRN_ESR, reason & ~ESR_IMCP);
+ } else
+ printk("Data");
+ printk(" machine check in kernel mode.\n");
+-#elif defined(CONFIG_440A)
++
++ return 0;
++}
++
++int machine_check_440A(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ if (reason & ESR_IMCP){
+ printk("Instruction Synchronous Machine Check exception\n");
+@@ -375,7 +382,13 @@
+ /* Clear MCSR */
+ mtspr(SPRN_MCSR, mcsr);
+ }
+-#elif defined (CONFIG_E500)
++ return 0;
++}
++#elif defined(CONFIG_E500)
++int machine_check_e500(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from MCSR=%lx): ", reason);
+
+@@ -403,7 +416,14 @@
+ printk("Bus - Instruction Parity Error\n");
+ if (reason & MCSR_BUS_RPERR)
+ printk("Bus - Read Parity Error\n");
+-#elif defined (CONFIG_E200)
++
++ return 0;
++}
++#elif defined(CONFIG_E200)
++int machine_check_e200(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from MCSR=%lx): ", reason);
+
+@@ -421,7 +441,14 @@
+ printk("Bus - Read Bus Error on data load\n");
+ if (reason & MCSR_BUS_WRERR)
+ printk("Bus - Write Bus Error on buffered store or cache line push\n");
+-#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
++
++ return 0;
++}
++#else
++int machine_check_generic(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from SRR1=%lx): ", reason);
+ switch (reason & 0x601F0000) {
+@@ -451,22 +478,26 @@
+ default:
+ printk("Unknown values in msr\n");
+ }
+-#endif /* CONFIG_4xx */
+-
+ return 0;
+ }
++#endif /* everything else */
+
+ void machine_check_exception(struct pt_regs *regs)
+ {
+ int recover = 0;
+
+- /* See if any machine dependent calls */
++ /* See if any machine dependent calls. In theory, we would want
++ * to call the CPU first, and call the ppc_md. one if the CPU
++ * one returns a positive number. However there is existing code
++ * that assumes the board gets a first chance, so let's keep it
++ * that way for now and fix things later. --BenH.
++ */
+ if (ppc_md.machine_check_exception)
+ recover = ppc_md.machine_check_exception(regs);
+- else
+- recover = generic_machine_check_exception(regs);
++ else if (cur_cpu_spec->machine_check)
++ recover = cur_cpu_spec->machine_check(regs);
+
+- if (recover)
++ if (recover > 0)
+ return;
+
+ if (user_mode(regs)) {
+@@ -476,7 +507,12 @@
+ }
+
+ #if defined(CONFIG_8xx) && defined(CONFIG_PCI)
+- /* the qspan pci read routines can cause machine checks -- Cort */
++ /* the qspan pci read routines can cause machine checks -- Cort
++ *
++ * yuck !!! that totally needs to go away ! There are better ways
++ * to deal with that than having a wart in the mcheck handler.
++ * -- BenH
++ */
+ bad_page_fault(regs, regs->dar, SIGBUS);
+ return;
+ #endif
+@@ -622,6 +658,9 @@
+ #define INST_POPCNTB 0x7c0000f4
+ #define INST_POPCNTB_MASK 0xfc0007fe
+
++#define INST_ISEL 0x7c00001e
++#define INST_ISEL_MASK 0xfc00003e
++
+ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
+ {
+ u8 rT = (instword >> 21) & 0x1f;
+@@ -707,6 +746,23 @@
+ return 0;
+ }
+
++static int emulate_isel(struct pt_regs *regs, u32 instword)
++{
++ u8 rT = (instword >> 21) & 0x1f;
++ u8 rA = (instword >> 16) & 0x1f;
++ u8 rB = (instword >> 11) & 0x1f;
++ u8 BC = (instword >> 6) & 0x1f;
++ u8 bit;
++ unsigned long tmp;
++
++ tmp = (rA == 0) ? 0 : regs->gpr[rA];
++ bit = (regs->ccr >> (31 - BC)) & 0x1;
++
++ regs->gpr[rT] = bit ? tmp : regs->gpr[rB];
++
++ return 0;
++}
++
+ static int emulate_instruction(struct pt_regs *regs)
+ {
+ u32 instword;
+@@ -749,6 +805,11 @@
+ return emulate_popcntb_inst(regs, instword);
+ }
+
++ /* Emulate isel (Integer Select) instruction */
++ if ((instword & INST_ISEL_MASK) == INST_ISEL) {
++ return emulate_isel(regs, instword);
++ }
++
+ return -EINVAL;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/udbg.c powerpc.git/arch/powerpc/kernel/udbg.c
+--- linux-2.6.24/arch/powerpc/kernel/udbg.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/udbg.c 2008-01-28 20:25:49.000000000 +0100
+@@ -54,9 +54,16 @@
+ #elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
+ /* PPC44x debug */
+ udbg_init_44x_as1();
++#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
++ /* PPC40x debug */
++ udbg_init_40x_realmode();
+ #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
+ udbg_init_cpm();
+ #endif
++
++#ifdef CONFIG_PPC_EARLY_DEBUG
++ console_loglevel = 10;
++#endif
+ }
+
+ /* udbg library, used by xmon et al */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/kernel/udbg_16550.c powerpc.git/arch/powerpc/kernel/udbg_16550.c
+--- linux-2.6.24/arch/powerpc/kernel/udbg_16550.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/kernel/udbg_16550.c 2008-01-28 20:25:49.000000000 +0100
+@@ -46,7 +46,7 @@
+
+ #define LCR_DLAB 0x80
+
+-static volatile struct NS16550 __iomem *udbg_comport;
++static struct NS16550 __iomem *udbg_comport;
+
+ static void udbg_550_putc(char c)
+ {
+@@ -117,7 +117,7 @@
+ {
+ unsigned int dll, dlm, divisor, prescaler, speed;
+ u8 old_lcr;
+- volatile struct NS16550 __iomem *port = comport;
++ struct NS16550 __iomem *port = comport;
+
+ old_lcr = in_8(&port->lcr);
+
+@@ -162,7 +162,7 @@
+
+ void __init udbg_init_maple_realmode(void)
+ {
+- udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
++ udbg_comport = (struct NS16550 __iomem *)0xf40003f8;
+
+ udbg_putc = udbg_maple_real_putc;
+ udbg_getc = NULL;
+@@ -184,7 +184,7 @@
+
+ void udbg_init_pas_realmode(void)
+ {
+- udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8UL;
++ udbg_comport = (struct NS16550 __iomem *)0xfcff03f8UL;
+
+ udbg_putc = udbg_pas_real_putc;
+ udbg_getc = NULL;
+@@ -219,9 +219,42 @@
+ void __init udbg_init_44x_as1(void)
+ {
+ udbg_comport =
+- (volatile struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
++ (struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
+
+ udbg_putc = udbg_44x_as1_putc;
+ udbg_getc = udbg_44x_as1_getc;
+ }
+ #endif /* CONFIG_PPC_EARLY_DEBUG_44x */
++
++#ifdef CONFIG_PPC_EARLY_DEBUG_40x
++static void udbg_40x_real_putc(char c)
++{
++ if (udbg_comport) {
++ while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
++ /* wait for idle */;
++ real_writeb(c, &udbg_comport->thr); eieio();
++ if (c == '\n')
++ udbg_40x_real_putc('\r');
++ }
++}
++
++static int udbg_40x_real_getc(void)
++{
++ if (udbg_comport) {
++ while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0)
++ ; /* wait for char */
++ return real_readb(&udbg_comport->rbr);
++ }
++ return -1;
++}
++
++void __init udbg_init_40x_realmode(void)
++{
++ udbg_comport = (struct NS16550 __iomem *)
++ CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR;
++
++ udbg_putc = udbg_40x_real_putc;
++ udbg_getc = udbg_40x_real_getc;
++ udbg_getc_poll = NULL;
++}
++#endif /* CONFIG_PPC_EARLY_DEBUG_40x */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/math-emu/op-4.h powerpc.git/arch/powerpc/math-emu/op-4.h
+--- linux-2.6.24/arch/powerpc/math-emu/op-4.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/math-emu/op-4.h 2008-01-28 20:25:49.000000000 +0100
+@@ -194,19 +194,39 @@
+ (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
+
+ #ifndef __FP_FRAC_ADD_4
+-#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
+- (r0 = x0 + y0, \
+- r1 = x1 + y1 + (r0 < x0), \
+- r2 = x2 + y2 + (r1 < x1), \
+- r3 = x3 + y3 + (r2 < x2))
++#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
++ do { \
++ int _c1, _c2, _c3; \
++ r0 = x0 + y0; \
++ _c1 = r0 < x0; \
++ r1 = x1 + y1; \
++ _c2 = r1 < x1; \
++ r1 += _c1; \
++ _c2 |= r1 < _c1; \
++ r2 = x2 + y2; \
++ _c3 = r2 < x2; \
++ r2 += _c2; \
++ _c3 |= r2 < _c2; \
++ r3 = x3 + y3 + _c3; \
++ } while (0)
+ #endif
+
+ #ifndef __FP_FRAC_SUB_4
+-#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
+- (r0 = x0 - y0, \
+- r1 = x1 - y1 - (r0 > x0), \
+- r2 = x2 - y2 - (r1 > x1), \
+- r3 = x3 - y3 - (r2 > x2))
++#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
++ do { \
++ int _c1, _c2, _c3; \
++ r0 = x0 - y0; \
++ _c1 = r0 > x0; \
++ r1 = x1 - y1; \
++ _c2 = r1 > x1; \
++ r1 -= _c1; \
++ _c2 |= r1 > _c1; \
++ r2 = x2 - y2; \
++ _c3 = r2 > x2; \
++ r2 -= _c2; \
++ _c3 |= r2 > _c2; \
++ r3 = x3 - y3 - _c3; \
++ } while (0)
+ #endif
+
+ #ifndef __FP_FRAC_ADDI_4
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/fault.c powerpc.git/arch/powerpc/mm/fault.c
+--- linux-2.6.24/arch/powerpc/mm/fault.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/fault.c 2008-01-28 20:25:49.000000000 +0100
+@@ -167,10 +167,8 @@
+ if (notify_page_fault(regs))
+ return 0;
+
+- if (trap == 0x300) {
+- if (debugger_fault_handler(regs))
+- return 0;
+- }
++ if (unlikely(debugger_fault_handler(regs)))
++ return 0;
+
+ /* On a kernel SLB miss we can only check for a valid exception entry */
+ if (!user_mode(regs) && (address >= TASK_SIZE))
+@@ -189,7 +187,7 @@
+ return SIGSEGV;
+ /* in_atomic() in user mode is really bad,
+ as is current->mm == NULL. */
+- printk(KERN_EMERG "Page fault in user mode with"
++ printk(KERN_EMERG "Page fault in user mode with "
+ "in_atomic() = %d mm = %p\n", in_atomic(), mm);
+ printk(KERN_EMERG "NIP = %lx MSR = %lx\n",
+ regs->nip, regs->msr);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/fsl_booke_mmu.c powerpc.git/arch/powerpc/mm/fsl_booke_mmu.c
+--- linux-2.6.24/arch/powerpc/mm/fsl_booke_mmu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/fsl_booke_mmu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -165,15 +165,15 @@
+ void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
+ unsigned long cam2)
+ {
+- settlbcam(0, KERNELBASE, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
++ settlbcam(0, PAGE_OFFSET, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
+ tlbcam_index++;
+ if (cam1) {
+ tlbcam_index++;
+- settlbcam(1, KERNELBASE+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
++ settlbcam(1, PAGE_OFFSET+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
+ }
+ if (cam2) {
+ tlbcam_index++;
+- settlbcam(2, KERNELBASE+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
++ settlbcam(2, PAGE_OFFSET+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
+ }
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/hash_utils_64.c powerpc.git/arch/powerpc/mm/hash_utils_64.c
+--- linux-2.6.24/arch/powerpc/mm/hash_utils_64.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/hash_utils_64.c 2008-01-28 21:37:04.000000000 +0100
+@@ -96,6 +96,7 @@
+ int mmu_io_psize = MMU_PAGE_4K;
+ int mmu_kernel_ssize = MMU_SEGSIZE_256M;
+ int mmu_highuser_ssize = MMU_SEGSIZE_256M;
++u16 mmu_slb_size = 64;
+ #ifdef CONFIG_HUGETLB_PAGE
+ int mmu_huge_psize = MMU_PAGE_16M;
+ unsigned int HPAGE_SHIFT;
+@@ -368,18 +369,11 @@
+ * on what is available
+ */
+ if (mmu_psize_defs[MMU_PAGE_16M].shift)
+- mmu_huge_psize = MMU_PAGE_16M;
++ set_huge_psize(MMU_PAGE_16M);
+ /* With 4k/4level pagetables, we can't (for now) cope with a
+ * huge page size < PMD_SIZE */
+ else if (mmu_psize_defs[MMU_PAGE_1M].shift)
+- mmu_huge_psize = MMU_PAGE_1M;
+-
+- /* Calculate HPAGE_SHIFT and sanity check it */
+- if (mmu_psize_defs[mmu_huge_psize].shift > MIN_HUGEPTE_SHIFT &&
+- mmu_psize_defs[mmu_huge_psize].shift < SID_SHIFT)
+- HPAGE_SHIFT = mmu_psize_defs[mmu_huge_psize].shift;
+- else
+- HPAGE_SHIFT = 0; /* No huge pages dude ! */
++ set_huge_psize(MMU_PAGE_1M);
+ #endif /* CONFIG_HUGETLB_PAGE */
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/hugetlbpage.c powerpc.git/arch/powerpc/mm/hugetlbpage.c
+--- linux-2.6.24/arch/powerpc/mm/hugetlbpage.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/hugetlbpage.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,18 +24,17 @@
+ #include <asm/cputable.h>
+ #include <asm/spu.h>
+
++#define HPAGE_SHIFT_64K 16
++#define HPAGE_SHIFT_16M 24
++
+ #define NUM_LOW_AREAS (0x100000000UL >> SID_SHIFT)
+ #define NUM_HIGH_AREAS (PGTABLE_RANGE >> HTLB_AREA_SHIFT)
+
+-#ifdef CONFIG_PPC_64K_PAGES
+-#define HUGEPTE_INDEX_SIZE (PMD_SHIFT-HPAGE_SHIFT)
+-#else
+-#define HUGEPTE_INDEX_SIZE (PUD_SHIFT-HPAGE_SHIFT)
+-#endif
+-#define PTRS_PER_HUGEPTE (1 << HUGEPTE_INDEX_SIZE)
+-#define HUGEPTE_TABLE_SIZE (sizeof(pte_t) << HUGEPTE_INDEX_SIZE)
++unsigned int hugepte_shift;
++#define PTRS_PER_HUGEPTE (1 << hugepte_shift)
++#define HUGEPTE_TABLE_SIZE (sizeof(pte_t) << hugepte_shift)
+
+-#define HUGEPD_SHIFT (HPAGE_SHIFT + HUGEPTE_INDEX_SIZE)
++#define HUGEPD_SHIFT (HPAGE_SHIFT + hugepte_shift)
+ #define HUGEPD_SIZE (1UL << HUGEPD_SHIFT)
+ #define HUGEPD_MASK (~(HUGEPD_SIZE-1))
+
+@@ -82,11 +81,35 @@
+ return 0;
+ }
+
++/* Base page size affects how we walk hugetlb page tables */
++#ifdef CONFIG_PPC_64K_PAGES
++#define hpmd_offset(pud, addr) pmd_offset(pud, addr)
++#define hpmd_alloc(mm, pud, addr) pmd_alloc(mm, pud, addr)
++#else
++static inline
++pmd_t *hpmd_offset(pud_t *pud, unsigned long addr)
++{
++ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
++ return pmd_offset(pud, addr);
++ else
++ return (pmd_t *) pud;
++}
++static inline
++pmd_t *hpmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long addr)
++{
++ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
++ return pmd_alloc(mm, pud, addr);
++ else
++ return (pmd_t *) pud;
++}
++#endif
++
+ /* Modelled after find_linux_pte() */
+ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+ {
+ pgd_t *pg;
+ pud_t *pu;
++ pmd_t *pm;
+
+ BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
+
+@@ -96,14 +119,9 @@
+ if (!pgd_none(*pg)) {
+ pu = pud_offset(pg, addr);
+ if (!pud_none(*pu)) {
+-#ifdef CONFIG_PPC_64K_PAGES
+- pmd_t *pm;
+- pm = pmd_offset(pu, addr);
++ pm = hpmd_offset(pu, addr);
+ if (!pmd_none(*pm))
+ return hugepte_offset((hugepd_t *)pm, addr);
+-#else
+- return hugepte_offset((hugepd_t *)pu, addr);
+-#endif
+ }
+ }
+
+@@ -114,6 +132,7 @@
+ {
+ pgd_t *pg;
+ pud_t *pu;
++ pmd_t *pm;
+ hugepd_t *hpdp = NULL;
+
+ BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
+@@ -124,14 +143,9 @@
+ pu = pud_alloc(mm, pg, addr);
+
+ if (pu) {
+-#ifdef CONFIG_PPC_64K_PAGES
+- pmd_t *pm;
+- pm = pmd_alloc(mm, pu, addr);
++ pm = hpmd_alloc(mm, pu, addr);
+ if (pm)
+ hpdp = (hugepd_t *)pm;
+-#else
+- hpdp = (hugepd_t *)pu;
+-#endif
+ }
+
+ if (! hpdp)
+@@ -158,7 +172,6 @@
+ PGF_CACHENUM_MASK));
+ }
+
+-#ifdef CONFIG_PPC_64K_PAGES
+ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
+ unsigned long addr, unsigned long end,
+ unsigned long floor, unsigned long ceiling)
+@@ -191,7 +204,6 @@
+ pud_clear(pud);
+ pmd_free_tlb(tlb, pmd);
+ }
+-#endif
+
+ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
+ unsigned long addr, unsigned long end,
+@@ -210,9 +222,15 @@
+ continue;
+ hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
+ #else
+- if (pud_none(*pud))
+- continue;
+- free_hugepte_range(tlb, (hugepd_t *)pud);
++ if (HPAGE_SHIFT == HPAGE_SHIFT_64K) {
++ if (pud_none_or_clear_bad(pud))
++ continue;
++ hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
++ } else {
++ if (pud_none(*pud))
++ continue;
++ free_hugepte_range(tlb, (hugepd_t *)pud);
++ }
+ #endif
+ } while (pud++, addr = next, addr != end);
+
+@@ -526,6 +544,57 @@
+ return err;
+ }
+
++void set_huge_psize(int psize)
++{
++ /* Check that it is a page size supported by the hardware and
++ * that it fits within pagetable limits. */
++ if (mmu_psize_defs[psize].shift && mmu_psize_defs[psize].shift < SID_SHIFT &&
++ (mmu_psize_defs[psize].shift > MIN_HUGEPTE_SHIFT ||
++ mmu_psize_defs[psize].shift == HPAGE_SHIFT_64K)) {
++ HPAGE_SHIFT = mmu_psize_defs[psize].shift;
++ mmu_huge_psize = psize;
++#ifdef CONFIG_PPC_64K_PAGES
++ hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
++#else
++ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
++ hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
++ else
++ hugepte_shift = (PUD_SHIFT-HPAGE_SHIFT);
++#endif
++
++ } else
++ HPAGE_SHIFT = 0;
++}
++
++static int __init hugepage_setup_sz(char *str)
++{
++ unsigned long long size;
++ int mmu_psize = -1;
++ int shift;
++
++ size = memparse(str, &str);
++
++ shift = __ffs(size);
++ switch (shift) {
++#ifndef CONFIG_PPC_64K_PAGES
++ case HPAGE_SHIFT_64K:
++ mmu_psize = MMU_PAGE_64K;
++ break;
++#endif
++ case HPAGE_SHIFT_16M:
++ mmu_psize = MMU_PAGE_16M;
++ break;
++ }
++
++ if (mmu_psize >=0 && mmu_psize_defs[mmu_psize].shift)
++ set_huge_psize(mmu_psize);
++ else
++ printk(KERN_WARNING "Invalid huge page size specified(%llu)\n", size);
++
++ return 1;
++}
++__setup("hugepagesz=", hugepage_setup_sz);
++
+ static void zero_ctor(struct kmem_cache *cache, void *addr)
+ {
+ memset(addr, 0, kmem_cache_size(cache));
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/lmb.c powerpc.git/arch/powerpc/mm/lmb.c
+--- linux-2.6.24/arch/powerpc/mm/lmb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/lmb.c 2008-01-28 20:25:49.000000000 +0100
+@@ -342,3 +342,16 @@
+ }
+ }
+ }
++
++int __init lmb_is_reserved(unsigned long addr)
++{
++ int i;
++
++ for (i = 0; i < lmb.reserved.cnt; i++) {
++ unsigned long upper = lmb.reserved.region[i].base +
++ lmb.reserved.region[i].size - 1;
++ if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
++ return 1;
++ }
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/mem.c powerpc.git/arch/powerpc/mm/mem.c
+--- linux-2.6.24/arch/powerpc/mm/mem.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/mem.c 2008-01-28 20:25:49.000000000 +0100
+@@ -213,15 +213,30 @@
+ */
+ #ifdef CONFIG_HIGHMEM
+ free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
++
++ /* reserve the sections we're already using */
++ for (i = 0; i < lmb.reserved.cnt; i++) {
++ unsigned long addr = lmb.reserved.region[i].base +
++ lmb_size_bytes(&lmb.reserved, i) - 1;
++ if (addr < total_lowmem)
++ reserve_bootmem(lmb.reserved.region[i].base,
++ lmb_size_bytes(&lmb.reserved, i));
++ else if (lmb.reserved.region[i].base < total_lowmem) {
++ unsigned long adjusted_size = total_lowmem -
++ lmb.reserved.region[i].base;
++ reserve_bootmem(lmb.reserved.region[i].base,
++ adjusted_size);
++ }
++ }
+ #else
+ free_bootmem_with_active_regions(0, max_pfn);
+-#endif
+
+ /* reserve the sections we're already using */
+ for (i = 0; i < lmb.reserved.cnt; i++)
+ reserve_bootmem(lmb.reserved.region[i].base,
+ lmb_size_bytes(&lmb.reserved, i));
+
++#endif
+ /* XXX need to clip this if using highmem? */
+ sparse_memory_present_with_active_regions(0);
+
+@@ -334,11 +349,13 @@
+ highmem_mapnr = total_lowmem >> PAGE_SHIFT;
+ for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
+ struct page *page = pfn_to_page(pfn);
+-
++ if (lmb_is_reserved(pfn << PAGE_SHIFT))
++ continue;
+ ClearPageReserved(page);
+ init_page_count(page);
+ __free_page(page);
+ totalhigh_pages++;
++ reservedpages--;
+ }
+ totalram_pages += totalhigh_pages;
+ printk(KERN_DEBUG "High memory: %luk\n",
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/slb.c powerpc.git/arch/powerpc/mm/slb.c
+--- linux-2.6.24/arch/powerpc/mm/slb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/slb.c 2008-01-28 20:25:49.000000000 +0100
+@@ -256,6 +256,7 @@
+ static int slb_encoding_inited;
+ extern unsigned int *slb_miss_kernel_load_linear;
+ extern unsigned int *slb_miss_kernel_load_io;
++ extern unsigned int *slb_compare_rr_to_size;
+
+ /* Prepare our SLB miss handler based on our page size */
+ linear_llp = mmu_psize_defs[mmu_linear_psize].sllp;
+@@ -269,6 +270,8 @@
+ SLB_VSID_KERNEL | linear_llp);
+ patch_slb_encoding(slb_miss_kernel_load_io,
+ SLB_VSID_KERNEL | io_llp);
++ patch_slb_encoding(slb_compare_rr_to_size,
++ mmu_slb_size);
+
+ DBG("SLB: linear LLP = %04x\n", linear_llp);
+ DBG("SLB: io LLP = %04x\n", io_llp);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/mm/slb_low.S powerpc.git/arch/powerpc/mm/slb_low.S
+--- linux-2.6.24/arch/powerpc/mm/slb_low.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/mm/slb_low.S 2008-01-28 20:25:49.000000000 +0100
+@@ -227,8 +227,9 @@
+
+ 7: ld r10,PACASTABRR(r13)
+ addi r10,r10,1
+- /* use a cpu feature mask if we ever change our slb size */
+- cmpldi r10,SLB_NUM_ENTRIES
++ /* This gets soft patched on boot. */
++_GLOBAL(slb_compare_rr_to_size)
++ cmpldi r10,0
+
+ blt+ 4f
+ li r10,SLB_NUM_BOLTED
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/oprofile/op_model_cell.c powerpc.git/arch/powerpc/oprofile/op_model_cell.c
+--- linux-2.6.24/arch/powerpc/oprofile/op_model_cell.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/oprofile/op_model_cell.c 2008-01-28 20:25:49.000000000 +0100
+@@ -61,7 +61,7 @@
+ #define NUM_THREADS 2 /* number of physical threads in
+ * physical processor
+ */
+-#define NUM_TRACE_BUS_WORDS 4
++#define NUM_DEBUG_BUS_WORDS 4
+ #define NUM_INPUT_BUS_WORDS 2
+
+ #define MAX_SPU_COUNT 0xFFFFFF /* maximum 24 bit LFSR value */
+@@ -169,7 +169,6 @@
+
+ static u32 ctr_enabled;
+
+-static unsigned char trace_bus[NUM_TRACE_BUS_WORDS];
+ static unsigned char input_bus[NUM_INPUT_BUS_WORDS];
+
+ /*
+@@ -298,7 +297,7 @@
+
+ p->signal_group = event / 100;
+ p->bus_word = bus_word;
+- p->sub_unit = (unit_mask & 0x0000f000) >> 12;
++ p->sub_unit = GET_SUB_UNIT(unit_mask);
+
+ pm_regs.pm07_cntrl[ctr] = 0;
+ pm_regs.pm07_cntrl[ctr] |= PM07_CTR_COUNT_CYCLES(count_cycles);
+@@ -334,16 +333,16 @@
+ p->bit = signal_bit;
+ }
+
+- for (i = 0; i < NUM_TRACE_BUS_WORDS; i++) {
++ for (i = 0; i < NUM_DEBUG_BUS_WORDS; i++) {
+ if (bus_word & (1 << i)) {
+ pm_regs.debug_bus_control |=
+- (bus_type << (31 - (2 * i) + 1));
++ (bus_type << (30 - (2 * i)));
+
+ for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) {
+ if (input_bus[j] == 0xff) {
+ input_bus[j] = i;
+ pm_regs.group_control |=
+- (i << (31 - i));
++ (i << (30 - (2 * j)));
+
+ break;
+ }
+@@ -450,6 +449,12 @@
+ hdw_thread = 1 ^ hdw_thread;
+ next_hdw_thread = hdw_thread;
+
++ pm_regs.group_control = 0;
++ pm_regs.debug_bus_control = 0;
++
++ for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
++ input_bus[i] = 0xff;
++
+ /*
+ * There are some per thread events. Must do the
+ * set event, for the thread that is being started
+@@ -619,9 +624,6 @@
+ pmc_cntrl[1][i].vcntr = i;
+ }
+
+- for (i = 0; i < NUM_TRACE_BUS_WORDS; i++)
+- trace_bus[i] = 0xff;
+-
+ for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
+ input_bus[i] = 0xff;
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/Kconfig powerpc.git/arch/powerpc/platforms/40x/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/40x/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -14,28 +14,34 @@
+ # help
+ # This option enables support for the CPCI405 board.
+
+-#config EP405
+-# bool "EP405/EP405PC"
+-# depends on 40x
+-# default n
+-# select 405GP
+-# help
+-# This option enables support for the EP405/EP405PC boards.
+-
+-#config EP405PC
+-# bool "EP405PC Support"
+-# depends on EP405
+-# default y
+-# help
+-# This option enables support for the extra features of the EP405PC board.
++config EP405
++ bool "EP405/EP405PC"
++ depends on 40x
++ default n
++ select 405GP
++ select PCI
++ help
++ This option enables support for the EP405/EP405PC boards.
+
+ config KILAUEA
+ bool "Kilauea"
+ depends on 40x
+ default n
++ select 405EX
++ select PPC4xx_PCI_EXPRESS
+ help
+ This option enables support for the AMCC PPC405EX evaluation board.
+
++config MAKALU
++ bool "Makalu"
++ depends on 40x
++ default n
++ select 405EX
++ select PCI
++ select PPC4xx_PCI_EXPRESS
++ help
++ This option enables support for the AMCC PPC405EX board.
++
+ #config REDWOOD_5
+ # bool "Redwood-5"
+ # depends on 40x
+@@ -65,6 +71,7 @@
+ depends on 40x
+ default y
+ select 405GP
++ select PCI
+ help
+ This option enables support for the IBM PPC405GP evaluation board.
+
+@@ -105,6 +112,11 @@
+ config 405EP
+ bool
+
++config 405EX
++ bool
++ select IBM_NEW_EMAC_EMAC4
++ select IBM_NEW_EMAC_RGMII
++
+ config 405GPR
+ bool
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/Makefile powerpc.git/arch/powerpc/platforms/40x/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/40x/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -1,3 +1,5 @@
+ obj-$(CONFIG_KILAUEA) += kilauea.o
++obj-$(CONFIG_MAKALU) += makalu.o
+ obj-$(CONFIG_WALNUT) += walnut.o
+ obj-$(CONFIG_XILINX_VIRTEX_GENERIC_BOARD) += virtex.o
++obj-$(CONFIG_EP405) += ep405.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/ep405.c powerpc.git/arch/powerpc/platforms/40x/ep405.c
+--- linux-2.6.24/arch/powerpc/platforms/40x/ep405.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/ep405.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,123 @@
++/*
++ * Architecture- / platform-specific boot-time initialization code for
++ * IBM PowerPC 4xx based boards. Adapted from original
++ * code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek
++ * <dan@net4x.com>.
++ *
++ * Copyright(c) 1999-2000 Grant Erickson <grant@lcse.umn.edu>
++ *
++ * Rewritten and ported to the merged powerpc tree:
++ * Copyright 2007 IBM Corporation
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ *
++ * Adapted to EP405 by Ben. Herrenschmidt <benh@kernel.crashing.org>
++ *
++ * TODO: Wire up the PCI IRQ mux and the southbridge interrupts
++ *
++ * 2002 (c) MontaVista, Software, Inc. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ */
++
++#include <linux/init.h>
++#include <linux/of_platform.h>
++
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
++static struct device_node *bcsr_node;
++static void __iomem *bcsr_regs;
++
++/* BCSR registers */
++#define BCSR_ID 0
++#define BCSR_PCI_CTRL 1
++#define BCSR_FLASH_NV_POR_CTRL 2
++#define BCSR_FENET_UART_CTRL 3
++#define BCSR_PCI_IRQ 4
++#define BCSR_XIRQ_SELECT 5
++#define BCSR_XIRQ_ROUTING 6
++#define BCSR_XIRQ_STATUS 7
++#define BCSR_XIRQ_STATUS2 8
++#define BCSR_SW_STAT_LED_CTRL 9
++#define BCSR_GPIO_IRQ_PAR_CTRL 10
++/* there's more, can't be bothered typing them tho */
++
++
++static __initdata struct of_device_id ep405_of_bus[] = {
++ { .compatible = "ibm,plb3", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init ep405_device_probe(void)
++{
++ of_platform_bus_probe(NULL, ep405_of_bus, NULL);
++
++ return 0;
++}
++machine_device_initcall(ep405, ep405_device_probe);
++
++static void __init ep405_init_bcsr(void)
++{
++ const u8 *irq_routing;
++ int i;
++
++ /* Find the bloody thing & map it */
++ bcsr_node = of_find_compatible_node(NULL, NULL, "ep405-bcsr");
++ if (bcsr_node == NULL) {
++ printk(KERN_ERR "EP405 BCSR not found !\n");
++ return;
++ }
++ bcsr_regs = of_iomap(bcsr_node, 0);
++ if (bcsr_regs == NULL) {
++ printk(KERN_ERR "EP405 BCSR failed to map !\n");
++ return;
++ }
++
++ /* Get the irq-routing property and apply the routing to the CPLD */
++ irq_routing = of_get_property(bcsr_node, "irq-routing", NULL);
++ if (irq_routing == NULL)
++ return;
++ for (i = 0; i < 16; i++) {
++ u8 irq = irq_routing[i];
++ out_8(bcsr_regs + BCSR_XIRQ_SELECT, i);
++ out_8(bcsr_regs + BCSR_XIRQ_ROUTING, irq);
++ }
++ in_8(bcsr_regs + BCSR_XIRQ_SELECT);
++ mb();
++ out_8(bcsr_regs + BCSR_GPIO_IRQ_PAR_CTRL, 0xfe);
++}
++
++static void __init ep405_setup_arch(void)
++{
++ /* Find & init the BCSR CPLD */
++ ep405_init_bcsr();
++
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++}
++
++static int __init ep405_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (!of_flat_dt_is_compatible(root, "ep405"))
++ return 0;
++
++ return 1;
++}
++
++define_machine(ep405) {
++ .name = "EP405",
++ .probe = ep405_probe,
++ .setup_arch = ep405_setup_arch,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/kilauea.c powerpc.git/arch/powerpc/platforms/40x/kilauea.c
+--- linux-2.6.24/arch/powerpc/platforms/40x/kilauea.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/kilauea.c 2008-01-28 20:25:49.000000000 +0100
+@@ -19,8 +19,9 @@
+ #include <asm/udbg.h>
+ #include <asm/time.h>
+ #include <asm/uic.h>
++#include <asm/pci-bridge.h>
+
+-static struct of_device_id kilauea_of_bus[] = {
++static __initdata struct of_device_id kilauea_of_bus[] = {
+ { .compatible = "ibm,plb4", },
+ { .compatible = "ibm,opb", },
+ { .compatible = "ibm,ebc", },
+@@ -29,14 +30,11 @@
+
+ static int __init kilauea_device_probe(void)
+ {
+- if (!machine_is(kilauea))
+- return 0;
+-
+ of_platform_bus_probe(NULL, kilauea_of_bus, NULL);
+
+ return 0;
+ }
+-device_initcall(kilauea_device_probe);
++machine_device_initcall(kilauea, kilauea_device_probe);
+
+ static int __init kilauea_probe(void)
+ {
+@@ -45,6 +43,8 @@
+ if (!of_flat_dt_is_compatible(root, "amcc,kilauea"))
+ return 0;
+
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
+ return 1;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/makalu.c powerpc.git/arch/powerpc/platforms/40x/makalu.c
+--- linux-2.6.24/arch/powerpc/platforms/40x/makalu.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/makalu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,58 @@
++/*
++ * Makalu board specific routines
++ *
++ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
++ *
++ * Based on the Walnut code by
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ * Copyright 2007 IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++#include <linux/init.h>
++#include <linux/of_platform.h>
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
++static __initdata struct of_device_id makalu_of_bus[] = {
++ { .compatible = "ibm,plb4", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init makalu_device_probe(void)
++{
++ of_platform_bus_probe(NULL, makalu_of_bus, NULL);
++
++ return 0;
++}
++machine_device_initcall(makalu, makalu_device_probe);
++
++static int __init makalu_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (!of_flat_dt_is_compatible(root, "amcc,makalu"))
++ return 0;
++
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
++ return 1;
++}
++
++define_machine(makalu) {
++ .name = "Makalu",
++ .probe = makalu_probe,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/virtex.c powerpc.git/arch/powerpc/platforms/40x/virtex.c
+--- linux-2.6.24/arch/powerpc/platforms/40x/virtex.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/virtex.c 2008-01-28 20:25:49.000000000 +0100
+@@ -15,16 +15,23 @@
+ #include <asm/time.h>
+ #include <asm/xilinx_intc.h>
+
++static struct of_device_id xilinx_of_bus_ids[] __initdata = {
++ { .compatible = "xlnx,plb-v46-1.00.a", },
++ { .compatible = "xlnx,plb-v34-1.01.a", },
++ { .compatible = "xlnx,plb-v34-1.02.a", },
++ { .compatible = "xlnx,opb-v20-1.10.c", },
++ { .compatible = "xlnx,dcr-v29-1.00.a", },
++ { .compatible = "xlnx,compound", },
++ {}
++};
++
+ static int __init virtex_device_probe(void)
+ {
+- if (!machine_is(virtex))
+- return 0;
+-
+- of_platform_bus_probe(NULL, NULL, NULL);
++ of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(virtex_device_probe);
++machine_device_initcall(virtex, virtex_device_probe);
+
+ static int __init virtex_probe(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/40x/walnut.c powerpc.git/arch/powerpc/platforms/40x/walnut.c
+--- linux-2.6.24/arch/powerpc/platforms/40x/walnut.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/40x/walnut.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,8 +24,9 @@
+ #include <asm/udbg.h>
+ #include <asm/time.h>
+ #include <asm/uic.h>
++#include <asm/pci-bridge.h>
+
+-static struct of_device_id walnut_of_bus[] = {
++static __initdata struct of_device_id walnut_of_bus[] = {
+ { .compatible = "ibm,plb3", },
+ { .compatible = "ibm,opb", },
+ { .compatible = "ibm,ebc", },
+@@ -34,15 +35,12 @@
+
+ static int __init walnut_device_probe(void)
+ {
+- if (!machine_is(walnut))
+- return 0;
+-
+- /* FIXME: do bus probe here */
+ of_platform_bus_probe(NULL, walnut_of_bus, NULL);
++ of_instantiate_rtc();
+
+ return 0;
+ }
+-device_initcall(walnut_device_probe);
++machine_device_initcall(walnut, walnut_device_probe);
+
+ static int __init walnut_probe(void)
+ {
+@@ -51,6 +49,8 @@
+ if (!of_flat_dt_is_compatible(root, "ibm,walnut"))
+ return 0;
+
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
+ return 1;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/Kconfig powerpc.git/arch/powerpc/platforms/44x/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/44x/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -3,6 +3,7 @@
+ depends on 44x
+ default n
+ select 440EP
++ select PCI
+ help
+ This option enables support for the IBM PPC440EP evaluation board.
+
+@@ -11,6 +12,8 @@
+ depends on 44x
+ default y
+ select 440GP
++ select PCI
++ select OF_RTC
+ help
+ This option enables support for the IBM PPC440GP evaluation board.
+
+@@ -22,6 +25,48 @@
+ help
+ This option enables support for the AMCC PPC440EPX evaluation board.
+
++config TAISHAN
++ bool "Taishan"
++ depends on 44x
++ default n
++ select 440GX
++ select PCI
++ help
++ This option enables support for the AMCC PPC440GX "Taishan"
++ evaluation board.
++
++config KATMAI
++ bool "Katmai"
++ depends on 44x
++ default n
++ select 440SPe
++ select PCI
++ select PPC4xx_PCI_EXPRESS
++ help
++ This option enables support for the AMCC PPC440SPe evaluation board.
++
++config RAINIER
++ bool "Rainier"
++ depends on 44x
++ default n
++ select 440GRX
++ select PCI
++ help
++ This option enables support for the AMCC PPC440GRX evaluation board.
++
++config WARP
++ bool "PIKA Warp"
++ depends on 44x
++ default n
++ select 440EP
++ help
++ This option enables support for the PIKA Warp(tm) Appliance. The Warp
++ is a small computer replacement with up to 9 ports of FXO/FXS plus VOIP
++ stations and trunks.
++
++ See http://www.pikatechnologies.com/ and follow the "PIKA for Computer
++ Telephony Developers" link for more information.
++
+ #config LUAN
+ # bool "Luan"
+ # depends on 44x
+@@ -44,6 +89,7 @@
+ select PPC_FPU
+ select IBM440EP_ERR42
+ select IBM_NEW_EMAC_ZMII
++ select USB_ARCH_HAS_OHCI
+
+ config 440EPX
+ bool
+@@ -52,20 +98,29 @@
+ select IBM_NEW_EMAC_RGMII
+ select IBM_NEW_EMAC_ZMII
+
++config 440GRX
++ bool
++ select IBM_NEW_EMAC_EMAC4
++ select IBM_NEW_EMAC_RGMII
++ select IBM_NEW_EMAC_ZMII
++
+ config 440GP
+ bool
+ select IBM_NEW_EMAC_ZMII
+
+ config 440GX
+ bool
++ select IBM_NEW_EMAC_EMAC4
++ select IBM_NEW_EMAC_RGMII
++ select IBM_NEW_EMAC_ZMII #test only
++ select IBM_NEW_EMAC_TAH #test only
+
+ config 440SP
+ bool
+
+-config 440A
++config 440SPe
++ select IBM_NEW_EMAC_EMAC4
+ bool
+- depends on 440GX || 440EPX
+- default y
+
+ # 44x errata/workaround config symbols, selected by the CPU models above
+ config IBM440EP_ERR42
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/Makefile powerpc.git/arch/powerpc/platforms/44x/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/44x/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -1,4 +1,9 @@
+ obj-$(CONFIG_44x) := misc_44x.o
+ obj-$(CONFIG_EBONY) += ebony.o
+-obj-$(CONFIG_BAMBOO) += bamboo.o
++obj-$(CONFIG_TAISHAN) += taishan.o
++obj-$(CONFIG_BAMBOO) += bamboo.o
+ obj-$(CONFIG_SEQUOIA) += sequoia.o
++obj-$(CONFIG_KATMAI) += katmai.o
++obj-$(CONFIG_RAINIER) += rainier.o
++obj-$(CONFIG_WARP) += warp.o
++obj-$(CONFIG_WARP) += warp-nand.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/bamboo.c powerpc.git/arch/powerpc/platforms/44x/bamboo.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/bamboo.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/bamboo.c 2008-01-28 20:25:49.000000000 +0100
+@@ -21,9 +21,11 @@
+ #include <asm/udbg.h>
+ #include <asm/time.h>
+ #include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
+ #include "44x.h"
+
+-static struct of_device_id bamboo_of_bus[] = {
++static __initdata struct of_device_id bamboo_of_bus[] = {
+ { .compatible = "ibm,plb4", },
+ { .compatible = "ibm,opb", },
+ { .compatible = "ibm,ebc", },
+@@ -32,14 +34,11 @@
+
+ static int __init bamboo_device_probe(void)
+ {
+- if (!machine_is(bamboo))
+- return 0;
+-
+ of_platform_bus_probe(NULL, bamboo_of_bus, NULL);
+
+ return 0;
+ }
+-device_initcall(bamboo_device_probe);
++machine_device_initcall(bamboo, bamboo_device_probe);
+
+ static int __init bamboo_probe(void)
+ {
+@@ -48,6 +47,8 @@
+ if (!of_flat_dt_is_compatible(root, "amcc,bamboo"))
+ return 0;
+
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
+ return 1;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/ebony.c powerpc.git/arch/powerpc/platforms/44x/ebony.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/ebony.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/ebony.c 2008-01-28 20:25:49.000000000 +0100
+@@ -18,16 +18,18 @@
+
+ #include <linux/init.h>
+ #include <linux/of_platform.h>
++#include <linux/rtc.h>
+
+ #include <asm/machdep.h>
+ #include <asm/prom.h>
+ #include <asm/udbg.h>
+ #include <asm/time.h>
+ #include <asm/uic.h>
++#include <asm/pci-bridge.h>
+
+ #include "44x.h"
+
+-static struct of_device_id ebony_of_bus[] = {
++static __initdata struct of_device_id ebony_of_bus[] = {
+ { .compatible = "ibm,plb4", },
+ { .compatible = "ibm,opb", },
+ { .compatible = "ibm,ebc", },
+@@ -36,14 +38,12 @@
+
+ static int __init ebony_device_probe(void)
+ {
+- if (!machine_is(ebony))
+- return 0;
+-
+ of_platform_bus_probe(NULL, ebony_of_bus, NULL);
++ of_instantiate_rtc();
+
+ return 0;
+ }
+-device_initcall(ebony_device_probe);
++machine_device_initcall(ebony, ebony_device_probe);
+
+ /*
+ * Called very early, MMU is off, device-tree isn't unflattened
+@@ -55,6 +55,8 @@
+ if (!of_flat_dt_is_compatible(root, "ibm,ebony"))
+ return 0;
+
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
+ return 1;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/katmai.c powerpc.git/arch/powerpc/platforms/44x/katmai.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/katmai.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/katmai.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,63 @@
++/*
++ * Katmai board specific routines
++ *
++ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
++ * Copyright 2007 IBM Corp.
++ *
++ * Based on the Bamboo code by
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ * Copyright 2007 IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++#include <linux/init.h>
++#include <linux/of_platform.h>
++
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
++#include "44x.h"
++
++static __initdata struct of_device_id katmai_of_bus[] = {
++ { .compatible = "ibm,plb4", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init katmai_device_probe(void)
++{
++ of_platform_bus_probe(NULL, katmai_of_bus, NULL);
++
++ return 0;
++}
++machine_device_initcall(katmai, katmai_device_probe);
++
++static int __init katmai_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (!of_flat_dt_is_compatible(root, "amcc,katmai"))
++ return 0;
++
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
++ return 1;
++}
++
++define_machine(katmai) {
++ .name = "Katmai",
++ .probe = katmai_probe,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .restart = ppc44x_reset_system,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/rainier.c powerpc.git/arch/powerpc/platforms/44x/rainier.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/rainier.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/rainier.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,62 @@
++/*
++ * Rainier board specific routines
++ *
++ * Valentine Barshak <vbarshak@ru.mvista.com>
++ * Copyright 2007 MontaVista Software Inc.
++ *
++ * Based on the Bamboo code by
++ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
++ * Copyright 2007 IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++#include <linux/init.h>
++#include <linux/of_platform.h>
++
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++#include <asm/pci-bridge.h>
++#include "44x.h"
++
++static __initdata struct of_device_id rainier_of_bus[] = {
++ { .compatible = "ibm,plb4", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init rainier_device_probe(void)
++{
++ of_platform_bus_probe(NULL, rainier_of_bus, NULL);
++
++ return 0;
++}
++machine_device_initcall(rainier, rainier_device_probe);
++
++static int __init rainier_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (!of_flat_dt_is_compatible(root, "amcc,rainier"))
++ return 0;
++
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
++ return 1;
++}
++
++define_machine(rainier) {
++ .name = "Rainier",
++ .probe = rainier_probe,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .restart = ppc44x_reset_system,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/sequoia.c powerpc.git/arch/powerpc/platforms/44x/sequoia.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/sequoia.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/sequoia.c 2008-01-28 20:25:49.000000000 +0100
+@@ -21,9 +21,11 @@
+ #include <asm/udbg.h>
+ #include <asm/time.h>
+ #include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
+ #include "44x.h"
+
+-static struct of_device_id sequoia_of_bus[] = {
++static __initdata struct of_device_id sequoia_of_bus[] = {
+ { .compatible = "ibm,plb4", },
+ { .compatible = "ibm,opb", },
+ { .compatible = "ibm,ebc", },
+@@ -32,14 +34,11 @@
+
+ static int __init sequoia_device_probe(void)
+ {
+- if (!machine_is(sequoia))
+- return 0;
+-
+ of_platform_bus_probe(NULL, sequoia_of_bus, NULL);
+
+ return 0;
+ }
+-device_initcall(sequoia_device_probe);
++machine_device_initcall(sequoia, sequoia_device_probe);
+
+ static int __init sequoia_probe(void)
+ {
+@@ -48,6 +47,8 @@
+ if (!of_flat_dt_is_compatible(root, "amcc,sequoia"))
+ return 0;
+
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
+ return 1;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/taishan.c powerpc.git/arch/powerpc/platforms/44x/taishan.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/taishan.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/taishan.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,73 @@
++/*
++ * Taishan board specific routines based off ebony.c code
++ * original copyrights below
++ *
++ * Matt Porter <mporter@kernel.crashing.org>
++ * Copyright 2002-2005 MontaVista Software Inc.
++ *
++ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
++ * Copyright (c) 2003-2005 Zultys Technologies
++ *
++ * Rewritten and ported to the merged powerpc tree:
++ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
++ *
++ * Modified from ebony.c for taishan:
++ * Copyright 2007 Hugh Blemings <hugh@au.ibm.com>, IBM Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/init.h>
++#include <linux/of_platform.h>
++
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++#include <asm/pci-bridge.h>
++
++#include "44x.h"
++
++static __initdata struct of_device_id taishan_of_bus[] = {
++ { .compatible = "ibm,plb4", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init taishan_device_probe(void)
++{
++ of_platform_bus_probe(NULL, taishan_of_bus, NULL);
++
++ return 0;
++}
++machine_device_initcall(taishan, taishan_device_probe);
++
++/*
++ * Called very early, MMU is off, device-tree isn't unflattened
++ */
++static int __init taishan_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (!of_flat_dt_is_compatible(root, "amcc,taishan"))
++ return 0;
++
++ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
++
++ return 1;
++}
++
++define_machine(taishan) {
++ .name = "Taishan",
++ .probe = taishan_probe,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .restart = ppc44x_reset_system,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/warp-nand.c powerpc.git/arch/powerpc/platforms/44x/warp-nand.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/warp-nand.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/warp-nand.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,105 @@
++/*
++ * PIKA Warp(tm) NAND flash specific routines
++ *
++ * Copyright (c) 2008 PIKA Technologies
++ * Sean MacLennan <smaclennan@pikatech.com>
++ */
++
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/nand.h>
++#include <linux/mtd/ndfc.h>
++
++#ifdef CONFIG_MTD_NAND_NDFC
++
++#define CS_NAND_0 1 /* use chip select 1 for NAND device 0 */
++
++#define WARP_NAND_FLASH_REG_ADDR 0xD0000000UL
++#define WARP_NAND_FLASH_REG_SIZE 0x2000
++
++static struct resource warp_ndfc = {
++ .start = WARP_NAND_FLASH_REG_ADDR,
++ .end = WARP_NAND_FLASH_REG_ADDR + WARP_NAND_FLASH_REG_SIZE,
++ .flags = IORESOURCE_MEM,
++};
++
++static struct mtd_partition nand_parts[] = {
++ {
++ .name = "kernel",
++ .offset = 0,
++ .size = 0x0200000
++ },
++ {
++ .name = "root",
++ .offset = 0x0200000,
++ .size = 0x3400000
++ },
++ {
++ .name = "user",
++ .offset = 0x3600000,
++ .size = 0x0A00000
++ },
++};
++
++struct ndfc_controller_settings warp_ndfc_settings = {
++ .ccr_settings = (NDFC_CCR_BS(CS_NAND_0) | NDFC_CCR_ARAC1),
++ .ndfc_erpn = 0,
++};
++
++static struct ndfc_chip_settings warp_chip0_settings = {
++ .bank_settings = 0x80002222,
++};
++
++struct platform_nand_ctrl warp_nand_ctrl = {
++ .priv = &warp_ndfc_settings,
++};
++
++static struct platform_device warp_ndfc_device = {
++ .name = "ndfc-nand",
++ .id = 0,
++ .dev = {
++ .platform_data = &warp_nand_ctrl,
++ },
++ .num_resources = 1,
++ .resource = &warp_ndfc,
++};
++
++static struct nand_ecclayout nand_oob_16 = {
++ .eccbytes = 3,
++ .eccpos = { 0, 1, 2, 3, 6, 7 },
++ .oobfree = { {.offset = 8, .length = 16} }
++};
++
++static struct platform_nand_chip warp_nand_chip0 = {
++ .nr_chips = 1,
++ .chip_offset = CS_NAND_0,
++ .nr_partitions = ARRAY_SIZE(nand_parts),
++ .partitions = nand_parts,
++ .chip_delay = 50,
++ .ecclayout = &nand_oob_16,
++ .priv = &warp_chip0_settings,
++};
++
++static struct platform_device warp_nand_device = {
++ .name = "ndfc-chip",
++ .id = 0,
++ .num_resources = 1,
++ .resource = &warp_ndfc,
++ .dev = {
++ .platform_data = &warp_nand_chip0,
++ .parent = &warp_ndfc_device.dev,
++ }
++};
++
++static int warp_setup_nand_flash(void)
++{
++ platform_device_register(&warp_ndfc_device);
++ platform_device_register(&warp_nand_device);
++
++ return 0;
++}
++device_initcall(warp_setup_nand_flash);
++
++#endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/44x/warp.c powerpc.git/arch/powerpc/platforms/44x/warp.c
+--- linux-2.6.24/arch/powerpc/platforms/44x/warp.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/44x/warp.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,153 @@
++/*
++ * PIKA Warp(tm) board specific routines
++ *
++ * Copyright (c) 2008 PIKA Technologies
++ * Sean MacLennan <smaclennan@pikatech.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++#include <linux/init.h>
++#include <linux/of_platform.h>
++#include <linux/kthread.h>
++
++#include <asm/machdep.h>
++#include <asm/prom.h>
++#include <asm/udbg.h>
++#include <asm/time.h>
++#include <asm/uic.h>
++
++#include "44x.h"
++
++
++static __initdata struct of_device_id warp_of_bus[] = {
++ { .compatible = "ibm,plb4", },
++ { .compatible = "ibm,opb", },
++ { .compatible = "ibm,ebc", },
++ {},
++};
++
++static int __init warp_device_probe(void)
++{
++ of_platform_bus_probe(NULL, warp_of_bus, NULL);
++ return 0;
++}
++machine_device_initcall(warp, warp_device_probe);
++
++static int __init warp_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ return of_flat_dt_is_compatible(root, "pika,warp");
++}
++
++define_machine(warp) {
++ .name = "Warp",
++ .probe = warp_probe,
++ .progress = udbg_progress,
++ .init_IRQ = uic_init_tree,
++ .get_irq = uic_get_irq,
++ .restart = ppc44x_reset_system,
++ .calibrate_decr = generic_calibrate_decr,
++};
++
++
++#define LED_GREEN (0x80000000 >> 0)
++#define LED_RED (0x80000000 >> 1)
++
++
++/* This is for the power LEDs 1 = on, 0 = off, -1 = leave alone */
++void warp_set_power_leds(int green, int red)
++{
++ static void __iomem *gpio_base = NULL;
++ unsigned leds;
++
++ if (gpio_base == NULL) {
++ struct device_node *np;
++
++ /* Power LEDS are on the second GPIO controller */
++ np = of_find_compatible_node(NULL, NULL, "ibm,gpio-440EP");
++ if (np)
++ np = of_find_compatible_node(np, NULL, "ibm,gpio-440EP");
++ if (np == NULL) {
++ printk(KERN_ERR __FILE__ ": Unable to find gpio\n");
++ return;
++ }
++
++ gpio_base = of_iomap(np, 0);
++ of_node_put(np);
++ if (gpio_base == NULL) {
++ printk(KERN_ERR __FILE__ ": Unable to map gpio");
++ return;
++ }
++ }
++
++ leds = in_be32(gpio_base);
++
++ switch (green) {
++ case 0: leds &= ~LED_GREEN; break;
++ case 1: leds |= LED_GREEN; break;
++ }
++ switch (red) {
++ case 0: leds &= ~LED_RED; break;
++ case 1: leds |= LED_RED; break;
++ }
++
++ out_be32(gpio_base, leds);
++}
++EXPORT_SYMBOL(warp_set_power_leds);
++
++
++#ifdef CONFIG_SENSORS_AD7414
++static int pika_dtm_thread(void __iomem *fpga)
++{
++ extern int ad7414_get_temp(int index);
++
++ while (!kthread_should_stop()) {
++ int temp = ad7414_get_temp(0);
++
++ out_be32(fpga, temp);
++
++ set_current_state(TASK_INTERRUPTIBLE);
++ schedule_timeout(HZ);
++ }
++
++ return 0;
++}
++
++static int __init pika_dtm_start(void)
++{
++ struct task_struct *dtm_thread;
++ struct device_node *np;
++ struct resource res;
++ void __iomem *fpga;
++
++ np = of_find_compatible_node(NULL, NULL, "pika,fpga");
++ if (np == NULL)
++ return -ENOENT;
++
++ /* We do not call of_iomap here since it would map in the entire
++ * fpga space, which is over 8k.
++ */
++ if (of_address_to_resource(np, 0, &res)) {
++ of_node_put(np);
++ return -ENOENT;
++ }
++ of_node_put(np);
++
++ fpga = ioremap(res.start + 0x20, 4);
++ if (fpga == NULL)
++ return -ENOENT;
++
++ dtm_thread = kthread_run(pika_dtm_thread, fpga + 0x20, "pika-dtm");
++ if (IS_ERR(dtm_thread)) {
++ iounmap(fpga);
++ return PTR_ERR(dtm_thread);
++ }
++
++ return 0;
++}
++device_initcall(pika_dtm_start);
++#endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/Kconfig powerpc.git/arch/powerpc/platforms/52xx/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/52xx/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -19,6 +19,28 @@
+
+ It is safe to say 'Y' here
+
++config PPC_MPC5200_SIMPLE
++ bool "Generic support for simple MPC5200 based boards"
++ depends on PPC_MULTIPLATFORM && PPC32
++ select PPC_MPC5200
++ select DEFAULT_UIMAGE
++ select WANT_DEVICE_TREE
++ default n
++ help
++ This option enables support for a simple MPC52xx based boards which
++ do not need a custom platform specific setup. Such boards are
++ supported assuming the following:
++
++ - GPIO pins are configured by the firmware,
++ - CDM configuration (clocking) is setup correctly by firmware,
++ - if the 'fsl,has-wdt' property is present in one of the
++ gpt nodes, then it is safe to use such gpt to reset the board,
++ - PCI is supported if enabled in the kernel configuration
++ and if there is a PCI bus node defined in the device tree.
++
++ Boards that are compatible with this generic platform support
++ are: 'tqc,tqm5200', 'promess,motionpro', 'schindler,cm5200'.
++
+ config PPC_EFIKA
+ bool "bPlan Efika 5k2. MPC5200B based computer"
+ depends on PPC_MULTIPLATFORM && PPC32
+@@ -31,8 +53,7 @@
+ config PPC_LITE5200
+ bool "Freescale Lite5200 Eval Board"
+ depends on PPC_MULTIPLATFORM && PPC32
+- select WANT_DEVICE_TREE
+ select PPC_MPC5200
++ select DEFAULT_UIMAGE
++ select WANT_DEVICE_TREE
+ default n
+-
+-
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/Makefile powerpc.git/arch/powerpc/platforms/52xx/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/52xx/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -6,6 +6,7 @@
+ obj-$(CONFIG_PCI) += mpc52xx_pci.o
+ endif
+
++obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o
+ obj-$(CONFIG_PPC_EFIKA) += efika.o
+ obj-$(CONFIG_PPC_LITE5200) += lite5200.o
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/lite5200.c powerpc.git/arch/powerpc/platforms/52xx/lite5200.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/lite5200.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/lite5200.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,10 +42,13 @@
+ static void __init
+ lite5200_fix_clock_config(void)
+ {
++ struct device_node *np;
+ struct mpc52xx_cdm __iomem *cdm;
+
+ /* Map zones */
+- cdm = mpc52xx_find_and_map("mpc5200-cdm");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
++ cdm = of_iomap(np, 0);
++ of_node_put(np);
+ if (!cdm) {
+ printk(KERN_ERR "%s() failed; expect abnormal behaviour\n",
+ __FUNCTION__);
+@@ -74,10 +77,13 @@
+ static void __init
+ lite5200_fix_port_config(void)
+ {
++ struct device_node *np;
+ struct mpc52xx_gpio __iomem *gpio;
+ u32 port_config;
+
+- gpio = mpc52xx_find_and_map("mpc5200-gpio");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
++ gpio = of_iomap(np, 0);
++ of_node_put(np);
+ if (!gpio) {
+ printk(KERN_ERR "%s() failed. expect abnormal behavior\n",
+ __FUNCTION__);
+@@ -131,10 +137,6 @@
+
+ static void __init lite5200_setup_arch(void)
+ {
+-#ifdef CONFIG_PCI
+- struct device_node *np;
+-#endif
+-
+ if (ppc_md.progress)
+ ppc_md.progress("lite5200_setup_arch()", 0);
+
+@@ -154,13 +156,7 @@
+ lite5200_pm_init();
+ #endif
+
+-#ifdef CONFIG_PCI
+- np = of_find_node_by_type(NULL, "pci");
+- if (np) {
+- mpc52xx_add_bridge(np);
+- of_node_put(np);
+- }
+-#endif
++ mpc52xx_setup_pci();
+ }
+
+ /*
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/lite5200_pm.c powerpc.git/arch/powerpc/platforms/52xx/lite5200_pm.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/lite5200_pm.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/lite5200_pm.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,6 +42,8 @@
+
+ static int lite5200_pm_prepare(void)
+ {
++ struct device_node *np;
++
+ /* deep sleep? let mpc52xx code handle that */
+ if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
+ return mpc52xx_pm_prepare();
+@@ -50,7 +52,9 @@
+ return -EINVAL;
+
+ /* map registers */
+- mbar = mpc52xx_find_and_map("mpc5200");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200");
++ mbar = of_iomap(np, 0);
++ of_node_put(np);
+ if (!mbar) {
+ printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
+ return -ENOSYS;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/mpc5200_simple.c powerpc.git/arch/powerpc/platforms/52xx/mpc5200_simple.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/mpc5200_simple.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/mpc5200_simple.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,85 @@
++/*
++ * Support for 'mpc5200-simple-platform' compatible boards.
++ *
++ * Written by Marian Balakowicz <m8@semihalf.com>
++ * Copyright (C) 2007 Semihalf
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * Description:
++ * This code implements support for a simple MPC52xx based boards which
++ * do not need a custom platform specific setup. Such boards are
++ * supported assuming the following:
++ *
++ * - GPIO pins are configured by the firmware,
++ * - CDM configuration (clocking) is setup correctly by firmware,
++ * - if the 'fsl,has-wdt' property is present in one of the
++ * gpt nodes, then it is safe to use such gpt to reset the board,
++ * - PCI is supported if enabled in the kernel configuration
++ * and if there is a PCI bus node defined in the device tree.
++ *
++ * Boards that are compatible with this generic platform support
++ * are listed in a 'board' table.
++ */
++
++#undef DEBUG
++#include <asm/time.h>
++#include <asm/prom.h>
++#include <asm/machdep.h>
++#include <asm/mpc52xx.h>
++
++/*
++ * Setup the architecture
++ */
++static void __init mpc5200_simple_setup_arch(void)
++{
++ if (ppc_md.progress)
++ ppc_md.progress("mpc5200_simple_setup_arch()", 0);
++
++ /* Some mpc5200 & mpc5200b related configuration */
++ mpc5200_setup_xlb_arbiter();
++
++ /* Map wdt for mpc52xx_restart() */
++ mpc52xx_map_wdt();
++
++ mpc52xx_setup_pci();
++}
++
++/* list of the supported boards */
++static char *board[] __initdata = {
++ "promess,motionpro",
++ "schindler,cm5200",
++ "tqc,tqm5200",
++ NULL
++};
++
++/*
++ * Called very early, MMU is off, device-tree isn't unflattened
++ */
++static int __init mpc5200_simple_probe(void)
++{
++ unsigned long node = of_get_flat_dt_root();
++ int i = 0;
++
++ while (board[i]) {
++ if (of_flat_dt_is_compatible(node, board[i]))
++ break;
++ i++;
++ }
++
++ return (board[i] != NULL);
++}
++
++define_machine(mpc5200_simple_platform) {
++ .name = "mpc5200-simple-platform",
++ .probe = mpc5200_simple_probe,
++ .setup_arch = mpc5200_simple_setup_arch,
++ .init = mpc52xx_declare_of_platform_devices,
++ .init_IRQ = mpc52xx_init_irq,
++ .get_irq = mpc52xx_get_irq,
++ .restart = mpc52xx_restart,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_common.c powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_common.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_common.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_common.c 2008-01-28 20:25:49.000000000 +0100
+@@ -26,45 +26,6 @@
+ */
+ static volatile struct mpc52xx_gpt *mpc52xx_wdt = NULL;
+
+-static void __iomem *
+-mpc52xx_map_node(struct device_node *ofn)
+-{
+- const u32 *regaddr_p;
+- u64 regaddr64, size64;
+-
+- if (!ofn)
+- return NULL;
+-
+- regaddr_p = of_get_address(ofn, 0, &size64, NULL);
+- if (!regaddr_p) {
+- of_node_put(ofn);
+- return NULL;
+- }
+-
+- regaddr64 = of_translate_address(ofn, regaddr_p);
+-
+- of_node_put(ofn);
+-
+- return ioremap((u32)regaddr64, (u32)size64);
+-}
+-
+-void __iomem *
+-mpc52xx_find_and_map(const char *compatible)
+-{
+- return mpc52xx_map_node(
+- of_find_compatible_node(NULL, NULL, compatible));
+-}
+-
+-EXPORT_SYMBOL(mpc52xx_find_and_map);
+-
+-void __iomem *
+-mpc52xx_find_and_map_path(const char *path)
+-{
+- return mpc52xx_map_node(of_find_node_by_path(path));
+-}
+-
+-EXPORT_SYMBOL(mpc52xx_find_and_map_path);
+-
+ /**
+ * mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
+ * @node: device node
+@@ -101,9 +62,12 @@
+ void __init
+ mpc5200_setup_xlb_arbiter(void)
+ {
++ struct device_node *np;
+ struct mpc52xx_xlb __iomem *xlb;
+
+- xlb = mpc52xx_find_and_map("mpc5200-xlb");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-xlb");
++ xlb = of_iomap(np, 0);
++ of_node_put(np);
+ if (!xlb) {
+ printk(KERN_ERR __FILE__ ": "
+ "Error mapping XLB in mpc52xx_setup_cpu(). "
+@@ -124,11 +88,21 @@
+ iounmap(xlb);
+ }
+
++static struct of_device_id mpc52xx_bus_ids[] __initdata= {
++ { .compatible = "fsl,mpc5200-immr", },
++ { .compatible = "fsl,lpb", },
++
++ /* depreciated matches; shouldn't be used in new device trees */
++ { .type = "builtin", .compatible = "mpc5200", }, /* efika */
++ { .type = "soc", .compatible = "mpc5200", }, /* lite5200 */
++ {},
++};
++
+ void __init
+ mpc52xx_declare_of_platform_devices(void)
+ {
+ /* Find every child of the SOC node and add it to of_platform */
+- if (of_platform_bus_probe(NULL, NULL, NULL))
++ if (of_platform_bus_probe(NULL, mpc52xx_bus_ids, NULL))
+ printk(KERN_ERR __FILE__ ": "
+ "Error while probing of_platform bus\n");
+ }
+@@ -146,16 +120,19 @@
+ for_each_compatible_node(np, NULL, "fsl,mpc5200-gpt") {
+ has_wdt = of_get_property(np, "fsl,has-wdt", NULL);
+ if (has_wdt) {
+- mpc52xx_wdt = mpc52xx_map_node(np);
++ mpc52xx_wdt = of_iomap(np, 0);
++ of_node_put(np);
+ return;
+ }
+ }
+ for_each_compatible_node(np, NULL, "mpc5200-gpt") {
+ has_wdt = of_get_property(np, "has-wdt", NULL);
+ if (has_wdt) {
+- mpc52xx_wdt = mpc52xx_map_node(np);
++ mpc52xx_wdt = of_iomap(np, 0);
++ of_node_put(np);
+ return;
+ }
++
+ }
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pci.c powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pci.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -363,7 +363,7 @@
+
+ pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
+
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+
+ if (of_address_to_resource(node, 0, &rsrc) != 0) {
+ printk(KERN_ERR "Can't get %s resources\n", node->full_name);
+@@ -406,3 +406,17 @@
+
+ return 0;
+ }
++
++void __init mpc52xx_setup_pci(void)
++{
++ struct device_node *pci;
++
++ pci = of_find_compatible_node(NULL, NULL, "fsl,mpc5200-pci");
++ if (!pci)
++ pci = of_find_compatible_node(NULL, NULL, "mpc5200-pci");
++ if (!pci)
++ return;
++
++ mpc52xx_add_bridge(pci);
++ of_node_put(pci);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pic.c powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pic.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pic.c 2008-01-28 20:25:49.000000000 +0100
+@@ -364,16 +364,18 @@
+ {
+ u32 intr_ctrl;
+ struct device_node *picnode;
++ struct device_node *np;
+
+ /* Remap the necessary zones */
+ picnode = of_find_compatible_node(NULL, NULL, "mpc5200-pic");
+-
+- intr = mpc52xx_find_and_map("mpc5200-pic");
++ intr = of_iomap(picnode, 0);
+ if (!intr)
+ panic(__FILE__ ": find_and_map failed on 'mpc5200-pic'. "
+ "Check node !");
+
+- sdma = mpc52xx_find_and_map("mpc5200-bestcomm");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-bestcomm");
++ sdma = of_iomap(np, 0);
++ of_node_put(np);
+ if (!sdma)
+ panic(__FILE__ ": find_and_map failed on 'mpc5200-bestcomm'. "
+ "Check node !");
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pm.c powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pm.c
+--- linux-2.6.24/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2008-01-28 20:25:49.000000000 +0100
+@@ -59,10 +59,14 @@
+
+ int mpc52xx_pm_prepare(void)
+ {
++ struct device_node *np;
++
+ /* map the whole register space */
+- mbar = mpc52xx_find_and_map("mpc5200");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200");
++ mbar = of_iomap(np, 0);
++ of_node_put(np);
+ if (!mbar) {
+- printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
++ pr_err("mpc52xx_pm_prepare(): could not map registers\n");
+ return -ENOSYS;
+ }
+ /* these offsets are from mpc5200 users manual */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/82xx/Kconfig powerpc.git/arch/powerpc/platforms/82xx/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/82xx/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/82xx/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -26,6 +26,19 @@
+ help
+ This option enables support for the PQ2FADS board
+
++config EP8248E
++ bool "Embedded Planet EP8248E (a.k.a. CWH-PPC-8248N-VE)"
++ select 8272
++ select 8260
++ select FSL_SOC
++ select PPC_CPM_NEW_BINDING
++ select MDIO_BITBANG
++ help
++ This enables support for the Embedded Planet EP8248E board.
++
++ This board is also resold by Freescale as the QUICCStart
++ MPC8248 Evaluation System and/or the CWH-PPC-8248N-VE.
++
+ endchoice
+
+ config PQ2ADS
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/82xx/Makefile powerpc.git/arch/powerpc/platforms/82xx/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/82xx/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/82xx/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -5,3 +5,4 @@
+ obj-$(CONFIG_CPM2) += pq2.o
+ obj-$(CONFIG_PQ2_ADS_PCI_PIC) += pq2ads-pci-pic.o
+ obj-$(CONFIG_PQ2FADS) += pq2fads.o
++obj-$(CONFIG_EP8248E) += ep8248e.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/82xx/ep8248e.c powerpc.git/arch/powerpc/platforms/82xx/ep8248e.c
+--- linux-2.6.24/arch/powerpc/platforms/82xx/ep8248e.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/82xx/ep8248e.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,324 @@
++/*
++ * Embedded Planet EP8248E support
++ *
++ * Copyright 2007 Freescale Semiconductor, Inc.
++ * Author: Scott Wood <scottwood@freescale.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <linux/fsl_devices.h>
++#include <linux/mdio-bitbang.h>
++#include <linux/of_platform.h>
++
++#include <asm/io.h>
++#include <asm/cpm2.h>
++#include <asm/udbg.h>
++#include <asm/machdep.h>
++#include <asm/time.h>
++#include <asm/mpc8260.h>
++#include <asm/prom.h>
++
++#include <sysdev/fsl_soc.h>
++#include <sysdev/cpm2_pic.h>
++
++#include "pq2.h"
++
++static u8 __iomem *ep8248e_bcsr;
++static struct device_node *ep8248e_bcsr_node;
++
++#define BCSR7_SCC2_ENABLE 0x10
++
++#define BCSR8_PHY1_ENABLE 0x80
++#define BCSR8_PHY1_POWER 0x40
++#define BCSR8_PHY2_ENABLE 0x20
++#define BCSR8_PHY2_POWER 0x10
++#define BCSR8_MDIO_READ 0x04
++#define BCSR8_MDIO_CLOCK 0x02
++#define BCSR8_MDIO_DATA 0x01
++
++#define BCSR9_USB_ENABLE 0x80
++#define BCSR9_USB_POWER 0x40
++#define BCSR9_USB_HOST 0x20
++#define BCSR9_USB_FULL_SPEED_TARGET 0x10
++
++static void __init ep8248e_pic_init(void)
++{
++ struct device_node *np = of_find_compatible_node(NULL, NULL, "fsl,pq2-pic");
++ if (!np) {
++ printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
++ return;
++ }
++
++ cpm2_pic_init(np);
++ of_node_put(np);
++}
++
++static void ep8248e_set_mdc(struct mdiobb_ctrl *ctrl, int level)
++{
++ if (level)
++ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
++ else
++ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
++
++ /* Read back to flush the write. */
++ in_8(&ep8248e_bcsr[8]);
++}
++
++static void ep8248e_set_mdio_dir(struct mdiobb_ctrl *ctrl, int output)
++{
++ if (output)
++ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
++ else
++ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
++
++ /* Read back to flush the write. */
++ in_8(&ep8248e_bcsr[8]);
++}
++
++static void ep8248e_set_mdio_data(struct mdiobb_ctrl *ctrl, int data)
++{
++ if (data)
++ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
++ else
++ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
++
++ /* Read back to flush the write. */
++ in_8(&ep8248e_bcsr[8]);
++}
++
++static int ep8248e_get_mdio_data(struct mdiobb_ctrl *ctrl)
++{
++ return in_8(&ep8248e_bcsr[8]) & BCSR8_MDIO_DATA;
++}
++
++static const struct mdiobb_ops ep8248e_mdio_ops = {
++ .set_mdc = ep8248e_set_mdc,
++ .set_mdio_dir = ep8248e_set_mdio_dir,
++ .set_mdio_data = ep8248e_set_mdio_data,
++ .get_mdio_data = ep8248e_get_mdio_data,
++ .owner = THIS_MODULE,
++};
++
++static struct mdiobb_ctrl ep8248e_mdio_ctrl = {
++ .ops = &ep8248e_mdio_ops,
++};
++
++static int __devinit ep8248e_mdio_probe(struct of_device *ofdev,
++ const struct of_device_id *match)
++{
++ struct mii_bus *bus;
++ struct resource res;
++ struct device_node *node;
++ int ret, i;
++
++ node = of_get_parent(ofdev->node);
++ of_node_put(node);
++ if (node != ep8248e_bcsr_node)
++ return -ENODEV;
++
++ ret = of_address_to_resource(ofdev->node, 0, &res);
++ if (ret)
++ return ret;
++
++ bus = alloc_mdio_bitbang(&ep8248e_mdio_ctrl);
++ if (!bus)
++ return -ENOMEM;
++
++ bus->phy_mask = 0;
++ bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
++
++ for (i = 0; i < PHY_MAX_ADDR; i++)
++ bus->irq[i] = -1;
++
++ bus->name = "ep8248e-mdio-bitbang";
++ bus->dev = &ofdev->dev;
++ bus->id = res.start;
++
++ return mdiobus_register(bus);
++}
++
++static int ep8248e_mdio_remove(struct of_device *ofdev)
++{
++ BUG();
++ return 0;
++}
++
++static const struct of_device_id ep8248e_mdio_match[] = {
++ {
++ .compatible = "fsl,ep8248e-mdio-bitbang",
++ },
++ {},
++};
++
++static struct of_platform_driver ep8248e_mdio_driver = {
++ .driver = {
++ .name = "ep8248e-mdio-bitbang",
++ },
++ .match_table = ep8248e_mdio_match,
++ .probe = ep8248e_mdio_probe,
++ .remove = ep8248e_mdio_remove,
++};
++
++struct cpm_pin {
++ int port, pin, flags;
++};
++
++static __initdata struct cpm_pin ep8248e_pins[] = {
++ /* SMC1 */
++ {2, 4, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++
++ /* SCC1 */
++ {2, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++
++ /* FCC1 */
++ {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++ {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++ {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++ {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++ {2, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++
++ /* FCC2 */
++ {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++
++ /* I2C */
++ {4, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++ {4, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
++
++ /* USB */
++ {2, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {2, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {2, 24, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++ {3, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {3, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
++ {3, 25, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
++};
++
++static void __init init_ioports(void)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(ep8248e_pins); i++) {
++ const struct cpm_pin *pin = &ep8248e_pins[i];
++ cpm2_set_pin(pin->port, pin->pin, pin->flags);
++ }
++
++ cpm2_smc_clk_setup(CPM_CLK_SMC1, CPM_BRG7);
++ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
++ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
++ cpm2_clk_setup(CPM_CLK_SCC3, CPM_CLK8, CPM_CLK_TX); /* USB */
++ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK11, CPM_CLK_RX);
++ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_TX);
++ cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
++ cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
++}
++
++static void __init ep8248e_setup_arch(void)
++{
++ if (ppc_md.progress)
++ ppc_md.progress("ep8248e_setup_arch()", 0);
++
++ cpm2_reset();
++
++ /* When this is set, snooping CPM DMA from RAM causes
++ * machine checks. See erratum SIU18.
++ */
++ clrbits32(&cpm2_immr->im_siu_conf.siu_82xx.sc_bcr, MPC82XX_BCR_PLDP);
++
++ ep8248e_bcsr_node =
++ of_find_compatible_node(NULL, NULL, "fsl,ep8248e-bcsr");
++ if (!ep8248e_bcsr_node) {
++ printk(KERN_ERR "No bcsr in device tree\n");
++ return;
++ }
++
++ ep8248e_bcsr = of_iomap(ep8248e_bcsr_node, 0);
++ if (!ep8248e_bcsr) {
++ printk(KERN_ERR "Cannot map BCSR registers\n");
++ of_node_put(ep8248e_bcsr_node);
++ ep8248e_bcsr_node = NULL;
++ return;
++ }
++
++ setbits8(&ep8248e_bcsr[7], BCSR7_SCC2_ENABLE);
++ setbits8(&ep8248e_bcsr[8], BCSR8_PHY1_ENABLE | BCSR8_PHY1_POWER |
++ BCSR8_PHY2_ENABLE | BCSR8_PHY2_POWER);
++
++ init_ioports();
++
++ if (ppc_md.progress)
++ ppc_md.progress("ep8248e_setup_arch(), finish", 0);
++}
++
++static __initdata struct of_device_id of_bus_ids[] = {
++ { .compatible = "simple-bus", },
++ { .compatible = "fsl,ep8248e-bcsr", },
++ {},
++};
++
++static int __init declare_of_platform_devices(void)
++{
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
++ of_register_platform_driver(&ep8248e_mdio_driver);
++
++ return 0;
++}
++machine_device_initcall(ep8248e, declare_of_platform_devices);
++
++/*
++ * Called very early, device-tree isn't unflattened
++ */
++static int __init ep8248e_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++ return of_flat_dt_is_compatible(root, "fsl,ep8248e");
++}
++
++define_machine(ep8248e)
++{
++ .name = "Embedded Planet EP8248E",
++ .probe = ep8248e_probe,
++ .setup_arch = ep8248e_setup_arch,
++ .init_IRQ = ep8248e_pic_init,
++ .get_irq = cpm2_get_irq,
++ .calibrate_decr = generic_calibrate_decr,
++ .restart = pq2_restart,
++ .progress = udbg_progress,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/82xx/pq2.c powerpc.git/arch/powerpc/platforms/82xx/pq2.c
+--- linux-2.6.24/arch/powerpc/platforms/82xx/pq2.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/82xx/pq2.c 2008-01-28 20:25:49.000000000 +0100
+@@ -53,13 +53,13 @@
+ if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
+ goto err;
+
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+
+ hose = pcibios_alloc_controller(np);
+ if (!hose)
+ return;
+
+- hose->arch_data = np;
++ hose->dn = np;
+
+ setup_indirect_pci(hose, r.start + 0x100, r.start + 0x104, 0);
+ pci_process_bridge_OF_ranges(hose, np, 1);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/82xx/pq2fads.c powerpc.git/arch/powerpc/platforms/82xx/pq2fads.c
+--- linux-2.6.24/arch/powerpc/platforms/82xx/pq2fads.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/82xx/pq2fads.c 2008-01-28 20:25:49.000000000 +0100
+@@ -15,12 +15,12 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/fsl_devices.h>
++#include <linux/of_platform.h>
+
+ #include <asm/io.h>
+ #include <asm/cpm2.h>
+ #include <asm/udbg.h>
+ #include <asm/machdep.h>
+-#include <asm/of_platform.h>
+ #include <asm/time.h>
+
+ #include <sysdev/fsl_soc.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/Kconfig powerpc.git/arch/powerpc/platforms/83xx/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/83xx/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -50,6 +50,11 @@
+ help
+ This option enables support for the MPC836x MDS Processor Board.
+
++config MPC837x_MDS
++ bool "Freescale MPC837x MDS"
++ select DEFAULT_UIMAGE
++ help
++ This option enables support for the MPC837x MDS Processor Board.
+ endchoice
+
+ config PPC_MPC831x
+@@ -75,3 +80,9 @@
+ select PPC_UDBG_16550
+ select PPC_INDIRECT_PCI
+ default y if MPC836x_MDS
++
++config PPC_MPC837x
++ bool
++ select PPC_UDBG_16550
++ select PPC_INDIRECT_PCI
++ default y if MPC837x_MDS
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/Makefile powerpc.git/arch/powerpc/platforms/83xx/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/83xx/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -9,3 +9,4 @@
+ obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o
+ obj-$(CONFIG_MPC836x_MDS) += mpc836x_mds.o
+ obj-$(CONFIG_MPC832x_MDS) += mpc832x_mds.o
++obj-$(CONFIG_MPC837x_MDS) += mpc837x_mds.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc8313_rdb.c powerpc.git/arch/powerpc/platforms/83xx/mpc8313_rdb.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc8313_rdb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc8313_rdb.c 2008-01-28 20:25:49.000000000 +0100
+@@ -14,6 +14,7 @@
+ */
+
+ #include <linux/pci.h>
++#include <linux/of_platform.h>
+
+ #include <asm/time.h>
+ #include <asm/ipic.h>
+@@ -70,11 +71,23 @@
+ */
+ static int __init mpc8313_rdb_probe(void)
+ {
+- unsigned long root = of_get_flat_dt_root();
++ unsigned long root = of_get_flat_dt_root();
+
+- return of_flat_dt_is_compatible(root, "MPC8313ERDB");
++ return of_flat_dt_is_compatible(root, "MPC8313ERDB");
+ }
+
++static struct of_device_id __initdata of_bus_ids[] = {
++ { .compatible = "simple-bus" },
++ {},
++};
++
++static int __init declare_of_platform_devices(void)
++{
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
++ return 0;
++}
++machine_device_initcall(mpc8313_rdb, declare_of_platform_devices);
++
+ define_machine(mpc8313_rdb) {
+ .name = "MPC8313 RDB",
+ .probe = mpc8313_rdb_probe,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc832x_mds.c powerpc.git/arch/powerpc/platforms/83xx/mpc832x_mds.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc832x_mds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc832x_mds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -23,9 +23,9 @@
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
+ #include <linux/initrd.h>
++#include <linux/of_platform.h>
++#include <linux/of_device.h>
+
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/system.h>
+ #include <asm/atomic.h>
+ #include <asm/time.h>
+@@ -110,15 +110,12 @@
+
+ static int __init mpc832x_declare_of_platform_devices(void)
+ {
+- if (!machine_is(mpc832x_mds))
+- return 0;
+-
+ /* Publish the QE devices */
+ of_platform_bus_probe(NULL, mpc832x_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(mpc832x_declare_of_platform_devices);
++machine_device_initcall(mpc832x_mds, mpc832x_declare_of_platform_devices);
+
+ static void __init mpc832x_sys_init_IRQ(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc832x_rdb.c powerpc.git/arch/powerpc/platforms/83xx/mpc832x_rdb.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc832x_rdb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc832x_rdb.c 2008-01-28 20:25:49.000000000 +0100
+@@ -19,8 +19,8 @@
+ #include <linux/spi/spi.h>
+ #include <linux/spi/mmc_spi.h>
+ #include <linux/mmc/host.h>
++#include <linux/of_platform.h>
+
+-#include <asm/of_platform.h>
+ #include <asm/time.h>
+ #include <asm/ipic.h>
+ #include <asm/udbg.h>
+@@ -63,9 +63,6 @@
+
+ static int __init mpc832x_spi_init(void)
+ {
+- if (!machine_is(mpc832x_rdb))
+- return 0;
+-
+ par_io_config_pin(3, 0, 3, 0, 1, 0); /* SPI1 MOSI, I/O */
+ par_io_config_pin(3, 1, 3, 0, 1, 0); /* SPI1 MISO, I/O */
+ par_io_config_pin(3, 2, 3, 0, 1, 0); /* SPI1 CLK, I/O */
+@@ -80,7 +77,7 @@
+ mpc83xx_spi_deactivate_cs);
+ }
+
+-device_initcall(mpc832x_spi_init);
++machine_device_initcall(mpc832x_rdb, mpc832x_spi_init);
+
+ /* ************************************************************************
+ *
+@@ -123,15 +120,12 @@
+
+ static int __init mpc832x_declare_of_platform_devices(void)
+ {
+- if (!machine_is(mpc832x_rdb))
+- return 0;
+-
+ /* Publish the QE devices */
+ of_platform_bus_probe(NULL, mpc832x_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(mpc832x_declare_of_platform_devices);
++machine_device_initcall(mpc832x_rdb, mpc832x_declare_of_platform_devices);
+
+ void __init mpc832x_rdb_init_IRQ(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc834x_itx.c powerpc.git/arch/powerpc/platforms/83xx/mpc834x_itx.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc834x_itx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc834x_itx.c 2008-01-28 20:25:49.000000000 +0100
+@@ -23,6 +23,7 @@
+ #include <linux/delay.h>
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
++#include <linux/of_platform.h>
+
+ #include <asm/system.h>
+ #include <asm/atomic.h>
+@@ -37,6 +38,17 @@
+
+ #include "mpc83xx.h"
+
++static struct of_device_id __initdata mpc834x_itx_ids[] = {
++ { .compatible = "fsl,pq2pro-localbus", },
++ {},
++};
++
++static int __init mpc834x_itx_declare_of_platform_devices(void)
++{
++ return of_platform_bus_probe(NULL, mpc834x_itx_ids, NULL);
++}
++machine_device_initcall(mpc834x_itx, mpc834x_itx_declare_of_platform_devices);
++
+ /* ************************************************************************
+ *
+ * Setup the architecture
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc834x_mds.c powerpc.git/arch/powerpc/platforms/83xx/mpc834x_mds.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc834x_mds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc834x_mds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -23,6 +23,7 @@
+ #include <linux/delay.h>
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
++#include <linux/of_platform.h>
+
+ #include <asm/system.h>
+ #include <asm/atomic.h>
+@@ -106,14 +107,27 @@
+ ipic_set_default_priority();
+ }
+
++static struct of_device_id mpc834x_ids[] = {
++ { .type = "soc", },
++ { .compatible = "soc", },
++ {},
++};
++
++static int __init mpc834x_declare_of_platform_devices(void)
++{
++ of_platform_bus_probe(NULL, mpc834x_ids, NULL);
++ return 0;
++}
++machine_device_initcall(mpc834x_mds, mpc834x_declare_of_platform_devices);
++
+ /*
+ * Called very early, MMU is off, device-tree isn't unflattened
+ */
+ static int __init mpc834x_mds_probe(void)
+ {
+- unsigned long root = of_get_flat_dt_root();
++ unsigned long root = of_get_flat_dt_root();
+
+- return of_flat_dt_is_compatible(root, "MPC834xMDS");
++ return of_flat_dt_is_compatible(root, "MPC834xMDS");
+ }
+
+ define_machine(mpc834x_mds) {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc836x_mds.c powerpc.git/arch/powerpc/platforms/83xx/mpc836x_mds.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc836x_mds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc836x_mds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -29,9 +29,9 @@
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
+ #include <linux/initrd.h>
++#include <linux/of_platform.h>
++#include <linux/of_device.h>
+
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/system.h>
+ #include <asm/atomic.h>
+ #include <asm/time.h>
+@@ -141,15 +141,12 @@
+
+ static int __init mpc836x_declare_of_platform_devices(void)
+ {
+- if (!machine_is(mpc836x_mds))
+- return 0;
+-
+ /* Publish the QE devices */
+ of_platform_bus_probe(NULL, mpc836x_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(mpc836x_declare_of_platform_devices);
++machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices);
+
+ static void __init mpc836x_mds_init_IRQ(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc837x_mds.c powerpc.git/arch/powerpc/platforms/83xx/mpc837x_mds.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc837x_mds.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc837x_mds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,147 @@
++/*
++ * arch/powerpc/platforms/83xx/mpc837x_mds.c
++ *
++ * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
++ *
++ * MPC837x MDS board specific routines
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/pci.h>
++#include <linux/of.h>
++#include <linux/of_platform.h>
++
++#include <asm/time.h>
++#include <asm/ipic.h>
++#include <asm/udbg.h>
++#include <asm/prom.h>
++
++#include "mpc83xx.h"
++
++#define BCSR12_USB_SER_MASK 0x8a
++#define BCSR12_USB_SER_PIN 0x80
++#define BCSR12_USB_SER_DEVICE 0x02
++extern int mpc837x_usb_cfg(void);
++
++static int mpc837xmds_usb_cfg(void)
++{
++ struct device_node *np;
++ const void *phy_type, *mode;
++ void __iomem *bcsr_regs = NULL;
++ u8 bcsr12;
++ int ret;
++
++ ret = mpc837x_usb_cfg();
++ if (ret)
++ return ret;
++ /* Map BCSR area */
++ np = of_find_node_by_name(NULL, "bcsr");
++ if (np) {
++ struct resource res;
++
++ of_address_to_resource(np, 0, &res);
++ bcsr_regs = ioremap(res.start, res.end - res.start + 1);
++ of_node_put(np);
++ }
++ if (!bcsr_regs)
++ return -1;
++
++ np = of_find_node_by_name(NULL, "usb");
++ if (!np)
++ return -ENODEV;
++ phy_type = of_get_property(np, "phy_type", NULL);
++ if (phy_type && !strcmp(phy_type, "ulpi")) {
++ clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN);
++ } else if (phy_type && !strcmp(phy_type, "serial")) {
++ mode = of_get_property(np, "dr_mode", NULL);
++ bcsr12 = in_8(bcsr_regs + 12) & ~BCSR12_USB_SER_MASK;
++ bcsr12 |= BCSR12_USB_SER_PIN;
++ if (mode && !strcmp(mode, "peripheral"))
++ bcsr12 |= BCSR12_USB_SER_DEVICE;
++ out_8(bcsr_regs + 12, bcsr12);
++ } else {
++ printk(KERN_ERR "USB DR: unsupported PHY\n");
++ }
++
++ of_node_put(np);
++ iounmap(bcsr_regs);
++ return 0;
++}
++
++/* ************************************************************************
++ *
++ * Setup the architecture
++ *
++ */
++static void __init mpc837x_mds_setup_arch(void)
++{
++#ifdef CONFIG_PCI
++ struct device_node *np;
++#endif
++
++ if (ppc_md.progress)
++ ppc_md.progress("mpc837x_mds_setup_arch()", 0);
++
++#ifdef CONFIG_PCI
++ for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
++ mpc83xx_add_bridge(np);
++#endif
++ mpc837xmds_usb_cfg();
++}
++
++static struct of_device_id mpc837x_ids[] = {
++ { .type = "soc", },
++ { .compatible = "soc", },
++ {},
++};
++
++static int __init mpc837x_declare_of_platform_devices(void)
++{
++ /* Publish of_device */
++ of_platform_bus_probe(NULL, mpc837x_ids, NULL);
++
++ return 0;
++}
++machine_device_initcall(mpc837x_mds, mpc837x_declare_of_platform_devices);
++
++static void __init mpc837x_mds_init_IRQ(void)
++{
++ struct device_node *np;
++
++ np = of_find_compatible_node(NULL, NULL, "fsl,ipic");
++ if (!np)
++ return;
++
++ ipic_init(np, 0);
++
++ /* Initialize the default interrupt mapping priorities,
++ * in case the boot rom changed something on us.
++ */
++ ipic_set_default_priority();
++}
++
++/*
++ * Called very early, MMU is off, device-tree isn't unflattened
++ */
++static int __init mpc837x_mds_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ return of_flat_dt_is_compatible(root, "fsl,mpc837xmds");
++}
++
++define_machine(mpc837x_mds) {
++ .name = "MPC837x MDS",
++ .probe = mpc837x_mds_probe,
++ .setup_arch = mpc837x_mds_setup_arch,
++ .init_IRQ = mpc837x_mds_init_IRQ,
++ .get_irq = ipic_get_irq,
++ .restart = mpc83xx_restart,
++ .time_init = mpc83xx_time_init,
++ .calibrate_decr = generic_calibrate_decr,
++ .progress = udbg_progress,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/mpc83xx.h powerpc.git/arch/powerpc/platforms/83xx/mpc83xx.h
+--- linux-2.6.24/arch/powerpc/platforms/83xx/mpc83xx.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/mpc83xx.h 2008-01-28 20:25:49.000000000 +0100
+@@ -14,6 +14,7 @@
+ #define MPC83XX_SCCR_USB_DRCM_11 0x00300000
+ #define MPC83XX_SCCR_USB_DRCM_01 0x00100000
+ #define MPC83XX_SCCR_USB_DRCM_10 0x00200000
++#define MPC837X_SCCR_USB_DRCM_11 0x00c00000
+
+ /* system i/o configuration register low */
+ #define MPC83XX_SICRL_OFFS 0x114
+@@ -22,6 +23,8 @@
+ #define MPC834X_SICRL_USB1 0x20000000
+ #define MPC831X_SICRL_USB_MASK 0x00000c00
+ #define MPC831X_SICRL_USB_ULPI 0x00000800
++#define MPC837X_SICRL_USB_MASK 0xf0000000
++#define MPC837X_SICRL_USB_ULPI 0x50000000
+
+ /* system i/o configuration register high */
+ #define MPC83XX_SICRH_OFFS 0x118
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/pci.c powerpc.git/arch/powerpc/platforms/83xx/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -54,7 +54,7 @@
+ " bus 0\n", dev->full_name);
+ }
+
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+ hose = pcibios_alloc_controller(dev);
+ if (!hose)
+ return -ENOMEM;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/83xx/usb.c powerpc.git/arch/powerpc/platforms/83xx/usb.c
+--- linux-2.6.24/arch/powerpc/platforms/83xx/usb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/83xx/usb.c 2008-01-28 20:25:49.000000000 +0100
+@@ -41,7 +41,7 @@
+ sicrl = in_be32(immap + MPC83XX_SICRL_OFFS) & ~MPC834X_SICRL_USB_MASK;
+ sicrh = in_be32(immap + MPC83XX_SICRH_OFFS) & ~MPC834X_SICRH_USB_UTMI;
+
+- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
++ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
+ if (np) {
+ sccr |= MPC83XX_SCCR_USB_DRCM_11; /* 1:3 */
+
+@@ -67,7 +67,7 @@
+ port0_is_dr = 1;
+ of_node_put(np);
+ }
+- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-mph");
++ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
+ if (np) {
+ sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
+
+@@ -111,7 +111,7 @@
+ const void *dr_mode;
+ #endif
+
+- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
++ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
+ if (!np)
+ return -ENODEV;
+ prop = of_get_property(np, "phy_type", NULL);
+@@ -179,3 +179,43 @@
+ return ret;
+ }
+ #endif /* CONFIG_PPC_MPC831x */
++
++#ifdef CONFIG_PPC_MPC837x
++int mpc837x_usb_cfg(void)
++{
++ void __iomem *immap;
++ struct device_node *np = NULL;
++ const void *prop;
++ int ret = 0;
++
++ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
++ if (!np)
++ return -ENODEV;
++ prop = of_get_property(np, "phy_type", NULL);
++
++ if (!prop || (strcmp(prop, "ulpi") && strcmp(prop, "serial"))) {
++ printk(KERN_WARNING "837x USB PHY type not supported\n");
++ of_node_put(np);
++ return -EINVAL;
++ }
++
++ /* Map IMMR space for pin and clock settings */
++ immap = ioremap(get_immrbase(), 0x1000);
++ if (!immap) {
++ of_node_put(np);
++ return -ENOMEM;
++ }
++
++ /* Configure clock */
++ clrsetbits_be32(immap + MPC83XX_SCCR_OFFS, MPC837X_SCCR_USB_DRCM_11,
++ MPC837X_SCCR_USB_DRCM_11);
++
++ /* Configure pin mux for ULPI/serial */
++ clrsetbits_be32(immap + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USB_MASK,
++ MPC837X_SICRL_USB_ULPI);
++
++ iounmap(immap);
++ of_node_put(np);
++ return ret;
++}
++#endif /* CONFIG_PPC_MPC837x */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_ads.c powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_ads.c
+--- linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_ads.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_ads.c 2008-01-28 20:25:49.000000000 +0100
+@@ -52,9 +52,9 @@
+ {
+ int cascade_irq;
+
+- while ((cascade_irq = cpm2_get_irq()) >= 0) {
++ while ((cascade_irq = cpm2_get_irq()) >= 0)
+ generic_handle_irq(cascade_irq);
+- }
++
+ desc->chip->eoi(irq);
+ }
+
+@@ -70,13 +70,12 @@
+ #endif
+
+ np = of_find_node_by_type(np, "open-pic");
+-
+- if (np == NULL) {
++ if (!np) {
+ printk(KERN_ERR "Could not find open-pic node\n");
+ return;
+ }
+
+- if(of_address_to_resource(np, 0, &r)) {
++ if (of_address_to_resource(np, 0, &r)) {
+ printk(KERN_ERR "Could not map mpic register space\n");
+ of_node_put(np);
+ return;
+@@ -100,6 +99,7 @@
+ irq = irq_of_parse_and_map(np, 0);
+
+ cpm2_pic_init(np);
++ of_node_put(np);
+ set_irq_chained_handler(irq, cpm2_cascade);
+ #endif
+ }
+@@ -112,7 +112,7 @@
+ int port, pin, flags;
+ };
+
+-static struct cpm_pin mpc8560_ads_pins[] = {
++static const struct cpm_pin mpc8560_ads_pins[] = {
+ /* SCC1 */
+ {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+ {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+@@ -233,13 +233,11 @@
+
+ static int __init declare_of_platform_devices(void)
+ {
+- if (!machine_is(mpc85xx_ads))
+- return 0;
+-
+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
++
+ return 0;
+ }
+-device_initcall(declare_of_platform_devices);
++machine_device_initcall(mpc85xx_ads, declare_of_platform_devices);
+
+ /*
+ * Called very early, device-tree isn't unflattened
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_cds.c powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_cds.c
+--- linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_cds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_cds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -222,9 +222,6 @@
+ struct device_node *cascade_node = NULL;
+ int cascade_irq;
+
+- if (!machine_is(mpc85xx_cds))
+- return 0;
+-
+ /* Initialize the i8259 controller */
+ for_each_node_by_type(np, "interrupt-controller")
+ if (of_device_is_compatible(np, "chrp,iic")) {
+@@ -262,8 +259,7 @@
+
+ return 0;
+ }
+-
+-device_initcall(mpc85xx_cds_8259_attach);
++machine_device_initcall(mpc85xx_cds, mpc85xx_cds_8259_attach);
+
+ #endif /* CONFIG_PPC_I8259 */
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_ds.c powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_ds.c
+--- linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_ds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_ds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -123,7 +123,7 @@
+ struct device_node* node;
+ struct resource rsrc;
+
+- node = (struct device_node *)hose->arch_data;
++ node = hose->dn;
+ of_address_to_resource(node, 0, &rsrc);
+
+ if ((rsrc.start & 0xfffff) == primary_phb_addr) {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_mds.c powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+--- linux-2.6.24/arch/powerpc/platforms/85xx/mpc85xx_mds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/85xx/mpc85xx_mds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -30,9 +30,9 @@
+ #include <linux/initrd.h>
+ #include <linux/module.h>
+ #include <linux/fsl_devices.h>
++#include <linux/of_platform.h>
++#include <linux/of_device.h>
+
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/system.h>
+ #include <asm/atomic.h>
+ #include <asm/time.h>
+@@ -144,15 +144,12 @@
+
+ static int __init mpc85xx_publish_devices(void)
+ {
+- if (!machine_is(mpc85xx_mds))
+- return 0;
+-
+ /* Publish the QE devices */
+- of_platform_bus_probe(NULL,mpc85xx_ids,NULL);
++ of_platform_bus_probe(NULL, mpc85xx_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(mpc85xx_publish_devices);
++machine_device_initcall(mpc85xx_mds, mpc85xx_publish_devices);
+
+ static void __init mpc85xx_mds_pic_init(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/86xx/mpc8610_hpcd.c powerpc.git/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
+--- linux-2.6.24/arch/powerpc/platforms/86xx/mpc8610_hpcd.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/86xx/mpc8610_hpcd.c 2008-01-28 20:25:49.000000000 +0100
+@@ -34,9 +34,24 @@
+
+ #include <asm/mpic.h>
+
++#include <linux/of_platform.h>
+ #include <sysdev/fsl_pci.h>
+ #include <sysdev/fsl_soc.h>
+
++static struct of_device_id __initdata mpc8610_ids[] = {
++ { .compatible = "fsl,mpc8610-immr", },
++ {}
++};
++
++static int __init mpc8610_declare_of_platform_devices(void)
++{
++ /* Without this call, the SSI device driver won't get probed. */
++ of_platform_bus_probe(NULL, mpc8610_ids, NULL);
++
++ return 0;
++}
++machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices);
++
+ void __init
+ mpc86xx_hpcd_init_irq(void)
+ {
+@@ -124,7 +139,7 @@
+ static void __devinit final_uli5288(struct pci_dev *dev)
+ {
+ struct pci_controller *hose = pci_bus_to_host(dev->bus);
+- struct device_node *hosenode = hose ? hose->arch_data : NULL;
++ struct device_node *hosenode = hose ? hose->dn : NULL;
+ struct of_irq oirq;
+ int virq, pin = 2;
+ u32 laddr[3];
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c powerpc.git/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
+--- linux-2.6.24/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c 2008-01-28 20:25:49.000000000 +0100
+@@ -18,6 +18,7 @@
+ #include <linux/kdev_t.h>
+ #include <linux/delay.h>
+ #include <linux/seq_file.h>
++#include <linux/of_platform.h>
+
+ #include <asm/system.h>
+ #include <asm/time.h>
+@@ -116,7 +117,7 @@
+ struct device_node* node;
+ struct resource rsrc;
+
+- node = (struct device_node *)hose->arch_data;
++ node = hose->dn;
+ of_address_to_resource(node, 0, &rsrc);
+
+ if ((rsrc.start & 0xfffff) == 0x8000) {
+@@ -212,6 +213,19 @@
+ return 0;
+ }
+
++static __initdata struct of_device_id of_bus_ids[] = {
++ { .compatible = "simple-bus", },
++ {},
++};
++
++static int __init declare_of_platform_devices(void)
++{
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
++
++ return 0;
++}
++machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices);
++
+ define_machine(mpc86xx_hpcn) {
+ .name = "MPC86xx HPCN",
+ .probe = mpc86xx_hpcn_probe,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/Kconfig powerpc.git/arch/powerpc/platforms/8xx/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/8xx/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -18,6 +18,7 @@
+ config MPC86XADS
+ bool "MPC86XADS"
+ select CPM1
++ select PPC_CPM_NEW_BINDING
+ help
+ MPC86x Application Development System by Freescale Semiconductor.
+ The MPC86xADS is meant to serve as a platform for s/w and h/w
+@@ -43,6 +44,15 @@
+ This board is also resold by Freescale as the QUICCStart
+ MPC885 Evaluation System and/or the CWH-PPC-885XN-VE.
+
++config PPC_ADDER875
++ bool "Analogue & Micro Adder 875"
++ select CPM1
++ select PPC_CPM_NEW_BINDING
++ select REDBOOT
++ help
++ This enables support for the Analogue & Micro Adder 875
++ board.
++
+ endchoice
+
+ menu "Freescale Ethernet driver platform-specific options"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/Makefile powerpc.git/arch/powerpc/platforms/8xx/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/8xx/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -5,3 +5,4 @@
+ obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o
+ obj-$(CONFIG_MPC86XADS) += mpc86xads_setup.o
+ obj-$(CONFIG_PPC_EP88XC) += ep88xc.o
++obj-$(CONFIG_PPC_ADDER875) += adder875.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/adder875.c powerpc.git/arch/powerpc/platforms/8xx/adder875.c
+--- linux-2.6.24/arch/powerpc/platforms/8xx/adder875.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/adder875.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,118 @@
++/* Analogue & Micro Adder MPC875 board support
++ *
++ * Author: Scott Wood <scottwood@freescale.com>
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License, version 2, as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/init.h>
++#include <linux/fs_enet_pd.h>
++#include <linux/of_platform.h>
++
++#include <asm/time.h>
++#include <asm/machdep.h>
++#include <asm/commproc.h>
++#include <asm/fs_pd.h>
++#include <asm/udbg.h>
++#include <asm/prom.h>
++
++#include <sysdev/commproc.h>
++
++struct cpm_pin {
++ int port, pin, flags;
++};
++
++static __initdata struct cpm_pin adder875_pins[] = {
++ /* SMC1 */
++ {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
++ {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
++
++ /* MII1 */
++ {CPM_PORTA, 0, CPM_PIN_INPUT},
++ {CPM_PORTA, 1, CPM_PIN_INPUT},
++ {CPM_PORTA, 2, CPM_PIN_INPUT},
++ {CPM_PORTA, 3, CPM_PIN_INPUT},
++ {CPM_PORTA, 4, CPM_PIN_OUTPUT},
++ {CPM_PORTA, 10, CPM_PIN_OUTPUT},
++ {CPM_PORTA, 11, CPM_PIN_OUTPUT},
++ {CPM_PORTB, 19, CPM_PIN_INPUT},
++ {CPM_PORTB, 31, CPM_PIN_INPUT},
++ {CPM_PORTC, 12, CPM_PIN_INPUT},
++ {CPM_PORTC, 13, CPM_PIN_INPUT},
++ {CPM_PORTE, 30, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 31, CPM_PIN_OUTPUT},
++
++ /* MII2 */
++ {CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 16, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
++ {CPM_PORTE, 21, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 22, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 23, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 24, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 25, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 26, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 27, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 28, CPM_PIN_OUTPUT},
++ {CPM_PORTE, 29, CPM_PIN_OUTPUT},
++};
++
++static void __init init_ioports(void)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(adder875_pins); i++) {
++ const struct cpm_pin *pin = &adder875_pins[i];
++ cpm1_set_pin(pin->port, pin->pin, pin->flags);
++ }
++
++ cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
++
++ /* Set FEC1 and FEC2 to MII mode */
++ clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
++}
++
++static void __init adder875_setup(void)
++{
++ cpm_reset();
++ init_ioports();
++}
++
++static int __init adder875_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++ return of_flat_dt_is_compatible(root, "analogue-and-micro,adder875");
++}
++
++static __initdata struct of_device_id of_bus_ids[] = {
++ { .compatible = "simple-bus", },
++ {},
++};
++
++static int __init declare_of_platform_devices(void)
++{
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
++ return 0;
++}
++machine_device_initcall(adder875, declare_of_platform_devices);
++
++define_machine(adder875) {
++ .name = "Adder MPC875",
++ .probe = adder875_probe,
++ .setup_arch = adder875_setup,
++ .init_IRQ = m8xx_pic_init,
++ .get_irq = mpc8xx_get_irq,
++ .restart = mpc8xx_restart,
++ .calibrate_decr = generic_calibrate_decr,
++ .set_rtc_time = mpc8xx_set_rtc_time,
++ .get_rtc_time = mpc8xx_get_rtc_time,
++ .progress = udbg_progress,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/ep88xc.c powerpc.git/arch/powerpc/platforms/8xx/ep88xc.c
+--- linux-2.6.24/arch/powerpc/platforms/8xx/ep88xc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/ep88xc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -155,12 +155,11 @@
+ static int __init declare_of_platform_devices(void)
+ {
+ /* Publish the QE devices */
+- if (machine_is(ep88xc))
+- of_platform_bus_probe(NULL, of_bus_ids, NULL);
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(declare_of_platform_devices);
++machine_device_initcall(ep88xc, declare_of_platform_devices);
+
+ define_machine(ep88xc) {
+ .name = "Embedded Planet EP88xC",
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/m8xx_setup.c powerpc.git/arch/powerpc/platforms/8xx/m8xx_setup.c
+--- linux-2.6.24/arch/powerpc/platforms/8xx/m8xx_setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/m8xx_setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -120,7 +120,7 @@
+ ppc_tb_freq /= 16;
+ ppc_proc_freq = 50000000;
+ if (!get_freq("clock-frequency", &ppc_proc_freq))
+- printk(KERN_ERR "WARNING: Estimating processor frequency"
++ printk(KERN_ERR "WARNING: Estimating processor frequency "
+ "(not found)\n");
+
+ printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/mpc86xads.h powerpc.git/arch/powerpc/platforms/8xx/mpc86xads.h
+--- linux-2.6.24/arch/powerpc/platforms/8xx/mpc86xads.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/mpc86xads.h 2008-01-28 20:25:49.000000000 +0100
+@@ -15,27 +15,6 @@
+ #ifndef __ASM_MPC86XADS_H__
+ #define __ASM_MPC86XADS_H__
+
+-#include <sysdev/fsl_soc.h>
+-
+-/* U-Boot maps BCSR to 0xff080000 */
+-#define BCSR_ADDR ((uint)0xff080000)
+-#define BCSR_SIZE ((uint)32)
+-#define BCSR0 ((uint)(BCSR_ADDR + 0x00))
+-#define BCSR1 ((uint)(BCSR_ADDR + 0x04))
+-#define BCSR2 ((uint)(BCSR_ADDR + 0x08))
+-#define BCSR3 ((uint)(BCSR_ADDR + 0x0c))
+-#define BCSR4 ((uint)(BCSR_ADDR + 0x10))
+-
+-#define CFG_PHYDEV_ADDR ((uint)0xff0a0000)
+-#define BCSR5 ((uint)(CFG_PHYDEV_ADDR + 0x300))
+-
+-#define MPC8xx_CPM_OFFSET (0x9c0)
+-#define CPM_MAP_ADDR (get_immrbase() + MPC8xx_CPM_OFFSET)
+-#define CPM_IRQ_OFFSET 16 // for compability with cpm_uart driver
+-
+-#define PCMCIA_MEM_ADDR ((uint)0xff020000)
+-#define PCMCIA_MEM_SIZE ((uint)(64 * 1024))
+-
+ /* Bits of interest in the BCSRs.
+ */
+ #define BCSR1_ETHEN ((uint)0x20000000)
+@@ -64,28 +43,5 @@
+ #define BCSR5_MII1_EN 0x02
+ #define BCSR5_MII1_RST 0x01
+
+-/* Interrupt level assignments */
+-#define PHY_INTERRUPT SIU_IRQ7 /* PHY link change interrupt */
+-#define SIU_INT_FEC1 SIU_LEVEL1 /* FEC1 interrupt */
+-#define FEC_INTERRUPT SIU_INT_FEC1 /* FEC interrupt */
+-
+-/* We don't use the 8259 */
+-#define NR_8259_INTS 0
+-
+-/* CPM Ethernet through SCC1 */
+-#define PA_ENET_RXD ((ushort)0x0001)
+-#define PA_ENET_TXD ((ushort)0x0002)
+-#define PA_ENET_TCLK ((ushort)0x0100)
+-#define PA_ENET_RCLK ((ushort)0x0200)
+-#define PB_ENET_TENA ((uint)0x00001000)
+-#define PC_ENET_CLSN ((ushort)0x0010)
+-#define PC_ENET_RENA ((ushort)0x0020)
+-
+-/* Control bits in the SICR to route TCLK (CLK1) and RCLK (CLK2) to
+- * SCC1. Also, make sure GR1 (bit 24) and SC1 (bit 25) are zero.
+- */
+-#define SICR_ENET_MASK ((uint)0x000000ff)
+-#define SICR_ENET_CLKRT ((uint)0x0000002c)
+-
+ #endif /* __ASM_MPC86XADS_H__ */
+ #endif /* __KERNEL__ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/mpc86xads_setup.c powerpc.git/arch/powerpc/platforms/8xx/mpc86xads_setup.c
+--- linux-2.6.24/arch/powerpc/platforms/8xx/mpc86xads_setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/mpc86xads_setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -6,264 +6,133 @@
+ *
+ * Copyright 2005 MontaVista Software Inc.
+ *
++ * Heavily modified by Scott Wood <scottwood@freescale.com>
++ * Copyright 2007 Freescale Semiconductor, Inc.
++ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+ #include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/param.h>
+-#include <linux/string.h>
+-#include <linux/ioport.h>
+-#include <linux/device.h>
+-#include <linux/delay.h>
+-#include <linux/root_dev.h>
+-
+-#include <linux/fs_enet_pd.h>
+-#include <linux/fs_uart_pd.h>
+-#include <linux/mii.h>
++#include <linux/of_platform.h>
+
+-#include <asm/delay.h>
+ #include <asm/io.h>
+ #include <asm/machdep.h>
+-#include <asm/page.h>
+-#include <asm/processor.h>
+ #include <asm/system.h>
+ #include <asm/time.h>
+ #include <asm/mpc8xx.h>
+ #include <asm/8xx_immap.h>
+ #include <asm/commproc.h>
+ #include <asm/fs_pd.h>
+-#include <asm/prom.h>
++#include <asm/udbg.h>
+
+ #include <sysdev/commproc.h>
+
+-static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi);
+-static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi);
+-static void init_scc1_ioports(struct fs_platform_info* ptr);
+-
+-void __init mpc86xads_board_setup(void)
+-{
+- cpm8xx_t *cp;
+- unsigned int *bcsr_io;
+- u8 tmpval8;
+-
+- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+- cp = (cpm8xx_t *)immr_map(im_cpm);
++#include "mpc86xads.h"
+
+- if (bcsr_io == NULL) {
+- printk(KERN_CRIT "Could not remap BCSR\n");
+- return;
+- }
+-#ifdef CONFIG_SERIAL_CPM_SMC1
+- clrbits32(bcsr_io, BCSR1_RS232EN_1);
+- clrbits32(&cp->cp_simode, 0xe0000000 >> 17); /* brg1 */
+- tmpval8 = in_8(&(cp->cp_smc[0].smc_smcm)) | (SMCM_RX | SMCM_TX);
+- out_8(&(cp->cp_smc[0].smc_smcm), tmpval8);
+- clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
+-#else
+- setbits32(bcsr_io,BCSR1_RS232EN_1);
+- out_be16(&cp->cp_smc[0].smc_smcmr, 0);
+- out_8(&cp->cp_smc[0].smc_smce, 0);
+-#endif
+-
+-#ifdef CONFIG_SERIAL_CPM_SMC2
+- clrbits32(bcsr_io,BCSR1_RS232EN_2);
+- clrbits32(&cp->cp_simode, 0xe0000000 >> 1);
+- setbits32(&cp->cp_simode, 0x20000000 >> 1); /* brg2 */
+- tmpval8 = in_8(&(cp->cp_smc[1].smc_smcm)) | (SMCM_RX | SMCM_TX);
+- out_8(&(cp->cp_smc[1].smc_smcm), tmpval8);
+- clrbits16(&cp->cp_smc[1].smc_smcmr, SMCMR_REN | SMCMR_TEN);
+-
+- init_smc2_uart_ioports(0);
+-#else
+- setbits32(bcsr_io,BCSR1_RS232EN_2);
+- out_be16(&cp->cp_smc[1].smc_smcmr, 0);
+- out_8(&cp->cp_smc[1].smc_smce, 0);
+-#endif
+- immr_unmap(cp);
+- iounmap(bcsr_io);
+-}
++struct cpm_pin {
++ int port, pin, flags;
++};
+
++static struct cpm_pin mpc866ads_pins[] = {
++ /* SMC1 */
++ {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
++ {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
++
++ /* SMC2 */
++ {CPM_PORTB, 21, CPM_PIN_INPUT}, /* RX */
++ {CPM_PORTB, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
++
++ /* SCC1 */
++ {CPM_PORTA, 6, CPM_PIN_INPUT}, /* CLK1 */
++ {CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */
++ {CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */
++ {CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */
++ {CPM_PORTB, 19, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
++ {CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
++ {CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
++
++ /* MII */
++ {CPM_PORTD, 3, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 4, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 5, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 6, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 7, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 8, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 9, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 10, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 11, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 12, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 13, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 14, CPM_PIN_OUTPUT},
++ {CPM_PORTD, 15, CPM_PIN_OUTPUT},
++};
+
+-static void init_fec1_ioports(struct fs_platform_info* ptr)
++static void __init init_ioports(void)
+ {
+- iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
++ int i;
+
+- /* configure FEC1 pins */
++ for (i = 0; i < ARRAY_SIZE(mpc866ads_pins); i++) {
++ struct cpm_pin *pin = &mpc866ads_pins[i];
++ cpm1_set_pin(pin->port, pin->pin, pin->flags);
++ }
+
+- setbits16(&io_port->iop_pdpar, 0x1fff);
+- setbits16(&io_port->iop_pddir, 0x1fff);
++ cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
++ cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
++ cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK1, CPM_CLK_TX);
++ cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
+
+- immr_unmap(io_port);
++ /* Set FEC1 and FEC2 to MII mode */
++ clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
+ }
+
+-void init_fec_ioports(struct fs_platform_info *fpi)
++static void __init mpc86xads_setup_arch(void)
+ {
+- int fec_no = fs_get_fec_index(fpi->fs_no);
++ struct device_node *np;
++ u32 __iomem *bcsr_io;
++
++ cpm_reset();
++ init_ioports();
+
+- switch (fec_no) {
+- case 0:
+- init_fec1_ioports(fpi);
+- break;
+- default:
+- printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
++ np = of_find_compatible_node(NULL, NULL, "fsl,mpc866ads-bcsr");
++ if (!np) {
++ printk(KERN_CRIT "Could not find fsl,mpc866ads-bcsr node\n");
+ return;
+ }
+-}
+
+-static void init_scc1_ioports(struct fs_platform_info* fpi)
+-{
+- unsigned *bcsr_io;
+- iop8xx_t *io_port;
+- cpm8xx_t *cp;
+-
+- bcsr_io = ioremap(BCSR_ADDR, BCSR_SIZE);
+- io_port = (iop8xx_t *)immr_map(im_ioport);
+- cp = (cpm8xx_t *)immr_map(im_cpm);
++ bcsr_io = of_iomap(np, 0);
++ of_node_put(np);
+
+ if (bcsr_io == NULL) {
+ printk(KERN_CRIT "Could not remap BCSR\n");
+ return;
+ }
+
+- /* Configure port A pins for Txd and Rxd.
+- */
+- setbits16(&io_port->iop_papar, PA_ENET_RXD | PA_ENET_TXD);
+- clrbits16(&io_port->iop_padir, PA_ENET_RXD | PA_ENET_TXD);
+- clrbits16(&io_port->iop_paodr, PA_ENET_TXD);
+-
+- /* Configure port C pins to enable CLSN and RENA.
+- */
+- clrbits16(&io_port->iop_pcpar, PC_ENET_CLSN | PC_ENET_RENA);
+- clrbits16(&io_port->iop_pcdir, PC_ENET_CLSN | PC_ENET_RENA);
+- setbits16(&io_port->iop_pcso, PC_ENET_CLSN | PC_ENET_RENA);
+-
+- /* Configure port A for TCLK and RCLK.
+- */
+- setbits16(&io_port->iop_papar, PA_ENET_TCLK | PA_ENET_RCLK);
+- clrbits16(&io_port->iop_padir, PA_ENET_TCLK | PA_ENET_RCLK);
+- clrbits32(&cp->cp_pbpar, PB_ENET_TENA);
+- clrbits32(&cp->cp_pbdir, PB_ENET_TENA);
+-
+- /* Configure Serial Interface clock routing.
+- * First, clear all SCC bits to zero, then set the ones we want.
+- */
+- clrbits32(&cp->cp_sicr, SICR_ENET_MASK);
+- setbits32(&cp->cp_sicr, SICR_ENET_CLKRT);
+-
+- /* In the original SCC enet driver the following code is placed at
+- the end of the initialization */
+- setbits32(&cp->cp_pbpar, PB_ENET_TENA);
+- setbits32(&cp->cp_pbdir, PB_ENET_TENA);
+-
+- clrbits32(bcsr_io+1, BCSR1_ETHEN);
++ clrbits32(bcsr_io, BCSR1_RS232EN_1 | BCSR1_RS232EN_2 | BCSR1_ETHEN);
+ iounmap(bcsr_io);
+- immr_unmap(cp);
+- immr_unmap(io_port);
+-}
+-
+-void init_scc_ioports(struct fs_platform_info *fpi)
+-{
+- int scc_no = fs_get_scc_index(fpi->fs_no);
+-
+- switch (scc_no) {
+- case 0:
+- init_scc1_ioports(fpi);
+- break;
+- default:
+- printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
+- return;
+- }
+ }
+
+-
+-
+-static void init_smc1_uart_ioports(struct fs_uart_platform_info* ptr)
++static int __init mpc86xads_probe(void)
+ {
+- unsigned *bcsr_io;
+- cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
+-
+- setbits32(&cp->cp_pbpar, 0x000000c0);
+- clrbits32(&cp->cp_pbdir, 0x000000c0);
+- clrbits16(&cp->cp_pbodr, 0x00c0);
+- immr_unmap(cp);
+-
+- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+-
+- if (bcsr_io == NULL) {
+- printk(KERN_CRIT "Could not remap BCSR1\n");
+- return;
+- }
+- clrbits32(bcsr_io,BCSR1_RS232EN_1);
+- iounmap(bcsr_io);
++ unsigned long root = of_get_flat_dt_root();
++ return of_flat_dt_is_compatible(root, "fsl,mpc866ads");
+ }
+
+-static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi)
+-{
+- unsigned *bcsr_io;
+- cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
+-
+- setbits32(&cp->cp_pbpar, 0x00000c00);
+- clrbits32(&cp->cp_pbdir, 0x00000c00);
+- clrbits16(&cp->cp_pbodr, 0x0c00);
+- immr_unmap(cp);
+-
+- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+-
+- if (bcsr_io == NULL) {
+- printk(KERN_CRIT "Could not remap BCSR1\n");
+- return;
+- }
+- clrbits32(bcsr_io,BCSR1_RS232EN_2);
+- iounmap(bcsr_io);
+-}
++static struct of_device_id __initdata of_bus_ids[] = {
++ { .name = "soc", },
++ { .name = "cpm", },
++ { .name = "localbus", },
++ {},
++};
+
+-void init_smc_ioports(struct fs_uart_platform_info *data)
++static int __init declare_of_platform_devices(void)
+ {
+- int smc_no = fs_uart_id_fsid2smc(data->fs_no);
+-
+- switch (smc_no) {
+- case 0:
+- init_smc1_uart_ioports(data);
+- data->brg = data->clk_rx;
+- break;
+- case 1:
+- init_smc2_uart_ioports(data);
+- data->brg = data->clk_rx;
+- break;
+- default:
+- printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
+- return;
+- }
+-}
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
+
+-int platform_device_skip(const char *model, int id)
+-{
+ return 0;
+ }
+-
+-static void __init mpc86xads_setup_arch(void)
+-{
+- cpm_reset();
+-
+- mpc86xads_board_setup();
+-
+- ROOT_DEV = Root_NFS;
+-}
+-
+-static int __init mpc86xads_probe(void)
+-{
+- char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
+- "model", NULL);
+- if (model == NULL)
+- return 0;
+- if (strcmp(model, "MPC866ADS"))
+- return 0;
+-
+- return 1;
+-}
++machine_device_initcall(mpc86x_ads, declare_of_platform_devices);
+
+ define_machine(mpc86x_ads) {
+ .name = "MPC86x ADS",
+@@ -275,4 +144,5 @@
+ .calibrate_decr = mpc8xx_calibrate_decr,
+ .set_rtc_time = mpc8xx_set_rtc_time,
+ .get_rtc_time = mpc8xx_get_rtc_time,
++ .progress = udbg_progress,
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/8xx/mpc885ads_setup.c powerpc.git/arch/powerpc/platforms/8xx/mpc885ads_setup.c
+--- linux-2.6.24/arch/powerpc/platforms/8xx/mpc885ads_setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/8xx/mpc885ads_setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -264,12 +264,11 @@
+ static int __init declare_of_platform_devices(void)
+ {
+ /* Publish the QE devices */
+- if (machine_is(mpc885_ads))
+- of_platform_bus_probe(NULL, of_bus_ids, NULL);
++ of_platform_bus_probe(NULL, of_bus_ids, NULL);
+
+ return 0;
+ }
+-device_initcall(declare_of_platform_devices);
++machine_device_initcall(mpc885_ads, declare_of_platform_devices);
+
+ define_machine(mpc885_ads) {
+ .name = "Freescale MPC885 ADS",
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/Kconfig powerpc.git/arch/powerpc/platforms/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -22,6 +22,7 @@
+ depends on 6xx
+ select FSL_SOC
+ select 83xx
++ select IPIC
+ select WANT_DEVICE_TREE
+
+ config PPC_86xx
+@@ -80,6 +81,10 @@
+ bool
+ default y
+
++config IPIC
++ bool
++ default n
++
+ config MPIC
+ bool
+ default n
+@@ -265,6 +270,7 @@
+ config QUICC_ENGINE
+ bool
+ select PPC_LIB_RHEAP
++ select CRC32
+ help
+ The QUICC Engine (QE) is a new generation of communications
+ coprocessors on Freescale embedded CPUs (akin to CPM in older chips).
+@@ -315,6 +321,12 @@
+ config CPM
+ bool
+
++config OF_RTC
++ bool
++ help
++ Uses information from the OF or flattened device tree to instatiate
++ platform devices for direct mapped RTC chips like the DS1742 or DS1743.
++
+ source "arch/powerpc/sysdev/bestcomm/Kconfig"
+
+ endmenu
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/Kconfig.cputype powerpc.git/arch/powerpc/platforms/Kconfig.cputype
+--- linux-2.6.24/arch/powerpc/platforms/Kconfig.cputype 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/Kconfig.cputype 2008-01-28 20:25:49.000000000 +0100
+@@ -43,6 +43,7 @@
+ bool "AMCC 40x"
+ select PPC_DCR_NATIVE
+ select WANT_DEVICE_TREE
++ select PPC_UDBG_16550
+
+ config 44x
+ bool "AMCC 44x"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/Makefile powerpc.git/arch/powerpc/platforms/cell/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/cell/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -20,7 +20,7 @@
+
+ obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
+ spu_notify.o \
+- spu_syscalls.o \
++ spu_syscalls.o spu_fault.o \
+ $(spu-priv1-y) \
+ $(spu-manage-y) \
+ spufs/
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/cbe_cpufreq.c powerpc.git/arch/powerpc/platforms/cell/cbe_cpufreq.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/cbe_cpufreq.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/cbe_cpufreq.c 2008-01-28 20:25:49.000000000 +0100
+@@ -21,8 +21,9 @@
+ */
+
+ #include <linux/cpufreq.h>
++#include <linux/of_platform.h>
++
+ #include <asm/machdep.h>
+-#include <asm/of_platform.h>
+ #include <asm/prom.h>
+ #include <asm/cell-regs.h>
+ #include "cbe_cpufreq.h"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c powerpc.git/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c 2008-01-28 20:25:49.000000000 +0100
+@@ -23,7 +23,8 @@
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/timer.h>
+-#include <asm/of_platform.h>
++#include <linux/of_platform.h>
++
+ #include <asm/processor.h>
+ #include <asm/prom.h>
+ #include <asm/pmi.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/cbe_regs.c powerpc.git/arch/powerpc/platforms/cell/cbe_regs.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/cbe_regs.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/cbe_regs.c 2008-01-28 20:25:49.000000000 +0100
+@@ -9,13 +9,13 @@
+ #include <linux/percpu.h>
+ #include <linux/types.h>
+ #include <linux/module.h>
++#include <linux/of_device.h>
++#include <linux/of_platform.h>
+
+ #include <asm/io.h>
+ #include <asm/pgtable.h>
+ #include <asm/prom.h>
+ #include <asm/ptrace.h>
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/cell-regs.h>
+
+ /*
+@@ -256,6 +256,7 @@
+ printk(KERN_ERR "cbe_regs: More BE chips than supported"
+ "!\n");
+ cbe_regs_map_count--;
++ of_node_put(cpu);
+ return;
+ }
+ map->cpu_node = cpu;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/io-workarounds.c powerpc.git/arch/powerpc/platforms/cell/io-workarounds.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/io-workarounds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/io-workarounds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -238,7 +238,7 @@
+ static void __init spider_pci_add_one(struct pci_controller *phb)
+ {
+ struct spider_pci_bus *bus = &spider_pci_busses[spider_pci_count];
+- struct device_node *np = phb->arch_data;
++ struct device_node *np = phb->dn;
+ struct resource rsrc;
+ void __iomem *regs;
+
+@@ -309,15 +309,12 @@
+ {
+ struct pci_controller *phb;
+
+- if (!machine_is(cell))
+- return 0;
+-
+ /* Find spider bridges. We assume they have been all probed
+ * in setup_arch(). If that was to change, we would need to
+ * update this code to cope with dynamically added busses
+ */
+ list_for_each_entry(phb, &hose_list, list_node) {
+- struct device_node *np = phb->arch_data;
++ struct device_node *np = phb->dn;
+ const char *model = of_get_property(np, "model", NULL);
+
+ /* If no model property or name isn't exactly "pci", skip */
+@@ -343,4 +340,4 @@
+
+ return 0;
+ }
+-arch_initcall(spider_pci_workaround_init);
++machine_arch_initcall(cell, spider_pci_workaround_init);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/iommu.c powerpc.git/arch/powerpc/platforms/cell/iommu.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/iommu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/iommu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -26,14 +26,15 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/notifier.h>
++#include <linux/of_platform.h>
+
+ #include <asm/prom.h>
+ #include <asm/iommu.h>
+ #include <asm/machdep.h>
+ #include <asm/pci-bridge.h>
+ #include <asm/udbg.h>
+-#include <asm/of_platform.h>
+ #include <asm/lmb.h>
++#include <asm/firmware.h>
+ #include <asm/cell-regs.h>
+
+ #include "interrupt.h"
+@@ -309,8 +310,8 @@
+ {
+ struct page *page;
+ int ret, i;
+- unsigned long reg, segments, pages_per_segment, ptab_size, n_pte_pages;
+- unsigned long xlate_base;
++ unsigned long reg, segments, pages_per_segment, ptab_size, stab_size,
++ n_pte_pages, xlate_base;
+ unsigned int virq;
+
+ if (cell_iommu_find_ioc(iommu->nid, &xlate_base))
+@@ -327,7 +328,8 @@
+ __FUNCTION__, iommu->nid, segments, pages_per_segment);
+
+ /* set up the segment table */
+- page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0);
++ stab_size = segments * sizeof(unsigned long);
++ page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size));
+ BUG_ON(!page);
+ iommu->stab = page_address(page);
+ clear_page(iommu->stab);
+@@ -489,15 +491,18 @@
+ return NULL;
+ }
+
++static unsigned long cell_dma_direct_offset;
++
+ static void cell_dma_dev_setup(struct device *dev)
+ {
+ struct iommu_window *window;
+ struct cbe_iommu *iommu;
+ struct dev_archdata *archdata = &dev->archdata;
+
+- /* If we run without iommu, no need to do anything */
+- if (get_pci_dma_ops() == &dma_direct_ops)
++ if (get_pci_dma_ops() == &dma_direct_ops) {
++ archdata->dma_data = (void *)cell_dma_direct_offset;
+ return;
++ }
+
+ /* Current implementation uses the first window available in that
+ * node's iommu. We -might- do something smarter later though it may
+@@ -653,7 +658,7 @@
+
+ /* If we have no Axon, we set up the spider DMA magic offset */
+ if (of_find_node_by_name(NULL, "axon") == NULL)
+- dma_direct_offset = SPIDER_DMA_OFFSET;
++ cell_dma_direct_offset = SPIDER_DMA_OFFSET;
+
+ /* Now we need to check to see where the memory is mapped
+ * in PCI space. We assume that all busses use the same dma
+@@ -687,10 +692,13 @@
+ return -ENODEV;
+ }
+
+- dma_direct_offset += base;
++ cell_dma_direct_offset += base;
++
++ if (cell_dma_direct_offset != 0)
++ ppc_md.pci_dma_dev_setup = cell_pci_dma_dev_setup;
+
+ printk("iommu: disabled, direct DMA offset is 0x%lx\n",
+- dma_direct_offset);
++ cell_dma_direct_offset);
+
+ return 0;
+ }
+@@ -699,9 +707,6 @@
+ {
+ struct device_node *np;
+
+- if (!machine_is(cell))
+- return -ENODEV;
+-
+ /* If IOMMU is disabled or we have little enough RAM to not need
+ * to enable it, we setup a direct mapping.
+ *
+@@ -744,5 +749,6 @@
+
+ return 0;
+ }
+-arch_initcall(cell_iommu_init);
++machine_arch_initcall(cell, cell_iommu_init);
++machine_arch_initcall(celleb_native, cell_iommu_init);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/pmu.c powerpc.git/arch/powerpc/platforms/cell/pmu.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/pmu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/pmu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -213,7 +213,7 @@
+ break;
+
+ case pm_interval:
+- READ_SHADOW_REG(val, pm_interval);
++ READ_MMIO_UPPER32(val, pm_interval);
+ break;
+
+ case pm_start_stop:
+@@ -381,9 +381,6 @@
+ unsigned int irq;
+ int rc, node;
+
+- if (!machine_is(cell))
+- return 0;
+-
+ for_each_node(node) {
+ irq = irq_create_mapping(NULL, IIC_IRQ_IOEX_PMI |
+ (node << IIC_IRQ_NODE_SHIFT));
+@@ -404,7 +401,7 @@
+
+ return 0;
+ }
+-arch_initcall(cbe_init_pm_irq);
++machine_arch_initcall(cell, cbe_init_pm_irq);
+
+ void cbe_sync_irq(int node)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/setup.c powerpc.git/arch/powerpc/platforms/cell/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -30,6 +30,7 @@
+ #include <linux/console.h>
+ #include <linux/mutex.h>
+ #include <linux/memory_hotplug.h>
++#include <linux/of_platform.h>
+
+ #include <asm/mmu.h>
+ #include <asm/processor.h>
+@@ -51,7 +52,6 @@
+ #include <asm/spu_priv1.h>
+ #include <asm/udbg.h>
+ #include <asm/mpic.h>
+-#include <asm/of_platform.h>
+ #include <asm/cell-regs.h>
+
+ #include "interrupt.h"
+@@ -85,9 +85,6 @@
+ {
+ int node;
+
+- if (!machine_is(cell))
+- return 0;
+-
+ /* Publish OF platform devices for southbridge IOs */
+ of_platform_bus_probe(NULL, NULL, NULL);
+
+@@ -101,7 +98,7 @@
+ }
+ return 0;
+ }
+-device_initcall(cell_publish_devices);
++machine_device_initcall(cell, cell_publish_devices);
+
+ static void cell_mpic_cascade(unsigned int irq, struct irq_desc *desc)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/smp.c powerpc.git/arch/powerpc/platforms/cell/smp.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/smp.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/smp.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,6 +42,7 @@
+ #include <asm/firmware.h>
+ #include <asm/system.h>
+ #include <asm/rtas.h>
++#include <asm/cputhreads.h>
+
+ #include "interrupt.h"
+ #include <asm/udbg.h>
+@@ -182,7 +183,7 @@
+ */
+ if (system_state < SYSTEM_RUNNING &&
+ cpu_has_feature(CPU_FTR_SMT) &&
+- !smt_enabled_at_boot && nr % 2 != 0)
++ !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
+ return 0;
+
+ return 1;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spu_base.c powerpc.git/arch/powerpc/platforms/cell/spu_base.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spu_base.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spu_base.c 2008-01-28 20:25:49.000000000 +0100
+@@ -34,6 +34,7 @@
+ #include <linux/linux_logo.h>
+ #include <asm/spu.h>
+ #include <asm/spu_priv1.h>
++#include <asm/spu_csa.h>
+ #include <asm/xmon.h>
+ #include <asm/prom.h>
+
+@@ -47,6 +48,13 @@
+ EXPORT_SYMBOL_GPL(cbe_spu_info);
+
+ /*
++ * The spufs fault-handling code needs to call force_sig_info to raise signals
++ * on DMA errors. Export it here to avoid general kernel-wide access to this
++ * function
++ */
++EXPORT_SYMBOL_GPL(force_sig_info);
++
++/*
+ * Protects cbe_spu_info and spu->number.
+ */
+ static DEFINE_SPINLOCK(spu_lock);
+@@ -66,6 +74,10 @@
+ static DEFINE_SPINLOCK(spu_full_list_lock);
+ static DEFINE_MUTEX(spu_full_list_mutex);
+
++struct spu_slb {
++ u64 esid, vsid;
++};
++
+ void spu_invalidate_slbs(struct spu *spu)
+ {
+ struct spu_priv2 __iomem *priv2 = spu->priv2;
+@@ -114,40 +126,36 @@
+ }
+ EXPORT_SYMBOL_GPL(spu_associate_mm);
+
+-static int __spu_trap_invalid_dma(struct spu *spu)
++int spu_64k_pages_available(void)
+ {
+- pr_debug("%s\n", __FUNCTION__);
+- spu->dma_callback(spu, SPE_EVENT_INVALID_DMA);
+- return 0;
++ return mmu_psize_defs[MMU_PAGE_64K].shift != 0;
+ }
++EXPORT_SYMBOL_GPL(spu_64k_pages_available);
+
+-static int __spu_trap_dma_align(struct spu *spu)
++static void spu_restart_dma(struct spu *spu)
+ {
+- pr_debug("%s\n", __FUNCTION__);
+- spu->dma_callback(spu, SPE_EVENT_DMA_ALIGNMENT);
+- return 0;
+-}
++ struct spu_priv2 __iomem *priv2 = spu->priv2;
+
+-static int __spu_trap_error(struct spu *spu)
+-{
+- pr_debug("%s\n", __FUNCTION__);
+- spu->dma_callback(spu, SPE_EVENT_SPE_ERROR);
+- return 0;
++ if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
++ out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
+ }
+
+-static void spu_restart_dma(struct spu *spu)
++static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb)
+ {
+ struct spu_priv2 __iomem *priv2 = spu->priv2;
+
+- if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
+- out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
++ pr_debug("%s: adding SLB[%d] 0x%016lx 0x%016lx\n",
++ __func__, slbe, slb->vsid, slb->esid);
++
++ out_be64(&priv2->slb_index_W, slbe);
++ out_be64(&priv2->slb_vsid_RW, slb->vsid);
++ out_be64(&priv2->slb_esid_RW, slb->esid);
+ }
+
+ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
+ {
+- struct spu_priv2 __iomem *priv2 = spu->priv2;
+ struct mm_struct *mm = spu->mm;
+- u64 esid, vsid, llp;
++ struct spu_slb slb;
+ int psize;
+
+ pr_debug("%s\n", __FUNCTION__);
+@@ -159,7 +167,7 @@
+ printk("%s: invalid access during switch!\n", __func__);
+ return 1;
+ }
+- esid = (ea & ESID_MASK) | SLB_ESID_V;
++ slb.esid = (ea & ESID_MASK) | SLB_ESID_V;
+
+ switch(REGION_ID(ea)) {
+ case USER_REGION_ID:
+@@ -168,21 +176,21 @@
+ #else
+ psize = mm->context.user_psize;
+ #endif
+- vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
+- SLB_VSID_USER;
++ slb.vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M)
++ << SLB_VSID_SHIFT) | SLB_VSID_USER;
+ break;
+ case VMALLOC_REGION_ID:
+ if (ea < VMALLOC_END)
+ psize = mmu_vmalloc_psize;
+ else
+ psize = mmu_io_psize;
+- vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
+- SLB_VSID_KERNEL;
++ slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
++ << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
+ break;
+ case KERNEL_REGION_ID:
+ psize = mmu_linear_psize;
+- vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
+- SLB_VSID_KERNEL;
++ slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
++ << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
+ break;
+ default:
+ /* Future: support kernel segments so that drivers
+@@ -191,11 +199,9 @@
+ pr_debug("invalid region access at %016lx\n", ea);
+ return 1;
+ }
+- llp = mmu_psize_defs[psize].sllp;
++ slb.vsid |= mmu_psize_defs[psize].sllp;
+
+- out_be64(&priv2->slb_index_W, spu->slb_replace);
+- out_be64(&priv2->slb_vsid_RW, vsid | llp);
+- out_be64(&priv2->slb_esid_RW, esid);
++ spu_load_slb(spu, spu->slb_replace, &slb);
+
+ spu->slb_replace++;
+ if (spu->slb_replace >= 8)
+@@ -225,13 +231,83 @@
+ return 1;
+ }
+
++ spu->class_0_pending = 0;
+ spu->dar = ea;
+ spu->dsisr = dsisr;
+- mb();
++
+ spu->stop_callback(spu);
++
+ return 0;
+ }
+
++static void __spu_kernel_slb(void *addr, struct spu_slb *slb)
++{
++ unsigned long ea = (unsigned long)addr;
++ u64 llp;
++
++ if (REGION_ID(ea) == KERNEL_REGION_ID)
++ llp = mmu_psize_defs[mmu_linear_psize].sllp;
++ else
++ llp = mmu_psize_defs[mmu_virtual_psize].sllp;
++
++ slb->vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
++ SLB_VSID_KERNEL | llp;
++ slb->esid = (ea & ESID_MASK) | SLB_ESID_V;
++}
++
++/**
++ * Given an array of @nr_slbs SLB entries, @slbs, return non-zero if the
++ * address @new_addr is present.
++ */
++static inline int __slb_present(struct spu_slb *slbs, int nr_slbs,
++ void *new_addr)
++{
++ unsigned long ea = (unsigned long)new_addr;
++ int i;
++
++ for (i = 0; i < nr_slbs; i++)
++ if (!((slbs[i].esid ^ ea) & ESID_MASK))
++ return 1;
++
++ return 0;
++}
++
++/**
++ * Setup the SPU kernel SLBs, in preparation for a context save/restore. We
++ * need to map both the context save area, and the save/restore code.
++ *
++ * Because the lscsa and code may cross segment boundaires, we check to see
++ * if mappings are required for the start and end of each range. We currently
++ * assume that the mappings are smaller that one segment - if not, something
++ * is seriously wrong.
++ */
++void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
++ void *code, int code_size)
++{
++ struct spu_slb slbs[4];
++ int i, nr_slbs = 0;
++ /* start and end addresses of both mappings */
++ void *addrs[] = {
++ lscsa, (void *)lscsa + sizeof(*lscsa) - 1,
++ code, code + code_size - 1
++ };
++
++ /* check the set of addresses, and create a new entry in the slbs array
++ * if there isn't already a SLB for that address */
++ for (i = 0; i < ARRAY_SIZE(addrs); i++) {
++ if (__slb_present(slbs, nr_slbs, addrs[i]))
++ continue;
++
++ __spu_kernel_slb(addrs[i], &slbs[nr_slbs]);
++ nr_slbs++;
++ }
++
++ /* Add the set of SLBs */
++ for (i = 0; i < nr_slbs; i++)
++ spu_load_slb(spu, i, &slbs[i]);
++}
++EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs);
++
+ static irqreturn_t
+ spu_irq_class_0(int irq, void *data)
+ {
+@@ -240,12 +316,13 @@
+
+ spu = data;
+
++ spin_lock(&spu->register_lock);
+ mask = spu_int_mask_get(spu, 0);
+- stat = spu_int_stat_get(spu, 0);
+- stat &= mask;
++ stat = spu_int_stat_get(spu, 0) & mask;
+
+- spin_lock(&spu->register_lock);
+ spu->class_0_pending |= stat;
++ spu->dsisr = spu_mfc_dsisr_get(spu);
++ spu->dar = spu_mfc_dar_get(spu);
+ spin_unlock(&spu->register_lock);
+
+ spu->stop_callback(spu);
+@@ -255,31 +332,6 @@
+ return IRQ_HANDLED;
+ }
+
+-int
+-spu_irq_class_0_bottom(struct spu *spu)
+-{
+- unsigned long flags;
+- unsigned long stat;
+-
+- spin_lock_irqsave(&spu->register_lock, flags);
+- stat = spu->class_0_pending;
+- spu->class_0_pending = 0;
+-
+- if (stat & 1) /* invalid DMA alignment */
+- __spu_trap_dma_align(spu);
+-
+- if (stat & 2) /* invalid MFC DMA */
+- __spu_trap_invalid_dma(spu);
+-
+- if (stat & 4) /* error on SPU */
+- __spu_trap_error(spu);
+-
+- spin_unlock_irqrestore(&spu->register_lock, flags);
+-
+- return (stat & 0x7) ? -EIO : 0;
+-}
+-EXPORT_SYMBOL_GPL(spu_irq_class_0_bottom);
+-
+ static irqreturn_t
+ spu_irq_class_1(int irq, void *data)
+ {
+@@ -294,24 +346,23 @@
+ stat = spu_int_stat_get(spu, 1) & mask;
+ dar = spu_mfc_dar_get(spu);
+ dsisr = spu_mfc_dsisr_get(spu);
+- if (stat & 2) /* mapping fault */
++ if (stat & CLASS1_STORAGE_FAULT_INTR)
+ spu_mfc_dsisr_set(spu, 0ul);
+ spu_int_stat_clear(spu, 1, stat);
+ spin_unlock(&spu->register_lock);
+ pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
+ dar, dsisr);
+
+- if (stat & 1) /* segment fault */
++ if (stat & CLASS1_SEGMENT_FAULT_INTR)
+ __spu_trap_data_seg(spu, dar);
+
+- if (stat & 2) { /* mapping fault */
++ if (stat & CLASS1_STORAGE_FAULT_INTR)
+ __spu_trap_data_map(spu, dar, dsisr);
+- }
+
+- if (stat & 4) /* ls compare & suspend on get */
++ if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR)
+ ;
+
+- if (stat & 8) /* ls compare & suspend on put */
++ if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR)
+ ;
+
+ return stat ? IRQ_HANDLED : IRQ_NONE;
+@@ -323,6 +374,8 @@
+ struct spu *spu;
+ unsigned long stat;
+ unsigned long mask;
++ const int mailbox_intrs =
++ CLASS2_MAILBOX_THRESHOLD_INTR | CLASS2_MAILBOX_INTR;
+
+ spu = data;
+ spin_lock(&spu->register_lock);
+@@ -330,31 +383,30 @@
+ mask = spu_int_mask_get(spu, 2);
+ /* ignore interrupts we're not waiting for */
+ stat &= mask;
+- /*
+- * mailbox interrupts (0x1 and 0x10) are level triggered.
+- * mask them now before acknowledging.
+- */
+- if (stat & 0x11)
+- spu_int_mask_and(spu, 2, ~(stat & 0x11));
++
++ /* mailbox interrupts are level triggered. mask them now before
++ * acknowledging */
++ if (stat & mailbox_intrs)
++ spu_int_mask_and(spu, 2, ~(stat & mailbox_intrs));
+ /* acknowledge all interrupts before the callbacks */
+ spu_int_stat_clear(spu, 2, stat);
+ spin_unlock(&spu->register_lock);
+
+ pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask);
+
+- if (stat & 1) /* PPC core mailbox */
++ if (stat & CLASS2_MAILBOX_INTR)
+ spu->ibox_callback(spu);
+
+- if (stat & 2) /* SPU stop-and-signal */
++ if (stat & CLASS2_SPU_STOP_INTR)
+ spu->stop_callback(spu);
+
+- if (stat & 4) /* SPU halted */
++ if (stat & CLASS2_SPU_HALT_INTR)
+ spu->stop_callback(spu);
+
+- if (stat & 8) /* DMA tag group complete */
++ if (stat & CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR)
+ spu->mfc_callback(spu);
+
+- if (stat & 0x10) /* SPU mailbox threshold */
++ if (stat & CLASS2_MAILBOX_THRESHOLD_INTR)
+ spu->wbox_callback(spu);
+
+ spu->stats.class2_intr++;
+@@ -479,13 +531,27 @@
+ int spu_add_sysdev_attr_group(struct attribute_group *attrs)
+ {
+ struct spu *spu;
++ int rc = 0;
+
+ mutex_lock(&spu_full_list_mutex);
+- list_for_each_entry(spu, &spu_full_list, full_list)
+- sysfs_create_group(&spu->sysdev.kobj, attrs);
++ list_for_each_entry(spu, &spu_full_list, full_list) {
++ rc = sysfs_create_group(&spu->sysdev.kobj, attrs);
++
++ /* we're in trouble here, but try unwinding anyway */
++ if (rc) {
++ printk(KERN_ERR "%s: can't create sysfs group '%s'\n",
++ __func__, attrs->name);
++
++ list_for_each_entry_continue_reverse(spu,
++ &spu_full_list, full_list)
++ sysfs_remove_group(&spu->sysdev.kobj, attrs);
++ break;
++ }
++ }
++
+ mutex_unlock(&spu_full_list_mutex);
+
+- return 0;
++ return rc;
+ }
+ EXPORT_SYMBOL_GPL(spu_add_sysdev_attr_group);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spu_fault.c powerpc.git/arch/powerpc/platforms/cell/spu_fault.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spu_fault.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spu_fault.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,98 @@
++/*
++ * SPU mm fault handler
++ *
++ * (C) Copyright IBM Deutschland Entwicklung GmbH 2007
++ *
++ * Author: Arnd Bergmann <arndb@de.ibm.com>
++ * Author: Jeremy Kerr <jk@ozlabs.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <linux/module.h>
++
++#include <asm/spu.h>
++#include <asm/spu_csa.h>
++
++/*
++ * This ought to be kept in sync with the powerpc specific do_page_fault
++ * function. Currently, there are a few corner cases that we haven't had
++ * to handle fortunately.
++ */
++int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
++ unsigned long dsisr, unsigned *flt)
++{
++ struct vm_area_struct *vma;
++ unsigned long is_write;
++ int ret;
++
++#if 0
++ if (!IS_VALID_EA(ea)) {
++ return -EFAULT;
++ }
++#endif /* XXX */
++ if (mm == NULL) {
++ return -EFAULT;
++ }
++ if (mm->pgd == NULL) {
++ return -EFAULT;
++ }
++
++ down_read(&mm->mmap_sem);
++ vma = find_vma(mm, ea);
++ if (!vma)
++ goto bad_area;
++ if (vma->vm_start <= ea)
++ goto good_area;
++ if (!(vma->vm_flags & VM_GROWSDOWN))
++ goto bad_area;
++ if (expand_stack(vma, ea))
++ goto bad_area;
++good_area:
++ is_write = dsisr & MFC_DSISR_ACCESS_PUT;
++ if (is_write) {
++ if (!(vma->vm_flags & VM_WRITE))
++ goto bad_area;
++ } else {
++ if (dsisr & MFC_DSISR_ACCESS_DENIED)
++ goto bad_area;
++ if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
++ goto bad_area;
++ }
++ ret = 0;
++ *flt = handle_mm_fault(mm, vma, ea, is_write);
++ if (unlikely(*flt & VM_FAULT_ERROR)) {
++ if (*flt & VM_FAULT_OOM) {
++ ret = -ENOMEM;
++ goto bad_area;
++ } else if (*flt & VM_FAULT_SIGBUS) {
++ ret = -EFAULT;
++ goto bad_area;
++ }
++ BUG();
++ }
++ if (*flt & VM_FAULT_MAJOR)
++ current->maj_flt++;
++ else
++ current->min_flt++;
++ up_read(&mm->mmap_sem);
++ return ret;
++
++bad_area:
++ up_read(&mm->mmap_sem);
++ return -EFAULT;
++}
++EXPORT_SYMBOL_GPL(spu_handle_mm_fault);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spu_manage.c powerpc.git/arch/powerpc/platforms/cell/spu_manage.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spu_manage.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spu_manage.c 2008-01-28 20:25:49.000000000 +0100
+@@ -35,6 +35,7 @@
+ #include <asm/firmware.h>
+ #include <asm/prom.h>
+
++#include "spufs/spufs.h"
+ #include "interrupt.h"
+
+ struct device_node *spu_devnode(struct spu *spu)
+@@ -345,7 +346,7 @@
+ }
+ ret = spu_map_interrupts_old(spu, spe);
+ if (ret) {
+- printk(KERN_ERR "%s: could not map interrupts",
++ printk(KERN_ERR "%s: could not map interrupts\n",
+ spu->name);
+ goto out_unmap;
+ }
+@@ -369,6 +370,16 @@
+ return 0;
+ }
+
++static void enable_spu_by_master_run(struct spu_context *ctx)
++{
++ ctx->ops->master_start(ctx);
++}
++
++static void disable_spu_by_master_run(struct spu_context *ctx)
++{
++ ctx->ops->master_stop(ctx);
++}
++
+ /* Hardcoded affinity idxs for qs20 */
+ #define QS20_SPES_PER_BE 8
+ static int qs20_reg_idxs[QS20_SPES_PER_BE] = { 0, 2, 4, 6, 7, 5, 3, 1 };
+@@ -411,10 +422,15 @@
+
+ static int of_has_vicinity(void)
+ {
+- struct spu* spu;
++ struct device_node *dn;
+
+- spu = list_first_entry(&cbe_spu_info[0].spus, struct spu, cbe_list);
+- return of_find_property(spu_devnode(spu), "vicinity", NULL) != NULL;
++ for_each_node_by_type(dn, "spe") {
++ if (of_find_property(dn, "vicinity", NULL)) {
++ of_node_put(dn);
++ return 1;
++ }
++ }
++ return 0;
+ }
+
+ static struct spu *devnode_spu(int cbe, struct device_node *dn)
+@@ -525,7 +541,7 @@
+ if (of_flat_dt_is_compatible(root, "IBM,CPBW-1.0"))
+ init_affinity_qs20_harcoded();
+ else
+- printk("No affinity configuration found");
++ printk("No affinity configuration found\n");
+ }
+
+ return 0;
+@@ -535,5 +551,7 @@
+ .enumerate_spus = of_enumerate_spus,
+ .create_spu = of_create_spu,
+ .destroy_spu = of_destroy_spu,
++ .enable_spu = enable_spu_by_master_run,
++ .disable_spu = disable_spu_by_master_run,
+ .init_affinity = init_affinity,
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/Makefile powerpc.git/arch/powerpc/platforms/cell/spufs/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -1,8 +1,8 @@
+-obj-y += switch.o fault.o lscsa_alloc.o
+
+ obj-$(CONFIG_SPU_FS) += spufs.o
+ spufs-y += inode.o file.o context.o syscalls.o coredump.o
+ spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o
++spufs-y += switch.o fault.o lscsa_alloc.o
+
+ # Rules to build switch.o with the help of SPU tool chain
+ SPU_CROSS := spu-
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/backing_ops.c powerpc.git/arch/powerpc/platforms/cell/spufs/backing_ops.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/backing_ops.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/backing_ops.c 2008-01-28 20:25:49.000000000 +0100
+@@ -106,16 +106,20 @@
+ if (stat & 0xff0000)
+ ret |= POLLIN | POLLRDNORM;
+ else {
+- ctx->csa.priv1.int_stat_class0_RW &= ~0x1;
+- ctx->csa.priv1.int_mask_class2_RW |= 0x1;
++ ctx->csa.priv1.int_stat_class2_RW &=
++ ~CLASS2_MAILBOX_INTR;
++ ctx->csa.priv1.int_mask_class2_RW |=
++ CLASS2_ENABLE_MAILBOX_INTR;
+ }
+ }
+ if (events & (POLLOUT | POLLWRNORM)) {
+ if (stat & 0x00ff00)
+ ret = POLLOUT | POLLWRNORM;
+ else {
+- ctx->csa.priv1.int_stat_class0_RW &= ~0x10;
+- ctx->csa.priv1.int_mask_class2_RW |= 0x10;
++ ctx->csa.priv1.int_stat_class2_RW &=
++ ~CLASS2_MAILBOX_THRESHOLD_INTR;
++ ctx->csa.priv1.int_mask_class2_RW |=
++ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
+ }
+ }
+ spin_unlock_irq(&ctx->csa.register_lock);
+@@ -139,7 +143,7 @@
+ ret = 4;
+ } else {
+ /* make sure we get woken up by the interrupt */
+- ctx->csa.priv1.int_mask_class2_RW |= 0x1UL;
++ ctx->csa.priv1.int_mask_class2_RW |= CLASS2_ENABLE_MAILBOX_INTR;
+ ret = 0;
+ }
+ spin_unlock(&ctx->csa.register_lock);
+@@ -169,7 +173,8 @@
+ } else {
+ /* make sure we get woken up by the interrupt when space
+ becomes available */
+- ctx->csa.priv1.int_mask_class2_RW |= 0x10;
++ ctx->csa.priv1.int_mask_class2_RW |=
++ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
+ ret = 0;
+ }
+ spin_unlock(&ctx->csa.register_lock);
+@@ -268,6 +273,11 @@
+ return ctx->csa.lscsa->ls;
+ }
+
++static void spu_backing_privcntl_write(struct spu_context *ctx, u64 val)
++{
++ ctx->csa.priv2.spu_privcntl_RW = val;
++}
++
+ static u32 spu_backing_runcntl_read(struct spu_context *ctx)
+ {
+ return ctx->csa.prob.spu_runcntl_RW;
+@@ -285,6 +295,11 @@
+ spin_unlock(&ctx->csa.register_lock);
+ }
+
++static void spu_backing_runcntl_stop(struct spu_context *ctx)
++{
++ spu_backing_runcntl_write(ctx, SPU_RUNCNTL_STOP);
++}
++
+ static void spu_backing_master_start(struct spu_context *ctx)
+ {
+ struct spu_state *csa = &ctx->csa;
+@@ -358,7 +373,7 @@
+
+ static void spu_backing_restart_dma(struct spu_context *ctx)
+ {
+- /* nothing to do here */
++ ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_RESTART_DMA_COMMAND;
+ }
+
+ struct spu_context_ops spu_backing_ops = {
+@@ -379,8 +394,10 @@
+ .npc_write = spu_backing_npc_write,
+ .status_read = spu_backing_status_read,
+ .get_ls = spu_backing_get_ls,
++ .privcntl_write = spu_backing_privcntl_write,
+ .runcntl_read = spu_backing_runcntl_read,
+ .runcntl_write = spu_backing_runcntl_write,
++ .runcntl_stop = spu_backing_runcntl_stop,
+ .master_start = spu_backing_master_start,
+ .master_stop = spu_backing_master_stop,
+ .set_mfc_query = spu_backing_set_mfc_query,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/context.c powerpc.git/arch/powerpc/platforms/cell/spufs/context.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/context.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/context.c 2008-01-28 20:25:49.000000000 +0100
+@@ -52,6 +52,7 @@
+ init_waitqueue_head(&ctx->wbox_wq);
+ init_waitqueue_head(&ctx->stop_wq);
+ init_waitqueue_head(&ctx->mfc_wq);
++ init_waitqueue_head(&ctx->run_wq);
+ ctx->state = SPU_STATE_SAVED;
+ ctx->ops = &spu_backing_ops;
+ ctx->owner = get_task_mm(current);
+@@ -105,7 +106,17 @@
+ void spu_forget(struct spu_context *ctx)
+ {
+ struct mm_struct *mm;
+- spu_acquire_saved(ctx);
++
++ /*
++ * This is basically an open-coded spu_acquire_saved, except that
++ * we don't acquire the state mutex interruptible.
++ */
++ mutex_lock(&ctx->state_mutex);
++ if (ctx->state != SPU_STATE_SAVED) {
++ set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
++ spu_deactivate(ctx);
++ }
++
+ mm = ctx->owner;
+ ctx->owner = NULL;
+ mmput(mm);
+@@ -133,47 +144,23 @@
+ }
+
+ /**
+- * spu_acquire_runnable - lock spu contex and make sure it is in runnable state
++ * spu_acquire_saved - lock spu contex and make sure it is in saved state
+ * @ctx: spu contex to lock
+- *
+- * Note:
+- * Returns 0 and with the context locked on success
+- * Returns negative error and with the context _unlocked_ on failure.
+ */
+-int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags)
++int spu_acquire_saved(struct spu_context *ctx)
+ {
+- int ret = -EINVAL;
++ int ret;
+
+- spu_acquire(ctx);
+- if (ctx->state == SPU_STATE_SAVED) {
+- /*
+- * Context is about to be freed, so we can't acquire it anymore.
+- */
+- if (!ctx->owner)
+- goto out_unlock;
+- ret = spu_activate(ctx, flags);
+- if (ret)
+- goto out_unlock;
+- }
+-
+- return 0;
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+
+- out_unlock:
+- spu_release(ctx);
+- return ret;
+-}
+-
+-/**
+- * spu_acquire_saved - lock spu contex and make sure it is in saved state
+- * @ctx: spu contex to lock
+- */
+-void spu_acquire_saved(struct spu_context *ctx)
+-{
+- spu_acquire(ctx);
+ if (ctx->state != SPU_STATE_SAVED) {
+ set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
+ spu_deactivate(ctx);
+ }
++
++ return 0;
+ }
+
+ /**
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/coredump.c powerpc.git/arch/powerpc/platforms/cell/spufs/coredump.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/coredump.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/coredump.c 2008-01-28 20:25:49.000000000 +0100
+@@ -148,7 +148,9 @@
+
+ fd = 0;
+ while ((ctx = coredump_next_context(&fd)) != NULL) {
+- spu_acquire_saved(ctx);
++ rc = spu_acquire_saved(ctx);
++ if (rc)
++ break;
+ rc = spufs_ctx_note_size(ctx, fd);
+ spu_release_saved(ctx);
+ if (rc < 0)
+@@ -224,7 +226,9 @@
+
+ fd = 0;
+ while ((ctx = coredump_next_context(&fd)) != NULL) {
+- spu_acquire_saved(ctx);
++ rc = spu_acquire_saved(ctx);
++ if (rc)
++ return rc;
+
+ for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
+ rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/fault.c powerpc.git/arch/powerpc/platforms/cell/spufs/fault.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/fault.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/fault.c 2008-01-28 20:25:49.000000000 +0100
+@@ -28,117 +28,71 @@
+
+ #include "spufs.h"
+
+-/*
+- * This ought to be kept in sync with the powerpc specific do_page_fault
+- * function. Currently, there are a few corner cases that we haven't had
+- * to handle fortunately.
++/**
++ * Handle an SPE event, depending on context SPU_CREATE_EVENTS_ENABLED flag.
++ *
++ * If the context was created with events, we just set the return event.
++ * Otherwise, send an appropriate signal to the process.
+ */
+-static int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
+- unsigned long dsisr, unsigned *flt)
+-{
+- struct vm_area_struct *vma;
+- unsigned long is_write;
+- int ret;
+-
+-#if 0
+- if (!IS_VALID_EA(ea)) {
+- return -EFAULT;
+- }
+-#endif /* XXX */
+- if (mm == NULL) {
+- return -EFAULT;
+- }
+- if (mm->pgd == NULL) {
+- return -EFAULT;
+- }
+-
+- down_read(&mm->mmap_sem);
+- vma = find_vma(mm, ea);
+- if (!vma)
+- goto bad_area;
+- if (vma->vm_start <= ea)
+- goto good_area;
+- if (!(vma->vm_flags & VM_GROWSDOWN))
+- goto bad_area;
+- if (expand_stack(vma, ea))
+- goto bad_area;
+-good_area:
+- is_write = dsisr & MFC_DSISR_ACCESS_PUT;
+- if (is_write) {
+- if (!(vma->vm_flags & VM_WRITE))
+- goto bad_area;
+- } else {
+- if (dsisr & MFC_DSISR_ACCESS_DENIED)
+- goto bad_area;
+- if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
+- goto bad_area;
+- }
+- ret = 0;
+- *flt = handle_mm_fault(mm, vma, ea, is_write);
+- if (unlikely(*flt & VM_FAULT_ERROR)) {
+- if (*flt & VM_FAULT_OOM) {
+- ret = -ENOMEM;
+- goto bad_area;
+- } else if (*flt & VM_FAULT_SIGBUS) {
+- ret = -EFAULT;
+- goto bad_area;
+- }
+- BUG();
+- }
+- if (*flt & VM_FAULT_MAJOR)
+- current->maj_flt++;
+- else
+- current->min_flt++;
+- up_read(&mm->mmap_sem);
+- return ret;
+-
+-bad_area:
+- up_read(&mm->mmap_sem);
+- return -EFAULT;
+-}
+-
+-static void spufs_handle_dma_error(struct spu_context *ctx,
++static void spufs_handle_event(struct spu_context *ctx,
+ unsigned long ea, int type)
+ {
++ siginfo_t info;
++
+ if (ctx->flags & SPU_CREATE_EVENTS_ENABLED) {
+ ctx->event_return |= type;
+ wake_up_all(&ctx->stop_wq);
+- } else {
+- siginfo_t info;
+- memset(&info, 0, sizeof(info));
+-
+- switch (type) {
+- case SPE_EVENT_INVALID_DMA:
+- info.si_signo = SIGBUS;
+- info.si_code = BUS_OBJERR;
+- break;
+- case SPE_EVENT_SPE_DATA_STORAGE:
+- info.si_signo = SIGBUS;
+- info.si_addr = (void __user *)ea;
+- info.si_code = BUS_ADRERR;
+- break;
+- case SPE_EVENT_DMA_ALIGNMENT:
+- info.si_signo = SIGBUS;
+- /* DAR isn't set for an alignment fault :( */
+- info.si_code = BUS_ADRALN;
+- break;
+- case SPE_EVENT_SPE_ERROR:
+- info.si_signo = SIGILL;
+- info.si_addr = (void __user *)(unsigned long)
+- ctx->ops->npc_read(ctx) - 4;
+- info.si_code = ILL_ILLOPC;
+- break;
+- }
+- if (info.si_signo)
+- force_sig_info(info.si_signo, &info, current);
++ return;
+ }
++
++ memset(&info, 0, sizeof(info));
++
++ switch (type) {
++ case SPE_EVENT_INVALID_DMA:
++ info.si_signo = SIGBUS;
++ info.si_code = BUS_OBJERR;
++ break;
++ case SPE_EVENT_SPE_DATA_STORAGE:
++ info.si_signo = SIGSEGV;
++ info.si_addr = (void __user *)ea;
++ info.si_code = SEGV_ACCERR;
++ ctx->ops->restart_dma(ctx);
++ break;
++ case SPE_EVENT_DMA_ALIGNMENT:
++ info.si_signo = SIGBUS;
++ /* DAR isn't set for an alignment fault :( */
++ info.si_code = BUS_ADRALN;
++ break;
++ case SPE_EVENT_SPE_ERROR:
++ info.si_signo = SIGILL;
++ info.si_addr = (void __user *)(unsigned long)
++ ctx->ops->npc_read(ctx) - 4;
++ info.si_code = ILL_ILLOPC;
++ break;
++ }
++
++ if (info.si_signo)
++ force_sig_info(info.si_signo, &info, current);
+ }
+
+-void spufs_dma_callback(struct spu *spu, int type)
++int spufs_handle_class0(struct spu_context *ctx)
+ {
+- spufs_handle_dma_error(spu->ctx, spu->dar, type);
++ unsigned long stat = ctx->csa.class_0_pending & CLASS0_INTR_MASK;
++
++ if (likely(!stat))
++ return 0;
++
++ if (stat & CLASS0_DMA_ALIGNMENT_INTR)
++ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_DMA_ALIGNMENT);
++
++ if (stat & CLASS0_INVALID_DMA_COMMAND_INTR)
++ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_INVALID_DMA);
++
++ if (stat & CLASS0_SPU_ERROR_INTR)
++ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_SPE_ERROR);
++
++ return -EIO;
+ }
+-EXPORT_SYMBOL_GPL(spufs_dma_callback);
+
+ /*
+ * bottom half handler for page faults, we can't do this from
+@@ -154,7 +108,7 @@
+ u64 ea, dsisr, access;
+ unsigned long flags;
+ unsigned flt = 0;
+- int ret;
++ int ret, ret2;
+
+ /*
+ * dar and dsisr get passed from the registers
+@@ -165,16 +119,8 @@
+ * in time, we can still expect to get the same fault
+ * the immediately after the context restore.
+ */
+- if (ctx->state == SPU_STATE_RUNNABLE) {
+- ea = ctx->spu->dar;
+- dsisr = ctx->spu->dsisr;
+- ctx->spu->dar= ctx->spu->dsisr = 0;
+- } else {
+- ea = ctx->csa.priv1.mfc_dar_RW;
+- dsisr = ctx->csa.priv1.mfc_dsisr_RW;
+- ctx->csa.priv1.mfc_dar_RW = 0;
+- ctx->csa.priv1.mfc_dsisr_RW = 0;
+- }
++ ea = ctx->csa.dar;
++ dsisr = ctx->csa.dsisr;
+
+ if (!(dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED)))
+ return 0;
+@@ -201,7 +147,22 @@
+ if (ret)
+ ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt);
+
+- spu_acquire(ctx);
++ /*
++ * If spu_acquire fails due to a pending signal we just want to return
++ * EINTR to userspace even if that means missing the dma restart or
++ * updating the page fault statistics.
++ */
++ ret2 = spu_acquire(ctx);
++ if (ret2)
++ goto out;
++
++ /*
++ * Clear dsisr under ctxt lock after handling the fault, so that
++ * time slicing will not preempt the context while the page fault
++ * handler is running. Context switch code removes mappings.
++ */
++ ctx->csa.dar = ctx->csa.dsisr = 0;
++
+ /*
+ * If we handled the fault successfully and are in runnable
+ * state, restart the DMA.
+@@ -222,9 +183,9 @@
+ if (ctx->spu)
+ ctx->ops->restart_dma(ctx);
+ } else
+- spufs_handle_dma_error(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
++ spufs_handle_event(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
+
++ out:
+ spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
+ return ret;
+ }
+-EXPORT_SYMBOL_GPL(spufs_handle_class1);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/file.c powerpc.git/arch/powerpc/platforms/cell/spufs/file.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/file.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/file.c 2008-01-28 20:25:49.000000000 +0100
+@@ -40,6 +40,120 @@
+
+ #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000)
+
++/* Simple attribute files */
++struct spufs_attr {
++ int (*get)(void *, u64 *);
++ int (*set)(void *, u64);
++ char get_buf[24]; /* enough to store a u64 and "\n\0" */
++ char set_buf[24];
++ void *data;
++ const char *fmt; /* format for read operation */
++ struct mutex mutex; /* protects access to these buffers */
++};
++
++static int spufs_attr_open(struct inode *inode, struct file *file,
++ int (*get)(void *, u64 *), int (*set)(void *, u64),
++ const char *fmt)
++{
++ struct spufs_attr *attr;
++
++ attr = kmalloc(sizeof(*attr), GFP_KERNEL);
++ if (!attr)
++ return -ENOMEM;
++
++ attr->get = get;
++ attr->set = set;
++ attr->data = inode->i_private;
++ attr->fmt = fmt;
++ mutex_init(&attr->mutex);
++ file->private_data = attr;
++
++ return nonseekable_open(inode, file);
++}
++
++static int spufs_attr_release(struct inode *inode, struct file *file)
++{
++ kfree(file->private_data);
++ return 0;
++}
++
++static ssize_t spufs_attr_read(struct file *file, char __user *buf,
++ size_t len, loff_t *ppos)
++{
++ struct spufs_attr *attr;
++ size_t size;
++ ssize_t ret;
++
++ attr = file->private_data;
++ if (!attr->get)
++ return -EACCES;
++
++ ret = mutex_lock_interruptible(&attr->mutex);
++ if (ret)
++ return ret;
++
++ if (*ppos) { /* continued read */
++ size = strlen(attr->get_buf);
++ } else { /* first read */
++ u64 val;
++ ret = attr->get(attr->data, &val);
++ if (ret)
++ goto out;
++
++ size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
++ attr->fmt, (unsigned long long)val);
++ }
++
++ ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
++out:
++ mutex_unlock(&attr->mutex);
++ return ret;
++}
++
++static ssize_t spufs_attr_write(struct file *file, const char __user *buf,
++ size_t len, loff_t *ppos)
++{
++ struct spufs_attr *attr;
++ u64 val;
++ size_t size;
++ ssize_t ret;
++
++ attr = file->private_data;
++ if (!attr->set)
++ return -EACCES;
++
++ ret = mutex_lock_interruptible(&attr->mutex);
++ if (ret)
++ return ret;
++
++ ret = -EFAULT;
++ size = min(sizeof(attr->set_buf) - 1, len);
++ if (copy_from_user(attr->set_buf, buf, size))
++ goto out;
++
++ ret = len; /* claim we got the whole input */
++ attr->set_buf[size] = '\0';
++ val = simple_strtol(attr->set_buf, NULL, 0);
++ attr->set(attr->data, val);
++out:
++ mutex_unlock(&attr->mutex);
++ return ret;
++}
++
++#define DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
++static int __fops ## _open(struct inode *inode, struct file *file) \
++{ \
++ __simple_attr_check_format(__fmt, 0ull); \
++ return spufs_attr_open(inode, file, __get, __set, __fmt); \
++} \
++static struct file_operations __fops = { \
++ .owner = THIS_MODULE, \
++ .open = __fops ## _open, \
++ .release = spufs_attr_release, \
++ .read = spufs_attr_read, \
++ .write = spufs_attr_write, \
++};
++
+
+ static int
+ spufs_mem_open(struct inode *inode, struct file *file)
+@@ -84,9 +198,12 @@
+ struct spu_context *ctx = file->private_data;
+ ssize_t ret;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ret = __spufs_mem_read(ctx, buffer, size, pos);
+ spu_release(ctx);
++
+ return ret;
+ }
+
+@@ -106,7 +223,10 @@
+ if (size > LS_SIZE - pos)
+ size = LS_SIZE - pos;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
++
+ local_store = ctx->ops->get_ls(ctx);
+ ret = copy_from_user(local_store + pos, buffer, size);
+ spu_release(ctx);
+@@ -146,7 +266,8 @@
+ pr_debug("spufs_mem_mmap_nopfn address=0x%lx -> 0x%lx, offset=0x%lx\n",
+ addr0, address, offset);
+
+- spu_acquire(ctx);
++ if (spu_acquire(ctx))
++ return NOPFN_REFAULT;
+
+ if (ctx->state == SPU_STATE_SAVED) {
+ vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
+@@ -236,23 +357,32 @@
+ {
+ struct spu_context *ctx = vma->vm_file->private_data;
+ unsigned long area, offset = address - vma->vm_start;
+- int ret;
+
+ offset += vma->vm_pgoff << PAGE_SHIFT;
+ if (offset >= ps_size)
+ return NOPFN_SIGBUS;
+
+- /* error here usually means a signal.. we might want to test
+- * the error code more precisely though
++ /*
++ * We have to wait for context to be loaded before we have
++ * pages to hand out to the user, but we don't want to wait
++ * with the mmap_sem held.
++ * It is possible to drop the mmap_sem here, but then we need
++ * to return NOPFN_REFAULT because the mappings may have
++ * hanged.
+ */
+- ret = spu_acquire_runnable(ctx, 0);
+- if (ret)
++ if (spu_acquire(ctx))
+ return NOPFN_REFAULT;
+
+- area = ctx->spu->problem_phys + ps_offs;
+- vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
+- spu_release(ctx);
++ if (ctx->state == SPU_STATE_SAVED) {
++ up_read(&current->mm->mmap_sem);
++ spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
++ down_read(&current->mm->mmap_sem);
++ } else {
++ area = ctx->spu->problem_phys + ps_offs;
++ vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
++ }
+
++ spu_release(ctx);
+ return NOPFN_REFAULT;
+ }
+
+@@ -286,25 +416,32 @@
+ #define spufs_cntl_mmap NULL
+ #endif /* !SPUFS_MMAP_4K */
+
+-static u64 spufs_cntl_get(void *data)
++static int spufs_cntl_get(void *data, u64 *val)
+ {
+ struct spu_context *ctx = data;
+- u64 val;
++ int ret;
+
+- spu_acquire(ctx);
+- val = ctx->ops->status_read(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
++ *val = ctx->ops->status_read(ctx);
+ spu_release(ctx);
+
+- return val;
++ return 0;
+ }
+
+-static void spufs_cntl_set(void *data, u64 val)
++static int spufs_cntl_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
++ int ret;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->runcntl_write(ctx, val);
+ spu_release(ctx);
++
++ return 0;
+ }
+
+ static int spufs_cntl_open(struct inode *inode, struct file *file)
+@@ -317,7 +454,7 @@
+ if (!i->i_openers++)
+ ctx->cntl = inode->i_mapping;
+ mutex_unlock(&ctx->mapping_lock);
+- return simple_attr_open(inode, file, spufs_cntl_get,
++ return spufs_attr_open(inode, file, spufs_cntl_get,
+ spufs_cntl_set, "0x%08lx");
+ }
+
+@@ -327,7 +464,7 @@
+ struct spufs_inode_info *i = SPUFS_I(inode);
+ struct spu_context *ctx = i->i_ctx;
+
+- simple_attr_close(inode, file);
++ spufs_attr_release(inode, file);
+
+ mutex_lock(&ctx->mapping_lock);
+ if (!--i->i_openers)
+@@ -339,8 +476,8 @@
+ static const struct file_operations spufs_cntl_fops = {
+ .open = spufs_cntl_open,
+ .release = spufs_cntl_release,
+- .read = simple_attr_read,
+- .write = simple_attr_write,
++ .read = spufs_attr_read,
++ .write = spufs_attr_write,
+ .mmap = spufs_cntl_mmap,
+ };
+
+@@ -368,7 +505,9 @@
+ int ret;
+ struct spu_context *ctx = file->private_data;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ ret = __spufs_regs_read(ctx, buffer, size, pos);
+ spu_release_saved(ctx);
+ return ret;
+@@ -387,7 +526,9 @@
+ return -EFBIG;
+ *pos += size;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+
+ ret = copy_from_user(lscsa->gprs + *pos - size,
+ buffer, size) ? -EFAULT : size;
+@@ -419,7 +560,9 @@
+ int ret;
+ struct spu_context *ctx = file->private_data;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ ret = __spufs_fpcr_read(ctx, buffer, size, pos);
+ spu_release_saved(ctx);
+ return ret;
+@@ -436,10 +579,12 @@
+ size = min_t(ssize_t, sizeof(lscsa->fpcr) - *pos, size);
+ if (size <= 0)
+ return -EFBIG;
+- *pos += size;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+
++ *pos += size;
+ ret = copy_from_user((char *)&lscsa->fpcr + *pos - size,
+ buffer, size) ? -EFAULT : size;
+
+@@ -486,7 +631,10 @@
+
+ udata = (void __user *)buf;
+
+- spu_acquire(ctx);
++ count = spu_acquire(ctx);
++ if (count)
++ return count;
++
+ for (count = 0; (count + 4) <= len; count += 4, udata++) {
+ int ret;
+ ret = ctx->ops->mbox_read(ctx, &mbox_data);
+@@ -522,12 +670,15 @@
+ size_t len, loff_t *pos)
+ {
+ struct spu_context *ctx = file->private_data;
++ ssize_t ret;
+ u32 mbox_stat;
+
+ if (len < 4)
+ return -EINVAL;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+
+ mbox_stat = ctx->ops->mbox_stat_read(ctx) & 0xff;
+
+@@ -562,6 +713,9 @@
+ {
+ struct spu_context *ctx = spu->ctx;
+
++ if (!ctx)
++ return;
++
+ wake_up_all(&ctx->ibox_wq);
+ kill_fasync(&ctx->ibox_fasync, SIGIO, POLLIN);
+ }
+@@ -593,7 +747,9 @@
+
+ udata = (void __user *)buf;
+
+- spu_acquire(ctx);
++ count = spu_acquire(ctx);
++ if (count)
++ return count;
+
+ /* wait only for the first element */
+ count = 0;
+@@ -639,7 +795,11 @@
+
+ poll_wait(file, &ctx->ibox_wq, wait);
+
+- spu_acquire(ctx);
++ /*
++ * For now keep this uninterruptible and also ignore the rule
++ * that poll should not sleep. Will be fixed later.
++ */
++ mutex_lock(&ctx->state_mutex);
+ mask = ctx->ops->mbox_stat_poll(ctx, POLLIN | POLLRDNORM);
+ spu_release(ctx);
+
+@@ -657,12 +817,15 @@
+ size_t len, loff_t *pos)
+ {
+ struct spu_context *ctx = file->private_data;
++ ssize_t ret;
+ u32 ibox_stat;
+
+ if (len < 4)
+ return -EINVAL;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ibox_stat = (ctx->ops->mbox_stat_read(ctx) >> 16) & 0xff;
+ spu_release(ctx);
+
+@@ -698,6 +861,9 @@
+ {
+ struct spu_context *ctx = spu->ctx;
+
++ if (!ctx)
++ return;
++
+ wake_up_all(&ctx->wbox_wq);
+ kill_fasync(&ctx->wbox_fasync, SIGIO, POLLOUT);
+ }
+@@ -731,7 +897,9 @@
+ if (__get_user(wbox_data, udata))
+ return -EFAULT;
+
+- spu_acquire(ctx);
++ count = spu_acquire(ctx);
++ if (count)
++ return count;
+
+ /*
+ * make sure we can at least write one element, by waiting
+@@ -772,7 +940,11 @@
+
+ poll_wait(file, &ctx->wbox_wq, wait);
+
+- spu_acquire(ctx);
++ /*
++ * For now keep this uninterruptible and also ignore the rule
++ * that poll should not sleep. Will be fixed later.
++ */
++ mutex_lock(&ctx->state_mutex);
+ mask = ctx->ops->mbox_stat_poll(ctx, POLLOUT | POLLWRNORM);
+ spu_release(ctx);
+
+@@ -790,12 +962,15 @@
+ size_t len, loff_t *pos)
+ {
+ struct spu_context *ctx = file->private_data;
++ ssize_t ret;
+ u32 wbox_stat;
+
+ if (len < 4)
+ return -EINVAL;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ wbox_stat = (ctx->ops->mbox_stat_read(ctx) >> 8) & 0xff;
+ spu_release(ctx);
+
+@@ -866,7 +1041,9 @@
+ int ret;
+ struct spu_context *ctx = file->private_data;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ ret = __spufs_signal1_read(ctx, buf, len, pos);
+ spu_release_saved(ctx);
+
+@@ -877,6 +1054,7 @@
+ size_t len, loff_t *pos)
+ {
+ struct spu_context *ctx;
++ ssize_t ret;
+ u32 data;
+
+ ctx = file->private_data;
+@@ -887,7 +1065,9 @@
+ if (copy_from_user(&data, buf, 4))
+ return -EFAULT;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->signal1_write(ctx, data);
+ spu_release(ctx);
+
+@@ -997,7 +1177,9 @@
+ struct spu_context *ctx = file->private_data;
+ int ret;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ ret = __spufs_signal2_read(ctx, buf, len, pos);
+ spu_release_saved(ctx);
+
+@@ -1008,6 +1190,7 @@
+ size_t len, loff_t *pos)
+ {
+ struct spu_context *ctx;
++ ssize_t ret;
+ u32 data;
+
+ ctx = file->private_data;
+@@ -1018,7 +1201,9 @@
+ if (copy_from_user(&data, buf, 4))
+ return -EFAULT;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->signal2_write(ctx, data);
+ spu_release(ctx);
+
+@@ -1086,33 +1271,42 @@
+ #define SPU_ATTR_ACQUIRE_SAVED 2
+
+ #define DEFINE_SPUFS_ATTRIBUTE(__name, __get, __set, __fmt, __acquire) \
+-static u64 __##__get(void *data) \
++static int __##__get(void *data, u64 *val) \
+ { \
+ struct spu_context *ctx = data; \
+- u64 ret; \
++ int ret = 0; \
+ \
+ if (__acquire == SPU_ATTR_ACQUIRE) { \
+- spu_acquire(ctx); \
+- ret = __get(ctx); \
++ ret = spu_acquire(ctx); \
++ if (ret) \
++ return ret; \
++ *val = __get(ctx); \
+ spu_release(ctx); \
+ } else if (__acquire == SPU_ATTR_ACQUIRE_SAVED) { \
+- spu_acquire_saved(ctx); \
+- ret = __get(ctx); \
++ ret = spu_acquire_saved(ctx); \
++ if (ret) \
++ return ret; \
++ *val = __get(ctx); \
+ spu_release_saved(ctx); \
+ } else \
+- ret = __get(ctx); \
++ *val = __get(ctx); \
+ \
+- return ret; \
++ return 0; \
+ } \
+-DEFINE_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
++DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
+
+-static void spufs_signal1_type_set(void *data, u64 val)
++static int spufs_signal1_type_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
++ int ret;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->signal1_type_set(ctx, val);
+ spu_release(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_signal1_type_get(struct spu_context *ctx)
+@@ -1123,13 +1317,18 @@
+ spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
+
+
+-static void spufs_signal2_type_set(void *data, u64 val)
++static int spufs_signal2_type_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
++ int ret;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->signal2_type_set(ctx, val);
+ spu_release(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_signal2_type_get(struct spu_context *ctx)
+@@ -1329,6 +1528,9 @@
+ {
+ struct spu_context *ctx = spu->ctx;
+
++ if (!ctx)
++ return;
++
+ wake_up_all(&ctx->mfc_wq);
+
+ pr_debug("%s %s\n", __FUNCTION__, spu->name);
+@@ -1375,12 +1577,17 @@
+ if (size != 4)
+ goto out;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
++
++ ret = -EINVAL;
+ if (file->f_flags & O_NONBLOCK) {
+ status = ctx->ops->read_mfc_tagstatus(ctx);
+ if (!(status & ctx->tagwait))
+ ret = -EAGAIN;
+ else
++ /* XXX(hch): shouldn't we clear ret here? */
+ ctx->tagwait &= ~status;
+ } else {
+ ret = spufs_wait(ctx->mfc_wq,
+@@ -1505,7 +1712,11 @@
+ if (ret)
+ goto out;
+
+- ret = spu_acquire_runnable(ctx, 0);
++ ret = spu_acquire(ctx);
++ if (ret)
++ goto out;
++
++ ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
+ if (ret)
+ goto out;
+
+@@ -1539,7 +1750,11 @@
+
+ poll_wait(file, &ctx->mfc_wq, wait);
+
+- spu_acquire(ctx);
++ /*
++ * For now keep this uninterruptible and also ignore the rule
++ * that poll should not sleep. Will be fixed later.
++ */
++ mutex_lock(&ctx->state_mutex);
+ ctx->ops->set_mfc_query(ctx, ctx->tagwait, 2);
+ free_elements = ctx->ops->get_mfc_free_elements(ctx);
+ tagstatus = ctx->ops->read_mfc_tagstatus(ctx);
+@@ -1562,7 +1777,9 @@
+ struct spu_context *ctx = file->private_data;
+ int ret;
+
+- spu_acquire(ctx);
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ #if 0
+ /* this currently hangs */
+ ret = spufs_wait(ctx->mfc_wq,
+@@ -1605,12 +1822,18 @@
+ .mmap = spufs_mfc_mmap,
+ };
+
+-static void spufs_npc_set(void *data, u64 val)
++static int spufs_npc_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
+- spu_acquire(ctx);
++ int ret;
++
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+ ctx->ops->npc_write(ctx, val);
+ spu_release(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_npc_get(struct spu_context *ctx)
+@@ -1620,13 +1843,19 @@
+ DEFINE_SPUFS_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set,
+ "0x%llx\n", SPU_ATTR_ACQUIRE);
+
+-static void spufs_decr_set(void *data, u64 val)
++static int spufs_decr_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
+ struct spu_lscsa *lscsa = ctx->csa.lscsa;
+- spu_acquire_saved(ctx);
++ int ret;
++
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ lscsa->decr.slot[0] = (u32) val;
+ spu_release_saved(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_decr_get(struct spu_context *ctx)
+@@ -1637,15 +1866,21 @@
+ DEFINE_SPUFS_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set,
+ "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED);
+
+-static void spufs_decr_status_set(void *data, u64 val)
++static int spufs_decr_status_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
+- spu_acquire_saved(ctx);
++ int ret;
++
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ if (val)
+ ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_DECREMENTER_RUNNING;
+ else
+ ctx->csa.priv2.mfc_control_RW &= ~MFC_CNTL_DECREMENTER_RUNNING;
+ spu_release_saved(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_decr_status_get(struct spu_context *ctx)
+@@ -1659,13 +1894,19 @@
+ spufs_decr_status_set, "0x%llx\n",
+ SPU_ATTR_ACQUIRE_SAVED);
+
+-static void spufs_event_mask_set(void *data, u64 val)
++static int spufs_event_mask_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
+ struct spu_lscsa *lscsa = ctx->csa.lscsa;
+- spu_acquire_saved(ctx);
++ int ret;
++
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ lscsa->event_mask.slot[0] = (u32) val;
+ spu_release_saved(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_event_mask_get(struct spu_context *ctx)
+@@ -1690,13 +1931,19 @@
+ DEFINE_SPUFS_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get,
+ NULL, "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED)
+
+-static void spufs_srr0_set(void *data, u64 val)
++static int spufs_srr0_set(void *data, u64 val)
+ {
+ struct spu_context *ctx = data;
+ struct spu_lscsa *lscsa = ctx->csa.lscsa;
+- spu_acquire_saved(ctx);
++ int ret;
++
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ lscsa->srr0.slot[0] = (u32) val;
+ spu_release_saved(ctx);
++
++ return 0;
+ }
+
+ static u64 spufs_srr0_get(struct spu_context *ctx)
+@@ -1727,10 +1974,12 @@
+ return ctx->object_id;
+ }
+
+-static void spufs_object_id_set(void *data, u64 id)
++static int spufs_object_id_set(void *data, u64 id)
+ {
+ struct spu_context *ctx = data;
+ ctx->object_id = id;
++
++ return 0;
+ }
+
+ DEFINE_SPUFS_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get,
+@@ -1777,13 +2026,13 @@
+ static ssize_t __spufs_mbox_info_read(struct spu_context *ctx,
+ char __user *buf, size_t len, loff_t *pos)
+ {
+- u32 mbox_stat;
+ u32 data;
+
+- mbox_stat = ctx->csa.prob.mb_stat_R;
+- if (mbox_stat & 0x0000ff) {
+- data = ctx->csa.prob.pu_mb_R;
+- }
++ /* EOF if there's no entry in the mbox */
++ if (!(ctx->csa.prob.mb_stat_R & 0x0000ff))
++ return 0;
++
++ data = ctx->csa.prob.pu_mb_R;
+
+ return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
+ }
+@@ -1797,7 +2046,9 @@
+ if (!access_ok(VERIFY_WRITE, buf, len))
+ return -EFAULT;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ spin_lock(&ctx->csa.register_lock);
+ ret = __spufs_mbox_info_read(ctx, buf, len, pos);
+ spin_unlock(&ctx->csa.register_lock);
+@@ -1815,13 +2066,13 @@
+ static ssize_t __spufs_ibox_info_read(struct spu_context *ctx,
+ char __user *buf, size_t len, loff_t *pos)
+ {
+- u32 ibox_stat;
+ u32 data;
+
+- ibox_stat = ctx->csa.prob.mb_stat_R;
+- if (ibox_stat & 0xff0000) {
+- data = ctx->csa.priv2.puint_mb_R;
+- }
++ /* EOF if there's no entry in the ibox */
++ if (!(ctx->csa.prob.mb_stat_R & 0xff0000))
++ return 0;
++
++ data = ctx->csa.priv2.puint_mb_R;
+
+ return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
+ }
+@@ -1835,7 +2086,9 @@
+ if (!access_ok(VERIFY_WRITE, buf, len))
+ return -EFAULT;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ spin_lock(&ctx->csa.register_lock);
+ ret = __spufs_ibox_info_read(ctx, buf, len, pos);
+ spin_unlock(&ctx->csa.register_lock);
+@@ -1876,7 +2129,9 @@
+ if (!access_ok(VERIFY_WRITE, buf, len))
+ return -EFAULT;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ spin_lock(&ctx->csa.register_lock);
+ ret = __spufs_wbox_info_read(ctx, buf, len, pos);
+ spin_unlock(&ctx->csa.register_lock);
+@@ -1926,7 +2181,9 @@
+ if (!access_ok(VERIFY_WRITE, buf, len))
+ return -EFAULT;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ spin_lock(&ctx->csa.register_lock);
+ ret = __spufs_dma_info_read(ctx, buf, len, pos);
+ spin_unlock(&ctx->csa.register_lock);
+@@ -1977,7 +2234,9 @@
+ struct spu_context *ctx = file->private_data;
+ int ret;
+
+- spu_acquire_saved(ctx);
++ ret = spu_acquire_saved(ctx);
++ if (ret)
++ return ret;
+ spin_lock(&ctx->csa.register_lock);
+ ret = __spufs_proxydma_info_read(ctx, buf, len, pos);
+ spin_unlock(&ctx->csa.register_lock);
+@@ -2066,8 +2325,12 @@
+ static int spufs_show_stat(struct seq_file *s, void *private)
+ {
+ struct spu_context *ctx = s->private;
++ int ret;
++
++ ret = spu_acquire(ctx);
++ if (ret)
++ return ret;
+
+- spu_acquire(ctx);
+ seq_printf(s, "%s %llu %llu %llu %llu "
+ "%llu %llu %llu %llu %llu %llu %llu %llu\n",
+ ctx_state_names[ctx->stats.util_state],
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/hw_ops.c powerpc.git/arch/powerpc/platforms/cell/spufs/hw_ops.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/hw_ops.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/hw_ops.c 2008-01-28 20:25:49.000000000 +0100
+@@ -76,16 +76,18 @@
+ if (stat & 0xff0000)
+ ret |= POLLIN | POLLRDNORM;
+ else {
+- spu_int_stat_clear(spu, 2, 0x1);
+- spu_int_mask_or(spu, 2, 0x1);
++ spu_int_stat_clear(spu, 2, CLASS2_MAILBOX_INTR);
++ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
+ }
+ }
+ if (events & (POLLOUT | POLLWRNORM)) {
+ if (stat & 0x00ff00)
+ ret = POLLOUT | POLLWRNORM;
+ else {
+- spu_int_stat_clear(spu, 2, 0x10);
+- spu_int_mask_or(spu, 2, 0x10);
++ spu_int_stat_clear(spu, 2,
++ CLASS2_MAILBOX_THRESHOLD_INTR);
++ spu_int_mask_or(spu, 2,
++ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
+ }
+ }
+ spin_unlock_irq(&spu->register_lock);
+@@ -106,7 +108,7 @@
+ ret = 4;
+ } else {
+ /* make sure we get woken up by the interrupt */
+- spu_int_mask_or(spu, 2, 0x1);
++ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
+ ret = 0;
+ }
+ spin_unlock_irq(&spu->register_lock);
+@@ -127,7 +129,7 @@
+ } else {
+ /* make sure we get woken up by the interrupt when space
+ becomes available */
+- spu_int_mask_or(spu, 2, 0x10);
++ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
+ ret = 0;
+ }
+ spin_unlock_irq(&spu->register_lock);
+@@ -206,6 +208,11 @@
+ return ctx->spu->local_store;
+ }
+
++static void spu_hw_privcntl_write(struct spu_context *ctx, u64 val)
++{
++ out_be64(&ctx->spu->priv2->spu_privcntl_RW, val);
++}
++
+ static u32 spu_hw_runcntl_read(struct spu_context *ctx)
+ {
+ return in_be32(&ctx->spu->problem->spu_runcntl_RW);
+@@ -215,11 +222,21 @@
+ {
+ spin_lock_irq(&ctx->spu->register_lock);
+ if (val & SPU_RUNCNTL_ISOLATE)
+- out_be64(&ctx->spu->priv2->spu_privcntl_RW, 4LL);
++ spu_hw_privcntl_write(ctx,
++ SPU_PRIVCNT_LOAD_REQUEST_ENABLE_MASK);
+ out_be32(&ctx->spu->problem->spu_runcntl_RW, val);
+ spin_unlock_irq(&ctx->spu->register_lock);
+ }
+
++static void spu_hw_runcntl_stop(struct spu_context *ctx)
++{
++ spin_lock_irq(&ctx->spu->register_lock);
++ out_be32(&ctx->spu->problem->spu_runcntl_RW, SPU_RUNCNTL_STOP);
++ while (in_be32(&ctx->spu->problem->spu_status_R) & SPU_STATUS_RUNNING)
++ cpu_relax();
++ spin_unlock_irq(&ctx->spu->register_lock);
++}
++
+ static void spu_hw_master_start(struct spu_context *ctx)
+ {
+ struct spu *spu = ctx->spu;
+@@ -319,8 +336,10 @@
+ .npc_write = spu_hw_npc_write,
+ .status_read = spu_hw_status_read,
+ .get_ls = spu_hw_get_ls,
++ .privcntl_write = spu_hw_privcntl_write,
+ .runcntl_read = spu_hw_runcntl_read,
+ .runcntl_write = spu_hw_runcntl_write,
++ .runcntl_stop = spu_hw_runcntl_stop,
+ .master_start = spu_hw_master_start,
+ .master_stop = spu_hw_master_stop,
+ .set_mfc_query = spu_hw_set_mfc_query,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c powerpc.git/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -28,6 +28,8 @@
+ #include <asm/spu_csa.h>
+ #include <asm/mmu.h>
+
++#include "spufs.h"
++
+ static int spu_alloc_lscsa_std(struct spu_state *csa)
+ {
+ struct spu_lscsa *lscsa;
+@@ -73,7 +75,7 @@
+ int i, j, n_4k;
+
+ /* Check availability of 64K pages */
+- if (mmu_psize_defs[MMU_PAGE_64K].shift == 0)
++ if (!spu_64k_pages_available())
+ goto fail;
+
+ csa->use_big_pages = 1;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/run.c powerpc.git/arch/powerpc/platforms/cell/spufs/run.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/run.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/run.c 2008-01-28 20:25:49.000000000 +0100
+@@ -15,24 +15,55 @@
+ {
+ struct spu_context *ctx = spu->ctx;
+
+- wake_up_all(&ctx->stop_wq);
++ /*
++ * It should be impossible to preempt a context while an exception
++ * is being processed, since the context switch code is specially
++ * coded to deal with interrupts ... But, just in case, sanity check
++ * the context pointer. It is OK to return doing nothing since
++ * the exception will be regenerated when the context is resumed.
++ */
++ if (ctx) {
++ /* Copy exception arguments into module specific structure */
++ ctx->csa.class_0_pending = spu->class_0_pending;
++ ctx->csa.dsisr = spu->dsisr;
++ ctx->csa.dar = spu->dar;
++
++ /* ensure that the exception status has hit memory before a
++ * thread waiting on the context's stop queue is woken */
++ smp_wmb();
++
++ wake_up_all(&ctx->stop_wq);
++ }
++
++ /* Clear callback arguments from spu structure */
++ spu->class_0_pending = 0;
++ spu->dsisr = 0;
++ spu->dar = 0;
+ }
+
+-static inline int spu_stopped(struct spu_context *ctx, u32 *stat)
++int spu_stopped(struct spu_context *ctx, u32 *stat)
+ {
+- struct spu *spu;
+- u64 pte_fault;
++ u64 dsisr;
++ u32 stopped;
+
+ *stat = ctx->ops->status_read(ctx);
+
+- spu = ctx->spu;
+- if (ctx->state != SPU_STATE_RUNNABLE ||
+- test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
++ if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
++ return 1;
++
++ stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
++ SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
++ if (*stat & stopped)
++ return 1;
++
++ dsisr = ctx->csa.dsisr;
++ if (dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED))
+ return 1;
+- pte_fault = spu->dsisr &
+- (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
+- return (!(*stat & SPU_STATUS_RUNNING) || pte_fault || spu->class_0_pending) ?
+- 1 : 0;
++
++ if (ctx->csa.class_0_pending)
++ return 1;
++
++ return 0;
+ }
+
+ static int spu_setup_isolated(struct spu_context *ctx)
+@@ -128,34 +159,66 @@
+
+ static int spu_run_init(struct spu_context *ctx, u32 *npc)
+ {
++ unsigned long runcntl = SPU_RUNCNTL_RUNNABLE;
++ int ret;
++
+ spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
+
+- if (ctx->flags & SPU_CREATE_ISOLATE) {
+- unsigned long runcntl;
++ /*
++ * NOSCHED is synchronous scheduling with respect to the caller.
++ * The caller waits for the context to be loaded.
++ */
++ if (ctx->flags & SPU_CREATE_NOSCHED) {
++ if (ctx->state == SPU_STATE_SAVED) {
++ ret = spu_activate(ctx, 0);
++ if (ret)
++ return ret;
++ }
++ }
+
++ /*
++ * Apply special setup as required.
++ */
++ if (ctx->flags & SPU_CREATE_ISOLATE) {
+ if (!(ctx->ops->status_read(ctx) & SPU_STATUS_ISOLATED_STATE)) {
+- int ret = spu_setup_isolated(ctx);
++ ret = spu_setup_isolated(ctx);
+ if (ret)
+ return ret;
+ }
+
+- /* if userspace has set the runcntrl register (eg, to issue an
+- * isolated exit), we need to re-set it here */
++ /*
++ * If userspace has set the runcntrl register (eg, to
++ * issue an isolated exit), we need to re-set it here
++ */
+ runcntl = ctx->ops->runcntl_read(ctx) &
+ (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
+ if (runcntl == 0)
+ runcntl = SPU_RUNCNTL_RUNNABLE;
++ }
++
++ if (ctx->flags & SPU_CREATE_NOSCHED) {
++ spuctx_switch_state(ctx, SPU_UTIL_USER);
+ ctx->ops->runcntl_write(ctx, runcntl);
+ } else {
+- unsigned long mode = SPU_PRIVCNTL_MODE_NORMAL;
+- ctx->ops->npc_write(ctx, *npc);
++ unsigned long privcntl;
++
+ if (test_thread_flag(TIF_SINGLESTEP))
+- mode = SPU_PRIVCNTL_MODE_SINGLE_STEP;
+- out_be64(&ctx->spu->priv2->spu_privcntl_RW, mode);
+- ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
+- }
++ privcntl = SPU_PRIVCNTL_MODE_SINGLE_STEP;
++ else
++ privcntl = SPU_PRIVCNTL_MODE_NORMAL;
+
+- spuctx_switch_state(ctx, SPU_UTIL_USER);
++ ctx->ops->npc_write(ctx, *npc);
++ ctx->ops->privcntl_write(ctx, privcntl);
++ ctx->ops->runcntl_write(ctx, runcntl);
++
++ if (ctx->state == SPU_STATE_SAVED) {
++ ret = spu_activate(ctx, 0);
++ if (ret)
++ return ret;
++ } else {
++ spuctx_switch_state(ctx, SPU_UTIL_USER);
++ }
++ }
+
+ return 0;
+ }
+@@ -165,6 +228,8 @@
+ {
+ int ret = 0;
+
++ spu_del_from_rq(ctx);
++
+ *status = ctx->ops->status_read(ctx);
+ *npc = ctx->ops->npc_read(ctx);
+
+@@ -177,26 +242,6 @@
+ return ret;
+ }
+
+-static int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
+- u32 *status)
+-{
+- int ret;
+-
+- ret = spu_run_fini(ctx, npc, status);
+- if (ret)
+- return ret;
+-
+- if (*status & (SPU_STATUS_STOPPED_BY_STOP | SPU_STATUS_STOPPED_BY_HALT))
+- return *status;
+-
+- ret = spu_acquire_runnable(ctx, 0);
+- if (ret)
+- return ret;
+-
+- spuctx_switch_state(ctx, SPU_UTIL_USER);
+- return 0;
+-}
+-
+ /*
+ * SPU syscall restarting is tricky because we violate the basic
+ * assumption that the signal handler is running on the interrupted
+@@ -247,7 +292,7 @@
+ u32 ls_pointer, npc;
+ void __iomem *ls;
+ long spu_ret;
+- int ret;
++ int ret, ret2;
+
+ /* get syscall block from local store */
+ npc = ctx->ops->npc_read(ctx) & ~3;
+@@ -269,9 +314,11 @@
+ if (spu_ret <= -ERESTARTSYS) {
+ ret = spu_handle_restartsys(ctx, &spu_ret, &npc);
+ }
+- spu_acquire(ctx);
++ ret2 = spu_acquire(ctx);
+ if (ret == -ERESTARTSYS)
+ return ret;
++ if (ret2)
++ return -EINTR;
+ }
+
+ /* write result, jump over indirect pointer */
+@@ -281,18 +328,6 @@
+ return ret;
+ }
+
+-static inline int spu_process_events(struct spu_context *ctx)
+-{
+- struct spu *spu = ctx->spu;
+- int ret = 0;
+-
+- if (spu->class_0_pending)
+- ret = spu_irq_class_0_bottom(spu);
+- if (!ret && signal_pending(current))
+- ret = -ERESTARTSYS;
+- return ret;
+-}
+-
+ long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *event)
+ {
+ int ret;
+@@ -302,29 +337,14 @@
+ if (mutex_lock_interruptible(&ctx->run_mutex))
+ return -ERESTARTSYS;
+
+- ctx->ops->master_start(ctx);
++ spu_enable_spu(ctx);
+ ctx->event_return = 0;
+
+- spu_acquire(ctx);
+- if (ctx->state == SPU_STATE_SAVED) {
+- __spu_update_sched_info(ctx);
+- spu_set_timeslice(ctx);
+-
+- ret = spu_activate(ctx, 0);
+- if (ret) {
+- spu_release(ctx);
+- goto out;
+- }
+- } else {
+- /*
+- * We have to update the scheduling priority under active_mutex
+- * to protect against find_victim().
+- *
+- * No need to update the timeslice ASAP, it will get updated
+- * once the current one has expired.
+- */
+- spu_update_sched_info(ctx);
+- }
++ ret = spu_acquire(ctx);
++ if (ret)
++ goto out_unlock;
++
++ spu_update_sched_info(ctx);
+
+ ret = spu_run_init(ctx, npc);
+ if (ret) {
+@@ -358,14 +378,12 @@
+ if (ret)
+ break;
+
+- if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
+- ret = spu_reacquire_runnable(ctx, npc, &status);
+- if (ret)
+- goto out2;
+- continue;
+- }
+- ret = spu_process_events(ctx);
++ ret = spufs_handle_class0(ctx);
++ if (ret)
++ break;
+
++ if (signal_pending(current))
++ ret = -ERESTARTSYS;
+ } while (!ret && !(status & (SPU_STATUS_STOPPED_BY_STOP |
+ SPU_STATUS_STOPPED_BY_HALT |
+ SPU_STATUS_SINGLE_STEP)));
+@@ -376,11 +394,10 @@
+ ctx->stats.libassist++;
+
+
+- ctx->ops->master_stop(ctx);
++ spu_disable_spu(ctx);
+ ret = spu_run_fini(ctx, npc, &status);
+ spu_yield(ctx);
+
+-out2:
+ if ((ret == 0) ||
+ ((ret == -ERESTARTSYS) &&
+ ((status & SPU_STATUS_STOPPED_BY_HALT) ||
+@@ -401,6 +418,7 @@
+
+ out:
+ *event = ctx->event_return;
++out_unlock:
+ mutex_unlock(&ctx->run_mutex);
+ return ret;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/sched.c powerpc.git/arch/powerpc/platforms/cell/spufs/sched.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/sched.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/sched.c 2008-01-28 20:25:49.000000000 +0100
+@@ -58,6 +58,7 @@
+ static struct spu_prio_array *spu_prio;
+ static struct task_struct *spusched_task;
+ static struct timer_list spusched_timer;
++static struct timer_list spuloadavg_timer;
+
+ /*
+ * Priority of a normal, non-rt, non-niced'd process (aka nice level 0).
+@@ -105,15 +106,21 @@
+ void __spu_update_sched_info(struct spu_context *ctx)
+ {
+ /*
+- * 32-Bit assignment are atomic on powerpc, and we don't care about
+- * memory ordering here because retriving the controlling thread is
+- * per defintion racy.
++ * assert that the context is not on the runqueue, so it is safe
++ * to change its scheduling parameters.
++ */
++ BUG_ON(!list_empty(&ctx->rq));
++
++ /*
++ * 32-Bit assignments are atomic on powerpc, and we don't care about
++ * memory ordering here because retrieving the controlling thread is
++ * per definition racy.
+ */
+ ctx->tid = current->pid;
+
+ /*
+ * We do our own priority calculations, so we normally want
+- * ->static_prio to start with. Unfortunately thies field
++ * ->static_prio to start with. Unfortunately this field
+ * contains junk for threads with a realtime scheduling
+ * policy so we have to look at ->prio in this case.
+ */
+@@ -124,23 +131,32 @@
+ ctx->policy = current->policy;
+
+ /*
+- * A lot of places that don't hold list_mutex poke into
+- * cpus_allowed, including grab_runnable_context which
+- * already holds the runq_lock. So abuse runq_lock
+- * to protect this field aswell.
++ * TO DO: the context may be loaded, so we may need to activate
++ * it again on a different node. But it shouldn't hurt anything
++ * to update its parameters, because we know that the scheduler
++ * is not actively looking at this field, since it is not on the
++ * runqueue. The context will be rescheduled on the proper node
++ * if it is timesliced or preempted.
+ */
+- spin_lock(&spu_prio->runq_lock);
+ ctx->cpus_allowed = current->cpus_allowed;
+- spin_unlock(&spu_prio->runq_lock);
+ }
+
+ void spu_update_sched_info(struct spu_context *ctx)
+ {
+- int node = ctx->spu->node;
++ int node;
+
+- mutex_lock(&cbe_spu_info[node].list_mutex);
+- __spu_update_sched_info(ctx);
+- mutex_unlock(&cbe_spu_info[node].list_mutex);
++ if (ctx->state == SPU_STATE_RUNNABLE) {
++ node = ctx->spu->node;
++
++ /*
++ * Take list_mutex to sync with find_victim().
++ */
++ mutex_lock(&cbe_spu_info[node].list_mutex);
++ __spu_update_sched_info(ctx);
++ mutex_unlock(&cbe_spu_info[node].list_mutex);
++ } else {
++ __spu_update_sched_info(ctx);
++ }
+ }
+
+ static int __node_allowed(struct spu_context *ctx, int node)
+@@ -174,7 +190,7 @@
+ * Wake up the active spu_contexts.
+ *
+ * When the awakened processes see their "notify_active" flag is set,
+- * they will call spu_switch_notify();
++ * they will call spu_switch_notify().
+ */
+ for_each_online_node(node) {
+ struct spu *spu;
+@@ -221,7 +237,6 @@
+ spu->wbox_callback = spufs_wbox_callback;
+ spu->stop_callback = spufs_stop_callback;
+ spu->mfc_callback = spufs_mfc_callback;
+- spu->dma_callback = spufs_dma_callback;
+ mb();
+ spu_unmap_mappings(ctx);
+ spu_restore(&ctx->csa, spu);
+@@ -409,7 +424,6 @@
+ spu->wbox_callback = NULL;
+ spu->stop_callback = NULL;
+ spu->mfc_callback = NULL;
+- spu->dma_callback = NULL;
+ spu_associate_mm(spu, NULL);
+ spu->pid = 0;
+ spu->tgid = 0;
+@@ -454,6 +468,13 @@
+ }
+ }
+
++static void spu_add_to_rq(struct spu_context *ctx)
++{
++ spin_lock(&spu_prio->runq_lock);
++ __spu_add_to_rq(ctx);
++ spin_unlock(&spu_prio->runq_lock);
++}
++
+ static void __spu_del_from_rq(struct spu_context *ctx)
+ {
+ int prio = ctx->prio;
+@@ -468,10 +489,24 @@
+ }
+ }
+
++void spu_del_from_rq(struct spu_context *ctx)
++{
++ spin_lock(&spu_prio->runq_lock);
++ __spu_del_from_rq(ctx);
++ spin_unlock(&spu_prio->runq_lock);
++}
++
+ static void spu_prio_wait(struct spu_context *ctx)
+ {
+ DEFINE_WAIT(wait);
+
++ /*
++ * The caller must explicitly wait for a context to be loaded
++ * if the nosched flag is set. If NOSCHED is not set, the caller
++ * queues the context and waits for an spu event or error.
++ */
++ BUG_ON(!(ctx->flags & SPU_CREATE_NOSCHED));
++
+ spin_lock(&spu_prio->runq_lock);
+ prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE);
+ if (!signal_pending(current)) {
+@@ -555,7 +590,7 @@
+ /*
+ * Look for a possible preemption candidate on the local node first.
+ * If there is no candidate look at the other nodes. This isn't
+- * exactly fair, but so far the whole spu schedule tries to keep
++ * exactly fair, but so far the whole spu scheduler tries to keep
+ * a strong node affinity. We might want to fine-tune this in
+ * the future.
+ */
+@@ -571,6 +606,7 @@
+ struct spu_context *tmp = spu->ctx;
+
+ if (tmp && tmp->prio > ctx->prio &&
++ !(tmp->flags & SPU_CREATE_NOSCHED) &&
+ (!victim || tmp->prio > victim->prio))
+ victim = spu->ctx;
+ }
+@@ -582,6 +618,10 @@
+ * higher priority contexts before lower priority
+ * ones, so this is safe until we introduce
+ * priority inheritance schemes.
++ *
++ * XXX if the highest priority context is locked,
++ * this can loop a long time. Might be better to
++ * look at another context or give up after X retries.
+ */
+ if (!mutex_trylock(&victim->state_mutex)) {
+ victim = NULL;
+@@ -589,10 +629,10 @@
+ }
+
+ spu = victim->spu;
+- if (!spu) {
++ if (!spu || victim->prio <= ctx->prio) {
+ /*
+ * This race can happen because we've dropped
+- * the active list mutex. No a problem, just
++ * the active list mutex. Not a problem, just
+ * restart the search.
+ */
+ mutex_unlock(&victim->state_mutex);
+@@ -607,13 +647,10 @@
+
+ victim->stats.invol_ctx_switch++;
+ spu->stats.invol_ctx_switch++;
++ spu_add_to_rq(victim);
++
+ mutex_unlock(&victim->state_mutex);
+- /*
+- * We need to break out of the wait loop in spu_run
+- * manually to ensure this context gets put on the
+- * runqueue again ASAP.
+- */
+- wake_up(&victim->stop_wq);
++
+ return spu;
+ }
+ }
+@@ -621,6 +658,50 @@
+ return NULL;
+ }
+
++static void __spu_schedule(struct spu *spu, struct spu_context *ctx)
++{
++ int node = spu->node;
++ int success = 0;
++
++ spu_set_timeslice(ctx);
++
++ mutex_lock(&cbe_spu_info[node].list_mutex);
++ if (spu->ctx == NULL) {
++ spu_bind_context(spu, ctx);
++ cbe_spu_info[node].nr_active++;
++ spu->alloc_state = SPU_USED;
++ success = 1;
++ }
++ mutex_unlock(&cbe_spu_info[node].list_mutex);
++
++ if (success)
++ wake_up_all(&ctx->run_wq);
++ else
++ spu_add_to_rq(ctx);
++}
++
++static void spu_schedule(struct spu *spu, struct spu_context *ctx)
++{
++ /* not a candidate for interruptible because it's called either
++ from the scheduler thread or from spu_deactivate */
++ mutex_lock(&ctx->state_mutex);
++ __spu_schedule(spu, ctx);
++ spu_release(ctx);
++}
++
++static void spu_unschedule(struct spu *spu, struct spu_context *ctx)
++{
++ int node = spu->node;
++
++ mutex_lock(&cbe_spu_info[node].list_mutex);
++ cbe_spu_info[node].nr_active--;
++ spu->alloc_state = SPU_FREE;
++ spu_unbind_context(spu, ctx);
++ ctx->stats.invol_ctx_switch++;
++ spu->stats.invol_ctx_switch++;
++ mutex_unlock(&cbe_spu_info[node].list_mutex);
++}
++
+ /**
+ * spu_activate - find a free spu for a context and execute it
+ * @ctx: spu context to schedule
+@@ -632,39 +713,47 @@
+ */
+ int spu_activate(struct spu_context *ctx, unsigned long flags)
+ {
+- do {
+- struct spu *spu;
++ struct spu *spu;
+
+- /*
+- * If there are multiple threads waiting for a single context
+- * only one actually binds the context while the others will
+- * only be able to acquire the state_mutex once the context
+- * already is in runnable state.
+- */
+- if (ctx->spu)
+- return 0;
++ /*
++ * If there are multiple threads waiting for a single context
++ * only one actually binds the context while the others will
++ * only be able to acquire the state_mutex once the context
++ * already is in runnable state.
++ */
++ if (ctx->spu)
++ return 0;
+
+- spu = spu_get_idle(ctx);
+- /*
+- * If this is a realtime thread we try to get it running by
+- * preempting a lower priority thread.
+- */
+- if (!spu && rt_prio(ctx->prio))
+- spu = find_victim(ctx);
+- if (spu) {
+- int node = spu->node;
++spu_activate_top:
++ if (signal_pending(current))
++ return -ERESTARTSYS;
+
+- mutex_lock(&cbe_spu_info[node].list_mutex);
+- spu_bind_context(spu, ctx);
+- cbe_spu_info[node].nr_active++;
+- mutex_unlock(&cbe_spu_info[node].list_mutex);
+- return 0;
+- }
++ spu = spu_get_idle(ctx);
++ /*
++ * If this is a realtime thread we try to get it running by
++ * preempting a lower priority thread.
++ */
++ if (!spu && rt_prio(ctx->prio))
++ spu = find_victim(ctx);
++ if (spu) {
++ unsigned long runcntl;
+
++ runcntl = ctx->ops->runcntl_read(ctx);
++ __spu_schedule(spu, ctx);
++ if (runcntl & SPU_RUNCNTL_RUNNABLE)
++ spuctx_switch_state(ctx, SPU_UTIL_USER);
++
++ return 0;
++ }
++
++ if (ctx->flags & SPU_CREATE_NOSCHED) {
+ spu_prio_wait(ctx);
+- } while (!signal_pending(current));
++ goto spu_activate_top;
++ }
++
++ spu_add_to_rq(ctx);
+
+- return -ERESTARTSYS;
++ return 0;
+ }
+
+ /**
+@@ -706,21 +795,19 @@
+ if (spu) {
+ new = grab_runnable_context(max_prio, spu->node);
+ if (new || force) {
+- int node = spu->node;
+-
+- mutex_lock(&cbe_spu_info[node].list_mutex);
+- spu_unbind_context(spu, ctx);
+- spu->alloc_state = SPU_FREE;
+- cbe_spu_info[node].nr_active--;
+- mutex_unlock(&cbe_spu_info[node].list_mutex);
+-
+- ctx->stats.vol_ctx_switch++;
+- spu->stats.vol_ctx_switch++;
+-
+- if (new)
+- wake_up(&new->stop_wq);
++ spu_unschedule(spu, ctx);
++ if (new) {
++ if (new->flags & SPU_CREATE_NOSCHED)
++ wake_up(&new->stop_wq);
++ else {
++ spu_release(ctx);
++ spu_schedule(spu, new);
++ /* this one can't easily be made
++ interruptible */
++ mutex_lock(&ctx->state_mutex);
++ }
++ }
+ }
+-
+ }
+
+ return new != NULL;
+@@ -757,43 +844,38 @@
+
+ static noinline void spusched_tick(struct spu_context *ctx)
+ {
++ struct spu_context *new = NULL;
++ struct spu *spu = NULL;
++ u32 status;
++
++ if (spu_acquire(ctx))
++ BUG(); /* a kernel thread never has signals pending */
++
++ if (ctx->state != SPU_STATE_RUNNABLE)
++ goto out;
++ if (spu_stopped(ctx, &status))
++ goto out;
+ if (ctx->flags & SPU_CREATE_NOSCHED)
+- return;
++ goto out;
+ if (ctx->policy == SCHED_FIFO)
+- return;
++ goto out;
+
+ if (--ctx->time_slice)
+- return;
+-
+- /*
+- * Unfortunately list_mutex ranks outside of state_mutex, so
+- * we have to trylock here. If we fail give the context another
+- * tick and try again.
+- */
+- if (mutex_trylock(&ctx->state_mutex)) {
+- struct spu *spu = ctx->spu;
+- struct spu_context *new;
++ goto out;
+
+- new = grab_runnable_context(ctx->prio + 1, spu->node);
+- if (new) {
+- spu_unbind_context(spu, ctx);
+- ctx->stats.invol_ctx_switch++;
+- spu->stats.invol_ctx_switch++;
+- spu->alloc_state = SPU_FREE;
+- cbe_spu_info[spu->node].nr_active--;
+- wake_up(&new->stop_wq);
+- /*
+- * We need to break out of the wait loop in
+- * spu_run manually to ensure this context
+- * gets put on the runqueue again ASAP.
+- */
+- wake_up(&ctx->stop_wq);
+- }
+- spu_set_timeslice(ctx);
+- mutex_unlock(&ctx->state_mutex);
++ spu = ctx->spu;
++ new = grab_runnable_context(ctx->prio + 1, spu->node);
++ if (new) {
++ spu_unschedule(spu, ctx);
++ spu_add_to_rq(ctx);
+ } else {
+ ctx->time_slice++;
+ }
++out:
++ spu_release(ctx);
++
++ if (new)
++ spu_schedule(spu, new);
+ }
+
+ /**
+@@ -817,35 +899,31 @@
+ }
+
+ /**
+- * spu_calc_load - given tick count, update the avenrun load estimates.
+- * @tick: tick count
++ * spu_calc_load - update the avenrun load estimates.
+ *
+ * No locking against reading these values from userspace, as for
+ * the CPU loadavg code.
+ */
+-static void spu_calc_load(unsigned long ticks)
++static void spu_calc_load(void)
+ {
+ unsigned long active_tasks; /* fixed-point */
+- static int count = LOAD_FREQ;
+
+- count -= ticks;
+-
+- if (unlikely(count < 0)) {
+- active_tasks = count_active_contexts() * FIXED_1;
+- do {
+- CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
+- CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
+- CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
+- count += LOAD_FREQ;
+- } while (count < 0);
+- }
++ active_tasks = count_active_contexts() * FIXED_1;
++ CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
++ CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
++ CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
+ }
+
+ static void spusched_wake(unsigned long data)
+ {
+ mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK);
+ wake_up_process(spusched_task);
+- spu_calc_load(SPUSCHED_TICK);
++}
++
++static void spuloadavg_wake(unsigned long data)
++{
++ mod_timer(&spuloadavg_timer, jiffies + LOAD_FREQ);
++ spu_calc_load();
+ }
+
+ static int spusched_thread(void *unused)
+@@ -857,17 +935,58 @@
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule();
+ for (node = 0; node < MAX_NUMNODES; node++) {
+- mutex_lock(&cbe_spu_info[node].list_mutex);
+- list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list)
+- if (spu->ctx)
+- spusched_tick(spu->ctx);
+- mutex_unlock(&cbe_spu_info[node].list_mutex);
++ struct mutex *mtx = &cbe_spu_info[node].list_mutex;
++
++ mutex_lock(mtx);
++ list_for_each_entry(spu, &cbe_spu_info[node].spus,
++ cbe_list) {
++ struct spu_context *ctx = spu->ctx;
++
++ if (ctx) {
++ mutex_unlock(mtx);
++ spusched_tick(ctx);
++ mutex_lock(mtx);
++ }
++ }
++ mutex_unlock(mtx);
+ }
+ }
+
+ return 0;
+ }
+
++void spuctx_switch_state(struct spu_context *ctx,
++ enum spu_utilization_state new_state)
++{
++ unsigned long long curtime;
++ signed long long delta;
++ struct timespec ts;
++ struct spu *spu;
++ enum spu_utilization_state old_state;
++
++ ktime_get_ts(&ts);
++ curtime = timespec_to_ns(&ts);
++ delta = curtime - ctx->stats.tstamp;
++
++ WARN_ON(!mutex_is_locked(&ctx->state_mutex));
++ WARN_ON(delta < 0);
++
++ spu = ctx->spu;
++ old_state = ctx->stats.util_state;
++ ctx->stats.util_state = new_state;
++ ctx->stats.tstamp = curtime;
++
++ /*
++ * Update the physical SPU utilization statistics.
++ */
++ if (spu) {
++ ctx->stats.times[old_state] += delta;
++ spu->stats.times[old_state] += delta;
++ spu->stats.util_state = new_state;
++ spu->stats.tstamp = curtime;
++ }
++}
++
+ #define LOAD_INT(x) ((x) >> FSHIFT)
+ #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
+
+@@ -881,7 +1000,7 @@
+
+ /*
+ * Note that last_pid doesn't really make much sense for the
+- * SPU loadavg (it even seems very odd on the CPU side..),
++ * SPU loadavg (it even seems very odd on the CPU side...),
+ * but we include it here to have a 100% compatible interface.
+ */
+ seq_printf(s, "%d.%02d %d.%02d %d.%02d %ld/%d %d\n",
+@@ -922,6 +1041,7 @@
+ spin_lock_init(&spu_prio->runq_lock);
+
+ setup_timer(&spusched_timer, spusched_wake, 0);
++ setup_timer(&spuloadavg_timer, spuloadavg_wake, 0);
+
+ spusched_task = kthread_run(spusched_thread, NULL, "spusched");
+ if (IS_ERR(spusched_task)) {
+@@ -929,6 +1049,8 @@
+ goto out_free_spu_prio;
+ }
+
++ mod_timer(&spuloadavg_timer, 0);
++
+ entry = create_proc_entry("spu_loadavg", 0, NULL);
+ if (!entry)
+ goto out_stop_kthread;
+@@ -954,6 +1076,7 @@
+ remove_proc_entry("spu_loadavg", NULL);
+
+ del_timer_sync(&spusched_timer);
++ del_timer_sync(&spuloadavg_timer);
+ kthread_stop(spusched_task);
+
+ for (node = 0; node < MAX_NUMNODES; node++) {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/spufs.h powerpc.git/arch/powerpc/platforms/cell/spufs/spufs.h
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/spufs.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/spufs.h 2008-01-28 20:25:49.000000000 +0100
+@@ -71,6 +71,7 @@
+ wait_queue_head_t wbox_wq;
+ wait_queue_head_t stop_wq;
+ wait_queue_head_t mfc_wq;
++ wait_queue_head_t run_wq;
+ struct fasync_struct *ibox_fasync;
+ struct fasync_struct *wbox_fasync;
+ struct fasync_struct *mfc_fasync;
+@@ -168,8 +169,10 @@
+ void (*npc_write) (struct spu_context * ctx, u32 data);
+ u32(*status_read) (struct spu_context * ctx);
+ char*(*get_ls) (struct spu_context * ctx);
++ void (*privcntl_write) (struct spu_context *ctx, u64 data);
+ u32 (*runcntl_read) (struct spu_context * ctx);
+ void (*runcntl_write) (struct spu_context * ctx, u32 data);
++ void (*runcntl_stop) (struct spu_context * ctx);
+ void (*master_start) (struct spu_context * ctx);
+ void (*master_stop) (struct spu_context * ctx);
+ int (*set_mfc_query)(struct spu_context * ctx, u32 mask, u32 mode);
+@@ -219,15 +222,16 @@
+
+ /* fault handling */
+ int spufs_handle_class1(struct spu_context *ctx);
++int spufs_handle_class0(struct spu_context *ctx);
+
+ /* affinity */
+ struct spu *affinity_check(struct spu_context *ctx);
+
+ /* context management */
+ extern atomic_t nr_spu_contexts;
+-static inline void spu_acquire(struct spu_context *ctx)
++static inline int __must_check spu_acquire(struct spu_context *ctx)
+ {
+- mutex_lock(&ctx->state_mutex);
++ return mutex_lock_interruptible(&ctx->state_mutex);
+ }
+
+ static inline void spu_release(struct spu_context *ctx)
+@@ -242,10 +246,11 @@
+ void spu_unmap_mappings(struct spu_context *ctx);
+
+ void spu_forget(struct spu_context *ctx);
+-int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
+-void spu_acquire_saved(struct spu_context *ctx);
++int __must_check spu_acquire_saved(struct spu_context *ctx);
+ void spu_release_saved(struct spu_context *ctx);
+
++int spu_stopped(struct spu_context *ctx, u32 * stat);
++void spu_del_from_rq(struct spu_context *ctx);
+ int spu_activate(struct spu_context *ctx, unsigned long flags);
+ void spu_deactivate(struct spu_context *ctx);
+ void spu_yield(struct spu_context *ctx);
+@@ -279,7 +284,9 @@
+ } \
+ spu_release(ctx); \
+ schedule(); \
+- spu_acquire(ctx); \
++ __ret = spu_acquire(ctx); \
++ if (__ret) \
++ break; \
+ } \
+ finish_wait(&(wq), &__wait); \
+ __ret; \
+@@ -306,41 +313,16 @@
+ extern struct spufs_coredump_reader spufs_coredump_read[];
+ extern int spufs_coredump_num_notes;
+
+-/*
+- * This function is a little bit too large for an inline, but
+- * as fault.c is built into the kernel we can't move it out of
+- * line.
+- */
+-static inline void spuctx_switch_state(struct spu_context *ctx,
+- enum spu_utilization_state new_state)
+-{
+- unsigned long long curtime;
+- signed long long delta;
+- struct timespec ts;
+- struct spu *spu;
+- enum spu_utilization_state old_state;
+-
+- ktime_get_ts(&ts);
+- curtime = timespec_to_ns(&ts);
+- delta = curtime - ctx->stats.tstamp;
+-
+- WARN_ON(!mutex_is_locked(&ctx->state_mutex));
+- WARN_ON(delta < 0);
+-
+- spu = ctx->spu;
+- old_state = ctx->stats.util_state;
+- ctx->stats.util_state = new_state;
+- ctx->stats.tstamp = curtime;
+-
+- /*
+- * Update the physical SPU utilization statistics.
+- */
+- if (spu) {
+- ctx->stats.times[old_state] += delta;
+- spu->stats.times[old_state] += delta;
+- spu->stats.util_state = new_state;
+- spu->stats.tstamp = curtime;
+- }
+-}
++extern int spu_init_csa(struct spu_state *csa);
++extern void spu_fini_csa(struct spu_state *csa);
++extern int spu_save(struct spu_state *prev, struct spu *spu);
++extern int spu_restore(struct spu_state *new, struct spu *spu);
++extern int spu_switch(struct spu_state *prev, struct spu_state *new,
++ struct spu *spu);
++extern int spu_alloc_lscsa(struct spu_state *csa);
++extern void spu_free_lscsa(struct spu_state *csa);
++
++extern void spuctx_switch_state(struct spu_context *ctx,
++ enum spu_utilization_state new_state);
+
+ #endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/cell/spufs/switch.c powerpc.git/arch/powerpc/platforms/cell/spufs/switch.c
+--- linux-2.6.24/arch/powerpc/platforms/cell/spufs/switch.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/cell/spufs/switch.c 2008-01-28 20:25:49.000000000 +0100
+@@ -48,6 +48,8 @@
+ #include <asm/spu_csa.h>
+ #include <asm/mmu_context.h>
+
++#include "spufs.h"
++
+ #include "spu_save_dump.h"
+ #include "spu_restore_dump.h"
+
+@@ -691,35 +693,9 @@
+ out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE);
+ }
+
+-static inline void get_kernel_slb(u64 ea, u64 slb[2])
++static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu,
++ unsigned int *code, int code_size)
+ {
+- u64 llp;
+-
+- if (REGION_ID(ea) == KERNEL_REGION_ID)
+- llp = mmu_psize_defs[mmu_linear_psize].sllp;
+- else
+- llp = mmu_psize_defs[mmu_virtual_psize].sllp;
+- slb[0] = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
+- SLB_VSID_KERNEL | llp;
+- slb[1] = (ea & ESID_MASK) | SLB_ESID_V;
+-}
+-
+-static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe)
+-{
+- struct spu_priv2 __iomem *priv2 = spu->priv2;
+-
+- out_be64(&priv2->slb_index_W, slbe);
+- eieio();
+- out_be64(&priv2->slb_vsid_RW, slb[0]);
+- out_be64(&priv2->slb_esid_RW, slb[1]);
+- eieio();
+-}
+-
+-static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu)
+-{
+- u64 code_slb[2];
+- u64 lscsa_slb[2];
+-
+ /* Save, Step 47:
+ * Restore, Step 30.
+ * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All
+@@ -735,11 +711,7 @@
+ * translation is desired by OS environment).
+ */
+ spu_invalidate_slbs(spu);
+- get_kernel_slb((unsigned long)&spu_save_code[0], code_slb);
+- get_kernel_slb((unsigned long)csa->lscsa, lscsa_slb);
+- load_mfc_slb(spu, code_slb, 0);
+- if ((lscsa_slb[0] != code_slb[0]) || (lscsa_slb[1] != code_slb[1]))
+- load_mfc_slb(spu, lscsa_slb, 1);
++ spu_setup_kernel_slbs(spu, csa->lscsa, code, code_size);
+ }
+
+ static inline void set_switch_active(struct spu_state *csa, struct spu *spu)
+@@ -768,9 +740,9 @@
+ * (translation) interrupts.
+ */
+ spin_lock_irq(&spu->register_lock);
+- spu_int_stat_clear(spu, 0, ~0ul);
+- spu_int_stat_clear(spu, 1, ~0ul);
+- spu_int_stat_clear(spu, 2, ~0ul);
++ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
++ spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
++ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
+ spu_int_mask_set(spu, 0, 0ul);
+ spu_int_mask_set(spu, 1, class1_mask);
+ spu_int_mask_set(spu, 2, 0ul);
+@@ -927,8 +899,8 @@
+ POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask);
+
+ local_irq_save(flags);
+- spu_int_stat_clear(spu, 0, ~(0ul));
+- spu_int_stat_clear(spu, 2, ~(0ul));
++ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
++ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
+ local_irq_restore(flags);
+ }
+
+@@ -946,8 +918,8 @@
+ POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING);
+
+ local_irq_save(flags);
+- spu_int_stat_clear(spu, 0, ~(0ul));
+- spu_int_stat_clear(spu, 2, ~(0ul));
++ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
++ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
+ local_irq_restore(flags);
+ }
+
+@@ -1423,9 +1395,9 @@
+ spu_int_mask_set(spu, 0, 0ul);
+ spu_int_mask_set(spu, 1, 0ul);
+ spu_int_mask_set(spu, 2, 0ul);
+- spu_int_stat_clear(spu, 0, ~0ul);
+- spu_int_stat_clear(spu, 1, ~0ul);
+- spu_int_stat_clear(spu, 2, ~0ul);
++ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
++ spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
++ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
+ spin_unlock_irq(&spu->register_lock);
+ }
+
+@@ -1866,7 +1838,8 @@
+ */
+
+ resume_mfc_queue(prev, spu); /* Step 46. */
+- setup_mfc_slbs(prev, spu); /* Step 47. */
++ /* Step 47. */
++ setup_mfc_slbs(prev, spu, spu_save_code, sizeof(spu_save_code));
+ set_switch_active(prev, spu); /* Step 48. */
+ enable_interrupts(prev, spu); /* Step 49. */
+ save_ls_16kb(prev, spu); /* Step 50. */
+@@ -1971,7 +1944,8 @@
+ setup_spu_status_part1(next, spu); /* Step 27. */
+ setup_spu_status_part2(next, spu); /* Step 28. */
+ restore_mfc_rag(next, spu); /* Step 29. */
+- setup_mfc_slbs(next, spu); /* Step 30. */
++ /* Step 30. */
++ setup_mfc_slbs(next, spu, spu_restore_code, sizeof(spu_restore_code));
+ set_spu_npc(next, spu); /* Step 31. */
+ set_signot1(next, spu); /* Step 32. */
+ set_signot2(next, spu); /* Step 33. */
+@@ -2103,10 +2077,6 @@
+ int rc;
+
+ acquire_spu_lock(spu); /* Step 1. */
+- prev->dar = spu->dar;
+- prev->dsisr = spu->dsisr;
+- spu->dar = 0;
+- spu->dsisr = 0;
+ rc = __do_spu_save(prev, spu); /* Steps 2-53. */
+ release_spu_lock(spu);
+ if (rc != 0 && rc != 2 && rc != 6) {
+@@ -2133,9 +2103,6 @@
+ acquire_spu_lock(spu);
+ harvest(NULL, spu);
+ spu->slb_replace = 0;
+- new->dar = 0;
+- new->dsisr = 0;
+- spu->class_0_pending = 0;
+ rc = __do_spu_restore(new, spu);
+ release_spu_lock(spu);
+ if (rc) {
+@@ -2215,10 +2182,8 @@
+
+ return 0;
+ }
+-EXPORT_SYMBOL_GPL(spu_init_csa);
+
+ void spu_fini_csa(struct spu_state *csa)
+ {
+ spu_free_lscsa(csa);
+ }
+-EXPORT_SYMBOL_GPL(spu_fini_csa);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/Kconfig powerpc.git/arch/powerpc/platforms/celleb/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/celleb/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -2,6 +2,8 @@
+ bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
+ depends on PPC_MULTIPLATFORM && PPC64
+ select PPC_CELL
++ select PPC_CELL_NATIVE
++ select PPC_RTAS
+ select PPC_INDIRECT_IO
+ select PPC_OF_PLATFORM_PCI
+ select HAS_TXX9_SERIAL
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/io-workarounds.c powerpc.git/arch/powerpc/platforms/celleb/io-workarounds.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/io-workarounds.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/io-workarounds.c 2008-01-28 20:25:49.000000000 +0100
+@@ -22,6 +22,7 @@
+
+ #undef DEBUG
+
++#include <linux/of.h>
+ #include <linux/of_device.h>
+ #include <linux/irq.h>
+
+@@ -222,7 +223,7 @@
+ void (*dummy_read)(struct pci_controller *))
+ {
+ struct celleb_pci_bus *bus = &celleb_pci_busses[celleb_pci_count];
+- struct device_node *np = phb->arch_data;
++ struct device_node *np = phb->dn;
+
+ if (celleb_pci_count >= MAX_CELLEB_PCI_BUS) {
+ printk(KERN_ERR "Too many pci bridges, workarounds"
+@@ -256,13 +257,13 @@
+
+ celleb_dummy_page_va = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!celleb_dummy_page_va) {
+- printk(KERN_ERR "Celleb: dummy read disabled."
++ printk(KERN_ERR "Celleb: dummy read disabled. "
+ "Alloc celleb_dummy_page_va failed\n");
+ return 1;
+ }
+
+ list_for_each_entry(phb, &hose_list, list_node) {
+- node = phb->arch_data;
++ node = phb->dn;
+ match = of_match_node(celleb_pci_workaround_match, node);
+
+ if (match) {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/iommu.c powerpc.git/arch/powerpc/platforms/celleb/iommu.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/iommu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/iommu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -22,8 +22,9 @@
+ #include <linux/init.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/pci.h>
++#include <linux/of_platform.h>
+
+-#include <asm/of_platform.h>
++#include <asm/machdep.h>
+
+ #include "beat_wrapper.h"
+
+@@ -51,6 +52,8 @@
+ return 0;
+ }
+
++static unsigned long celleb_dma_direct_offset;
++
+ static void __init celleb_init_direct_mapping(void)
+ {
+ u64 lpar_addr, io_addr;
+@@ -68,7 +71,18 @@
+ ioid, DMA_FLAGS);
+ }
+
+- dma_direct_offset = dma_base;
++ celleb_dma_direct_offset = dma_base;
++}
++
++static void celleb_dma_dev_setup(struct device *dev)
++{
++ dev->archdata.dma_ops = get_pci_dma_ops();
++ dev->archdata.dma_data = (void *)celleb_dma_direct_offset;
++}
++
++static void celleb_pci_dma_dev_setup(struct pci_dev *pdev)
++{
++ celleb_dma_dev_setup(&pdev->dev);
+ }
+
+ static int celleb_of_bus_notify(struct notifier_block *nb,
+@@ -80,7 +94,7 @@
+ if (action != BUS_NOTIFY_ADD_DEVICE)
+ return 0;
+
+- dev->archdata.dma_ops = get_pci_dma_ops();
++ celleb_dma_dev_setup(dev);
+
+ return 0;
+ }
+@@ -91,14 +105,12 @@
+
+ static int __init celleb_init_iommu(void)
+ {
+- if (!machine_is(celleb))
+- return -ENODEV;
+-
+ celleb_init_direct_mapping();
+ set_pci_dma_ops(&dma_direct_ops);
++ ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup;
+ bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
+
+ return 0;
+ }
+
+-arch_initcall(celleb_init_iommu);
++machine_arch_initcall(celleb_beat, celleb_init_iommu);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/pci.c powerpc.git/arch/powerpc/platforms/celleb/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -31,6 +31,7 @@
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+ #include <linux/pci_regs.h>
++#include <linux/of.h>
+ #include <linux/of_device.h>
+
+ #include <asm/io.h>
+@@ -138,8 +139,6 @@
+ *val = celleb_fake_config_readl(p);
+ break;
+ }
+-
+- return;
+ }
+
+ static void celleb_config_write_fake(unsigned char *config, int where,
+@@ -158,7 +157,6 @@
+ celleb_fake_config_writel(val, p);
+ break;
+ }
+- return;
+ }
+
+ static int celleb_fake_pci_read_config(struct pci_bus *bus,
+@@ -351,6 +349,10 @@
+ wi1 = of_get_property(node, "vendor-id", NULL);
+ wi2 = of_get_property(node, "class-code", NULL);
+ wi3 = of_get_property(node, "revision-id", NULL);
++ if (!wi0 || !wi1 || !wi2 || !wi3) {
++ printk(KERN_ERR "PCI: Missing device tree properties.\n");
++ goto error;
++ }
+
+ celleb_config_write_fake(*config, PCI_DEVICE_ID, 2, wi0[0] & 0xffff);
+ celleb_config_write_fake(*config, PCI_VENDOR_ID, 2, wi1[0] & 0xffff);
+@@ -372,6 +374,10 @@
+ celleb_setup_pci_base_addrs(hose, devno, fn, num_base_addr);
+
+ li = of_get_property(node, "interrupts", &rlen);
++ if (!li) {
++ printk(KERN_ERR "PCI: interrupts not found.\n");
++ goto error;
++ }
+ val = li[0];
+ celleb_config_write_fake(*config, PCI_INTERRUPT_PIN, 1, 1);
+ celleb_config_write_fake(*config, PCI_INTERRUPT_LINE, 1, val);
+@@ -475,7 +481,7 @@
+
+ int __init celleb_setup_phb(struct pci_controller *phb)
+ {
+- struct device_node *dev = phb->arch_data;
++ struct device_node *dev = phb->dn;
+ const struct of_device_id *match;
+ int (*setup_func)(struct device_node *, struct pci_controller *);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/scc_epci.c powerpc.git/arch/powerpc/platforms/celleb/scc_epci.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/scc_epci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/scc_epci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -95,7 +95,7 @@
+ private->dummy_page_da = dma_map_single(hose->parent,
+ celleb_dummy_page_va, PAGE_SIZE, DMA_FROM_DEVICE);
+ if (private->dummy_page_da == DMA_ERROR_CODE) {
+- printk(KERN_ERR "EPCI: dummy read disabled."
++ printk(KERN_ERR "EPCI: dummy read disabled. "
+ "Map dummy page failed.\n");
+ return;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/scc_uhc.c powerpc.git/arch/powerpc/platforms/celleb/scc_uhc.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/scc_uhc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/scc_uhc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -47,7 +47,8 @@
+ u32 val = 0;
+ int i;
+
+- if (!machine_is(celleb))
++ if (!machine_is(celleb_beat) &&
++ !machine_is(celleb_native))
+ return;
+
+ uhc_base = ioremap(pci_resource_start(dev, 0),
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/celleb/setup.c powerpc.git/arch/powerpc/platforms/celleb/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/celleb/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/celleb/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -40,6 +40,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
+ #include <linux/console.h>
++#include <linux/of_platform.h>
+
+ #include <asm/mmu.h>
+ #include <asm/processor.h>
+@@ -52,12 +53,16 @@
+ #include <asm/time.h>
+ #include <asm/spu_priv1.h>
+ #include <asm/firmware.h>
+-#include <asm/of_platform.h>
++#include <asm/rtas.h>
++#include <asm/cell-regs.h>
+
+ #include "interrupt.h"
+ #include "beat_wrapper.h"
+ #include "beat.h"
+ #include "pci.h"
++#include "../cell/interrupt.h"
++#include "../cell/pervasive.h"
++#include "../cell/ras.h"
+
+ static char celleb_machine_type[128] = "Celleb";
+
+@@ -88,61 +93,122 @@
+ printk("*** %04x : %s\n", hex, s ? s : "");
+ }
+
+-static void __init celleb_setup_arch(void)
++static void __init celleb_setup_arch_common(void)
++{
++ /* init to some ~sane value until calibrate_delay() runs */
++ loops_per_jiffy = 50000000;
++
++#ifdef CONFIG_DUMMY_CONSOLE
++ conswitchp = &dummy_con;
++#endif
++}
++
++static struct of_device_id celleb_bus_ids[] __initdata = {
++ { .type = "scc", },
++ { .type = "ioif", }, /* old style */
++ {},
++};
++
++static int __init celleb_publish_devices(void)
++{
++ /* Publish OF platform devices for southbridge IOs */
++ of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
++
++ celleb_pci_workaround_init();
++
++ return 0;
++}
++machine_device_initcall(celleb_beat, celleb_publish_devices);
++machine_device_initcall(celleb_native, celleb_publish_devices);
++
++
++/*
++ * functions for Celleb-Beat
++ */
++static void __init celleb_setup_arch_beat(void)
+ {
+ #ifdef CONFIG_SPU_BASE
+- spu_priv1_ops = &spu_priv1_beat_ops;
+- spu_management_ops = &spu_management_of_ops;
++ spu_priv1_ops = &spu_priv1_beat_ops;
++ spu_management_ops = &spu_management_of_ops;
+ #endif
+
+ #ifdef CONFIG_SMP
+ smp_init_celleb();
+ #endif
+
+- /* init to some ~sane value until calibrate_delay() runs */
+- loops_per_jiffy = 50000000;
+-
+-#ifdef CONFIG_DUMMY_CONSOLE
+- conswitchp = &dummy_con;
+-#endif
++ celleb_setup_arch_common();
+ }
+
+-static int __init celleb_probe(void)
++static int __init celleb_probe_beat(void)
+ {
+ unsigned long root = of_get_flat_dt_root();
+
+ if (!of_flat_dt_is_compatible(root, "Beat"))
+ return 0;
+
+- powerpc_firmware_features |= FW_FEATURE_CELLEB_POSSIBLE;
++ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS
++ | FW_FEATURE_BEAT | FW_FEATURE_LPAR;
+ hpte_init_beat_v3();
++
+ return 1;
+ }
+
+-static struct of_device_id celleb_bus_ids[] __initdata = {
+- { .type = "scc", },
+- { .type = "ioif", }, /* old style */
+- {},
+-};
+
+-static int __init celleb_publish_devices(void)
++/*
++ * functions for Celleb-native
++ */
++static void __init celleb_init_IRQ_native(void)
+ {
+- if (!machine_is(celleb))
+- return 0;
++ iic_init_IRQ();
++ spider_init_IRQ();
++}
+
+- /* Publish OF platform devices for southbridge IOs */
+- of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
++static void __init celleb_setup_arch_native(void)
++{
++#ifdef CONFIG_SPU_BASE
++ spu_priv1_ops = &spu_priv1_mmio_ops;
++ spu_management_ops = &spu_management_of_ops;
++#endif
+
+- celleb_pci_workaround_init();
++ cbe_regs_init();
+
+- return 0;
++#ifdef CONFIG_CBE_RAS
++ cbe_ras_init();
++#endif
++
++#ifdef CONFIG_SMP
++ smp_init_cell();
++#endif
++
++ cbe_pervasive_init();
++
++ /* XXX: nvram initialization should be added */
++
++ celleb_setup_arch_common();
++}
++
++static int __init celleb_probe_native(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ if (of_flat_dt_is_compatible(root, "Beat") ||
++ !of_flat_dt_is_compatible(root, "TOSHIBA,Celleb"))
++ return 0;
++
++ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS;
++ hpte_init_native();
++
++ return 1;
+ }
+-device_initcall(celleb_publish_devices);
+
+-define_machine(celleb) {
+- .name = "Cell Reference Set",
+- .probe = celleb_probe,
+- .setup_arch = celleb_setup_arch,
++
++/*
++ * machine definitions
++ */
++define_machine(celleb_beat) {
++ .name = "Cell Reference Set (Beat)",
++ .probe = celleb_probe_beat,
++ .setup_arch = celleb_setup_arch_beat,
+ .show_cpuinfo = celleb_show_cpuinfo,
+ .restart = beat_restart,
+ .power_off = beat_power_off,
+@@ -167,3 +233,26 @@
+ .machine_crash_shutdown = default_machine_crash_shutdown,
+ #endif
+ };
++
++define_machine(celleb_native) {
++ .name = "Cell Reference Set (native)",
++ .probe = celleb_probe_native,
++ .setup_arch = celleb_setup_arch_native,
++ .show_cpuinfo = celleb_show_cpuinfo,
++ .restart = rtas_restart,
++ .power_off = rtas_power_off,
++ .halt = rtas_halt,
++ .get_boot_time = rtas_get_boot_time,
++ .get_rtc_time = rtas_get_rtc_time,
++ .set_rtc_time = rtas_set_rtc_time,
++ .calibrate_decr = generic_calibrate_decr,
++ .progress = celleb_progress,
++ .pci_probe_mode = celleb_pci_probe_mode,
++ .pci_setup_phb = celleb_setup_phb,
++ .init_IRQ = celleb_init_IRQ_native,
++#ifdef CONFIG_KEXEC
++ .machine_kexec = default_machine_kexec,
++ .machine_kexec_prepare = default_machine_kexec_prepare,
++ .machine_crash_shutdown = default_machine_crash_shutdown,
++#endif
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/chrp/pci.c powerpc.git/arch/powerpc/platforms/chrp/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/chrp/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/chrp/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -198,7 +198,7 @@
+ printk ("RTAS supporting Pegasos OF not found, please upgrade"
+ " your firmware\n");
+ }
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+ /* keep the reference to the root node */
+ }
+
+@@ -354,7 +354,7 @@
+ * mode as well. The same fixup must be done to the class-code property in
+ * the IDE node /pci@80000000/ide@C,1
+ */
+-static void __devinit chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
++static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
+ {
+ u8 progif;
+ struct pci_dev *viaisa;
+@@ -375,4 +375,4 @@
+
+ pci_dev_put(viaisa);
+ }
+-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/chrp/setup.c powerpc.git/arch/powerpc/platforms/chrp/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/chrp/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/chrp/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -115,7 +115,7 @@
+ seq_printf(m, "machine\t\t: CHRP %s\n", model);
+
+ /* longtrail (goldengate) stuff */
+- if (!strncmp(model, "IBM,LongTrail", 13)) {
++ if (model && !strncmp(model, "IBM,LongTrail", 13)) {
+ /* VLSI VAS96011/12 `Golden Gate 2' */
+ /* Memory banks */
+ sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL)
+@@ -203,15 +203,20 @@
+ static void __init sio_init(void)
+ {
+ struct device_node *root;
++ const char *model;
+
+- if ((root = of_find_node_by_path("/")) &&
+- !strncmp(of_get_property(root, "model", NULL),
+- "IBM,LongTrail", 13)) {
++ root = of_find_node_by_path("/");
++ if (!root)
++ return;
++
++ model = of_get_property(root, "model", NULL);
++ if (model && !strncmp(model, "IBM,LongTrail", 13)) {
+ /* logical device 0 (KBC/Keyboard) */
+ sio_fixup_irq("keyboard", 0, 1, 2);
+ /* select logical device 1 (KBC/Mouse) */
+ sio_fixup_irq("mouse", 1, 12, 2);
+ }
++
+ of_node_put(root);
+ }
+
+@@ -251,6 +256,57 @@
+ for(;;);
+ }
+
++/*
++ * Per default, input/output-device points to the keyboard/screen
++ * If no card is installed, the built-in serial port is used as a fallback.
++ * But unfortunately, the firmware does not connect /chosen/{stdin,stdout}
++ * the the built-in serial node. Instead, a /failsafe node is created.
++ */
++static void chrp_init_early(void)
++{
++ struct device_node *node;
++ const char *property;
++
++ if (strstr(cmd_line, "console="))
++ return;
++ /* find the boot console from /chosen/stdout */
++ if (!of_chosen)
++ return;
++ node = of_find_node_by_path("/");
++ if (!node)
++ return;
++ property = of_get_property(node, "model", NULL);
++ if (!property)
++ goto out_put;
++ if (strcmp(property, "Pegasos2"))
++ goto out_put;
++ /* this is a Pegasos2 */
++ property = of_get_property(of_chosen, "linux,stdout-path", NULL);
++ if (!property)
++ goto out_put;
++ of_node_put(node);
++ node = of_find_node_by_path(property);
++ if (!node)
++ return;
++ property = of_get_property(node, "device_type", NULL);
++ if (!property)
++ goto out_put;
++ if (strcmp(property, "serial"))
++ goto out_put;
++ /*
++ * The 9pin connector is either /failsafe
++ * or /pci@80000000/isa@C/serial@i2F8
++ * The optional graphics card has also type 'serial' in VGA mode.
++ */
++ property = of_get_property(node, "name", NULL);
++ if (!property)
++ goto out_put;
++ if (!strcmp(property, "failsafe") || !strcmp(property, "serial"))
++ add_preferred_console("ttyS", 0, NULL);
++out_put:
++ of_node_put(node);
++}
++
+ void __init chrp_setup_arch(void)
+ {
+ struct device_node *root = of_find_node_by_path("/");
+@@ -594,6 +650,7 @@
+ .probe = chrp_probe,
+ .setup_arch = chrp_setup_arch,
+ .init = chrp_init2,
++ .init_early = chrp_init_early,
+ .show_cpuinfo = chrp_show_cpuinfo,
+ .init_IRQ = chrp_init_IRQ,
+ .restart = rtas_restart,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/embedded6xx/Kconfig powerpc.git/arch/powerpc/platforms/embedded6xx/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/embedded6xx/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/embedded6xx/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -9,6 +9,8 @@
+ select FSL_SOC
+ select PPC_UDBG_16550 if SERIAL_8250
+ select DEFAULT_UIMAGE
++ select MPC10X_OPENPIC
++ select MPC10X_BRIDGE
+ help
+ Select LINKSTATION if configuring for one of PPC- (MPC8241)
+ based NAS systems from Buffalo Technology. So far only
+@@ -16,6 +18,19 @@
+ Linkstation-I HD-HLAN and HD-HGLAN versions, and PPC-based
+ Terastation systems should be supported too.
+
++config STORCENTER
++ bool "IOMEGA StorCenter"
++ depends on EMBEDDED6xx
++ select MPIC
++ select FSL_SOC
++ select PPC_UDBG_16550 if SERIAL_8250
++ select WANT_DEVICE_TREE
++ select MPC10X_OPENPIC
++ select MPC10X_BRIDGE
++ help
++ Select STORCENTER if configuring for the iomega StorCenter
++ with an 8241 CPU in it.
++
+ config MPC7448HPC2
+ bool "Freescale MPC7448HPC2(Taiga)"
+ depends on EMBEDDED6xx
+@@ -23,6 +38,7 @@
+ select DEFAULT_UIMAGE
+ select PPC_UDBG_16550
+ select WANT_DEVICE_TREE
++ select TSI108_BRIDGE
+ help
+ Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
+ platform
+@@ -33,6 +49,7 @@
+ select TSI108_BRIDGE
+ select PPC_UDBG_16550
+ select WANT_DEVICE_TREE
++ select TSI108_BRIDGE
+ help
+ Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval
+ Board with TSI108/9 bridge (Hickory/Holly)
+@@ -48,17 +65,13 @@
+
+ config TSI108_BRIDGE
+ bool
+- depends on MPC7448HPC2 || PPC_HOLLY
+ select PCI
+ select MPIC
+ select MPIC_WEIRD
+- default y
+
+ config MPC10X_BRIDGE
+ bool
+- depends on LINKSTATION
+ select PPC_INDIRECT_PCI
+- default y
+
+ config MV64X60
+ bool
+@@ -67,8 +80,6 @@
+
+ config MPC10X_OPENPIC
+ bool
+- depends on LINKSTATION
+- default y
+
+ config MPC10X_STORE_GATHERING
+ bool "Enable MPC10x store gathering"
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/embedded6xx/Makefile powerpc.git/arch/powerpc/platforms/embedded6xx/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/embedded6xx/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/embedded6xx/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -3,5 +3,6 @@
+ #
+ obj-$(CONFIG_MPC7448HPC2) += mpc7448_hpc2.o
+ obj-$(CONFIG_LINKSTATION) += linkstation.o ls_uart.o
++obj-$(CONFIG_STORCENTER) += storcenter.o
+ obj-$(CONFIG_PPC_HOLLY) += holly.o
+ obj-$(CONFIG_PPC_PRPMC2800) += prpmc2800.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/embedded6xx/holly.c powerpc.git/arch/powerpc/platforms/embedded6xx/holly.c
+--- linux-2.6.24/arch/powerpc/platforms/embedded6xx/holly.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/embedded6xx/holly.c 2008-01-28 20:25:49.000000000 +0100
+@@ -20,12 +20,12 @@
+ #include <linux/console.h>
+ #include <linux/delay.h>
+ #include <linux/irq.h>
+-#include <linux/ide.h>
+ #include <linux/seq_file.h>
+ #include <linux/root_dev.h>
+ #include <linux/serial.h>
+ #include <linux/tty.h>
+ #include <linux/serial_core.h>
++#include <linux/of_platform.h>
+
+ #include <asm/system.h>
+ #include <asm/time.h>
+@@ -39,7 +39,6 @@
+ #include <asm/tsi108_irq.h>
+ #include <asm/tsi108_pci.h>
+ #include <asm/mpic.h>
+-#include <asm/of_platform.h>
+
+ #undef DEBUG
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c powerpc.git/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
+--- linux-2.6.24/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c 2008-01-28 20:25:49.000000000 +0100
+@@ -53,8 +53,6 @@
+
+ #define MPC7448HPC2_PCI_CFG_PHYS 0xfb000000
+
+-extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
+-
+ int mpc7448_hpc2_exclude_device(struct pci_controller *hose,
+ u_char bus, u_char devfn)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/embedded6xx/storcenter.c powerpc.git/arch/powerpc/platforms/embedded6xx/storcenter.c
+--- linux-2.6.24/arch/powerpc/platforms/embedded6xx/storcenter.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/embedded6xx/storcenter.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,192 @@
++/*
++ * Board setup routines for the storcenter
++ *
++ * Copyright 2007 (C) Oyvind Repvik (nail@nslu2-linux.org)
++ * Copyright 2007 Andy Wilcox, Jon Loeliger
++ *
++ * Based on linkstation.c by G. Liakhovetski
++ *
++ * This file is licensed under the terms of the GNU General Public License
++ * version 2. This program is licensed "as is" without any warranty of
++ * any kind, whether express or implied.
++ */
++
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <linux/initrd.h>
++#include <linux/mtd/physmap.h>
++#include <linux/of_platform.h>
++
++#include <asm/system.h>
++#include <asm/time.h>
++#include <asm/prom.h>
++#include <asm/mpic.h>
++#include <asm/pci-bridge.h>
++
++#include "mpc10x.h"
++
++
++#ifdef CONFIG_MTD_PHYSMAP
++static struct mtd_partition storcenter_physmap_partitions[] = {
++ {
++ .name = "kernel",
++ .offset = 0x000000,
++ .size = 0x170000,
++ },
++ {
++ .name = "rootfs",
++ .offset = 0x170000,
++ .size = 0x590000,
++ },
++ {
++ .name = "uboot",
++ .offset = 0x700000,
++ .size = 0x040000,
++ },
++ {
++ .name = "config",
++ .offset = 0x740000,
++ .size = 0x0c0000,
++ },
++};
++#endif
++
++
++static __initdata struct of_device_id storcenter_of_bus[] = {
++ { .name = "soc", },
++ {},
++};
++
++static int __init storcenter_device_probe(void)
++{
++ of_platform_bus_probe(NULL, storcenter_of_bus, NULL);
++ return 0;
++}
++machine_device_initcall(storcenter, storcenter_device_probe);
++
++
++static int __init storcenter_add_bridge(struct device_node *dev)
++{
++#ifdef CONFIG_PCI
++ int len;
++ struct pci_controller *hose;
++ const int *bus_range;
++
++ printk("Adding PCI host bridge %s\n", dev->full_name);
++
++ hose = pcibios_alloc_controller(dev);
++ if (hose == NULL)
++ return -ENOMEM;
++
++ bus_range = of_get_property(dev, "bus-range", &len);
++ hose->first_busno = bus_range ? bus_range[0] : 0;
++ hose->last_busno = bus_range ? bus_range[1] : 0xff;
++
++ setup_indirect_pci(hose, MPC10X_MAPB_CNFG_ADDR, MPC10X_MAPB_CNFG_DATA, 0);
++
++ /* Interpret the "ranges" property */
++ /* This also maps the I/O region and sets isa_io/mem_base */
++ pci_process_bridge_OF_ranges(hose, dev, 1);
++#endif
++
++ return 0;
++}
++
++static void __init storcenter_setup_arch(void)
++{
++ struct device_node *np;
++
++#ifdef CONFIG_MTD_PHYSMAP
++ physmap_set_partitions(storcenter_physmap_partitions,
++ ARRAY_SIZE(storcenter_physmap_partitions));
++#endif
++
++ /* Lookup PCI host bridges */
++ for_each_compatible_node(np, "pci", "mpc10x-pci")
++ storcenter_add_bridge(np);
++
++ printk(KERN_INFO "IOMEGA StorCenter\n");
++}
++
++/*
++ * Interrupt setup and service. Interrrupts on the turbostation come
++ * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
++ */
++static void __init storcenter_init_IRQ(void)
++{
++ struct mpic *mpic;
++ struct device_node *dnp;
++ const void *prop;
++ int size;
++ phys_addr_t paddr;
++
++ dnp = of_find_node_by_type(NULL, "open-pic");
++ if (dnp == NULL)
++ return;
++
++ prop = of_get_property(dnp, "reg", &size);
++ if (prop == NULL) {
++ of_node_put(dnp);
++ return;
++ }
++
++ paddr = (phys_addr_t)of_translate_address(dnp, prop);
++ mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET,
++ 4, 32, " EPIC ");
++
++ of_node_put(dnp);
++
++ BUG_ON(mpic == NULL);
++
++ /* PCI IRQs */
++ /*
++ * 2.6.12 patch:
++ * openpic_set_sources(0, 5, OpenPIC_Addr + 0x10200);
++ * openpic_set_sources(5, 2, OpenPIC_Addr + 0x11120);
++ * first_irq, num_irqs, __iomem first_ISR
++ * o_ss: i, src: 0, fdf50200
++ * o_ss: i, src: 1, fdf50220
++ * o_ss: i, src: 2, fdf50240
++ * o_ss: i, src: 3, fdf50260
++ * o_ss: i, src: 4, fdf50280
++ * o_ss: i, src: 5, fdf51120
++ * o_ss: i, src: 6, fdf51140
++ */
++ mpic_assign_isu(mpic, 0, paddr + 0x10200);
++ mpic_assign_isu(mpic, 1, paddr + 0x10220);
++ mpic_assign_isu(mpic, 2, paddr + 0x10240);
++ mpic_assign_isu(mpic, 3, paddr + 0x10260);
++ mpic_assign_isu(mpic, 4, paddr + 0x10280);
++ mpic_assign_isu(mpic, 5, paddr + 0x11120);
++ mpic_assign_isu(mpic, 6, paddr + 0x11140);
++
++ mpic_init(mpic);
++}
++
++static void storcenter_restart(char *cmd)
++{
++ local_irq_disable();
++
++ /* Set exception prefix high - to the firmware */
++ _nmask_and_or_msr(0, MSR_IP);
++
++ /* Wait for reset to happen */
++ for (;;) ;
++}
++
++static int __init storcenter_probe(void)
++{
++ unsigned long root = of_get_flat_dt_root();
++
++ return of_flat_dt_is_compatible(root, "storcenter");
++}
++
++define_machine(storcenter){
++ .name = "IOMEGA StorCenter",
++ .probe = storcenter_probe,
++ .setup_arch = storcenter_setup_arch,
++ .init_IRQ = storcenter_init_IRQ,
++ .get_irq = mpic_get_irq,
++ .restart = storcenter_restart,
++ .calibrate_decr = generic_calibrate_decr,
++};
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/Makefile powerpc.git/arch/powerpc/platforms/iseries/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/iseries/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -5,7 +5,7 @@
+ obj-y += exception.o
+ obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \
+ hvcall.o proc.o htab.o iommu.o misc.o irq.o
+-obj-$(CONFIG_PCI) += pci.o vpdinfo.o
++obj-$(CONFIG_PCI) += pci.o
+ obj-$(CONFIG_SMP) += smp.o
+ obj-$(CONFIG_VIOPATH) += viopath.o vio.o
+ obj-$(CONFIG_MODULES) += ksyms.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/iommu.c powerpc.git/arch/powerpc/platforms/iseries/iommu.c
+--- linux-2.6.24/arch/powerpc/platforms/iseries/iommu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/iommu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -163,8 +163,10 @@
+ (it->it_type == TCE_PCI) &&
+ (it->it_offset == tbl->it_offset) &&
+ (it->it_index == tbl->it_index) &&
+- (it->it_size == tbl->it_size))
++ (it->it_size == tbl->it_size)) {
++ of_node_put(node);
+ return it;
++ }
+ }
+ return NULL;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/lpevents.c powerpc.git/arch/powerpc/platforms/iseries/lpevents.c
+--- linux-2.6.24/arch/powerpc/platforms/iseries/lpevents.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/lpevents.c 2008-01-28 20:25:49.000000000 +0100
+@@ -239,7 +239,7 @@
+ * other CPUs, and that the deleted handler isn't
+ * still running on another CPU when we return.
+ */
+- synchronize_rcu();
++ synchronize_sched();
+ return 0;
+ }
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/pci.c powerpc.git/arch/powerpc/platforms/iseries/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/iseries/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -1,5 +1,6 @@
+ /*
+ * Copyright (C) 2001 Allan Trautman, IBM Corporation
++ * Copyright (C) 2005,2007 Stephen Rothwell, IBM Corp
+ *
+ * iSeries specific routines for PCI.
+ *
+@@ -19,13 +20,18 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
++
++#undef DEBUG
++
+ #include <linux/kernel.h>
+ #include <linux/list.h>
+ #include <linux/string.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #include <linux/pci.h>
++#include <linux/of.h>
+
++#include <asm/types.h>
+ #include <asm/io.h>
+ #include <asm/irq.h>
+ #include <asm/prom.h>
+@@ -35,6 +41,7 @@
+ #include <asm/abs_addr.h>
+ #include <asm/firmware.h>
+
++#include <asm/iseries/hv_types.h>
+ #include <asm/iseries/hv_call_xm.h>
+ #include <asm/iseries/mf.h>
+ #include <asm/iseries/iommu.h>
+@@ -45,15 +52,8 @@
+ #include "pci.h"
+ #include "call_pci.h"
+
+-/*
+- * Forward declares of prototypes.
+- */
+-static struct device_node *find_Device_Node(int bus, int devfn);
+-
+-static int Pci_Retry_Max = 3; /* Only retry 3 times */
+-static int Pci_Error_Flag = 1; /* Set Retry Error on. */
+-
+-static struct pci_ops iSeries_pci_ops;
++#define PCI_RETRY_MAX 3
++static int limit_pci_retries = 1; /* Set Retry Error on. */
+
+ /*
+ * Table defines
+@@ -62,6 +62,7 @@
+ #define IOMM_TABLE_MAX_ENTRIES 1024
+ #define IOMM_TABLE_ENTRY_SIZE 0x0000000000400000UL
+ #define BASE_IO_MEMORY 0xE000000000000000UL
++#define END_IO_MEMORY 0xEFFFFFFFFFFFFFFFUL
+
+ static unsigned long max_io_memory = BASE_IO_MEMORY;
+ static long current_iomm_table_entry;
+@@ -70,12 +71,237 @@
+ * Lookup Tables.
+ */
+ static struct device_node *iomm_table[IOMM_TABLE_MAX_ENTRIES];
+-static u8 iobar_table[IOMM_TABLE_MAX_ENTRIES];
++static u64 ds_addr_table[IOMM_TABLE_MAX_ENTRIES];
+
+-static const char pci_io_text[] = "iSeries PCI I/O";
+ static DEFINE_SPINLOCK(iomm_table_lock);
+
+ /*
++ * Generate a Direct Select Address for the Hypervisor
++ */
++static inline u64 iseries_ds_addr(struct device_node *node)
++{
++ struct pci_dn *pdn = PCI_DN(node);
++ const u32 *sbp = of_get_property(node, "linux,subbus", NULL);
++
++ return ((u64)pdn->busno << 48) + ((u64)(sbp ? *sbp : 0) << 40)
++ + ((u64)0x10 << 32);
++}
++
++/*
++ * Size of Bus VPD data
++ */
++#define BUS_VPDSIZE 1024
++
++/*
++ * Bus Vpd Tags
++ */
++#define VPD_END_OF_AREA 0x79
++#define VPD_ID_STRING 0x82
++#define VPD_VENDOR_AREA 0x84
++
++/*
++ * Mfg Area Tags
++ */
++#define VPD_FRU_FRAME_ID 0x4649 /* "FI" */
++#define VPD_SLOT_MAP_FORMAT 0x4D46 /* "MF" */
++#define VPD_SLOT_MAP 0x534D /* "SM" */
++
++/*
++ * Structures of the areas
++ */
++struct mfg_vpd_area {
++ u16 tag;
++ u8 length;
++ u8 data1;
++ u8 data2;
++};
++#define MFG_ENTRY_SIZE 3
++
++struct slot_map {
++ u8 agent;
++ u8 secondary_agent;
++ u8 phb;
++ char card_location[3];
++ char parms[8];
++ char reserved[2];
++};
++#define SLOT_ENTRY_SIZE 16
++
++/*
++ * Parse the Slot Area
++ */
++static void __init iseries_parse_slot_area(struct slot_map *map, int len,
++ HvAgentId agent, u8 *phb, char card[4])
++{
++ /*
++ * Parse Slot label until we find the one requested
++ */
++ while (len > 0) {
++ if (map->agent == agent) {
++ /*
++ * If Phb wasn't found, grab the entry first one found.
++ */
++ if (*phb == 0xff)
++ *phb = map->phb;
++ /* Found it, extract the data. */
++ if (map->phb == *phb) {
++ memcpy(card, &map->card_location, 3);
++ card[3] = 0;
++ break;
++ }
++ }
++ /* Point to the next Slot */
++ map = (struct slot_map *)((char *)map + SLOT_ENTRY_SIZE);
++ len -= SLOT_ENTRY_SIZE;
++ }
++}
++
++/*
++ * Parse the Mfg Area
++ */
++static void __init iseries_parse_mfg_area(struct mfg_vpd_area *area, int len,
++ HvAgentId agent, u8 *phb, u8 *frame, char card[4])
++{
++ u16 slot_map_fmt = 0;
++
++ /* Parse Mfg Data */
++ while (len > 0) {
++ int mfg_tag_len = area->length;
++ /* Frame ID (FI 4649020310 ) */
++ if (area->tag == VPD_FRU_FRAME_ID)
++ *frame = area->data1;
++ /* Slot Map Format (MF 4D46020004 ) */
++ else if (area->tag == VPD_SLOT_MAP_FORMAT)
++ slot_map_fmt = (area->data1 * 256)
++ + area->data2;
++ /* Slot Map (SM 534D90 */
++ else if (area->tag == VPD_SLOT_MAP) {
++ struct slot_map *slot_map;
++
++ if (slot_map_fmt == 0x1004)
++ slot_map = (struct slot_map *)((char *)area
++ + MFG_ENTRY_SIZE + 1);
++ else
++ slot_map = (struct slot_map *)((char *)area
++ + MFG_ENTRY_SIZE);
++ iseries_parse_slot_area(slot_map, mfg_tag_len,
++ agent, phb, card);
++ }
++ /*
++ * Point to the next Mfg Area
++ * Use defined size, sizeof give wrong answer
++ */
++ area = (struct mfg_vpd_area *)((char *)area + mfg_tag_len
++ + MFG_ENTRY_SIZE);
++ len -= (mfg_tag_len + MFG_ENTRY_SIZE);
++ }
++}
++
++/*
++ * Look for "BUS".. Data is not Null terminated.
++ * PHBID of 0xFF indicates PHB was not found in VPD Data.
++ */
++static u8 __init iseries_parse_phbid(u8 *area, int len)
++{
++ while (len > 0) {
++ if ((*area == 'B') && (*(area + 1) == 'U')
++ && (*(area + 2) == 'S')) {
++ area += 3;
++ while (*area == ' ')
++ area++;
++ return *area & 0x0F;
++ }
++ area++;
++ len--;
++ }
++ return 0xff;
++}
++
++/*
++ * Parse out the VPD Areas
++ */
++static void __init iseries_parse_vpd(u8 *data, int data_len,
++ HvAgentId agent, u8 *frame, char card[4])
++{
++ u8 phb = 0xff;
++
++ while (data_len > 0) {
++ int len;
++ u8 tag = *data;
++
++ if (tag == VPD_END_OF_AREA)
++ break;
++ len = *(data + 1) + (*(data + 2) * 256);
++ data += 3;
++ data_len -= 3;
++ if (tag == VPD_ID_STRING)
++ phb = iseries_parse_phbid(data, len);
++ else if (tag == VPD_VENDOR_AREA)
++ iseries_parse_mfg_area((struct mfg_vpd_area *)data, len,
++ agent, &phb, frame, card);
++ /* Point to next Area. */
++ data += len;
++ data_len -= len;
++ }
++}
++
++static int __init iseries_get_location_code(u16 bus, HvAgentId agent,
++ u8 *frame, char card[4])
++{
++ int status = 0;
++ int bus_vpd_len = 0;
++ u8 *bus_vpd = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
++
++ if (bus_vpd == NULL) {
++ printk("PCI: Bus VPD Buffer allocation failure.\n");
++ return 0;
++ }
++ bus_vpd_len = HvCallPci_getBusVpd(bus, iseries_hv_addr(bus_vpd),
++ BUS_VPDSIZE);
++ if (bus_vpd_len == 0) {
++ printk("PCI: Bus VPD Buffer zero length.\n");
++ goto out_free;
++ }
++ /* printk("PCI: bus_vpd: %p, %d\n",bus_vpd, bus_vpd_len); */
++ /* Make sure this is what I think it is */
++ if (*bus_vpd != VPD_ID_STRING) {
++ printk("PCI: Bus VPD Buffer missing starting tag.\n");
++ goto out_free;
++ }
++ iseries_parse_vpd(bus_vpd, bus_vpd_len, agent, frame, card);
++ status = 1;
++out_free:
++ kfree(bus_vpd);
++ return status;
++}
++
++/*
++ * Prints the device information.
++ * - Pass in pci_dev* pointer to the device.
++ * - Pass in the device count
++ *
++ * Format:
++ * PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet
++ * controller
++ */
++static void __init iseries_device_information(struct pci_dev *pdev,
++ u16 bus, HvSubBusNumber subbus)
++{
++ u8 frame = 0;
++ char card[4];
++ HvAgentId agent;
++
++ agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
++ ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
++
++ if (iseries_get_location_code(bus, agent, &frame, card)) {
++ printk(KERN_INFO "PCI: %s, Vendor %04X Frame%3d, "
++ "Card %4s 0x%04X\n", pci_name(pdev), pdev->vendor,
++ frame, card, (int)(pdev->class >> 8));
++ }
++}
++
++/*
+ * iomm_table_allocate_entry
+ *
+ * Adds pci_dev entry in address translation table
+@@ -87,7 +313,7 @@
+ * - CurrentIndex is incremented to keep track of the last entry.
+ * - Builds the resource entry for allocated BARs.
+ */
+-static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
++static void __init iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
+ {
+ struct resource *bar_res = &dev->resource[bar_num];
+ long bar_size = pci_resource_len(dev, bar_num);
+@@ -101,7 +327,6 @@
+ * Set Resource values.
+ */
+ spin_lock(&iomm_table_lock);
+- bar_res->name = pci_io_text;
+ bar_res->start = BASE_IO_MEMORY +
+ IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry;
+ bar_res->end = bar_res->start + bar_size - 1;
+@@ -110,7 +335,8 @@
+ */
+ while (bar_size > 0 ) {
+ iomm_table[current_iomm_table_entry] = dev->sysdata;
+- iobar_table[current_iomm_table_entry] = bar_num;
++ ds_addr_table[current_iomm_table_entry] =
++ iseries_ds_addr(dev->sysdata) | (bar_num << 24);
+ bar_size -= IOMM_TABLE_ENTRY_SIZE;
+ ++current_iomm_table_entry;
+ }
+@@ -130,7 +356,7 @@
+ * - Loops through The Bar resources(0 - 5) including the ROM
+ * is resource(6).
+ */
+-static void allocate_device_bars(struct pci_dev *dev)
++static void __init allocate_device_bars(struct pci_dev *dev)
+ {
+ int bar_num;
+
+@@ -145,79 +371,19 @@
+ * PCI: Read Vendor Failed 0x18.58.10 Rc: 0x00xx
+ * PCI: Connect Bus Unit Failed 0x18.58.10 Rc: 0x00xx
+ */
+-static void pci_Log_Error(char *Error_Text, int Bus, int SubBus,
+- int AgentId, int HvRc)
++static void pci_log_error(char *error, int bus, int subbus,
++ int agent, int hv_res)
+ {
+- if (HvRc == 0x0302)
++ if (hv_res == 0x0302)
+ return;
+ printk(KERN_ERR "PCI: %s Failed: 0x%02X.%02X.%02X Rc: 0x%04X",
+- Error_Text, Bus, SubBus, AgentId, HvRc);
+-}
+-
+-/*
+- * iSeries_pci_final_fixup(void)
+- */
+-void __init iSeries_pci_final_fixup(void)
+-{
+- struct pci_dev *pdev = NULL;
+- struct device_node *node;
+- int DeviceCount = 0;
+-
+- /* Fix up at the device node and pci_dev relationship */
+- mf_display_src(0xC9000100);
+-
+- printk("pcibios_final_fixup\n");
+- for_each_pci_dev(pdev) {
+- node = find_Device_Node(pdev->bus->number, pdev->devfn);
+- printk("pci dev %p (%x.%x), node %p\n", pdev,
+- pdev->bus->number, pdev->devfn, node);
+-
+- if (node != NULL) {
+- struct pci_dn *pdn = PCI_DN(node);
+- const u32 *agent;
+-
+- agent = of_get_property(node, "linux,agent-id", NULL);
+- if ((pdn != NULL) && (agent != NULL)) {
+- u8 irq = iSeries_allocate_IRQ(pdn->busno, 0,
+- pdn->bussubno);
+- int err;
+-
+- err = HvCallXm_connectBusUnit(pdn->busno, pdn->bussubno,
+- *agent, irq);
+- if (err)
+- pci_Log_Error("Connect Bus Unit",
+- pdn->busno, pdn->bussubno, *agent, err);
+- else {
+- err = HvCallPci_configStore8(pdn->busno, pdn->bussubno,
+- *agent,
+- PCI_INTERRUPT_LINE,
+- irq);
+- if (err)
+- pci_Log_Error("PciCfgStore Irq Failed!",
+- pdn->busno, pdn->bussubno, *agent, err);
+- }
+- if (!err)
+- pdev->irq = irq;
+- }
+-
+- ++DeviceCount;
+- pdev->sysdata = (void *)node;
+- PCI_DN(node)->pcidev = pdev;
+- allocate_device_bars(pdev);
+- iSeries_Device_Information(pdev, DeviceCount);
+- iommu_devnode_init_iSeries(pdev, node);
+- } else
+- printk("PCI: Device Tree not found for 0x%016lX\n",
+- (unsigned long)pdev);
+- }
+- iSeries_activate_IRQs();
+- mf_display_src(0xC9000200);
++ error, bus, subbus, agent, hv_res);
+ }
+
+ /*
+ * Look down the chain to find the matching Device Device
+ */
+-static struct device_node *find_Device_Node(int bus, int devfn)
++static struct device_node *find_device_node(int bus, int devfn)
+ {
+ struct device_node *node;
+
+@@ -230,22 +396,66 @@
+ return NULL;
+ }
+
+-#if 0
+ /*
+- * Returns the device node for the passed pci_dev
+- * Sanity Check Node PciDev to passed pci_dev
+- * If none is found, returns a NULL which the client must handle.
++ * iSeries_pcibios_fixup_resources
++ *
++ * Fixes up all resources for devices
+ */
+-static struct device_node *get_Device_Node(struct pci_dev *pdev)
++void __init iSeries_pcibios_fixup_resources(struct pci_dev *pdev)
+ {
++ const u32 *agent;
++ const u32 *sub_bus;
++ unsigned char bus = pdev->bus->number;
+ struct device_node *node;
++ int i;
++
++ node = find_device_node(bus, pdev->devfn);
++ pr_debug("PCI: iSeries %s, pdev %p, node %p\n",
++ pci_name(pdev), pdev, node);
++ if (!node) {
++ printk("PCI: %s disabled, device tree entry not found !\n",
++ pci_name(pdev));
++ for (i = 0; i <= PCI_ROM_RESOURCE; i++)
++ pdev->resource[i].flags = 0;
++ return;
++ }
++ sub_bus = of_get_property(node, "linux,subbus", NULL);
++ agent = of_get_property(node, "linux,agent-id", NULL);
++ if (agent && sub_bus) {
++ u8 irq = iSeries_allocate_IRQ(bus, 0, *sub_bus);
++ int err;
++
++ err = HvCallXm_connectBusUnit(bus, *sub_bus, *agent, irq);
++ if (err)
++ pci_log_error("Connect Bus Unit",
++ bus, *sub_bus, *agent, err);
++ else {
++ err = HvCallPci_configStore8(bus, *sub_bus,
++ *agent, PCI_INTERRUPT_LINE, irq);
++ if (err)
++ pci_log_error("PciCfgStore Irq Failed!",
++ bus, *sub_bus, *agent, err);
++ else
++ pdev->irq = irq;
++ }
++ }
+
+- node = pdev->sysdata;
+- if (node == NULL || PCI_DN(node)->pcidev != pdev)
+- node = find_Device_Node(pdev->bus->number, pdev->devfn);
+- return node;
++ pdev->sysdata = node;
++ allocate_device_bars(pdev);
++ iseries_device_information(pdev, bus, *sub_bus);
++ iommu_devnode_init_iSeries(pdev, node);
++}
++
++/*
++ * iSeries_pci_final_fixup(void)
++ */
++void __init iSeries_pci_final_fixup(void)
++{
++ /* Fix up at the device node and pci_dev relationship */
++ mf_display_src(0xC9000100);
++ iSeries_activate_IRQs();
++ mf_display_src(0xC9000200);
+ }
+-#endif
+
+ /*
+ * Config space read and write functions.
+@@ -269,7 +479,7 @@
+ static int iSeries_pci_read_config(struct pci_bus *bus, unsigned int devfn,
+ int offset, int size, u32 *val)
+ {
+- struct device_node *node = find_Device_Node(bus->number, devfn);
++ struct device_node *node = find_device_node(bus->number, devfn);
+ u64 fn;
+ struct HvCallPci_LoadReturn ret;
+
+@@ -299,7 +509,7 @@
+ static int iSeries_pci_write_config(struct pci_bus *bus, unsigned int devfn,
+ int offset, int size, u32 val)
+ {
+- struct device_node *node = find_Device_Node(bus->number, devfn);
++ struct device_node *node = find_device_node(bus->number, devfn);
+ u64 fn;
+ u64 ret;
+
+@@ -331,22 +541,22 @@
+ * PCI: Device 23.90 ReadL Retry( 1)
+ * PCI: Device 23.90 ReadL Retry Successful(1)
+ */
+-static int CheckReturnCode(char *TextHdr, struct device_node *DevNode,
++static int check_return_code(char *type, struct device_node *dn,
+ int *retry, u64 ret)
+ {
+ if (ret != 0) {
+- struct pci_dn *pdn = PCI_DN(DevNode);
++ struct pci_dn *pdn = PCI_DN(dn);
+
+ (*retry)++;
+ printk("PCI: %s: Device 0x%04X:%02X I/O Error(%2d): 0x%04X\n",
+- TextHdr, pdn->busno, pdn->devfn,
++ type, pdn->busno, pdn->devfn,
+ *retry, (int)ret);
+ /*
+ * Bump the retry and check for retry count exceeded.
+ * If, Exceeded, panic the system.
+ */
+- if (((*retry) > Pci_Retry_Max) &&
+- (Pci_Error_Flag > 0)) {
++ if (((*retry) > PCI_RETRY_MAX) &&
++ (limit_pci_retries > 0)) {
+ mf_display_src(0xB6000103);
+ panic_timeout = 0;
+ panic("PCI: Hardware I/O Error, SRC B6000103, "
+@@ -363,28 +573,39 @@
+ * the exposure of being device global.
+ */
+ static inline struct device_node *xlate_iomm_address(
+- const volatile void __iomem *IoAddress,
+- u64 *dsaptr, u64 *BarOffsetPtr)
++ const volatile void __iomem *addr,
++ u64 *dsaptr, u64 *bar_offset, const char *func)
+ {
+- unsigned long OrigIoAddr;
+- unsigned long BaseIoAddr;
+- unsigned long TableIndex;
+- struct device_node *DevNode;
++ unsigned long orig_addr;
++ unsigned long base_addr;
++ unsigned long ind;
++ struct device_node *dn;
+
+- OrigIoAddr = (unsigned long __force)IoAddress;
+- if ((OrigIoAddr < BASE_IO_MEMORY) || (OrigIoAddr >= max_io_memory))
++ orig_addr = (unsigned long __force)addr;
++ if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) {
++ static unsigned long last_jiffies;
++ static int num_printed;
++
++ if ((jiffies - last_jiffies) > 60 * HZ) {
++ last_jiffies = jiffies;
++ num_printed = 0;
++ }
++ if (num_printed++ < 10)
++ printk(KERN_ERR
++ "iSeries_%s: invalid access at IO address %p\n",
++ func, addr);
+ return NULL;
+- BaseIoAddr = OrigIoAddr - BASE_IO_MEMORY;
+- TableIndex = BaseIoAddr / IOMM_TABLE_ENTRY_SIZE;
+- DevNode = iomm_table[TableIndex];
+-
+- if (DevNode != NULL) {
+- int barnum = iobar_table[TableIndex];
+- *dsaptr = iseries_ds_addr(DevNode) | (barnum << 24);
+- *BarOffsetPtr = BaseIoAddr % IOMM_TABLE_ENTRY_SIZE;
++ }
++ base_addr = orig_addr - BASE_IO_MEMORY;
++ ind = base_addr / IOMM_TABLE_ENTRY_SIZE;
++ dn = iomm_table[ind];
++
++ if (dn != NULL) {
++ *dsaptr = ds_addr_table[ind];
++ *bar_offset = base_addr % IOMM_TABLE_ENTRY_SIZE;
+ } else
+- panic("PCI: Invalid PCI IoAddress detected!\n");
+- return DevNode;
++ panic("PCI: Invalid PCI IO address detected!\n");
++ return dn;
+ }
+
+ /*
+@@ -392,91 +613,58 @@
+ * On MM I/O error, all ones are returned and iSeries_pci_IoError is cal
+ * else, data is returned in Big Endian format.
+ */
+-static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
++static u8 iseries_readb(const volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ struct HvCallPci_LoadReturn ret;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
+-
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte");
+
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Read_Byte: invalid access at IO address %p\n",
+- IoAddress);
++ if (dn == NULL)
+ return 0xff;
+- }
+ do {
+- HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0);
+- } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0);
++ HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0);
++ } while (check_return_code("RDB", dn, &retry, ret.rc) != 0);
+
+ return ret.value;
+ }
+
+-static u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
++static u16 iseries_readw_be(const volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ struct HvCallPci_LoadReturn ret;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
+-
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "read_word");
+
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Read_Word: invalid access at IO address %p\n",
+- IoAddress);
++ if (dn == NULL)
+ return 0xffff;
+- }
+ do {
+ HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa,
+- BarOffset, 0);
+- } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0);
++ bar_offset, 0);
++ } while (check_return_code("RDW", dn, &retry, ret.rc) != 0);
+
+ return ret.value;
+ }
+
+-static u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
++static u32 iseries_readl_be(const volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ struct HvCallPci_LoadReturn ret;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "read_long");
+
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
+-
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Read_Long: invalid access at IO address %p\n",
+- IoAddress);
++ if (dn == NULL)
+ return 0xffffffff;
+- }
+ do {
+ HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa,
+- BarOffset, 0);
+- } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0);
++ bar_offset, 0);
++ } while (check_return_code("RDL", dn, &retry, ret.rc) != 0);
+
+ return ret.value;
+ }
+@@ -485,134 +673,72 @@
+ * Write MM I/O Instructions for the iSeries
+ *
+ */
+-static void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
++static void iseries_writeb(u8 data, volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ u64 rc;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
+-
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "write_byte");
+
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Write_Byte: invalid access at IO address %p\n", IoAddress);
++ if (dn == NULL)
+ return;
+- }
+ do {
+- rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0);
+- } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0);
++ rc = HvCall4(HvCallPciBarStore8, dsa, bar_offset, data, 0);
++ } while (check_return_code("WWB", dn, &retry, rc) != 0);
+ }
+
+-static void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
++static void iseries_writew_be(u16 data, volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ u64 rc;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "write_word");
+
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
+-
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Write_Word: invalid access at IO address %p\n",
+- IoAddress);
++ if (dn == NULL)
+ return;
+- }
+ do {
+- rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, data, 0);
+- } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0);
++ rc = HvCall4(HvCallPciBarStore16, dsa, bar_offset, data, 0);
++ } while (check_return_code("WWW", dn, &retry, rc) != 0);
+ }
+
+-static void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
++static void iseries_writel_be(u32 data, volatile void __iomem *addr)
+ {
+- u64 BarOffset;
++ u64 bar_offset;
+ u64 dsa;
+ int retry = 0;
+ u64 rc;
+- struct device_node *DevNode =
+- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
+-
+- if (DevNode == NULL) {
+- static unsigned long last_jiffies;
+- static int num_printed;
++ struct device_node *dn =
++ xlate_iomm_address(addr, &dsa, &bar_offset, "write_long");
+
+- if ((jiffies - last_jiffies) > 60 * HZ) {
+- last_jiffies = jiffies;
+- num_printed = 0;
+- }
+- if (num_printed++ < 10)
+- printk(KERN_ERR "iSeries_Write_Long: invalid access at IO address %p\n",
+- IoAddress);
++ if (dn == NULL)
+ return;
+- }
+ do {
+- rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, data, 0);
+- } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0);
+-}
+-
+-static u8 iseries_readb(const volatile void __iomem *addr)
+-{
+- return iSeries_Read_Byte(addr);
++ rc = HvCall4(HvCallPciBarStore32, dsa, bar_offset, data, 0);
++ } while (check_return_code("WWL", dn, &retry, rc) != 0);
+ }
+
+ static u16 iseries_readw(const volatile void __iomem *addr)
+ {
+- return le16_to_cpu(iSeries_Read_Word(addr));
++ return le16_to_cpu(iseries_readw_be(addr));
+ }
+
+ static u32 iseries_readl(const volatile void __iomem *addr)
+ {
+- return le32_to_cpu(iSeries_Read_Long(addr));
+-}
+-
+-static u16 iseries_readw_be(const volatile void __iomem *addr)
+-{
+- return iSeries_Read_Word(addr);
+-}
+-
+-static u32 iseries_readl_be(const volatile void __iomem *addr)
+-{
+- return iSeries_Read_Long(addr);
+-}
+-
+-static void iseries_writeb(u8 data, volatile void __iomem *addr)
+-{
+- iSeries_Write_Byte(data, addr);
++ return le32_to_cpu(iseries_readl_be(addr));
+ }
+
+ static void iseries_writew(u16 data, volatile void __iomem *addr)
+ {
+- iSeries_Write_Word(cpu_to_le16(data), addr);
++ iseries_writew_be(cpu_to_le16(data), addr);
+ }
+
+ static void iseries_writel(u32 data, volatile void __iomem *addr)
+ {
+- iSeries_Write_Long(cpu_to_le32(data), addr);
+-}
+-
+-static void iseries_writew_be(u16 data, volatile void __iomem *addr)
+-{
+- iSeries_Write_Word(data, addr);
+-}
+-
+-static void iseries_writel_be(u32 data, volatile void __iomem *addr)
+-{
+- iSeries_Write_Long(data, addr);
++ iseries_writel(cpu_to_le32(data), addr);
+ }
+
+ static void iseries_readsb(const volatile void __iomem *addr, void *buf,
+@@ -620,7 +746,7 @@
+ {
+ u8 *dst = buf;
+ while(count-- > 0)
+- *(dst++) = iSeries_Read_Byte(addr);
++ *(dst++) = iseries_readb(addr);
+ }
+
+ static void iseries_readsw(const volatile void __iomem *addr, void *buf,
+@@ -628,7 +754,7 @@
+ {
+ u16 *dst = buf;
+ while(count-- > 0)
+- *(dst++) = iSeries_Read_Word(addr);
++ *(dst++) = iseries_readw_be(addr);
+ }
+
+ static void iseries_readsl(const volatile void __iomem *addr, void *buf,
+@@ -636,7 +762,7 @@
+ {
+ u32 *dst = buf;
+ while(count-- > 0)
+- *(dst++) = iSeries_Read_Long(addr);
++ *(dst++) = iseries_readl_be(addr);
+ }
+
+ static void iseries_writesb(volatile void __iomem *addr, const void *buf,
+@@ -644,7 +770,7 @@
+ {
+ const u8 *src = buf;
+ while(count-- > 0)
+- iSeries_Write_Byte(*(src++), addr);
++ iseries_writeb(*(src++), addr);
+ }
+
+ static void iseries_writesw(volatile void __iomem *addr, const void *buf,
+@@ -652,7 +778,7 @@
+ {
+ const u16 *src = buf;
+ while(count-- > 0)
+- iSeries_Write_Word(*(src++), addr);
++ iseries_writew_be(*(src++), addr);
+ }
+
+ static void iseries_writesl(volatile void __iomem *addr, const void *buf,
+@@ -660,7 +786,7 @@
+ {
+ const u32 *src = buf;
+ while(count-- > 0)
+- iSeries_Write_Long(*(src++), addr);
++ iseries_writel_be(*(src++), addr);
+ }
+
+ static void iseries_memset_io(volatile void __iomem *addr, int c,
+@@ -669,7 +795,7 @@
+ volatile char __iomem *d = addr;
+
+ while (n-- > 0)
+- iSeries_Write_Byte(c, d++);
++ iseries_writeb(c, d++);
+ }
+
+ static void iseries_memcpy_fromio(void *dest, const volatile void __iomem *src,
+@@ -679,7 +805,7 @@
+ const volatile char __iomem *s = src;
+
+ while (n-- > 0)
+- *d++ = iSeries_Read_Byte(s++);
++ *d++ = iseries_readb(s++);
+ }
+
+ static void iseries_memcpy_toio(volatile void __iomem *dest, const void *src,
+@@ -689,7 +815,7 @@
+ volatile char __iomem *d = dest;
+
+ while (n-- > 0)
+- iSeries_Write_Byte(*s++, d++);
++ iseries_writeb(*s++, d++);
+ }
+
+ /* We only set MMIO ops. The default PIO ops will be default
+@@ -742,6 +868,8 @@
+ /* Install IO hooks */
+ ppc_pci_io = iseries_pci_io;
+
++ pci_probe_only = 1;
++
+ /* iSeries has no IO space in the common sense, it needs to set
+ * the IO base to 0
+ */
+@@ -767,11 +895,21 @@
+ phb = pcibios_alloc_controller(node);
+ if (phb == NULL)
+ continue;
++ /* All legacy iSeries PHBs are in domain zero */
++ phb->global_number = 0;
+
+- phb->pci_mem_offset = bus;
+ phb->first_busno = bus;
+ phb->last_busno = bus;
+ phb->ops = &iSeries_pci_ops;
++ phb->io_base_virt = (void __iomem *)_IO_BASE;
++ phb->io_resource.flags = IORESOURCE_IO;
++ phb->io_resource.start = BASE_IO_MEMORY;
++ phb->io_resource.end = END_IO_MEMORY;
++ phb->io_resource.name = "iSeries PCI IO";
++ phb->mem_resources[0].flags = IORESOURCE_MEM;
++ phb->mem_resources[0].start = BASE_IO_MEMORY;
++ phb->mem_resources[0].end = END_IO_MEMORY;
++ phb->mem_resources[0].name = "Series PCI MEM";
+ }
+
+ of_node_put(root);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/pci.h powerpc.git/arch/powerpc/platforms/iseries/pci.h
+--- linux-2.6.24/arch/powerpc/platforms/iseries/pci.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/pci.h 2008-01-28 20:25:49.000000000 +0100
+@@ -30,10 +30,6 @@
+ * End Change Activity
+ */
+
+-#include <asm/pci-bridge.h>
+-
+-struct pci_dev; /* For Forward Reference */
+-
+ /*
+ * Decodes Linux DevFn to iSeries DevFn, bridge device, or function.
+ * For Linux, see PCI_SLOT and PCI_FUNC in include/linux/pci.h
+@@ -47,17 +43,16 @@
+ #define ISERIES_GET_DEVICE_FROM_SUBBUS(subbus) ((subbus >> 5) & 0x7)
+ #define ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus) ((subbus >> 2) & 0x7)
+
+-/*
+- * Generate a Direct Select Address for the Hypervisor
+- */
+-static inline u64 iseries_ds_addr(struct device_node *node)
+-{
+- struct pci_dn *pdn = PCI_DN(node);
+-
+- return ((u64)pdn->busno << 48) + ((u64)pdn->bussubno << 40)
+- + ((u64)0x10 << 32);
+-}
++struct pci_dev;
+
+-extern void iSeries_Device_Information(struct pci_dev*, int);
++#ifdef CONFIG_PCI
++extern void iSeries_pcibios_init(void);
++extern void iSeries_pci_final_fixup(void);
++extern void iSeries_pcibios_fixup_resources(struct pci_dev *dev);
++#else
++static inline void iSeries_pcibios_init(void) { }
++static inline void iSeries_pci_final_fixup(void) { }
++static inline void iSeries_pcibios_fixup_resources(struct pci_dev *dev) {}
++#endif
+
+ #endif /* _PLATFORMS_ISERIES_PCI_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/setup.c powerpc.git/arch/powerpc/platforms/iseries/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/iseries/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -63,6 +63,7 @@
+ #include "main_store.h"
+ #include "call_sm.h"
+ #include "call_hpt.h"
++#include "pci.h"
+
+ #ifdef DEBUG
+ #define DBG(fmt...) udbg_printf(fmt)
+@@ -74,11 +75,6 @@
+ static unsigned long build_iSeries_Memory_Map(void);
+ static void iseries_shared_idle(void);
+ static void iseries_dedicated_idle(void);
+-#ifdef CONFIG_PCI
+-extern void iSeries_pci_final_fixup(void);
+-#else
+-static void iSeries_pci_final_fixup(void) { }
+-#endif
+
+
+ struct MemoryBlock {
+@@ -112,13 +108,13 @@
+ * correctly.
+ */
+ mb_array[0].logicalStart = 0;
+- mb_array[0].logicalEnd = 0x100000000;
++ mb_array[0].logicalEnd = 0x100000000UL;
+ mb_array[0].absStart = 0;
+- mb_array[0].absEnd = 0x100000000;
++ mb_array[0].absEnd = 0x100000000UL;
+
+ if (holeSize) {
+ numMemoryBlocks = 2;
+- holeStart = holeStart & 0x000fffffffffffff;
++ holeStart = holeStart & 0x000fffffffffffffUL;
+ holeStart = addr_to_chunk(holeStart);
+ holeFirstChunk = holeStart;
+ holeSize = addr_to_chunk(holeSize);
+@@ -128,9 +124,9 @@
+ mb_array[0].logicalEnd = holeFirstChunk;
+ mb_array[0].absEnd = holeFirstChunk;
+ mb_array[1].logicalStart = holeFirstChunk;
+- mb_array[1].logicalEnd = 0x100000000 - holeSizeChunks;
++ mb_array[1].logicalEnd = 0x100000000UL - holeSizeChunks;
+ mb_array[1].absStart = holeFirstChunk + holeSizeChunks;
+- mb_array[1].absEnd = 0x100000000;
++ mb_array[1].absEnd = 0x100000000UL;
+ }
+ return numMemoryBlocks;
+ }
+@@ -234,9 +230,9 @@
+ mb_array[i].logicalEnd,
+ mb_array[i].absStart, mb_array[i].absEnd);
+ mb_array[i].absStart = addr_to_chunk(mb_array[i].absStart &
+- 0x000fffffffffffff);
++ 0x000fffffffffffffUL);
+ mb_array[i].absEnd = addr_to_chunk(mb_array[i].absEnd &
+- 0x000fffffffffffff);
++ 0x000fffffffffffffUL);
+ mb_array[i].logicalStart =
+ addr_to_chunk(mb_array[i].logicalStart);
+ mb_array[i].logicalEnd = addr_to_chunk(mb_array[i].logicalEnd);
+@@ -320,7 +316,7 @@
+ };
+ EXPORT_SYMBOL(mschunks_map);
+
+-void mschunks_alloc(unsigned long num_chunks)
++static void mschunks_alloc(unsigned long num_chunks)
+ {
+ klimit = _ALIGN(klimit, sizeof(u32));
+ mschunks_map.mapping = (u32 *)klimit;
+@@ -499,6 +495,8 @@
+ itVpdAreas.xSlicMaxLogicalProcs);
+ printk("Max physical processors = %d\n",
+ itVpdAreas.xSlicMaxPhysicalProcs);
++
++ iSeries_pcibios_init();
+ }
+
+ static void iSeries_show_cpuinfo(struct seq_file *m)
+@@ -641,24 +639,25 @@
+ }
+
+ define_machine(iseries) {
+- .name = "iSeries",
+- .setup_arch = iSeries_setup_arch,
+- .show_cpuinfo = iSeries_show_cpuinfo,
+- .init_IRQ = iSeries_init_IRQ,
+- .get_irq = iSeries_get_irq,
+- .init_early = iSeries_init_early,
+- .pcibios_fixup = iSeries_pci_final_fixup,
+- .restart = mf_reboot,
+- .power_off = mf_power_off,
+- .halt = mf_power_off,
+- .get_boot_time = iSeries_get_boot_time,
+- .set_rtc_time = iSeries_set_rtc_time,
+- .get_rtc_time = iSeries_get_rtc_time,
+- .calibrate_decr = generic_calibrate_decr,
+- .progress = iSeries_progress,
+- .probe = iseries_probe,
+- .ioremap = iseries_ioremap,
+- .iounmap = iseries_iounmap,
++ .name = "iSeries",
++ .setup_arch = iSeries_setup_arch,
++ .show_cpuinfo = iSeries_show_cpuinfo,
++ .init_IRQ = iSeries_init_IRQ,
++ .get_irq = iSeries_get_irq,
++ .init_early = iSeries_init_early,
++ .pcibios_fixup = iSeries_pci_final_fixup,
++ .pcibios_fixup_resources= iSeries_pcibios_fixup_resources,
++ .restart = mf_reboot,
++ .power_off = mf_power_off,
++ .halt = mf_power_off,
++ .get_boot_time = iSeries_get_boot_time,
++ .set_rtc_time = iSeries_set_rtc_time,
++ .get_rtc_time = iSeries_get_rtc_time,
++ .calibrate_decr = generic_calibrate_decr,
++ .progress = iSeries_progress,
++ .probe = iseries_probe,
++ .ioremap = iseries_ioremap,
++ .iounmap = iseries_iounmap,
+ /* XXX Implement enable_pmcs for iSeries */
+ };
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/setup.h powerpc.git/arch/powerpc/platforms/iseries/setup.h
+--- linux-2.6.24/arch/powerpc/platforms/iseries/setup.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/setup.h 2008-01-28 20:25:49.000000000 +0100
+@@ -17,6 +17,7 @@
+ #ifndef __ISERIES_SETUP_H__
+ #define __ISERIES_SETUP_H__
+
++extern void *iSeries_early_setup(void);
+ extern unsigned long iSeries_get_boot_time(void);
+ extern int iSeries_set_rtc_time(struct rtc_time *tm);
+ extern void iSeries_get_rtc_time(struct rtc_time *tm);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/iseries/vpdinfo.c powerpc.git/arch/powerpc/platforms/iseries/vpdinfo.c
+--- linux-2.6.24/arch/powerpc/platforms/iseries/vpdinfo.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/iseries/vpdinfo.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,275 +0,0 @@
+-/*
+- * This code gets the card location of the hardware
+- * Copyright (C) 2001 <Allan H Trautman> <IBM Corp>
+- * Copyright (C) 2005 Stephen Rothwel, IBM Corp
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the:
+- * Free Software Foundation, Inc.,
+- * 59 Temple Place, Suite 330,
+- * Boston, MA 02111-1307 USA
+- *
+- * Change Activity:
+- * Created, Feb 2, 2001
+- * Ported to ppc64, August 20, 2001
+- * End Change Activity
+- */
+-#include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/pci.h>
+-
+-#include <asm/types.h>
+-#include <asm/resource.h>
+-#include <asm/abs_addr.h>
+-#include <asm/pci-bridge.h>
+-#include <asm/iseries/hv_types.h>
+-
+-#include "pci.h"
+-#include "call_pci.h"
+-
+-/*
+- * Size of Bus VPD data
+- */
+-#define BUS_VPDSIZE 1024
+-
+-/*
+- * Bus Vpd Tags
+- */
+-#define VpdEndOfAreaTag 0x79
+-#define VpdIdStringTag 0x82
+-#define VpdVendorAreaTag 0x84
+-
+-/*
+- * Mfg Area Tags
+- */
+-#define VpdFruFrameId 0x4649 // "FI"
+-#define VpdSlotMapFormat 0x4D46 // "MF"
+-#define VpdSlotMap 0x534D // "SM"
+-
+-/*
+- * Structures of the areas
+- */
+-struct MfgVpdAreaStruct {
+- u16 Tag;
+- u8 TagLength;
+- u8 AreaData1;
+- u8 AreaData2;
+-};
+-typedef struct MfgVpdAreaStruct MfgArea;
+-#define MFG_ENTRY_SIZE 3
+-
+-struct SlotMapStruct {
+- u8 AgentId;
+- u8 SecondaryAgentId;
+- u8 PhbId;
+- char CardLocation[3];
+- char Parms[8];
+- char Reserved[2];
+-};
+-typedef struct SlotMapStruct SlotMap;
+-#define SLOT_ENTRY_SIZE 16
+-
+-/*
+- * Parse the Slot Area
+- */
+-static void __init iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
+- HvAgentId agent, u8 *PhbId, char card[4])
+-{
+- int SlotMapLen = MapLen;
+- SlotMap *SlotMapPtr = MapPtr;
+-
+- /*
+- * Parse Slot label until we find the one requested
+- */
+- while (SlotMapLen > 0) {
+- if (SlotMapPtr->AgentId == agent) {
+- /*
+- * If Phb wasn't found, grab the entry first one found.
+- */
+- if (*PhbId == 0xff)
+- *PhbId = SlotMapPtr->PhbId;
+- /* Found it, extract the data. */
+- if (SlotMapPtr->PhbId == *PhbId) {
+- memcpy(card, &SlotMapPtr->CardLocation, 3);
+- card[3] = 0;
+- break;
+- }
+- }
+- /* Point to the next Slot */
+- SlotMapPtr = (SlotMap *)((char *)SlotMapPtr + SLOT_ENTRY_SIZE);
+- SlotMapLen -= SLOT_ENTRY_SIZE;
+- }
+-}
+-
+-/*
+- * Parse the Mfg Area
+- */
+-static void __init iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
+- HvAgentId agent, u8 *PhbId,
+- u8 *frame, char card[4])
+-{
+- MfgArea *MfgAreaPtr = (MfgArea *)AreaData;
+- int MfgAreaLen = AreaLen;
+- u16 SlotMapFmt = 0;
+-
+- /* Parse Mfg Data */
+- while (MfgAreaLen > 0) {
+- int MfgTagLen = MfgAreaPtr->TagLength;
+- /* Frame ID (FI 4649020310 ) */
+- if (MfgAreaPtr->Tag == VpdFruFrameId) /* FI */
+- *frame = MfgAreaPtr->AreaData1;
+- /* Slot Map Format (MF 4D46020004 ) */
+- else if (MfgAreaPtr->Tag == VpdSlotMapFormat) /* MF */
+- SlotMapFmt = (MfgAreaPtr->AreaData1 * 256)
+- + MfgAreaPtr->AreaData2;
+- /* Slot Map (SM 534D90 */
+- else if (MfgAreaPtr->Tag == VpdSlotMap) { /* SM */
+- SlotMap *SlotMapPtr;
+-
+- if (SlotMapFmt == 0x1004)
+- SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
+- + MFG_ENTRY_SIZE + 1);
+- else
+- SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
+- + MFG_ENTRY_SIZE);
+- iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen,
+- agent, PhbId, card);
+- }
+- /*
+- * Point to the next Mfg Area
+- * Use defined size, sizeof give wrong answer
+- */
+- MfgAreaPtr = (MfgArea *)((char *)MfgAreaPtr + MfgTagLen
+- + MFG_ENTRY_SIZE);
+- MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE);
+- }
+-}
+-
+-/*
+- * Look for "BUS".. Data is not Null terminated.
+- * PHBID of 0xFF indicates PHB was not found in VPD Data.
+- */
+-static int __init iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
+-{
+- u8 *PhbPtr = AreaPtr;
+- int DataLen = AreaLength;
+- char PhbId = 0xFF;
+-
+- while (DataLen > 0) {
+- if ((*PhbPtr == 'B') && (*(PhbPtr + 1) == 'U')
+- && (*(PhbPtr + 2) == 'S')) {
+- PhbPtr += 3;
+- while (*PhbPtr == ' ')
+- ++PhbPtr;
+- PhbId = (*PhbPtr & 0x0F);
+- break;
+- }
+- ++PhbPtr;
+- --DataLen;
+- }
+- return PhbId;
+-}
+-
+-/*
+- * Parse out the VPD Areas
+- */
+-static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
+- HvAgentId agent, u8 *frame, char card[4])
+-{
+- u8 *TagPtr = VpdData;
+- int DataLen = VpdDataLen - 3;
+- u8 PhbId = 0xff;
+-
+- while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) {
+- int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);
+- u8 *AreaData = TagPtr + 3;
+-
+- if (*TagPtr == VpdIdStringTag)
+- PhbId = iSeries_Parse_PhbId(AreaData, AreaLen);
+- else if (*TagPtr == VpdVendorAreaTag)
+- iSeries_Parse_MfgArea(AreaData, AreaLen,
+- agent, &PhbId, frame, card);
+- /* Point to next Area. */
+- TagPtr = AreaData + AreaLen;
+- DataLen -= AreaLen;
+- }
+-}
+-
+-static int __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
+- u8 *frame, char card[4])
+-{
+- int status = 0;
+- int BusVpdLen = 0;
+- u8 *BusVpdPtr = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
+-
+- if (BusVpdPtr == NULL) {
+- printk("PCI: Bus VPD Buffer allocation failure.\n");
+- return 0;
+- }
+- BusVpdLen = HvCallPci_getBusVpd(bus, iseries_hv_addr(BusVpdPtr),
+- BUS_VPDSIZE);
+- if (BusVpdLen == 0) {
+- printk("PCI: Bus VPD Buffer zero length.\n");
+- goto out_free;
+- }
+- /* printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); */
+- /* Make sure this is what I think it is */
+- if (*BusVpdPtr != VpdIdStringTag) { /* 0x82 */
+- printk("PCI: Bus VPD Buffer missing starting tag.\n");
+- goto out_free;
+- }
+- iSeries_Parse_Vpd(BusVpdPtr, BusVpdLen, agent, frame, card);
+- status = 1;
+-out_free:
+- kfree(BusVpdPtr);
+- return status;
+-}
+-
+-/*
+- * Prints the device information.
+- * - Pass in pci_dev* pointer to the device.
+- * - Pass in the device count
+- *
+- * Format:
+- * PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet
+- * controller
+- */
+-void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
+-{
+- struct device_node *DevNode = PciDev->sysdata;
+- struct pci_dn *pdn;
+- u16 bus;
+- u8 frame = 0;
+- char card[4];
+- HvSubBusNumber subbus;
+- HvAgentId agent;
+-
+- if (DevNode == NULL) {
+- printk("%d. PCI: iSeries_Device_Information DevNode is NULL\n",
+- count);
+- return;
+- }
+-
+- pdn = PCI_DN(DevNode);
+- bus = pdn->busno;
+- subbus = pdn->bussubno;
+- agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
+- ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
+-
+- if (iSeries_Get_Location_Code(bus, agent, &frame, card)) {
+- printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, "
+- "Card %4s 0x%04X\n", count, bus,
+- PCI_SLOT(PciDev->devfn), PciDev->vendor, frame,
+- card, (int)(PciDev->class >> 8));
+- }
+-}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/maple/Kconfig powerpc.git/arch/powerpc/platforms/maple/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/maple/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/maple/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -1,6 +1,7 @@
+ config PPC_MAPLE
+ depends on PPC_MULTIPLATFORM && PPC64
+ bool "Maple 970FX Evaluation Board"
++ select PCI
+ select MPIC
+ select U3_DART
+ select MPIC_U3_HT_IRQS
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/maple/pci.c powerpc.git/arch/powerpc/platforms/maple/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/maple/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/maple/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -558,7 +558,7 @@
+ * safe assumptions hopefully.
+ */
+ if (u3_agp) {
+- struct device_node *np = u3_agp->arch_data;
++ struct device_node *np = u3_agp->dn;
+ PCI_DN(np)->busno = 0xf0;
+ for (np = np->child; np; np = np->sibling)
+ PCI_DN(np)->busno = 0xf0;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/maple/setup.c powerpc.git/arch/powerpc/platforms/maple/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/maple/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/maple/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,6 +42,7 @@
+ #include <linux/serial.h>
+ #include <linux/smp.h>
+ #include <linux/bitops.h>
++#include <linux/of_device.h>
+
+ #include <asm/processor.h>
+ #include <asm/sections.h>
+@@ -56,7 +57,6 @@
+ #include <asm/dma.h>
+ #include <asm/cputable.h>
+ #include <asm/time.h>
+-#include <asm/of_device.h>
+ #include <asm/lmb.h>
+ #include <asm/mpic.h>
+ #include <asm/rtas.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/Kconfig powerpc.git/arch/powerpc/platforms/pasemi/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -3,6 +3,7 @@
+ bool "PA Semi SoC-based platforms"
+ default n
+ select MPIC
++ select PCI
+ select PPC_UDBG_16550
+ select PPC_NATIVE
+ select MPIC_BROKEN_REGREAD
+@@ -17,7 +18,7 @@
+ bool "PA Semi IOMMU support"
+ depends on PPC_PASEMI
+ help
+- IOMMU support for PA6T-1682M
++ IOMMU support for PA Semi PWRficient
+
+ config PPC_PASEMI_IOMMU_DMA_FORCE
+ bool "Force DMA engine to use IOMMU"
+@@ -36,13 +37,4 @@
+ help
+ Driver for MDIO via GPIO on PWRficient platforms
+
+-config ELECTRA_IDE
+- tristate "Electra IDE driver"
+- default y
+- depends on PPC_PASEMI && ATA
+- select PATA_PLATFORM
+- help
+- This includes driver support for the Electra on-board IDE
+- interface.
+-
+ endmenu
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/Makefile powerpc.git/arch/powerpc/platforms/pasemi/Makefile
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -1,4 +1,3 @@
+ obj-y += setup.o pci.o time.o idle.o powersave.o iommu.o
+ obj-$(CONFIG_PPC_PASEMI_MDIO) += gpio_mdio.o
+-obj-$(CONFIG_ELECTRA_IDE) += electra_ide.o
+ obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += cpufreq.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/cpufreq.c powerpc.git/arch/powerpc/platforms/pasemi/cpufreq.c
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/cpufreq.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/cpufreq.c 2008-01-28 20:25:49.000000000 +0100
+@@ -32,6 +32,7 @@
+ #include <asm/io.h>
+ #include <asm/prom.h>
+ #include <asm/time.h>
++#include <asm/smp.h>
+
+ #define SDCASR_REG 0x0100
+ #define SDCASR_REG_STRIDE 0x1000
+@@ -124,6 +125,11 @@
+ local_irq_restore(flags);
+ }
+
++int check_astate(void)
++{
++ return get_cur_astate(hard_smp_processor_id());
++}
++
+ void restore_astate(int cpu)
+ {
+ set_astate(cpu, current_astate);
+@@ -147,7 +153,10 @@
+ if (!cpu)
+ goto out;
+
+- dn = of_find_compatible_node(NULL, "sdc", "1682m-sdc");
++ dn = of_find_compatible_node(NULL, NULL, "1682m-sdc");
++ if (!dn)
++ dn = of_find_compatible_node(NULL, NULL,
++ "pasemi,pwrficient-sdc");
+ if (!dn)
+ goto out;
+ err = of_address_to_resource(dn, 0, &res);
+@@ -160,7 +169,10 @@
+ goto out;
+ }
+
+- dn = of_find_compatible_node(NULL, "gizmo", "1682m-gizmo");
++ dn = of_find_compatible_node(NULL, NULL, "1682m-gizmo");
++ if (!dn)
++ dn = of_find_compatible_node(NULL, NULL,
++ "pasemi,pwrficient-gizmo");
+ if (!dn) {
+ err = -ENODEV;
+ goto out_unmap_sdcasr;
+@@ -292,7 +304,8 @@
+
+ static int __init pas_cpufreq_init(void)
+ {
+- if (!machine_is_compatible("PA6T-1682M"))
++ if (!machine_is_compatible("PA6T-1682M") &&
++ !machine_is_compatible("pasemi,pwrficient"))
+ return -ENODEV;
+
+ return cpufreq_register_driver(&pas_cpufreq_driver);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/electra_ide.c powerpc.git/arch/powerpc/platforms/pasemi/electra_ide.c
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/electra_ide.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/electra_ide.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,96 +0,0 @@
+-/*
+- * Copyright (C) 2007 PA Semi, Inc
+- *
+- * Maintained by: Olof Johansson <olof@lixom.net>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- */
+-
+-#include <linux/platform_device.h>
+-
+-#include <asm/prom.h>
+-#include <asm/system.h>
+-
+-/* The electra IDE interface is incredibly simple: Just a device on the localbus
+- * with interrupts hooked up to one of the GPIOs. The device tree contains the
+- * address window and interrupt mappings already, and the pata_platform driver handles
+- * the rest. We just need to hook the two up.
+- */
+-
+-#define MAX_IFS 4 /* really, we have only one */
+-
+-static struct platform_device *pdevs[MAX_IFS];
+-
+-static int __devinit electra_ide_init(void)
+-{
+- struct device_node *np;
+- struct resource r[3];
+- int ret = 0;
+- int i;
+-
+- np = of_find_compatible_node(NULL, "ide", "electra-ide");
+- i = 0;
+-
+- while (np && i < MAX_IFS) {
+- memset(r, 0, sizeof(r));
+-
+- /* pata_platform wants two address ranges: one for the base registers,
+- * another for the control (altstatus). It's located at offset 0x3f6 in
+- * the window, but the device tree only has one large register window
+- * that covers both ranges. So we need to split it up by hand here:
+- */
+-
+- ret = of_address_to_resource(np, 0, &r[0]);
+- if (ret)
+- goto out;
+- ret = of_address_to_resource(np, 0, &r[1]);
+- if (ret)
+- goto out;
+-
+- r[1].start += 0x3f6;
+- r[0].end = r[1].start-1;
+-
+- r[2].start = irq_of_parse_and_map(np, 0);
+- r[2].end = irq_of_parse_and_map(np, 0);
+- r[2].flags = IORESOURCE_IRQ;
+-
+- pr_debug("registering platform device at 0x%lx/0x%lx, irq is %ld\n",
+- r[0].start, r[1].start, r[2].start);
+- pdevs[i] = platform_device_register_simple("pata_platform", i, r, 3);
+- if (IS_ERR(pdevs[i])) {
+- ret = PTR_ERR(pdevs[i]);
+- pdevs[i] = NULL;
+- goto out;
+- }
+- np = of_find_compatible_node(np, "ide", "electra-ide");
+- }
+-out:
+- return ret;
+-}
+-module_init(electra_ide_init);
+-
+-static void __devexit electra_ide_exit(void)
+-{
+- int i;
+-
+- for (i = 0; i < MAX_IFS; i++)
+- if (pdevs[i])
+- platform_device_unregister(pdevs[i]);
+-}
+-module_exit(electra_ide_exit);
+-
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
+-MODULE_DESCRIPTION("PA Semi Electra IDE driver");
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/gpio_mdio.c powerpc.git/arch/powerpc/platforms/pasemi/gpio_mdio.c
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/gpio_mdio.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/gpio_mdio.c 2008-01-28 20:25:49.000000000 +0100
+@@ -30,7 +30,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/phy.h>
+ #include <linux/platform_device.h>
+-#include <asm/of_platform.h>
++#include <linux/of_platform.h>
+
+ #define DELAY 1
+
+@@ -218,45 +218,27 @@
+ const struct of_device_id *match)
+ {
+ struct device *dev = &ofdev->dev;
+- struct device_node *np = ofdev->node;
+- struct device_node *gpio_np;
++ struct device_node *phy_dn, *np = ofdev->node;
+ struct mii_bus *new_bus;
+- struct resource res;
+ struct gpio_priv *priv;
+ const unsigned int *prop;
+- int err = 0;
++ int err;
+ int i;
+
+- gpio_np = of_find_compatible_node(NULL, "gpio", "1682m-gpio");
+-
+- if (!gpio_np)
+- return -ENODEV;
+-
+- err = of_address_to_resource(gpio_np, 0, &res);
+- of_node_put(gpio_np);
+-
+- if (err)
+- return -EINVAL;
+-
+- if (!gpio_regs)
+- gpio_regs = ioremap(res.start, 0x100);
+-
+- if (!gpio_regs)
+- return -EPERM;
+-
++ err = -ENOMEM;
+ priv = kzalloc(sizeof(struct gpio_priv), GFP_KERNEL);
+- if (priv == NULL)
+- return -ENOMEM;
++ if (!priv)
++ goto out;
+
+ new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
+
+- if (new_bus == NULL)
+- return -ENOMEM;
++ if (!new_bus)
++ goto out_free_priv;
+
+- new_bus->name = "pasemi gpio mdio bus",
+- new_bus->read = &gpio_mdio_read,
+- new_bus->write = &gpio_mdio_write,
+- new_bus->reset = &gpio_mdio_reset,
++ new_bus->name = "pasemi gpio mdio bus";
++ new_bus->read = &gpio_mdio_read;
++ new_bus->write = &gpio_mdio_write;
++ new_bus->reset = &gpio_mdio_reset;
+
+ prop = of_get_property(np, "reg", NULL);
+ new_bus->id = *prop;
+@@ -265,9 +247,24 @@
+ new_bus->phy_mask = 0;
+
+ new_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
+- for(i = 0; i < PHY_MAX_ADDR; ++i)
+- new_bus->irq[i] = irq_create_mapping(NULL, 10);
+
++ if (!new_bus->irq)
++ goto out_free_bus;
++
++ for (i = 0; i < PHY_MAX_ADDR; i++)
++ new_bus->irq[i] = NO_IRQ;
++
++ for (phy_dn = of_get_next_child(np, NULL);
++ phy_dn != NULL;
++ phy_dn = of_get_next_child(np, phy_dn)) {
++ const unsigned int *ip, *regp;
++
++ ip = of_get_property(phy_dn, "interrupts", NULL);
++ regp = of_get_property(phy_dn, "reg", NULL);
++ if (!ip || !regp || *regp >= PHY_MAX_ADDR)
++ continue;
++ new_bus->irq[*regp] = irq_create_mapping(NULL, *ip);
++ }
+
+ prop = of_get_property(np, "mdc-pin", NULL);
+ priv->mdc_pin = *prop;
+@@ -280,17 +277,21 @@
+
+ err = mdiobus_register(new_bus);
+
+- if (0 != err) {
++ if (err != 0) {
+ printk(KERN_ERR "%s: Cannot register as MDIO bus, err %d\n",
+ new_bus->name, err);
+- goto bus_register_fail;
++ goto out_free_irq;
+ }
+
+ return 0;
+
+-bus_register_fail:
++out_free_irq:
++ kfree(new_bus->irq);
++out_free_bus:
+ kfree(new_bus);
+-
++out_free_priv:
++ kfree(priv);
++out:
+ return err;
+ }
+
+@@ -317,6 +318,7 @@
+ },
+ {},
+ };
++MODULE_DEVICE_TABLE(of, gpio_mdio_match);
+
+ static struct of_platform_driver gpio_mdio_driver =
+ {
+@@ -330,12 +332,32 @@
+
+ int gpio_mdio_init(void)
+ {
++ struct device_node *np;
++
++ np = of_find_compatible_node(NULL, NULL, "1682m-gpio");
++ if (!np)
++ np = of_find_compatible_node(NULL, NULL,
++ "pasemi,pwrficient-gpio");
++ if (!np)
++ return -ENODEV;
++ gpio_regs = of_iomap(np, 0);
++ of_node_put(np);
++
++ if (!gpio_regs)
++ return -ENODEV;
++
+ return of_register_platform_driver(&gpio_mdio_driver);
+ }
++module_init(gpio_mdio_init);
+
+ void gpio_mdio_exit(void)
+ {
+ of_unregister_platform_driver(&gpio_mdio_driver);
++ if (gpio_regs)
++ iounmap(gpio_regs);
+ }
+-device_initcall(gpio_mdio_init);
++module_exit(gpio_mdio_exit);
+
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Olof Johansson <olof@lixom.net>");
++MODULE_DESCRIPTION("Driver for MDIO over GPIO on PA Semi PWRficient-based boards");
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/idle.c powerpc.git/arch/powerpc/platforms/pasemi/idle.c
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/idle.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/idle.c 2008-01-28 20:25:49.000000000 +0100
+@@ -74,9 +74,6 @@
+
+ static int __init pasemi_idle_init(void)
+ {
+- if (!machine_is(pasemi))
+- return -ENODEV;
+-
+ #ifndef CONFIG_PPC_PASEMI_CPUFREQ
+ printk(KERN_WARNING "No cpufreq driver, powersavings modes disabled\n");
+ current_mode = 0;
+@@ -88,7 +85,7 @@
+
+ return 0;
+ }
+-late_initcall(pasemi_idle_init);
++machine_late_initcall(pasemi, pasemi_idle_init);
+
+ static int __init idle_param(char *p)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/pasemi.h powerpc.git/arch/powerpc/platforms/pasemi/pasemi.h
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/pasemi.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/pasemi.h 2008-01-28 20:25:49.000000000 +0100
+@@ -16,8 +16,14 @@
+
+ /* Restore astate to last set */
+ #ifdef CONFIG_PPC_PASEMI_CPUFREQ
++extern int check_astate(void);
+ extern void restore_astate(int cpu);
+ #else
++static inline int check_astate(void)
++{
++ /* Always return >0 so we never power save */
++ return 1;
++}
+ static inline void restore_astate(int cpu)
+ {
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/powersave.S powerpc.git/arch/powerpc/platforms/pasemi/powersave.S
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/powersave.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/powersave.S 2008-01-28 20:25:49.000000000 +0100
+@@ -62,7 +62,16 @@
+ mflr r0
+ std r0, 16(r1)
+ stdu r1,-64(r1)
++#ifdef CONFIG_PPC_PASEMI_CPUFREQ
++ std r3, 48(r1)
+
++ /* Only do power savings when in astate 0 */
++ bl .check_astate
++ cmpwi r3,0
++ bne 1f
++
++ ld r3, 48(r1)
++#endif
+ LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
+ mfmsr r4
+ andc r5,r4,r6
+@@ -73,7 +82,7 @@
+
+ mtmsrd r4,0
+
+- addi r1,r1,64
++1: addi r1,r1,64
+ ld r0,16(r1)
+ mtlr r0
+ blr
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pasemi/setup.c powerpc.git/arch/powerpc/platforms/pasemi/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/pasemi/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pasemi/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -27,6 +27,7 @@
+ #include <linux/delay.h>
+ #include <linux/console.h>
+ #include <linux/pci.h>
++#include <linux/of_platform.h>
+
+ #include <asm/prom.h>
+ #include <asm/system.h>
+@@ -35,7 +36,7 @@
+ #include <asm/mpic.h>
+ #include <asm/smp.h>
+ #include <asm/time.h>
+-#include <asm/of_platform.h>
++#include <asm/mmu.h>
+
+ #include <pcmcia/ss.h>
+ #include <pcmcia/cistpl.h>
+@@ -43,6 +44,10 @@
+
+ #include "pasemi.h"
+
++#if !defined(CONFIG_SMP)
++static void smp_send_stop(void) {}
++#endif
++
+ /* SDC reset register, must be pre-mapped at reset time */
+ static void __iomem *reset_reg;
+
+@@ -56,10 +61,14 @@
+
+ static struct mce_regs mce_regs[MAX_MCE_REGS];
+ static int num_mce_regs;
++static int nmi_virq = NO_IRQ;
+
+
+ static void pas_restart(char *cmd)
+ {
++ /* Need to put others cpu in hold loop so they're not sleeping */
++ smp_send_stop();
++ udelay(10000);
+ printk("Restarting...\n");
+ while (1)
+ out_le32(reset_reg, 0x6000000);
+@@ -126,9 +135,6 @@
+ struct pci_dev *dev;
+ int reg;
+
+- if (!machine_is(pasemi))
+- return -ENODEV;
+-
+ /* Remap various SoC status registers for use by the MCE handler */
+
+ reg = 0;
+@@ -172,7 +178,7 @@
+
+ return 0;
+ }
+-device_initcall(pas_setup_mce_regs);
++machine_device_initcall(pasemi, pas_setup_mce_regs);
+
+ static __init void pas_init_IRQ(void)
+ {
+@@ -181,6 +187,8 @@
+ unsigned long openpic_addr;
+ const unsigned int *opprop;
+ int naddr, opplen;
++ int mpic_flags;
++ const unsigned int *nmiprop;
+ struct mpic *mpic;
+
+ mpic_node = NULL;
+@@ -213,13 +221,26 @@
+ openpic_addr = of_read_number(opprop, naddr);
+ printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
+
++ mpic_flags = MPIC_PRIMARY | MPIC_LARGE_VECTORS | MPIC_NO_BIAS;
++
++ nmiprop = of_get_property(mpic_node, "nmi-source", NULL);
++ if (nmiprop)
++ mpic_flags |= MPIC_ENABLE_MCK;
++
+ mpic = mpic_alloc(mpic_node, openpic_addr,
+- MPIC_PRIMARY|MPIC_LARGE_VECTORS,
+- 0, 0, " PAS-OPIC ");
++ mpic_flags, 0, 0, "PASEMI-OPIC");
+ BUG_ON(!mpic);
+
+ mpic_assign_isu(mpic, 0, openpic_addr + 0x10000);
+ mpic_init(mpic);
++ /* The NMI/MCK source needs to be prio 15 */
++ if (nmiprop) {
++ nmi_virq = irq_create_mapping(NULL, *nmiprop);
++ mpic_irq_set_priority(nmi_virq, 15);
++ set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
++ mpic_unmask_irq(nmi_virq);
++ }
++
+ of_node_put(mpic_node);
+ of_node_put(root);
+ }
+@@ -239,6 +260,14 @@
+
+ srr0 = regs->nip;
+ srr1 = regs->msr;
++
++ if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
++ printk(KERN_ERR "NMI delivered\n");
++ debugger(regs);
++ mpic_end_irq(nmi_virq);
++ goto out;
++ }
++
+ dsisr = mfspr(SPRN_DSISR);
+ printk(KERN_ERR "Machine Check on CPU %d\n", cpu);
+ printk(KERN_ERR "SRR0 0x%016lx SRR1 0x%016lx\n", srr0, srr1);
+@@ -295,14 +324,14 @@
+ int i;
+
+ printk(KERN_ERR "slb contents:\n");
+- for (i = 0; i < SLB_NUM_ENTRIES; i++) {
++ for (i = 0; i < mmu_slb_size; i++) {
+ asm volatile("slbmfee %0,%1" : "=r" (e) : "r" (i));
+ asm volatile("slbmfev %0,%1" : "=r" (v) : "r" (i));
+ printk(KERN_ERR "%02d %016lx %016lx\n", i, e, v);
+ }
+ }
+
+-
++out:
+ /* SRR1[62] is from MSR[62] if recoverable, so pass that back */
+ return !!(srr1 & 0x2);
+ }
+@@ -362,16 +391,17 @@
+
+
+ static struct of_device_id pasemi_bus_ids[] = {
++ /* Unfortunately needed for legacy firmwares */
+ { .type = "localbus", },
+ { .type = "sdc", },
++ /* These are the proper entries, which newer firmware uses */
++ { .compatible = "pasemi,localbus", },
++ { .compatible = "pasemi,sdc", },
+ {},
+ };
+
+ static int __init pasemi_publish_devices(void)
+ {
+- if (!machine_is(pasemi))
+- return 0;
+-
+ pasemi_pcmcia_init();
+
+ /* Publish OF platform devices for SDC and other non-PCI devices */
+@@ -379,7 +409,7 @@
+
+ return 0;
+ }
+-device_initcall(pasemi_publish_devices);
++machine_device_initcall(pasemi, pasemi_publish_devices);
+
+
+ /*
+@@ -389,7 +419,8 @@
+ {
+ unsigned long root = of_get_flat_dt_root();
+
+- if (!of_flat_dt_is_compatible(root, "PA6T-1682M"))
++ if (!of_flat_dt_is_compatible(root, "PA6T-1682M") &&
++ !of_flat_dt_is_compatible(root, "pasemi,pwrficient"))
+ return 0;
+
+ hpte_init_native();
+@@ -400,7 +431,7 @@
+ }
+
+ define_machine(pasemi) {
+- .name = "PA Semi PA6T-1682M",
++ .name = "PA Semi PWRficient",
+ .probe = pas_probe,
+ .setup_arch = pas_setup_arch,
+ .init_early = pas_init_early,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/low_i2c.c powerpc.git/arch/powerpc/platforms/powermac/low_i2c.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/low_i2c.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/low_i2c.c 2008-01-28 20:25:49.000000000 +0100
+@@ -585,8 +585,7 @@
+ struct device_node *np, *child, *parent;
+
+ /* Probe keywest-i2c busses */
+- for (np = NULL;
+- (np = of_find_compatible_node(np, "i2c","keywest-i2c")) != NULL;){
++ for_each_compatible_node(np, "i2c","keywest-i2c") {
+ struct pmac_i2c_host_kw *host;
+ int multibus, chans, i;
+
+@@ -1462,9 +1461,6 @@
+ return 0;
+ i2c_inited = 1;
+
+- if (!machine_is(powermac))
+- return 0;
+-
+ /* Probe keywest-i2c busses */
+ kw_i2c_probe();
+
+@@ -1483,7 +1479,7 @@
+
+ return 0;
+ }
+-arch_initcall(pmac_i2c_init);
++machine_arch_initcall(powermac, pmac_i2c_init);
+
+ /* Since pmac_i2c_init can be called too early for the platform device
+ * registration, we need to do it at a later time. In our case, subsys
+@@ -1515,4 +1511,4 @@
+
+ return 0;
+ }
+-subsys_initcall(pmac_i2c_create_platform_devices);
++machine_subsys_initcall(powermac, pmac_i2c_create_platform_devices);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/pci.c powerpc.git/arch/powerpc/platforms/powermac/pci.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -40,8 +40,6 @@
+ static int has_uninorth;
+ #ifdef CONFIG_PPC64
+ static struct pci_controller *u3_agp;
+-static struct pci_controller *u4_pcie;
+-static struct pci_controller *u3_ht;
+ #else
+ static int has_second_ohare;
+ #endif /* CONFIG_PPC64 */
+@@ -314,12 +312,15 @@
+
+ /* We only allow config cycles to devices that are in OF device-tree
+ * as we are apparently having some weird things going on with some
+- * revs of K2 on recent G5s
++ * revs of K2 on recent G5s, except for the host bridge itself, which
++ * is missing from the tree but we know we can probe.
+ */
+ if (bus->self)
+ busdn = pci_device_to_OF_node(bus->self);
++ else if (devfn == 0)
++ return 0;
+ else
+- busdn = hose->arch_data;
++ busdn = hose->dn;
+ for (dn = busdn->child; dn; dn = dn->sibling)
+ if (PCI_DN(dn) && PCI_DN(dn)->devfn == devfn)
+ break;
+@@ -344,14 +345,15 @@
+ + (((unsigned int)bus) << 16) \
+ + 0x01000000UL)
+
+-static volatile void __iomem *u3_ht_cfg_access(struct pci_controller* hose,
+- u8 bus, u8 devfn, u8 offset)
++static void __iomem *u3_ht_cfg_access(struct pci_controller *hose, u8 bus,
++ u8 devfn, u8 offset, int *swap)
+ {
++ *swap = 1;
+ if (bus == hose->first_busno) {
+- /* For now, we don't self probe U3 HT bridge */
+- if (PCI_SLOT(devfn) == 0)
+- return NULL;
+- return hose->cfg_data + U3_HT_CFA0(devfn, offset);
++ if (devfn != 0)
++ return hose->cfg_data + U3_HT_CFA0(devfn, offset);
++ *swap = 0;
++ return ((void __iomem *)hose->cfg_addr) + (offset << 2);
+ } else
+ return hose->cfg_data + U3_HT_CFA1(bus, devfn, offset);
+ }
+@@ -360,14 +362,15 @@
+ int offset, int len, u32 *val)
+ {
+ struct pci_controller *hose;
+- volatile void __iomem *addr;
++ void __iomem *addr;
++ int swap;
+
+ hose = pci_bus_to_host(bus);
+ if (hose == NULL)
+ return PCIBIOS_DEVICE_NOT_FOUND;
+ if (offset >= 0x100)
+ return PCIBIOS_BAD_REGISTER_NUMBER;
+- addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
++ addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
+ if (!addr)
+ return PCIBIOS_DEVICE_NOT_FOUND;
+
+@@ -397,10 +400,10 @@
+ *val = in_8(addr);
+ break;
+ case 2:
+- *val = in_le16(addr);
++ *val = swap ? in_le16(addr) : in_be16(addr);
+ break;
+ default:
+- *val = in_le32(addr);
++ *val = swap ? in_le32(addr) : in_be32(addr);
+ break;
+ }
+ return PCIBIOS_SUCCESSFUL;
+@@ -410,14 +413,15 @@
+ int offset, int len, u32 val)
+ {
+ struct pci_controller *hose;
+- volatile void __iomem *addr;
++ void __iomem *addr;
++ int swap;
+
+ hose = pci_bus_to_host(bus);
+ if (hose == NULL)
+ return PCIBIOS_DEVICE_NOT_FOUND;
+ if (offset >= 0x100)
+ return PCIBIOS_BAD_REGISTER_NUMBER;
+- addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
++ addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
+ if (!addr)
+ return PCIBIOS_DEVICE_NOT_FOUND;
+
+@@ -439,10 +443,10 @@
+ out_8(addr, val);
+ break;
+ case 2:
+- out_le16(addr, val);
++ swap ? out_le16(addr, val) : out_be16(addr, val);
+ break;
+ default:
+- out_le32((u32 __iomem *)addr, val);
++ swap ? out_le32(addr, val) : out_be32(addr, val);
+ break;
+ }
+ return PCIBIOS_SUCCESSFUL;
+@@ -725,7 +729,7 @@
+ static int __init setup_uninorth(struct pci_controller *hose,
+ struct resource *addr)
+ {
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+ has_uninorth = 1;
+ hose->ops = &macrisc_pci_ops;
+ hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000);
+@@ -773,31 +777,72 @@
+ */
+ hose->first_busno = 0x00;
+ hose->last_busno = 0xff;
+- u4_pcie = hose;
+ }
+
+-static void __init setup_u3_ht(struct pci_controller* hose)
++static void __init parse_region_decode(struct pci_controller *hose,
++ u32 decode)
+ {
+- struct device_node *np = (struct device_node *)hose->arch_data;
+- struct pci_controller *other = NULL;
+- int i, cur;
++ unsigned long base, end, next = -1;
++ int i, cur = -1;
+
++ /* Iterate through all bits. We ignore the last bit as this region is
++ * reserved for the ROM among other niceties
++ */
++ for (i = 0; i < 31; i++) {
++ if ((decode & (0x80000000 >> i)) == 0)
++ continue;
++ if (i < 16) {
++ base = 0xf0000000 | (((u32)i) << 24);
++ end = base + 0x00ffffff;
++ } else {
++ base = ((u32)i-16) << 28;
++ end = base + 0x0fffffff;
++ }
++ if (base != next) {
++ if (++cur >= 3) {
++ printk(KERN_WARNING "PCI: Too many ranges !\n");
++ break;
++ }
++ hose->mem_resources[cur].flags = IORESOURCE_MEM;
++ hose->mem_resources[cur].name = hose->dn->full_name;
++ hose->mem_resources[cur].start = base;
++ hose->mem_resources[cur].end = end;
++ DBG(" %d: 0x%08lx-0x%08lx\n", cur, base, end);
++ } else {
++ DBG(" : -0x%08lx\n", end);
++ hose->mem_resources[cur].end = end;
++ }
++ next = end + 1;
++ }
++}
++
++static void __init setup_u3_ht(struct pci_controller* hose)
++{
++ struct device_node *np = hose->dn;
++ struct resource cfg_res, self_res;
++ u32 decode;
+
+ hose->ops = &u3_ht_pci_ops;
+
+- /* We hard code the address because of the different size of
+- * the reg address cell, we shall fix that by killing struct
+- * reg_property and using some accessor functions instead
++ /* Get base addresses from OF tree
+ */
+- hose->cfg_data = ioremap(0xf2000000, 0x02000000);
++ if (of_address_to_resource(np, 0, &cfg_res) ||
++ of_address_to_resource(np, 1, &self_res)) {
++ printk(KERN_ERR "PCI: Failed to get U3/U4 HT resources !\n");
++ return;
++ }
++
++ /* Map external cfg space access into cfg_data and self registers
++ * into cfg_addr
++ */
++ hose->cfg_data = ioremap(cfg_res.start, 0x02000000);
++ hose->cfg_addr = ioremap(self_res.start,
++ self_res.end - self_res.start + 1);
+
+ /*
+- * /ht node doesn't expose a "ranges" property, so we "remove"
+- * regions that have been allocated to AGP. So far, this version of
+- * the code doesn't assign any of the 0xfxxxxxxx "fine" memory regions
+- * to /ht. We need to fix that sooner or later by either parsing all
+- * child "ranges" properties or figuring out the U3 address space
+- * decoding logic and then read its configuration register (if any).
++ * /ht node doesn't expose a "ranges" property, we read the register
++ * that controls the decoding logic and use that for memory regions.
++ * The IO region is hard coded since it is fixed in HW as well.
+ */
+ hose->io_base_phys = 0xf4000000;
+ hose->pci_io_size = 0x00400000;
+@@ -808,76 +853,33 @@
+ hose->pci_mem_offset = 0;
+ hose->first_busno = 0;
+ hose->last_busno = 0xef;
+- hose->mem_resources[0].name = np->full_name;
+- hose->mem_resources[0].start = 0x80000000;
+- hose->mem_resources[0].end = 0xefffffff;
+- hose->mem_resources[0].flags = IORESOURCE_MEM;
+-
+- u3_ht = hose;
+-
+- if (u3_agp != NULL)
+- other = u3_agp;
+- else if (u4_pcie != NULL)
+- other = u4_pcie;
+
+- if (other == NULL) {
+- DBG("U3/4 has no AGP/PCIE, using full resource range\n");
+- return;
+- }
++ /* Note: fix offset when cfg_addr becomes a void * */
++ decode = in_be32(hose->cfg_addr + 0x80);
+
+- /* Fixup bus range vs. PCIE */
+- if (u4_pcie)
+- hose->last_busno = u4_pcie->first_busno - 1;
+-
+- /* We "remove" the AGP resources from the resources allocated to HT,
+- * that is we create "holes". However, that code does assumptions
+- * that so far happen to be true (cross fingers...), typically that
+- * resources in the AGP node are properly ordered
+- */
+- cur = 0;
+- for (i=0; i<3; i++) {
+- struct resource *res = &other->mem_resources[i];
+- if (res->flags != IORESOURCE_MEM)
+- continue;
+- /* We don't care about "fine" resources */
+- if (res->start >= 0xf0000000)
+- continue;
+- /* Check if it's just a matter of "shrinking" us in one
+- * direction
+- */
+- if (hose->mem_resources[cur].start == res->start) {
+- DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n",
+- cur, hose->mem_resources[cur].start,
+- res->end + 1);
+- hose->mem_resources[cur].start = res->end + 1;
+- continue;
+- }
+- if (hose->mem_resources[cur].end == res->end) {
+- DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n",
+- cur, hose->mem_resources[cur].end,
+- res->start - 1);
+- hose->mem_resources[cur].end = res->start - 1;
+- continue;
+- }
+- /* No, it's not the case, we need a hole */
+- if (cur == 2) {
+- /* not enough resources for a hole, we drop part
+- * of the range
+- */
+- printk(KERN_WARNING "Running out of resources"
+- " for /ht host !\n");
+- hose->mem_resources[cur].end = res->start - 1;
+- continue;
+- }
+- cur++;
+- DBG("U3/HT: hole, %d end at %08lx, %d start at %08lx\n",
+- cur-1, res->start - 1, cur, res->end + 1);
+- hose->mem_resources[cur].name = np->full_name;
+- hose->mem_resources[cur].flags = IORESOURCE_MEM;
+- hose->mem_resources[cur].start = res->end + 1;
+- hose->mem_resources[cur].end = hose->mem_resources[cur-1].end;
+- hose->mem_resources[cur-1].end = res->start - 1;
+- }
++ DBG("PCI: Apple HT bridge decode register: 0x%08x\n", decode);
++
++ /* NOTE: The decode register setup is a bit weird... region
++ * 0xf8000000 for example is marked as enabled in there while it's
++ & actually the memory controller registers.
++ * That means that we are incorrectly attributing it to HT.
++ *
++ * In a similar vein, region 0xf4000000 is actually the HT IO space but
++ * also marked as enabled in here and 0xf9000000 is used by some other
++ * internal bits of the northbridge.
++ *
++ * Unfortunately, we can't just mask out those bit as we would end
++ * up with more regions than we can cope (linux can only cope with
++ * 3 memory regions for a PHB at this stage).
++ *
++ * So for now, we just do a little hack. We happen to -know- that
++ * Apple firmware doesn't assign things below 0xfa000000 for that
++ * bridge anyway so we mask out all bits we don't want.
++ */
++ decode &= 0x003fffff;
++
++ /* Now parse the resulting bits and build resources */
++ parse_region_decode(hose, decode);
+ }
+ #endif /* CONFIG_PPC64 */
+
+@@ -994,6 +996,8 @@
+ struct device_node *np, *root;
+ struct device_node *ht = NULL;
+
++ ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN;
++
+ root = of_find_node_by_path("/");
+ if (root == NULL) {
+ printk(KERN_CRIT "pmac_pci_init: can't find root "
+@@ -1032,15 +1036,15 @@
+ * future though
+ */
+ if (u3_agp) {
+- struct device_node *np = u3_agp->arch_data;
++ struct device_node *np = u3_agp->dn;
+ PCI_DN(np)->busno = 0xf0;
+ for (np = np->child; np; np = np->sibling)
+ PCI_DN(np)->busno = 0xf0;
+ }
+ /* pmac_check_ht_link(); */
+
+- /* Tell pci.c to not use the common resource allocation mechanism */
+- pci_probe_only = 1;
++ /* We can allocate missing resources if any */
++ pci_probe_only = 0;
+
+ #else /* CONFIG_PPC64 */
+ init_p2pbridge();
+@@ -1051,13 +1055,13 @@
+ * some offset between bus number and domains for now when we
+ * assign all busses should help for now
+ */
+- if (pci_assign_all_buses)
++ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
+ pcibios_assign_bus_offset = 0x10;
+ #endif
+ }
+
+-int
+-pmac_pci_enable_device_hook(struct pci_dev *dev, int initial)
++#ifdef CONFIG_PPC32
++int pmac_pci_enable_device_hook(struct pci_dev *dev)
+ {
+ struct device_node* node;
+ int updatecfg = 0;
+@@ -1099,24 +1103,21 @@
+ updatecfg = 1;
+ }
+
++ /*
++ * Fixup various header fields on 32 bits. We don't do that on
++ * 64 bits as some of these have strange values behind the HT
++ * bridge and we must not, for example, enable MWI or set the
++ * cache line size on them.
++ */
+ if (updatecfg) {
+ u16 cmd;
+
+- /*
+- * Make sure PCI is correctly configured
+- *
+- * We use old pci_bios versions of the function since, by
+- * default, gmac is not powered up, and so will be absent
+- * from the kernel initial PCI lookup.
+- *
+- * Should be replaced by 2.4 new PCI mechanisms and really
+- * register the device.
+- */
+ pci_read_config_word(dev, PCI_COMMAND, &cmd);
+ cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
+ | PCI_COMMAND_INVALIDATE;
+ pci_write_config_word(dev, PCI_COMMAND, cmd);
+ pci_write_config_byte(dev, PCI_LATENCY_TIMER, 16);
++
+ pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
+ L1_CACHE_BYTES >> 2);
+ }
+@@ -1124,6 +1125,18 @@
+ return 0;
+ }
+
++void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev)
++{
++ struct device_node *node = pci_device_to_OF_node(dev);
++
++ /* We don't want to assign resources to USB controllers
++ * absent from the OF tree (iBook second controller)
++ */
++ if (dev->class == PCI_CLASS_SERIAL_USB_OHCI && !node)
++ dev->resource[0].flags = 0;
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, PCI_ANY_ID, pmac_pci_fixup_ohci);
++
+ /* We power down some devices after they have been probed. They'll
+ * be powered back on later on
+ */
+@@ -1171,7 +1184,6 @@
+ of_node_put(nd);
+ }
+
+-#ifdef CONFIG_PPC32
+ void pmac_pci_fixup_cardbus(struct pci_dev* dev)
+ {
+ if (!machine_is(powermac))
+@@ -1259,7 +1271,7 @@
+ }
+ }
+ DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata);
+-#endif
++#endif /* CONFIG_PPC32 */
+
+ /*
+ * Disable second function on K2-SATA, it's broken
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/pfunc_base.c powerpc.git/arch/powerpc/platforms/powermac/pfunc_base.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/pfunc_base.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/pfunc_base.c 2008-01-28 20:25:49.000000000 +0100
+@@ -363,8 +363,7 @@
+
+ return 0;
+ }
+-
+-arch_initcall(pmac_pfunc_base_install);
++machine_arch_initcall(powermac, pmac_pfunc_base_install);
+
+ #ifdef CONFIG_PM
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/pic.c powerpc.git/arch/powerpc/platforms/powermac/pic.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/pic.c 2008-01-28 20:25:49.000000000 +0100
+@@ -690,6 +690,5 @@
+ sysdev_driver_register(&pmacpic_sysclass, &driver_pmacpic);
+ return 0;
+ }
+-
+-subsys_initcall(init_pmacpic_sysfs);
++machine_subsys_initcall(powermac, init_pmacpic_sysfs);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/pmac.h powerpc.git/arch/powerpc/platforms/powermac/pmac.h
+--- linux-2.6.24/arch/powerpc/platforms/powermac/pmac.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/pmac.h 2008-01-28 20:25:49.000000000 +0100
+@@ -26,7 +26,7 @@
+ extern void pmac_nvram_update(void);
+ extern unsigned char pmac_nvram_read_byte(int addr);
+ extern void pmac_nvram_write_byte(int addr, unsigned char val);
+-extern int pmac_pci_enable_device_hook(struct pci_dev *dev, int initial);
++extern int pmac_pci_enable_device_hook(struct pci_dev *dev);
+ extern void pmac_pcibios_after_init(void);
+ extern int of_show_percpuinfo(struct seq_file *m, int i);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/setup.c powerpc.git/arch/powerpc/platforms/powermac/setup.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/setup.c 2008-01-28 20:25:49.000000000 +0100
+@@ -51,6 +51,8 @@
+ #include <linux/root_dev.h>
+ #include <linux/bitops.h>
+ #include <linux/suspend.h>
++#include <linux/of_device.h>
++#include <linux/of_platform.h>
+
+ #include <asm/reg.h>
+ #include <asm/sections.h>
+@@ -68,8 +70,6 @@
+ #include <asm/btext.h>
+ #include <asm/pmac_feature.h>
+ #include <asm/time.h>
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/mmu_context.h>
+ #include <asm/iommu.h>
+ #include <asm/smu.h>
+@@ -94,7 +94,6 @@
+ #define DEFAULT_ROOT_DEVICE Root_SDA1 /* sda1 - slightly silly choice */
+
+ #ifdef CONFIG_PPC64
+-#include <asm/udbg.h>
+ int sccdbg;
+ #endif
+
+@@ -398,17 +397,13 @@
+
+ static int pmac_late_init(void)
+ {
+- if (!machine_is(powermac))
+- return -ENODEV;
+-
+ initializing = 0;
+ /* this is udbg (which is __init) and we can later use it during
+ * cpu hotplug (in smp_core99_kick_cpu) */
+ ppc_md.progress = NULL;
+ return 0;
+ }
+-
+-late_initcall(pmac_late_init);
++machine_late_initcall(powermac, pmac_late_init);
+
+ /*
+ * This is __init_refok because we check for "initializing" before
+@@ -535,9 +530,6 @@
+ if (machine_is(chrp))
+ return -1;
+
+- if (!machine_is(powermac))
+- return 0;
+-
+ np = of_find_node_by_name(NULL, "valkyrie");
+ if (np)
+ of_platform_device_create(np, "valkyrie", NULL);
+@@ -552,8 +544,7 @@
+
+ return 0;
+ }
+-
+-device_initcall(pmac_declare_of_platform_devices);
++machine_device_initcall(powermac, pmac_declare_of_platform_devices);
+
+ /*
+ * Called very early, MMU is off, device-tree isn't unflattened
+@@ -613,9 +604,11 @@
+
+ /* We need to use normal PCI probing for the AGP bus,
+ * since the device for the AGP bridge isn't in the tree.
++ * Same for the PCIe host on U4 and the HT host bridge.
+ */
+ if (bus->self == NULL && (of_device_is_compatible(node, "u3-agp") ||
+- of_device_is_compatible(node, "u4-pcie")))
++ of_device_is_compatible(node, "u4-pcie") ||
++ of_device_is_compatible(node, "u3-ht")))
+ return PCI_PROBE_NORMAL;
+ return PCI_PROBE_DEVTREE;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/powermac/time.c powerpc.git/arch/powerpc/platforms/powermac/time.c
+--- linux-2.6.24/arch/powerpc/platforms/powermac/time.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/powermac/time.c 2008-01-28 20:25:49.000000000 +0100
+@@ -84,12 +84,14 @@
+ return delta;
+ }
+
++#if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU)
+ static void to_rtc_time(unsigned long now, struct rtc_time *tm)
+ {
+ to_tm(now, tm);
+ tm->tm_year -= 1900;
+ tm->tm_mon -= 1;
+ }
++#endif
+
+ static unsigned long from_rtc_time(struct rtc_time *tm)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/Kconfig powerpc.git/arch/powerpc/platforms/ps3/Kconfig
+--- linux-2.6.24/arch/powerpc/platforms/ps3/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -61,17 +61,6 @@
+ This support is mainly for Linux kernel development. If unsure,
+ say N.
+
+-config PS3_USE_LPAR_ADDR
+- depends on PPC_PS3 && EXPERIMENTAL
+- bool "PS3 use lpar address space"
+- default y
+- help
+- This option is solely for experimentation by experts. Disables
+- translation of lpar addresses. SPE support currently won't work
+- without this set to y.
+-
+- If you have any doubt, choose the default y.
+-
+ config PS3_VUART
+ depends on PPC_PS3
+ tristate
+@@ -138,4 +127,17 @@
+ be disabled on the kernel command line using "ps3flash=off", to
+ not allocate this fixed buffer.
+
++config PS3_LPM
++ tristate "PS3 Logical Performance Monitor support"
++ depends on PPC_PS3
++ help
++ Include support for the PS3 Logical Performance Monitor.
++
++ This support is required to use the logical performance monitor
++ of the PS3's LV1 hypervisor.
++
++ If you intend to use the advanced performance monitoring and
++ profiling support of the Cell processor with programs like
++ oprofile and perfmon2, then say Y or M, otherwise say N.
++
+ endmenu
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/device-init.c powerpc.git/arch/powerpc/platforms/ps3/device-init.c
+--- linux-2.6.24/arch/powerpc/platforms/ps3/device-init.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/device-init.c 2008-01-28 20:25:49.000000000 +0100
+@@ -23,6 +23,7 @@
+ #include <linux/kernel.h>
+ #include <linux/kthread.h>
+ #include <linux/init.h>
++#include <linux/reboot.h>
+
+ #include <asm/firmware.h>
+ #include <asm/lv1call.h>
+@@ -30,6 +31,89 @@
+
+ #include "platform.h"
+
++static int __init ps3_register_lpm_devices(void)
++{
++ int result;
++ u64 tmp1;
++ u64 tmp2;
++ struct ps3_system_bus_device *dev;
++
++ pr_debug(" -> %s:%d\n", __func__, __LINE__);
++
++ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
++ if (!dev)
++ return -ENOMEM;
++
++ dev->match_id = PS3_MATCH_ID_LPM;
++ dev->dev_type = PS3_DEVICE_TYPE_LPM;
++
++ /* The current lpm driver only supports a single BE processor. */
++
++ result = ps3_repository_read_be_node_id(0, &dev->lpm.node_id);
++
++ if (result) {
++ pr_debug("%s:%d: ps3_repository_read_be_node_id failed \n",
++ __func__, __LINE__);
++ goto fail_read_repo;
++ }
++
++ result = ps3_repository_read_lpm_privileges(dev->lpm.node_id, &tmp1,
++ &dev->lpm.rights);
++
++ if (result) {
++ pr_debug("%s:%d: ps3_repository_read_lpm_privleges failed \n",
++ __func__, __LINE__);
++ goto fail_read_repo;
++ }
++
++ lv1_get_logical_partition_id(&tmp2);
++
++ if (tmp1 != tmp2) {
++ pr_debug("%s:%d: wrong lpar\n",
++ __func__, __LINE__);
++ result = -ENODEV;
++ goto fail_rights;
++ }
++
++ if (!(dev->lpm.rights & PS3_LPM_RIGHTS_USE_LPM)) {
++ pr_debug("%s:%d: don't have rights to use lpm\n",
++ __func__, __LINE__);
++ result = -EPERM;
++ goto fail_rights;
++ }
++
++ pr_debug("%s:%d: pu_id %lu, rights %lu(%lxh)\n",
++ __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights,
++ dev->lpm.rights);
++
++ result = ps3_repository_read_pu_id(0, &dev->lpm.pu_id);
++
++ if (result) {
++ pr_debug("%s:%d: ps3_repository_read_pu_id failed \n",
++ __func__, __LINE__);
++ goto fail_read_repo;
++ }
++
++ result = ps3_system_bus_device_register(dev);
++
++ if (result) {
++ pr_debug("%s:%d ps3_system_bus_device_register failed\n",
++ __func__, __LINE__);
++ goto fail_register;
++ }
++
++ pr_debug(" <- %s:%d\n", __func__, __LINE__);
++ return 0;
++
++
++fail_register:
++fail_rights:
++fail_read_repo:
++ kfree(dev);
++ pr_debug(" <- %s:%d: failed\n", __func__, __LINE__);
++ return result;
++}
++
+ /**
+ * ps3_setup_gelic_device - Setup and register a gelic device instance.
+ *
+@@ -238,166 +322,6 @@
+ return result;
+ }
+
+-static int ps3stor_wait_for_completion(u64 dev_id, u64 tag,
+- unsigned int timeout)
+-{
+- int result = -1;
+- unsigned int retries = 0;
+- u64 status;
+-
+- for (retries = 0; retries < timeout; retries++) {
+- result = lv1_storage_check_async_status(dev_id, tag, &status);
+- if (!result)
+- break;
+-
+- msleep(1);
+- }
+-
+- if (result)
+- pr_debug("%s:%u: check_async_status: %s, status %lx\n",
+- __func__, __LINE__, ps3_result(result), status);
+-
+- return result;
+-}
+-
+-/**
+- * ps3_storage_wait_for_device - Wait for a storage device to become ready.
+- * @repo: The repository device to wait for.
+- *
+- * Uses the hypervisor's storage device notification mechanism to wait until
+- * a storage device is ready. The device notification mechanism uses a
+- * psuedo device (id = -1) to asynchronously notify the guest when storage
+- * devices become ready. The notification device has a block size of 512
+- * bytes.
+- */
+-
+-static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
+-{
+- int error = -ENODEV;
+- int result;
+- const u64 notification_dev_id = (u64)-1LL;
+- const unsigned int timeout = HZ;
+- u64 lpar;
+- u64 tag;
+- void *buf;
+- enum ps3_notify_type {
+- notify_device_ready = 0,
+- notify_region_probe = 1,
+- notify_region_update = 2,
+- };
+- struct {
+- u64 operation_code; /* must be zero */
+- u64 event_mask; /* OR of 1UL << enum ps3_notify_type */
+- } *notify_cmd;
+- struct {
+- u64 event_type; /* enum ps3_notify_type */
+- u64 bus_id;
+- u64 dev_id;
+- u64 dev_type;
+- u64 dev_port;
+- } *notify_event;
+-
+- pr_debug(" -> %s:%u: (%u:%u:%u)\n", __func__, __LINE__, repo->bus_id,
+- repo->dev_id, repo->dev_type);
+-
+- buf = kzalloc(512, GFP_KERNEL);
+- if (!buf)
+- return -ENOMEM;
+-
+- lpar = ps3_mm_phys_to_lpar(__pa(buf));
+- notify_cmd = buf;
+- notify_event = buf;
+-
+- result = lv1_open_device(repo->bus_id, notification_dev_id, 0);
+- if (result) {
+- printk(KERN_ERR "%s:%u: lv1_open_device %s\n", __func__,
+- __LINE__, ps3_result(result));
+- goto fail_free;
+- }
+-
+- /* Setup and write the request for device notification. */
+-
+- notify_cmd->operation_code = 0; /* must be zero */
+- notify_cmd->event_mask = 1UL << notify_region_probe;
+-
+- result = lv1_storage_write(notification_dev_id, 0, 0, 1, 0, lpar,
+- &tag);
+- if (result) {
+- printk(KERN_ERR "%s:%u: write failed %s\n", __func__, __LINE__,
+- ps3_result(result));
+- goto fail_close;
+- }
+-
+- /* Wait for the write completion */
+-
+- result = ps3stor_wait_for_completion(notification_dev_id, tag,
+- timeout);
+- if (result) {
+- printk(KERN_ERR "%s:%u: write not completed %s\n", __func__,
+- __LINE__, ps3_result(result));
+- goto fail_close;
+- }
+-
+- /* Loop here processing the requested notification events. */
+-
+- while (1) {
+- memset(notify_event, 0, sizeof(*notify_event));
+-
+- result = lv1_storage_read(notification_dev_id, 0, 0, 1, 0,
+- lpar, &tag);
+- if (result) {
+- printk(KERN_ERR "%s:%u: write failed %s\n", __func__,
+- __LINE__, ps3_result(result));
+- break;
+- }
+-
+- result = ps3stor_wait_for_completion(notification_dev_id, tag,
+- timeout);
+- if (result) {
+- printk(KERN_ERR "%s:%u: read not completed %s\n",
+- __func__, __LINE__, ps3_result(result));
+- break;
+- }
+-
+- pr_debug("%s:%d: notify event (%u:%u:%u): event_type 0x%lx, "
+- "port %lu\n", __func__, __LINE__, repo->bus_index,
+- repo->dev_index, repo->dev_type,
+- notify_event->event_type, notify_event->dev_port);
+-
+- if (notify_event->event_type != notify_region_probe ||
+- notify_event->bus_id != repo->bus_id) {
+- pr_debug("%s:%u: bad notify_event: event %lu, "
+- "dev_id %lu, dev_type %lu\n",
+- __func__, __LINE__, notify_event->event_type,
+- notify_event->dev_id, notify_event->dev_type);
+- break;
+- }
+-
+- if (notify_event->dev_id == repo->dev_id &&
+- notify_event->dev_type == repo->dev_type) {
+- pr_debug("%s:%u: device ready (%u:%u:%u)\n", __func__,
+- __LINE__, repo->bus_index, repo->dev_index,
+- repo->dev_type);
+- error = 0;
+- break;
+- }
+-
+- if (notify_event->dev_id == repo->dev_id &&
+- notify_event->dev_type == PS3_DEV_TYPE_NOACCESS) {
+- pr_debug("%s:%u: no access: dev_id %u\n", __func__,
+- __LINE__, repo->dev_id);
+- break;
+- }
+- }
+-
+-fail_close:
+- lv1_close_device(repo->bus_id, notification_dev_id);
+-fail_free:
+- kfree(buf);
+- pr_debug(" <- %s:%u\n", __func__, __LINE__);
+- return error;
+-}
+-
+ static int ps3_setup_storage_dev(const struct ps3_repository_device *repo,
+ enum ps3_match_id match_id)
+ {
+@@ -449,16 +373,6 @@
+ goto fail_find_interrupt;
+ }
+
+- /* FIXME: Arrange to only do this on a 'cold' boot */
+-
+- result = ps3_storage_wait_for_device(repo);
+- if (result) {
+- printk(KERN_ERR "%s:%u: storage_notification failed %d\n",
+- __func__, __LINE__, result);
+- result = -ENODEV;
+- goto fail_probe_notification;
+- }
+-
+ for (i = 0; i < num_regions; i++) {
+ unsigned int id;
+ u64 start, size;
+@@ -494,7 +408,6 @@
+
+ fail_device_register:
+ fail_read_region:
+-fail_probe_notification:
+ fail_find_interrupt:
+ kfree(p);
+ fail_malloc:
+@@ -659,62 +572,268 @@
+ return result;
+ }
+
++static void ps3_find_and_add_device(u64 bus_id, u64 dev_id)
++{
++ struct ps3_repository_device repo;
++ int res;
++ unsigned int retries;
++ unsigned long rem;
++
++ /*
++ * On some firmware versions (e.g. 1.90), the device may not show up
++ * in the repository immediately
++ */
++ for (retries = 0; retries < 10; retries++) {
++ res = ps3_repository_find_device_by_id(&repo, bus_id, dev_id);
++ if (!res)
++ goto found;
++
++ rem = msleep_interruptible(100);
++ if (rem)
++ break;
++ }
++ pr_warning("%s:%u: device %lu:%lu not found\n", __func__, __LINE__,
++ bus_id, dev_id);
++ return;
++
++found:
++ if (retries)
++ pr_debug("%s:%u: device %lu:%lu found after %u retries\n",
++ __func__, __LINE__, bus_id, dev_id, retries);
++
++ ps3_register_repository_device(&repo);
++ return;
++}
++
++#define PS3_NOTIFICATION_DEV_ID ULONG_MAX
++#define PS3_NOTIFICATION_INTERRUPT_ID 0
++
++struct ps3_notification_device {
++ struct ps3_system_bus_device sbd;
++ spinlock_t lock;
++ u64 tag;
++ u64 lv1_status;
++ struct completion done;
++};
++
++enum ps3_notify_type {
++ notify_device_ready = 0,
++ notify_region_probe = 1,
++ notify_region_update = 2,
++};
++
++struct ps3_notify_cmd {
++ u64 operation_code; /* must be zero */
++ u64 event_mask; /* OR of 1UL << enum ps3_notify_type */
++};
++
++struct ps3_notify_event {
++ u64 event_type; /* enum ps3_notify_type */
++ u64 bus_id;
++ u64 dev_id;
++ u64 dev_type;
++ u64 dev_port;
++};
++
++static irqreturn_t ps3_notification_interrupt(int irq, void *data)
++{
++ struct ps3_notification_device *dev = data;
++ int res;
++ u64 tag, status;
++
++ spin_lock(&dev->lock);
++ res = lv1_storage_get_async_status(PS3_NOTIFICATION_DEV_ID, &tag,
++ &status);
++ if (tag != dev->tag)
++ pr_err("%s:%u: tag mismatch, got %lx, expected %lx\n",
++ __func__, __LINE__, tag, dev->tag);
++
++ if (res) {
++ pr_err("%s:%u: res %d status 0x%lx\n", __func__, __LINE__, res,
++ status);
++ } else {
++ pr_debug("%s:%u: completed, status 0x%lx\n", __func__,
++ __LINE__, status);
++ dev->lv1_status = status;
++ complete(&dev->done);
++ }
++ spin_unlock(&dev->lock);
++ return IRQ_HANDLED;
++}
++
++static int ps3_notification_read_write(struct ps3_notification_device *dev,
++ u64 lpar, int write)
++{
++ const char *op = write ? "write" : "read";
++ unsigned long flags;
++ int res;
++
++ init_completion(&dev->done);
++ spin_lock_irqsave(&dev->lock, flags);
++ res = write ? lv1_storage_write(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
++ &dev->tag)
++ : lv1_storage_read(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
++ &dev->tag);
++ spin_unlock_irqrestore(&dev->lock, flags);
++ if (res) {
++ pr_err("%s:%u: %s failed %d\n", __func__, __LINE__, op, res);
++ return -EPERM;
++ }
++ pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op);
++
++ res = wait_event_interruptible(dev->done.wait,
++ dev->done.done || kthread_should_stop());
++ if (kthread_should_stop())
++ res = -EINTR;
++ if (res) {
++ pr_debug("%s:%u: interrupted %s\n", __func__, __LINE__, op);
++ return res;
++ }
++
++ if (dev->lv1_status) {
++ pr_err("%s:%u: %s not completed, status 0x%lx\n", __func__,
++ __LINE__, op, dev->lv1_status);
++ return -EIO;
++ }
++ pr_debug("%s:%u: notification %s completed\n", __func__, __LINE__, op);
++
++ return 0;
++}
++
++static struct task_struct *probe_task;
++
+ /**
+ * ps3_probe_thread - Background repository probing at system startup.
+ *
+ * This implementation only supports background probing on a single bus.
++ * It uses the hypervisor's storage device notification mechanism to wait until
++ * a storage device is ready. The device notification mechanism uses a
++ * pseudo device to asynchronously notify the guest when storage devices become
++ * ready. The notification device has a block size of 512 bytes.
+ */
+
+ static int ps3_probe_thread(void *data)
+ {
+- struct ps3_repository_device *repo = data;
+- int result;
+- unsigned int ms = 250;
++ struct ps3_notification_device dev;
++ int res;
++ unsigned int irq;
++ u64 lpar;
++ void *buf;
++ struct ps3_notify_cmd *notify_cmd;
++ struct ps3_notify_event *notify_event;
+
+ pr_debug(" -> %s:%u: kthread started\n", __func__, __LINE__);
+
+- do {
+- try_to_freeze();
++ buf = kzalloc(512, GFP_KERNEL);
++ if (!buf)
++ return -ENOMEM;
+
+- pr_debug("%s:%u: probing...\n", __func__, __LINE__);
++ lpar = ps3_mm_phys_to_lpar(__pa(buf));
++ notify_cmd = buf;
++ notify_event = buf;
++
++ /* dummy system bus device */
++ dev.sbd.bus_id = (u64)data;
++ dev.sbd.dev_id = PS3_NOTIFICATION_DEV_ID;
++ dev.sbd.interrupt_id = PS3_NOTIFICATION_INTERRUPT_ID;
++
++ res = lv1_open_device(dev.sbd.bus_id, dev.sbd.dev_id, 0);
++ if (res) {
++ pr_err("%s:%u: lv1_open_device failed %s\n", __func__,
++ __LINE__, ps3_result(res));
++ goto fail_free;
++ }
++
++ res = ps3_sb_event_receive_port_setup(&dev.sbd, PS3_BINDING_CPU_ANY,
++ &irq);
++ if (res) {
++ pr_err("%s:%u: ps3_sb_event_receive_port_setup failed %d\n",
++ __func__, __LINE__, res);
++ goto fail_close_device;
++ }
++
++ spin_lock_init(&dev.lock);
++
++ res = request_irq(irq, ps3_notification_interrupt, IRQF_DISABLED,
++ "ps3_notification", &dev);
++ if (res) {
++ pr_err("%s:%u: request_irq failed %d\n", __func__, __LINE__,
++ res);
++ goto fail_sb_event_receive_port_destroy;
++ }
++
++ /* Setup and write the request for device notification. */
++ notify_cmd->operation_code = 0; /* must be zero */
++ notify_cmd->event_mask = 1UL << notify_region_probe;
+
+- do {
+- result = ps3_repository_find_device(repo);
++ res = ps3_notification_read_write(&dev, lpar, 1);
++ if (res)
++ goto fail_free_irq;
+
+- if (result == -ENODEV)
+- pr_debug("%s:%u: nothing new\n", __func__,
+- __LINE__);
+- else if (result)
+- pr_debug("%s:%u: find device error.\n",
+- __func__, __LINE__);
+- else {
+- pr_debug("%s:%u: found device (%u:%u:%u)\n",
+- __func__, __LINE__, repo->bus_index,
+- repo->dev_index, repo->dev_type);
+- ps3_register_repository_device(repo);
+- ps3_repository_bump_device(repo);
+- ms = 250;
+- }
+- } while (!result);
++ /* Loop here processing the requested notification events. */
++ do {
++ try_to_freeze();
+
+- pr_debug("%s:%u: ms %u\n", __func__, __LINE__, ms);
++ memset(notify_event, 0, sizeof(*notify_event));
+
+- if ( ms > 60000)
++ res = ps3_notification_read_write(&dev, lpar, 0);
++ if (res)
+ break;
+
+- msleep_interruptible(ms);
++ pr_debug("%s:%u: notify event type 0x%lx bus id %lu dev id %lu"
++ " type %lu port %lu\n", __func__, __LINE__,
++ notify_event->event_type, notify_event->bus_id,
++ notify_event->dev_id, notify_event->dev_type,
++ notify_event->dev_port);
++
++ if (notify_event->event_type != notify_region_probe ||
++ notify_event->bus_id != dev.sbd.bus_id) {
++ pr_warning("%s:%u: bad notify_event: event %lu, "
++ "dev_id %lu, dev_type %lu\n",
++ __func__, __LINE__, notify_event->event_type,
++ notify_event->dev_id,
++ notify_event->dev_type);
++ continue;
++ }
+
+- /* An exponential backoff. */
+- ms <<= 1;
++ ps3_find_and_add_device(dev.sbd.bus_id, notify_event->dev_id);
+
+ } while (!kthread_should_stop());
+
++fail_free_irq:
++ free_irq(irq, &dev);
++fail_sb_event_receive_port_destroy:
++ ps3_sb_event_receive_port_destroy(&dev.sbd, irq);
++fail_close_device:
++ lv1_close_device(dev.sbd.bus_id, dev.sbd.dev_id);
++fail_free:
++ kfree(buf);
++
++ probe_task = NULL;
++
+ pr_debug(" <- %s:%u: kthread finished\n", __func__, __LINE__);
+
+ return 0;
+ }
+
+ /**
++ * ps3_stop_probe_thread - Stops the background probe thread.
++ *
++ */
++
++static int ps3_stop_probe_thread(struct notifier_block *nb, unsigned long code,
++ void *data)
++{
++ if (probe_task)
++ kthread_stop(probe_task);
++ return 0;
++}
++
++static struct notifier_block nb = {
++ .notifier_call = ps3_stop_probe_thread
++};
++
++/**
+ * ps3_start_probe_thread - Starts the background probe thread.
+ *
+ */
+@@ -723,7 +842,7 @@
+ {
+ int result;
+ struct task_struct *task;
+- static struct ps3_repository_device repo; /* must be static */
++ struct ps3_repository_device repo;
+
+ pr_debug(" -> %s:%d\n", __func__, __LINE__);
+
+@@ -746,7 +865,8 @@
+ return -ENODEV;
+ }
+
+- task = kthread_run(ps3_probe_thread, &repo, "ps3-probe-%u", bus_type);
++ task = kthread_run(ps3_probe_thread, (void *)repo.bus_id,
++ "ps3-probe-%u", bus_type);
+
+ if (IS_ERR(task)) {
+ result = PTR_ERR(task);
+@@ -755,6 +875,9 @@
+ return result;
+ }
+
++ probe_task = task;
++ register_reboot_notifier(&nb);
++
+ pr_debug(" <- %s:%d\n", __func__, __LINE__);
+ return 0;
+ }
+@@ -787,6 +910,8 @@
+
+ ps3_register_sound_devices();
+
++ ps3_register_lpm_devices();
++
+ pr_debug(" <- %s:%d\n", __func__, __LINE__);
+ return 0;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/mm.c powerpc.git/arch/powerpc/platforms/ps3/mm.c
+--- linux-2.6.24/arch/powerpc/platforms/ps3/mm.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/mm.c 2008-01-28 20:25:49.000000000 +0100
+@@ -36,11 +36,6 @@
+ #endif
+
+ enum {
+-#if defined(CONFIG_PS3_USE_LPAR_ADDR)
+- USE_LPAR_ADDR = 1,
+-#else
+- USE_LPAR_ADDR = 0,
+-#endif
+ #if defined(CONFIG_PS3_DYNAMIC_DMA)
+ USE_DYNAMIC_DMA = 1,
+ #else
+@@ -137,11 +132,8 @@
+ unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr)
+ {
+ BUG_ON(is_kernel_addr(phys_addr));
+- if (USE_LPAR_ADDR)
+- return phys_addr;
+- else
+- return (phys_addr < map.rm.size || phys_addr >= map.total)
+- ? phys_addr : phys_addr + map.r1.offset;
++ return (phys_addr < map.rm.size || phys_addr >= map.total)
++ ? phys_addr : phys_addr + map.r1.offset;
+ }
+
+ EXPORT_SYMBOL(ps3_mm_phys_to_lpar);
+@@ -309,7 +301,7 @@
+
+ BUG_ON(!mem_init_done);
+
+- start_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
++ start_addr = map.rm.size;
+ start_pfn = start_addr >> PAGE_SHIFT;
+ nr_pages = (map.r1.size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+@@ -359,7 +351,7 @@
+ static void __maybe_unused _dma_dump_region(const struct ps3_dma_region *r,
+ const char *func, int line)
+ {
+- DBG("%s:%d: dev %u:%u\n", func, line, r->dev->bus_id,
++ DBG("%s:%d: dev %lu:%lu\n", func, line, r->dev->bus_id,
+ r->dev->dev_id);
+ DBG("%s:%d: page_size %u\n", func, line, r->page_size);
+ DBG("%s:%d: bus_addr %lxh\n", func, line, r->bus_addr);
+@@ -394,7 +386,7 @@
+ static void _dma_dump_chunk (const struct dma_chunk* c, const char* func,
+ int line)
+ {
+- DBG("%s:%d: r.dev %u:%u\n", func, line,
++ DBG("%s:%d: r.dev %lu:%lu\n", func, line,
+ c->region->dev->bus_id, c->region->dev->dev_id);
+ DBG("%s:%d: r.bus_addr %lxh\n", func, line, c->region->bus_addr);
+ DBG("%s:%d: r.page_size %u\n", func, line, c->region->page_size);
+@@ -658,7 +650,7 @@
+ BUG_ON(!r);
+
+ if (!r->dev->bus_id) {
+- pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
++ pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
+ r->dev->bus_id, r->dev->dev_id);
+ return 0;
+ }
+@@ -724,7 +716,7 @@
+ BUG_ON(!r);
+
+ if (!r->dev->bus_id) {
+- pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
++ pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
+ r->dev->bus_id, r->dev->dev_id);
+ return 0;
+ }
+@@ -1007,7 +999,7 @@
+
+ if (r->offset + r->len > map.rm.size) {
+ /* Map (part of) 2nd RAM chunk */
+- virt_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
++ virt_addr = map.rm.size;
+ len = r->len;
+ if (r->offset >= map.rm.size)
+ virt_addr += r->offset - map.rm.size;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/platform.h powerpc.git/arch/powerpc/platforms/ps3/platform.h
+--- linux-2.6.24/arch/powerpc/platforms/ps3/platform.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/platform.h 2008-01-28 20:25:49.000000000 +0100
+@@ -89,13 +89,11 @@
+ PS3_DEV_TYPE_STOR_ROM = TYPE_ROM, /* 5 */
+ PS3_DEV_TYPE_SB_GPIO = 6,
+ PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC, /* 14 */
+- PS3_DEV_TYPE_STOR_DUMMY = 32,
+- PS3_DEV_TYPE_NOACCESS = 255,
+ };
+
+ int ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
+ u64 *value);
+-int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id);
++int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id);
+ int ps3_repository_read_bus_type(unsigned int bus_index,
+ enum ps3_bus_type *bus_type);
+ int ps3_repository_read_bus_num_dev(unsigned int bus_index,
+@@ -119,7 +117,7 @@
+ int ps3_repository_read_dev_str(unsigned int bus_index,
+ unsigned int dev_index, const char *dev_str, u64 *value);
+ int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
+- unsigned int *dev_id);
++ u64 *dev_id);
+ int ps3_repository_read_dev_type(unsigned int bus_index,
+ unsigned int dev_index, enum ps3_dev_type *dev_type);
+ int ps3_repository_read_dev_intr(unsigned int bus_index,
+@@ -138,21 +136,17 @@
+ /* repository bus enumerators */
+
+ struct ps3_repository_device {
+- enum ps3_bus_type bus_type;
+ unsigned int bus_index;
+- unsigned int bus_id;
+- enum ps3_dev_type dev_type;
+ unsigned int dev_index;
+- unsigned int dev_id;
++ enum ps3_bus_type bus_type;
++ enum ps3_dev_type dev_type;
++ u64 bus_id;
++ u64 dev_id;
+ };
+
+-static inline struct ps3_repository_device *ps3_repository_bump_device(
+- struct ps3_repository_device *repo)
+-{
+- repo->dev_index++;
+- return repo;
+-}
+ int ps3_repository_find_device(struct ps3_repository_device *repo);
++int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
++ u64 bus_id, u64 dev_id);
+ int ps3_repository_find_devices(enum ps3_bus_type bus_type,
+ int (*callback)(const struct ps3_repository_device *repo));
+ int ps3_repository_find_bus(enum ps3_bus_type bus_type, unsigned int from,
+@@ -186,10 +180,10 @@
+ unsigned int dev_index, unsigned int region_index,
+ unsigned int *region_id, u64 *region_start, u64 *region_size);
+
+-/* repository pu and memory info */
++/* repository logical pu and memory info */
+
+-int ps3_repository_read_num_pu(unsigned int *num_pu);
+-int ps3_repository_read_ppe_id(unsigned int *pu_index, unsigned int *ppe_id);
++int ps3_repository_read_num_pu(u64 *num_pu);
++int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id);
+ int ps3_repository_read_rm_base(unsigned int ppe_id, u64 *rm_base);
+ int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size);
+ int ps3_repository_read_region_total(u64 *region_total);
+@@ -200,9 +194,15 @@
+
+ int ps3_repository_read_num_be(unsigned int *num_be);
+ int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id);
++int ps3_repository_read_be_id(u64 node_id, u64 *be_id);
+ int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq);
+ int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq);
+
++/* repository performance monitor info */
++
++int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
++ u64 *rights);
++
+ /* repository 'Other OS' area */
+
+ int ps3_repository_read_boot_dat_addr(u64 *lpar_addr);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/repository.c powerpc.git/arch/powerpc/platforms/ps3/repository.c
+--- linux-2.6.24/arch/powerpc/platforms/ps3/repository.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/repository.c 2008-01-28 20:25:49.000000000 +0100
+@@ -33,7 +33,7 @@
+ };
+
+ #define dump_field(_a, _b) _dump_field(_a, _b, __func__, __LINE__)
+-static void _dump_field(const char *hdr, u64 n, const char* func, int line)
++static void _dump_field(const char *hdr, u64 n, const char *func, int line)
+ {
+ #if defined(DEBUG)
+ char s[16];
+@@ -50,8 +50,8 @@
+
+ #define dump_node_name(_a, _b, _c, _d, _e) \
+ _dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__)
+-static void _dump_node_name (unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
+- u64 n4, const char* func, int line)
++static void _dump_node_name(unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
++ u64 n4, const char *func, int line)
+ {
+ pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
+ _dump_field("n1: ", n1, func, line);
+@@ -63,7 +63,7 @@
+ #define dump_node(_a, _b, _c, _d, _e, _f, _g) \
+ _dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)
+ static void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
+- u64 v1, u64 v2, const char* func, int line)
++ u64 v1, u64 v2, const char *func, int line)
+ {
+ pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
+ _dump_field("n1: ", n1, func, line);
+@@ -165,21 +165,18 @@
+ make_first_field("bus", bus_index),
+ make_field(bus_str, 0),
+ 0, 0,
+- value, 0);
++ value, NULL);
+ }
+
+-int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id)
++int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id)
+ {
+ int result;
+- u64 v1;
+- u64 v2; /* unused */
+
+ result = read_node(PS3_LPAR_ID_PME,
+ make_first_field("bus", bus_index),
+ make_field("id", 0),
+ 0, 0,
+- &v1, &v2);
+- *bus_id = v1;
++ bus_id, NULL);
+ return result;
+ }
+
+@@ -193,7 +190,7 @@
+ make_first_field("bus", bus_index),
+ make_field("type", 0),
+ 0, 0,
+- &v1, 0);
++ &v1, NULL);
+ *bus_type = v1;
+ return result;
+ }
+@@ -208,7 +205,7 @@
+ make_first_field("bus", bus_index),
+ make_field("num_dev", 0),
+ 0, 0,
+- &v1, 0);
++ &v1, NULL);
+ *num_dev = v1;
+ return result;
+ }
+@@ -221,22 +218,20 @@
+ make_field("dev", dev_index),
+ make_field(dev_str, 0),
+ 0,
+- value, 0);
++ value, NULL);
+ }
+
+ int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
+- unsigned int *dev_id)
++ u64 *dev_id)
+ {
+ int result;
+- u64 v1;
+
+ result = read_node(PS3_LPAR_ID_PME,
+ make_first_field("bus", bus_index),
+ make_field("dev", dev_index),
+ make_field("id", 0),
+ 0,
+- &v1, 0);
+- *dev_id = v1;
++ dev_id, NULL);
+ return result;
+ }
+
+@@ -251,14 +246,14 @@
+ make_field("dev", dev_index),
+ make_field("type", 0),
+ 0,
+- &v1, 0);
++ &v1, NULL);
+ *dev_type = v1;
+ return result;
+ }
+
+ int ps3_repository_read_dev_intr(unsigned int bus_index,
+ unsigned int dev_index, unsigned int intr_index,
+- enum ps3_interrupt_type *intr_type, unsigned int* interrupt_id)
++ enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id)
+ {
+ int result;
+ u64 v1;
+@@ -287,7 +282,7 @@
+ make_field("dev", dev_index),
+ make_field("reg", reg_index),
+ make_field("type", 0),
+- &v1, 0);
++ &v1, NULL);
+ *reg_type = v1;
+ return result;
+ }
+@@ -332,7 +327,7 @@
+ return result;
+ }
+
+- pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %u, num_dev %u\n",
++ pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %lu, num_dev %u\n",
+ __func__, __LINE__, tmp.bus_type, tmp.bus_index, tmp.bus_id,
+ num_dev);
+
+@@ -349,47 +344,95 @@
+ return result;
+ }
+
+- if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) {
+- /*
+- * A storage device may show up in the repository before the
+- * hypervisor has finished probing its type and regions
+- */
+- unsigned int num_regions;
+-
+- if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) {
+- pr_debug("%s:%u storage device not ready\n", __func__,
+- __LINE__);
+- return -ENODEV;
+- }
++ result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
++ &tmp.dev_id);
+
+- result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index,
+- tmp.dev_index,
+- &num_regions);
++ if (result) {
++ pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
++ __LINE__);
++ return result;
++ }
++
++ pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %lu\n",
++ __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
++
++ *repo = tmp;
++ return 0;
++}
++
++int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
++ u64 bus_id, u64 dev_id)
++{
++ int result = -ENODEV;
++ struct ps3_repository_device tmp;
++ unsigned int num_dev;
++
++ pr_debug(" -> %s:%u: find device by id %lu:%lu\n", __func__, __LINE__,
++ bus_id, dev_id);
++
++ for (tmp.bus_index = 0; tmp.bus_index < 10; tmp.bus_index++) {
++ result = ps3_repository_read_bus_id(tmp.bus_index,
++ &tmp.bus_id);
+ if (result) {
+- pr_debug("%s:%d read_stor_dev_num_regions failed\n",
+- __func__, __LINE__);
++ pr_debug("%s:%u read_bus_id(%u) failed\n", __func__,
++ __LINE__, tmp.bus_index);
+ return result;
+ }
+
+- if (!num_regions) {
+- pr_debug("%s:%u storage device has no regions yet\n",
+- __func__, __LINE__);
+- return -ENODEV;
+- }
++ if (tmp.bus_id == bus_id)
++ goto found_bus;
++
++ pr_debug("%s:%u: skip, bus_id %lu\n", __func__, __LINE__,
++ tmp.bus_id);
+ }
++ pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
++ return result;
+
+- result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
+- &tmp.dev_id);
++found_bus:
++ result = ps3_repository_read_bus_type(tmp.bus_index, &tmp.bus_type);
++ if (result) {
++ pr_debug("%s:%u read_bus_type(%u) failed\n", __func__,
++ __LINE__, tmp.bus_index);
++ return result;
++ }
+
++ result = ps3_repository_read_bus_num_dev(tmp.bus_index, &num_dev);
+ if (result) {
+- pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
+- __LINE__);
++ pr_debug("%s:%u read_bus_num_dev failed\n", __func__,
++ __LINE__);
+ return result;
+ }
+
+- pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %u\n",
+- __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
++ for (tmp.dev_index = 0; tmp.dev_index < num_dev; tmp.dev_index++) {
++ result = ps3_repository_read_dev_id(tmp.bus_index,
++ tmp.dev_index,
++ &tmp.dev_id);
++ if (result) {
++ pr_debug("%s:%u read_dev_id(%u:%u) failed\n", __func__,
++ __LINE__, tmp.bus_index, tmp.dev_index);
++ return result;
++ }
++
++ if (tmp.dev_id == dev_id)
++ goto found_dev;
++
++ pr_debug("%s:%u: skip, dev_id %lu\n", __func__, __LINE__,
++ tmp.dev_id);
++ }
++ pr_debug(" <- %s:%u: dev not found\n", __func__, __LINE__);
++ return result;
++
++found_dev:
++ result = ps3_repository_read_dev_type(tmp.bus_index, tmp.dev_index,
++ &tmp.dev_type);
++ if (result) {
++ pr_debug("%s:%u read_dev_type failed\n", __func__, __LINE__);
++ return result;
++ }
+
++ pr_debug(" <- %s:%u: found: type (%u:%u) index (%u:%u) id (%lu:%lu)\n",
++ __func__, __LINE__, tmp.bus_type, tmp.dev_type, tmp.bus_index,
++ tmp.dev_index, tmp.bus_id, tmp.dev_id);
+ *repo = tmp;
+ return 0;
+ }
+@@ -402,50 +445,34 @@
+
+ pr_debug(" -> %s:%d: find bus_type %u\n", __func__, __LINE__, bus_type);
+
+- for (repo.bus_index = 0; repo.bus_index < 10; repo.bus_index++) {
++ repo.bus_type = bus_type;
++ result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index);
++ if (result) {
++ pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
++ return result;
++ }
+
+- result = ps3_repository_read_bus_type(repo.bus_index,
+- &repo.bus_type);
++ result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id);
++ if (result) {
++ pr_debug("%s:%d read_bus_id(%u) failed\n", __func__, __LINE__,
++ repo.bus_index);
++ return result;
++ }
+
+- if (result) {
+- pr_debug("%s:%d read_bus_type(%u) failed\n",
+- __func__, __LINE__, repo.bus_index);
++ for (repo.dev_index = 0; ; repo.dev_index++) {
++ result = ps3_repository_find_device(&repo);
++ if (result == -ENODEV) {
++ result = 0;
++ break;
++ } else if (result)
+ break;
+- }
+-
+- if (repo.bus_type != bus_type) {
+- pr_debug("%s:%d: skip, bus_type %u\n", __func__,
+- __LINE__, repo.bus_type);
+- continue;
+- }
+-
+- result = ps3_repository_read_bus_id(repo.bus_index,
+- &repo.bus_id);
+
++ result = callback(&repo);
+ if (result) {
+- pr_debug("%s:%d read_bus_id(%u) failed\n",
+- __func__, __LINE__, repo.bus_index);
+- continue;
+- }
+-
+- for (repo.dev_index = 0; ; repo.dev_index++) {
+- result = ps3_repository_find_device(&repo);
+-
+- if (result == -ENODEV) {
+- result = 0;
+- break;
+- } else if (result)
+- break;
+-
+- result = callback(&repo);
+-
+- if (result) {
+- pr_debug("%s:%d: abort at callback\n", __func__,
+- __LINE__);
+- break;
+- }
++ pr_debug("%s:%d: abort at callback\n", __func__,
++ __LINE__);
++ break;
+ }
+- break;
+ }
+
+ pr_debug(" <- %s:%d\n", __func__, __LINE__);
+@@ -561,7 +588,7 @@
+ make_first_field("bus", bus_index),
+ make_field("dev", dev_index),
+ make_field("port", 0),
+- 0, port, 0);
++ 0, port, NULL);
+ }
+
+ int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
+@@ -571,7 +598,7 @@
+ make_first_field("bus", bus_index),
+ make_field("dev", dev_index),
+ make_field("blk_size", 0),
+- 0, blk_size, 0);
++ 0, blk_size, NULL);
+ }
+
+ int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
+@@ -581,7 +608,7 @@
+ make_first_field("bus", bus_index),
+ make_field("dev", dev_index),
+ make_field("n_blocks", 0),
+- 0, num_blocks, 0);
++ 0, num_blocks, NULL);
+ }
+
+ int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
+@@ -594,7 +621,7 @@
+ make_first_field("bus", bus_index),
+ make_field("dev", dev_index),
+ make_field("n_regs", 0),
+- 0, &v1, 0);
++ 0, &v1, NULL);
+ *num_regions = v1;
+ return result;
+ }
+@@ -611,7 +638,7 @@
+ make_field("dev", dev_index),
+ make_field("region", region_index),
+ make_field("id", 0),
+- &v1, 0);
++ &v1, NULL);
+ *region_id = v1;
+ return result;
+ }
+@@ -624,7 +651,7 @@
+ make_field("dev", dev_index),
+ make_field("region", region_index),
+ make_field("size", 0),
+- region_size, 0);
++ region_size, NULL);
+ }
+
+ int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
+@@ -635,7 +662,7 @@
+ make_field("dev", dev_index),
+ make_field("region", region_index),
+ make_field("start", 0),
+- region_start, 0);
++ region_start, NULL);
+ }
+
+ int ps3_repository_read_stor_dev_info(unsigned int bus_index,
+@@ -684,6 +711,35 @@
+ return result;
+ }
+
++/**
++ * ps3_repository_read_num_pu - Number of logical PU processors for this lpar.
++ */
++
++int ps3_repository_read_num_pu(u64 *num_pu)
++{
++ *num_pu = 0;
++ return read_node(PS3_LPAR_ID_CURRENT,
++ make_first_field("bi", 0),
++ make_field("pun", 0),
++ 0, 0,
++ num_pu, NULL);
++}
++
++/**
++ * ps3_repository_read_pu_id - Read the logical PU id.
++ * @pu_index: Zero based index.
++ * @pu_id: The logical PU id.
++ */
++
++int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id)
++{
++ return read_node(PS3_LPAR_ID_CURRENT,
++ make_first_field("bi", 0),
++ make_field("pu", pu_index),
++ 0, 0,
++ pu_id, NULL);
++}
++
+ int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
+ {
+ return read_node(PS3_LPAR_ID_CURRENT,
+@@ -691,7 +747,7 @@
+ make_field("pu", 0),
+ ppe_id,
+ make_field("rm_size", 0),
+- rm_size, 0);
++ rm_size, NULL);
+ }
+
+ int ps3_repository_read_region_total(u64 *region_total)
+@@ -700,7 +756,7 @@
+ make_first_field("bi", 0),
+ make_field("rgntotal", 0),
+ 0, 0,
+- region_total, 0);
++ region_total, NULL);
+ }
+
+ /**
+@@ -736,7 +792,7 @@
+ make_first_field("bi", 0),
+ make_field("spun", 0),
+ 0, 0,
+- &v1, 0);
++ &v1, NULL);
+ *num_spu_reserved = v1;
+ return result;
+ }
+@@ -755,7 +811,7 @@
+ make_first_field("bi", 0),
+ make_field("spursvn", 0),
+ 0, 0,
+- &v1, 0);
++ &v1, NULL);
+ *num_resource_id = v1;
+ return result;
+ }
+@@ -768,7 +824,7 @@
+ */
+
+ int ps3_repository_read_spu_resource_id(unsigned int res_index,
+- enum ps3_spu_resource_type* resource_type, unsigned int *resource_id)
++ enum ps3_spu_resource_type *resource_type, unsigned int *resource_id)
+ {
+ int result;
+ u64 v1;
+@@ -785,14 +841,14 @@
+ return result;
+ }
+
+-int ps3_repository_read_boot_dat_address(u64 *address)
++static int ps3_repository_read_boot_dat_address(u64 *address)
+ {
+ return read_node(PS3_LPAR_ID_CURRENT,
+ make_first_field("bi", 0),
+ make_field("boot_dat", 0),
+ make_field("address", 0),
+ 0,
+- address, 0);
++ address, NULL);
+ }
+
+ int ps3_repository_read_boot_dat_size(unsigned int *size)
+@@ -805,7 +861,7 @@
+ make_field("boot_dat", 0),
+ make_field("size", 0),
+ 0,
+- &v1, 0);
++ &v1, NULL);
+ *size = v1;
+ return result;
+ }
+@@ -820,7 +876,7 @@
+ make_field("vir_uart", 0),
+ make_field("port", 0),
+ make_field("avset", 0),
+- &v1, 0);
++ &v1, NULL);
+ *port = v1;
+ return result;
+ }
+@@ -835,7 +891,7 @@
+ make_field("vir_uart", 0),
+ make_field("port", 0),
+ make_field("sysmgr", 0),
+- &v1, 0);
++ &v1, NULL);
+ *port = v1;
+ return result;
+ }
+@@ -856,6 +912,10 @@
+ : ps3_repository_read_boot_dat_size(size);
+ }
+
++/**
++ * ps3_repository_read_num_be - Number of physical BE processors in the system.
++ */
++
+ int ps3_repository_read_num_be(unsigned int *num_be)
+ {
+ int result;
+@@ -866,11 +926,17 @@
+ 0,
+ 0,
+ 0,
+- &v1, 0);
++ &v1, NULL);
+ *num_be = v1;
+ return result;
+ }
+
++/**
++ * ps3_repository_read_be_node_id - Read the physical BE processor node id.
++ * @be_index: Zero based index.
++ * @node_id: The BE processor node id.
++ */
++
+ int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id)
+ {
+ return read_node(PS3_LPAR_ID_PME,
+@@ -878,7 +944,23 @@
+ 0,
+ 0,
+ 0,
+- node_id, 0);
++ node_id, NULL);
++}
++
++/**
++ * ps3_repository_read_be_id - Read the physical BE processor id.
++ * @node_id: The BE processor node id.
++ * @be_id: The BE processor id.
++ */
++
++int ps3_repository_read_be_id(u64 node_id, u64 *be_id)
++{
++ return read_node(PS3_LPAR_ID_PME,
++ make_first_field("be", 0),
++ node_id,
++ 0,
++ 0,
++ be_id, NULL);
+ }
+
+ int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq)
+@@ -888,7 +970,7 @@
+ node_id,
+ make_field("clock", 0),
+ 0,
+- tb_freq, 0);
++ tb_freq, NULL);
+ }
+
+ int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq)
+@@ -897,11 +979,29 @@
+ u64 node_id;
+
+ *tb_freq = 0;
+- result = ps3_repository_read_be_node_id(0, &node_id);
++ result = ps3_repository_read_be_node_id(be_index, &node_id);
+ return result ? result
+ : ps3_repository_read_tb_freq(node_id, tb_freq);
+ }
+
++int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
++ u64 *rights)
++{
++ int result;
++ u64 node_id;
++
++ *lpar = 0;
++ *rights = 0;
++ result = ps3_repository_read_be_node_id(be_index, &node_id);
++ return result ? result
++ : read_node(PS3_LPAR_ID_PME,
++ make_first_field("be", 0),
++ node_id,
++ make_field("lpm", 0),
++ make_field("priv", 0),
++ lpar, rights);
++}
++
+ #if defined(DEBUG)
+
+ int ps3_repository_dump_resource_info(const struct ps3_repository_device *repo)
+@@ -1034,7 +1134,7 @@
+ continue;
+ }
+
+- pr_debug("%s:%d (%u:%u): dev_type %u, dev_id %u\n", __func__,
++ pr_debug("%s:%d (%u:%u): dev_type %u, dev_id %lu\n", __func__,
+ __LINE__, repo->bus_index, repo->dev_index,
+ repo->dev_type, repo->dev_id);
+
+@@ -1091,7 +1191,7 @@
+ continue;
+ }
+
+- pr_debug("%s:%d bus_%u: bus_type %u, bus_id %u, num_dev %u\n",
++ pr_debug("%s:%d bus_%u: bus_type %u, bus_id %lu, num_dev %u\n",
+ __func__, __LINE__, repo.bus_index, repo.bus_type,
+ repo.bus_id, num_dev);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/spu.c powerpc.git/arch/powerpc/platforms/ps3/spu.c
+--- linux-2.6.24/arch/powerpc/platforms/ps3/spu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/spu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -28,6 +28,7 @@
+ #include <asm/spu_priv1.h>
+ #include <asm/lv1call.h>
+
++#include "../cell/spufs/spufs.h"
+ #include "platform.h"
+
+ /* spu_management_ops */
+@@ -419,10 +420,34 @@
+ return 0;
+ }
+
++/**
++ * ps3_enable_spu - Enable SPU run control.
++ *
++ * An outstanding enhancement for the PS3 would be to add a guard to check
++ * for incorrect access to the spu problem state when the spu context is
++ * disabled. This check could be implemented with a flag added to the spu
++ * context that would inhibit mapping problem state pages, and a routine
++ * to unmap spu problem state pages. When the spu is enabled with
++ * ps3_enable_spu() the flag would be set allowing pages to be mapped,
++ * and when the spu is disabled with ps3_disable_spu() the flag would be
++ * cleared and the mapped problem state pages would be unmapped.
++ */
++
++static void ps3_enable_spu(struct spu_context *ctx)
++{
++}
++
++static void ps3_disable_spu(struct spu_context *ctx)
++{
++ ctx->ops->runcntl_stop(ctx);
++}
++
+ const struct spu_management_ops spu_management_ps3_ops = {
+ .enumerate_spus = ps3_enumerate_spus,
+ .create_spu = ps3_create_spu,
+ .destroy_spu = ps3_destroy_spu,
++ .enable_spu = ps3_enable_spu,
++ .disable_spu = ps3_disable_spu,
+ .init_affinity = ps3_init_affinity,
+ };
+
+@@ -505,8 +530,6 @@
+ static const u64 allowed = ~(MFC_STATE1_LOCAL_STORAGE_DECODE_MASK
+ | MFC_STATE1_PROBLEM_STATE_MASK);
+
+- sr1 |= MFC_STATE1_MASTER_RUN_CONTROL_MASK;
+-
+ BUG_ON((sr1 & allowed) != (spu_pdata(spu)->cache.sr1 & allowed));
+
+ spu_pdata(spu)->cache.sr1 = sr1;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/ps3/system-bus.c powerpc.git/arch/powerpc/platforms/ps3/system-bus.c
+--- linux-2.6.24/arch/powerpc/platforms/ps3/system-bus.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/ps3/system-bus.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,8 +42,8 @@
+ int gpu;
+ } static usage_hack;
+
+-static int ps3_is_device(struct ps3_system_bus_device *dev,
+- unsigned int bus_id, unsigned int dev_id)
++static int ps3_is_device(struct ps3_system_bus_device *dev, u64 bus_id,
++ u64 dev_id)
+ {
+ return dev->bus_id == bus_id && dev->dev_id == dev_id;
+ }
+@@ -182,8 +182,8 @@
+ case PS3_MATCH_ID_SYSTEM_MANAGER:
+ pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
+ __LINE__, dev->match_id);
+- pr_debug("%s:%d: bus_id: %u\n", __func__,
+- __LINE__, dev->bus_id);
++ pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
++ dev->bus_id);
+ BUG();
+ return -EINVAL;
+
+@@ -220,8 +220,8 @@
+ case PS3_MATCH_ID_SYSTEM_MANAGER:
+ pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
+ __LINE__, dev->match_id);
+- pr_debug("%s:%d: bus_id: %u\n", __func__,
+- __LINE__, dev->bus_id);
++ pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
++ dev->bus_id);
+ BUG();
+ return -EINVAL;
+
+@@ -240,7 +240,7 @@
+ static void _dump_mmio_region(const struct ps3_mmio_region* r,
+ const char* func, int line)
+ {
+- pr_debug("%s:%d: dev %u:%u\n", func, line, r->dev->bus_id,
++ pr_debug("%s:%d: dev %lu:%lu\n", func, line, r->dev->bus_id,
+ r->dev->dev_id);
+ pr_debug("%s:%d: bus_addr %lxh\n", func, line, r->bus_addr);
+ pr_debug("%s:%d: len %lxh\n", func, line, r->len);
+@@ -715,6 +715,7 @@
+ static unsigned int dev_ioc0_count;
+ static unsigned int dev_sb_count;
+ static unsigned int dev_vuart_count;
++ static unsigned int dev_lpm_count;
+
+ if (!dev->core.parent)
+ dev->core.parent = &ps3_system_bus;
+@@ -737,6 +738,10 @@
+ snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
+ "vuart_%02x", ++dev_vuart_count);
+ break;
++ case PS3_DEVICE_TYPE_LPM:
++ snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
++ "lpm_%02x", ++dev_lpm_count);
++ break;
+ default:
+ BUG();
+ };
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/eeh.c powerpc.git/arch/powerpc/platforms/pseries/eeh.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/eeh.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/eeh.c 2008-01-28 20:25:49.000000000 +0100
+@@ -29,6 +29,8 @@
+ #include <linux/rbtree.h>
+ #include <linux/seq_file.h>
+ #include <linux/spinlock.h>
++#include <linux/of.h>
++
+ #include <asm/atomic.h>
+ #include <asm/eeh.h>
+ #include <asm/eeh_event.h>
+@@ -169,7 +171,6 @@
+ */
+ static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
+ {
+- struct device_node *dn;
+ struct pci_dev *dev = pdn->pcidev;
+ u32 cfg;
+ int cap, i;
+@@ -243,12 +244,12 @@
+
+ /* Gather status on devices under the bridge */
+ if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
+- dn = pdn->node->child;
+- while (dn) {
++ struct device_node *dn;
++
++ for_each_child_of_node(pdn->node, dn) {
+ pdn = PCI_DN(dn);
+ if (pdn)
+ n += gather_pci_data(pdn, buf+n, len-n);
+- dn = dn->sibling;
+ }
+ }
+
+@@ -372,7 +373,7 @@
+ return dn;
+ }
+
+-/** Mark all devices that are peers of this device as failed.
++/** Mark all devices that are children of this device as failed.
+ * Mark the device driver too, so that it can see the failure
+ * immediately; this is critical, since some drivers poll
+ * status registers in interrupts ... If a driver is polling,
+@@ -380,9 +381,11 @@
+ * an interrupt context, which is bad.
+ */
+
+-static void __eeh_mark_slot (struct device_node *dn, int mode_flag)
++static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
+ {
+- while (dn) {
++ struct device_node *dn;
++
++ for_each_child_of_node(parent, dn) {
+ if (PCI_DN(dn)) {
+ /* Mark the pci device driver too */
+ struct pci_dev *dev = PCI_DN(dn)->pcidev;
+@@ -392,10 +395,8 @@
+ if (dev && dev->driver)
+ dev->error_state = pci_channel_io_frozen;
+
+- if (dn->child)
+- __eeh_mark_slot (dn->child, mode_flag);
++ __eeh_mark_slot(dn, mode_flag);
+ }
+- dn = dn->sibling;
+ }
+ }
+
+@@ -415,19 +416,19 @@
+ if (dev)
+ dev->error_state = pci_channel_io_frozen;
+
+- __eeh_mark_slot (dn->child, mode_flag);
++ __eeh_mark_slot(dn, mode_flag);
+ }
+
+-static void __eeh_clear_slot (struct device_node *dn, int mode_flag)
++static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
+ {
+- while (dn) {
++ struct device_node *dn;
++
++ for_each_child_of_node(parent, dn) {
+ if (PCI_DN(dn)) {
+ PCI_DN(dn)->eeh_mode &= ~mode_flag;
+ PCI_DN(dn)->eeh_check_count = 0;
+- if (dn->child)
+- __eeh_clear_slot (dn->child, mode_flag);
++ __eeh_clear_slot(dn, mode_flag);
+ }
+- dn = dn->sibling;
+ }
+ }
+
+@@ -444,7 +445,7 @@
+
+ PCI_DN(dn)->eeh_mode &= ~mode_flag;
+ PCI_DN(dn)->eeh_check_count = 0;
+- __eeh_clear_slot (dn->child, mode_flag);
++ __eeh_clear_slot(dn, mode_flag);
+ spin_unlock_irqrestore(&confirm_error_lock, flags);
+ }
+
+@@ -480,6 +481,7 @@
+ no_dn++;
+ return 0;
+ }
++ dn = find_device_pe(dn);
+ pdn = PCI_DN(dn);
+
+ /* Access to IO BARs might get this far and still not want checking. */
+@@ -545,7 +547,7 @@
+
+ /* Note that config-io to empty slots may fail;
+ * they are empty when they don't have children. */
+- if ((rets[0] == 5) && (dn->child == NULL)) {
++ if ((rets[0] == 5) && (rets[2] == 0) && (dn->child == NULL)) {
+ false_positives++;
+ pdn->eeh_false_positives ++;
+ rc = 0;
+@@ -848,11 +850,8 @@
+ if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
+ __restore_bars (pdn);
+
+- dn = pdn->node->child;
+- while (dn) {
++ for_each_child_of_node(pdn->node, dn)
+ eeh_restore_bars (PCI_DN(dn));
+- dn = dn->sibling;
+- }
+ }
+
+ /**
+@@ -1130,7 +1129,8 @@
+ void eeh_add_device_tree_early(struct device_node *dn)
+ {
+ struct device_node *sib;
+- for (sib = dn->child; sib; sib = sib->sibling)
++
++ for_each_child_of_node(dn, sib)
+ eeh_add_device_tree_early(sib);
+ eeh_add_device_early(dn);
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/eeh_driver.c powerpc.git/arch/powerpc/platforms/pseries/eeh_driver.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/eeh_driver.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/eeh_driver.c 2008-01-28 20:25:49.000000000 +0100
+@@ -310,8 +310,6 @@
+ const char *location, *pci_str, *drv_str;
+
+ frozen_dn = find_device_pe(event->dn);
+- frozen_bus = pcibios_find_pci_bus(frozen_dn);
+-
+ if (!frozen_dn) {
+
+ location = of_get_property(event->dn, "ibm,loc-code", NULL);
+@@ -321,6 +319,8 @@
+ location, pci_name(event->dev));
+ return NULL;
+ }
++
++ frozen_bus = pcibios_find_pci_bus(frozen_dn);
+ location = of_get_property(frozen_dn, "ibm,loc-code", NULL);
+ location = location ? location : "unknown";
+
+@@ -354,13 +354,6 @@
+ if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES)
+ goto excess_failures;
+
+- /* Get the current PCI slot state. */
+- rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
+- if (rc < 0) {
+- printk(KERN_WARNING "EEH: Permanent failure\n");
+- goto hard_fail;
+- }
+-
+ printk(KERN_WARNING
+ "EEH: This PCI device has failed %d times in the last hour:\n",
+ frozen_pdn->eeh_freeze_count);
+@@ -376,6 +369,14 @@
+ */
+ pci_walk_bus(frozen_bus, eeh_report_error, &result);
+
++ /* Get the current PCI slot state. This can take a long time,
++ * sometimes over 3 seconds for certain systems. */
++ rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
++ if (rc < 0) {
++ printk(KERN_WARNING "EEH: Permanent failure\n");
++ goto hard_fail;
++ }
++
+ /* Since rtas may enable MMIO when posting the error log,
+ * don't post the error log until after all dev drivers
+ * have been informed.
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/iommu.c powerpc.git/arch/powerpc/platforms/pseries/iommu.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/iommu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/iommu.c 2008-01-28 20:25:49.000000000 +0100
+@@ -251,7 +251,7 @@
+ const unsigned long *basep;
+ const u32 *sizep;
+
+- node = (struct device_node *)phb->arch_data;
++ node = phb->dn;
+
+ basep = of_get_property(node, "linux,tce-base", NULL);
+ sizep = of_get_property(node, "linux,tce-size", NULL);
+@@ -296,11 +296,12 @@
+ static void iommu_table_setparms_lpar(struct pci_controller *phb,
+ struct device_node *dn,
+ struct iommu_table *tbl,
+- const void *dma_window)
++ const void *dma_window,
++ int bussubno)
+ {
+ unsigned long offset, size;
+
+- tbl->it_busno = PCI_DN(dn)->bussubno;
++ tbl->it_busno = bussubno;
+ of_parse_dma_window(dn, dma_window, &tbl->it_index, &offset, &size);
+
+ tbl->it_base = 0;
+@@ -420,17 +421,10 @@
+ pdn->full_name, ppci->iommu_table);
+
+ if (!ppci->iommu_table) {
+- /* Bussubno hasn't been copied yet.
+- * Do it now because iommu_table_setparms_lpar needs it.
+- */
+-
+- ppci->bussubno = bus->number;
+-
+ tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
+ ppci->phb->node);
+-
+- iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window);
+-
++ iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window,
++ bus->number);
+ ppci->iommu_table = iommu_init_table(tbl, ppci->phb->node);
+ DBG(" created table: %p\n", ppci->iommu_table);
+ }
+@@ -523,14 +517,10 @@
+
+ pci = PCI_DN(pdn);
+ if (!pci->iommu_table) {
+- /* iommu_table_setparms_lpar needs bussubno. */
+- pci->bussubno = pci->phb->bus->number;
+-
+ tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
+ pci->phb->node);
+-
+- iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window);
+-
++ iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window,
++ pci->phb->bus->number);
+ pci->iommu_table = iommu_init_table(tbl, pci->phb->node);
+ DBG(" created table: %p\n", pci->iommu_table);
+ } else {
+@@ -556,7 +546,7 @@
+ case PSERIES_RECONFIG_REMOVE:
+ if (pci && pci->iommu_table &&
+ of_get_property(np, "ibm,dma-window", NULL))
+- iommu_free_table(np);
++ iommu_free_table(pci->iommu_table, np->full_name);
+ break;
+ default:
+ err = NOTIFY_DONE;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/pci_dlpar.c powerpc.git/arch/powerpc/platforms/pseries/pci_dlpar.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/pci_dlpar.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/pci_dlpar.c 2008-01-28 20:25:49.000000000 +0100
+@@ -83,7 +83,7 @@
+
+ /* Must be called before pci_bus_add_devices */
+ void
+-pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
++pcibios_fixup_new_pci_devices(struct pci_bus *bus)
+ {
+ struct pci_dev *dev;
+
+@@ -98,8 +98,6 @@
+ /* Fill device archdata and setup iommu table */
+ pcibios_setup_new_device(dev);
+
+- if(fix_bus)
+- pcibios_fixup_device_resources(dev, bus);
+ pci_read_irq_line(dev);
+ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+ struct resource *r = &dev->resource[i];
+@@ -132,8 +130,8 @@
+
+ pci_scan_child_bus(child_bus);
+
+- /* Fixup new pci devices without touching bus struct */
+- pcibios_fixup_new_pci_devices(child_bus, 0);
++ /* Fixup new pci devices */
++ pcibios_fixup_new_pci_devices(child_bus);
+
+ /* Make the discovered devices available */
+ pci_bus_add_devices(child_bus);
+@@ -169,7 +167,7 @@
+ /* use ofdt-based probe */
+ of_scan_bus(dn, bus);
+ if (!list_empty(&bus->devices)) {
+- pcibios_fixup_new_pci_devices(bus, 0);
++ pcibios_fixup_new_pci_devices(bus);
+ pci_bus_add_devices(bus);
+ eeh_add_device_tree_late(bus);
+ }
+@@ -178,7 +176,7 @@
+ slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
+ num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
+ if (num) {
+- pcibios_fixup_new_pci_devices(bus, 1);
++ pcibios_fixup_new_pci_devices(bus);
+ pci_bus_add_devices(bus);
+ eeh_add_device_tree_late(bus);
+ }
+@@ -208,7 +206,7 @@
+ eeh_add_device_tree_early(dn);
+
+ scan_phb(phb);
+- pcibios_fixup_new_pci_devices(phb->bus, 0);
++ pcibios_fixup_new_pci_devices(phb->bus);
+ pci_bus_add_devices(phb->bus);
+ eeh_add_device_tree_late(phb->bus);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/plpar_wrappers.h powerpc.git/arch/powerpc/platforms/pseries/plpar_wrappers.h
+--- linux-2.6.24/arch/powerpc/platforms/pseries/plpar_wrappers.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/plpar_wrappers.h 2008-01-28 20:25:49.000000000 +0100
+@@ -8,11 +8,6 @@
+ return plpar_hcall_norets(H_POLL_PENDING);
+ }
+
+-static inline long prod_processor(void)
+-{
+- return plpar_hcall_norets(H_PROD);
+-}
+-
+ static inline long cede_processor(void)
+ {
+ return plpar_hcall_norets(H_CEDE);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/smp.c powerpc.git/arch/powerpc/platforms/pseries/smp.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/smp.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/smp.c 2008-01-28 20:25:49.000000000 +0100
+@@ -46,6 +46,7 @@
+ #include <asm/pSeries_reconfig.h>
+ #include <asm/mpic.h>
+ #include <asm/vdso_datapage.h>
++#include <asm/cputhreads.h>
+
+ #include "plpar_wrappers.h"
+ #include "pseries.h"
+@@ -202,7 +203,7 @@
+ */
+ if (system_state < SYSTEM_RUNNING &&
+ cpu_has_feature(CPU_FTR_SMT) &&
+- !smt_enabled_at_boot && nr % 2 != 0)
++ !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
+ return 0;
+
+ return 1;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/xics.c powerpc.git/arch/powerpc/platforms/pseries/xics.c
+--- linux-2.6.24/arch/powerpc/platforms/pseries/xics.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/xics.c 2008-01-28 20:25:49.000000000 +0100
+@@ -87,19 +87,25 @@
+ /* Direct HW low level accessors */
+
+
+-static inline unsigned int direct_xirr_info_get(int n_cpu)
++static inline unsigned int direct_xirr_info_get(void)
+ {
+- return in_be32(&xics_per_cpu[n_cpu]->xirr.word);
++ int cpu = smp_processor_id();
++
++ return in_be32(&xics_per_cpu[cpu]->xirr.word);
+ }
+
+-static inline void direct_xirr_info_set(int n_cpu, int value)
++static inline void direct_xirr_info_set(int value)
+ {
+- out_be32(&xics_per_cpu[n_cpu]->xirr.word, value);
++ int cpu = smp_processor_id();
++
++ out_be32(&xics_per_cpu[cpu]->xirr.word, value);
+ }
+
+-static inline void direct_cppr_info(int n_cpu, u8 value)
++static inline void direct_cppr_info(u8 value)
+ {
+- out_8(&xics_per_cpu[n_cpu]->xirr.bytes[0], value);
++ int cpu = smp_processor_id();
++
++ out_8(&xics_per_cpu[cpu]->xirr.bytes[0], value);
+ }
+
+ static inline void direct_qirr_info(int n_cpu, u8 value)
+@@ -111,7 +117,7 @@
+ /* LPAR low level accessors */
+
+
+-static inline unsigned int lpar_xirr_info_get(int n_cpu)
++static inline unsigned int lpar_xirr_info_get(void)
+ {
+ unsigned long lpar_rc;
+ unsigned long return_value;
+@@ -122,7 +128,7 @@
+ return (unsigned int)return_value;
+ }
+
+-static inline void lpar_xirr_info_set(int n_cpu, int value)
++static inline void lpar_xirr_info_set(int value)
+ {
+ unsigned long lpar_rc;
+ unsigned long val64 = value & 0xffffffff;
+@@ -133,7 +139,7 @@
+ val64);
+ }
+
+-static inline void lpar_cppr_info(int n_cpu, u8 value)
++static inline void lpar_cppr_info(u8 value)
+ {
+ unsigned long lpar_rc;
+
+@@ -275,21 +281,19 @@
+
+ static void xics_eoi_direct(unsigned int virq)
+ {
+- int cpu = smp_processor_id();
+ unsigned int irq = (unsigned int)irq_map[virq].hwirq;
+
+ iosync();
+- direct_xirr_info_set(cpu, (0xff << 24) | irq);
++ direct_xirr_info_set((0xff << 24) | irq);
+ }
+
+
+ static void xics_eoi_lpar(unsigned int virq)
+ {
+- int cpu = smp_processor_id();
+ unsigned int irq = (unsigned int)irq_map[virq].hwirq;
+
+ iosync();
+- lpar_xirr_info_set(cpu, (0xff << 24) | irq);
++ lpar_xirr_info_set((0xff << 24) | irq);
+ }
+
+ static inline unsigned int xics_remap_irq(unsigned int vec)
+@@ -312,16 +316,12 @@
+
+ static unsigned int xics_get_irq_direct(void)
+ {
+- unsigned int cpu = smp_processor_id();
+-
+- return xics_remap_irq(direct_xirr_info_get(cpu));
++ return xics_remap_irq(direct_xirr_info_get());
+ }
+
+ static unsigned int xics_get_irq_lpar(void)
+ {
+- unsigned int cpu = smp_processor_id();
+-
+- return xics_remap_irq(lpar_xirr_info_get(cpu));
++ return xics_remap_irq(lpar_xirr_info_get());
+ }
+
+ #ifdef CONFIG_SMP
+@@ -387,12 +387,12 @@
+
+ #endif /* CONFIG_SMP */
+
+-static void xics_set_cpu_priority(int cpu, unsigned char cppr)
++static void xics_set_cpu_priority(unsigned char cppr)
+ {
+ if (firmware_has_feature(FW_FEATURE_LPAR))
+- lpar_cppr_info(cpu, cppr);
++ lpar_cppr_info(cppr);
+ else
+- direct_cppr_info(cpu, cppr);
++ direct_cppr_info(cppr);
+ iosync();
+ }
+
+@@ -440,9 +440,7 @@
+
+ void xics_setup_cpu(void)
+ {
+- int cpu = smp_processor_id();
+-
+- xics_set_cpu_priority(cpu, 0xff);
++ xics_set_cpu_priority(0xff);
+
+ /*
+ * Put the calling processor into the GIQ. This is really only
+@@ -783,7 +781,7 @@
+ unsigned int ipi;
+ struct irq_desc *desc;
+
+- xics_set_cpu_priority(cpu, 0);
++ xics_set_cpu_priority(0);
+
+ /*
+ * Clear IPI
+@@ -824,10 +822,11 @@
+ void xics_migrate_irqs_away(void)
+ {
+ int status;
+- unsigned int irq, virq, cpu = smp_processor_id();
++ int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id();
++ unsigned int irq, virq;
+
+ /* Reject any interrupt that was queued to us... */
+- xics_set_cpu_priority(cpu, 0);
++ xics_set_cpu_priority(0);
+
+ /* remove ourselves from the global interrupt queue */
+ status = rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE,
+@@ -835,7 +834,7 @@
+ WARN_ON(status < 0);
+
+ /* Allow IPIs again... */
+- xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
++ xics_set_cpu_priority(DEFAULT_PRIORITY);
+
+ for_each_irq(virq) {
+ struct irq_desc *desc;
+@@ -874,7 +873,7 @@
+ * The irq has to be migrated only in the single cpu
+ * case.
+ */
+- if (xics_status[0] != get_hard_smp_processor_id(cpu))
++ if (xics_status[0] != hw_cpu)
+ goto unlock;
+
+ printk(KERN_WARNING "IRQ %u affinity broken off cpu %u\n",
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/platforms/pseries/xics.h powerpc.git/arch/powerpc/platforms/pseries/xics.h
+--- linux-2.6.24/arch/powerpc/platforms/pseries/xics.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/platforms/pseries/xics.h 2008-01-28 20:25:49.000000000 +0100
+@@ -21,9 +21,6 @@
+ extern void xics_request_IPIs(void);
+ extern void xics_migrate_irqs_away(void);
+
+-/* first argument is ignored for now*/
+-void pSeriesLP_cppr_info(int n_cpu, u8 value);
+-
+ struct xics_ipi_struct {
+ volatile unsigned long value;
+ } ____cacheline_aligned;
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/Kconfig powerpc.git/arch/powerpc/sysdev/Kconfig
+--- linux-2.6.24/arch/powerpc/sysdev/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,8 @@
++# For a description of the syntax of this configuration file,
++# see Documentation/kbuild/kconfig-language.txt.
++#
++
++config PPC4xx_PCI_EXPRESS
++ bool
++ depends on PCI && 4xx
++ default n
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/Makefile powerpc.git/arch/powerpc/sysdev/Makefile
+--- linux-2.6.24/arch/powerpc/sysdev/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/Makefile 2008-01-28 20:25:49.000000000 +0100
+@@ -2,7 +2,7 @@
+ EXTRA_CFLAGS += -mno-minimal-toc
+ endif
+
+-mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o
++mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o
+ obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y)
+
+ obj-$(CONFIG_PPC_MPC106) += grackle.o
+@@ -12,6 +12,7 @@
+ obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
+ obj-$(CONFIG_FSL_SOC) += fsl_soc.o
+ obj-$(CONFIG_FSL_PCI) += fsl_pci.o
++obj-$(CONFIG_RAPIDIO) += fsl_rio.o
+ obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o
+ obj-$(CONFIG_QUICC_ENGINE) += qe_lib/
+ obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/
+@@ -24,9 +25,13 @@
+ ifeq ($(CONFIG_PPC_MERGE),y)
+ obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
+ obj-$(CONFIG_PPC_I8259) += i8259.o
+-obj-$(CONFIG_PPC_83xx) += ipic.o
++obj-$(CONFIG_IPIC) += ipic.o
+ obj-$(CONFIG_4xx) += uic.o
+ obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o
++obj-$(CONFIG_OF_RTC) += of_rtc.o
++ifeq ($(CONFIG_PCI),y)
++obj-$(CONFIG_4xx) += ppc4xx_pci.o
++endif
+ endif
+
+ # Temporary hack until we have migrated to asm-powerpc
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/axonram.c powerpc.git/arch/powerpc/sysdev/axonram.c
+--- linux-2.6.24/arch/powerpc/sysdev/axonram.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/axonram.c 2008-01-28 20:25:49.000000000 +0100
+@@ -42,8 +42,9 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/types.h>
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
++#include <linux/of_device.h>
++#include <linux/of_platform.h>
++
+ #include <asm/page.h>
+ #include <asm/prom.h>
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/bestcomm/bestcomm.h powerpc.git/arch/powerpc/sysdev/bestcomm/bestcomm.h
+--- linux-2.6.24/arch/powerpc/sysdev/bestcomm/bestcomm.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/bestcomm/bestcomm.h 2008-01-28 20:25:49.000000000 +0100
+@@ -20,7 +20,7 @@
+
+
+ /* ======================================================================== */
+-/* Generic task managment */
++/* Generic task management */
+ /* ======================================================================== */
+
+ /**
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/commproc.c powerpc.git/arch/powerpc/sysdev/commproc.c
+--- linux-2.6.24/arch/powerpc/sysdev/commproc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/commproc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -240,6 +240,34 @@
+ #endif
+ }
+
++static DEFINE_SPINLOCK(cmd_lock);
++
++#define MAX_CR_CMD_LOOPS 10000
++
++int cpm_command(u32 command, u8 opcode)
++{
++ int i, ret;
++ unsigned long flags;
++
++ if (command & 0xffffff0f)
++ return -EINVAL;
++
++ spin_lock_irqsave(&cmd_lock, flags);
++
++ ret = 0;
++ out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8));
++ for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
++ if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
++ goto out;
++
++ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
++ ret = -EIO;
++out:
++ spin_unlock_irqrestore(&cmd_lock, flags);
++ return ret;
++}
++EXPORT_SYMBOL(cpm_command);
++
+ /* We used to do this earlier, but have to postpone as long as possible
+ * to ensure the kernel VM is now running.
+ */
+@@ -408,7 +436,7 @@
+ #endif /* !CONFIG_PPC_CPM_NEW_BINDING */
+
+ struct cpm_ioport16 {
+- __be16 dir, par, sor, dat, intr;
++ __be16 dir, par, odr_sor, dat, intr;
+ __be16 res[3];
+ };
+
+@@ -438,6 +466,13 @@
+ else
+ clrbits32(&iop->par, pin);
+
++ if (port == CPM_PORTB) {
++ if (flags & CPM_PIN_OPENDRAIN)
++ setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
++ else
++ clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
++ }
++
+ if (port == CPM_PORTE) {
+ if (flags & CPM_PIN_SECONDARY)
+ setbits32(&iop->sor, pin);
+@@ -471,11 +506,17 @@
+ else
+ clrbits16(&iop->par, pin);
+
++ if (port == CPM_PORTA) {
++ if (flags & CPM_PIN_OPENDRAIN)
++ setbits16(&iop->odr_sor, pin);
++ else
++ clrbits16(&iop->odr_sor, pin);
++ }
+ if (port == CPM_PORTC) {
+ if (flags & CPM_PIN_SECONDARY)
+- setbits16(&iop->sor, pin);
++ setbits16(&iop->odr_sor, pin);
+ else
+- clrbits16(&iop->sor, pin);
++ clrbits16(&iop->odr_sor, pin);
+ }
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/cpm2_common.c powerpc.git/arch/powerpc/sysdev/cpm2_common.c
+--- linux-2.6.24/arch/powerpc/sysdev/cpm2_common.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/cpm2_common.c 2008-01-28 20:25:49.000000000 +0100
+@@ -82,6 +82,31 @@
+ cpmp = &cpm2_immr->im_cpm;
+ }
+
++static DEFINE_SPINLOCK(cmd_lock);
++
++#define MAX_CR_CMD_LOOPS 10000
++
++int cpm_command(u32 command, u8 opcode)
++{
++ int i, ret;
++ unsigned long flags;
++
++ spin_lock_irqsave(&cmd_lock, flags);
++
++ ret = 0;
++ out_be32(&cpmp->cp_cpcr, command | opcode | CPM_CR_FLG);
++ for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
++ if ((in_be32(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
++ goto out;
++
++ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
++ ret = -EIO;
++out:
++ spin_unlock_irqrestore(&cmd_lock, flags);
++ return ret;
++}
++EXPORT_SYMBOL(cpm_command);
++
+ /* Set a baud rate generator. This needs lots of work. There are
+ * eight BRGs, which can be connected to the CPM channels or output
+ * as clocks. The BRGs are in two different block of internal
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/fsl_pci.c powerpc.git/arch/powerpc/sysdev/fsl_pci.c
+--- linux-2.6.24/arch/powerpc/sysdev/fsl_pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/fsl_pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -33,8 +33,8 @@
+ struct ccsr_pci __iomem *pci;
+ int i;
+
+- pr_debug("PCI memory map start 0x%x, size 0x%x\n", rsrc->start,
+- rsrc->end - rsrc->start + 1);
++ pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n",
++ (u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1);
+ pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1);
+
+ /* Disable all windows (except powar0 since its ignored) */
+@@ -46,17 +46,17 @@
+ /* Setup outbound MEM window */
+ for(i = 0; i < 3; i++)
+ if (hose->mem_resources[i].flags & IORESOURCE_MEM){
+- pr_debug("PCI MEM resource start 0x%08x, size 0x%08x.\n",
+- hose->mem_resources[i].start,
+- hose->mem_resources[i].end
+- - hose->mem_resources[i].start + 1);
+- out_be32(&pci->pow[i+1].potar,
+- (hose->mem_resources[i].start >> 12)
+- & 0x000fffff);
++ resource_size_t pci_addr_start =
++ hose->mem_resources[i].start -
++ hose->pci_mem_offset;
++ pr_debug("PCI MEM resource start 0x%016llx, size 0x%016llx.\n",
++ (u64)hose->mem_resources[i].start,
++ (u64)hose->mem_resources[i].end
++ - (u64)hose->mem_resources[i].start + 1);
++ out_be32(&pci->pow[i+1].potar, (pci_addr_start >> 12));
+ out_be32(&pci->pow[i+1].potear, 0);
+ out_be32(&pci->pow[i+1].powbar,
+- (hose->mem_resources[i].start >> 12)
+- & 0x000fffff);
++ (hose->mem_resources[i].start >> 12));
+ /* Enable, Mem R/W */
+ out_be32(&pci->pow[i+1].powar, 0x80044000
+ | (__ilog2(hose->mem_resources[i].end
+@@ -65,15 +65,14 @@
+
+ /* Setup outbound IO window */
+ if (hose->io_resource.flags & IORESOURCE_IO){
+- pr_debug("PCI IO resource start 0x%08x, size 0x%08x, phy base 0x%08x.\n",
+- hose->io_resource.start,
+- hose->io_resource.end - hose->io_resource.start + 1,
+- hose->io_base_phys);
+- out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12)
+- & 0x000fffff);
++ pr_debug("PCI IO resource start 0x%016llx, size 0x%016llx, "
++ "phy base 0x%016llx.\n",
++ (u64)hose->io_resource.start,
++ (u64)hose->io_resource.end - (u64)hose->io_resource.start + 1,
++ (u64)hose->io_base_phys);
++ out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12));
+ out_be32(&pci->pow[i+1].potear, 0);
+- out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12)
+- & 0x000fffff);
++ out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12));
+ /* Enable, IO R/W */
+ out_be32(&pci->pow[i+1].powar, 0x80088000
+ | (__ilog2(hose->io_resource.end
+@@ -107,55 +106,17 @@
+ }
+ }
+
+-static void __init quirk_fsl_pcie_transparent(struct pci_dev *dev)
+-{
+- struct resource *res;
+- int i, res_idx = PCI_BRIDGE_RESOURCES;
+- struct pci_controller *hose;
++static int fsl_pcie_bus_fixup;
+
++static void __init quirk_fsl_pcie_header(struct pci_dev *dev)
++{
+ /* if we aren't a PCIe don't bother */
+ if (!pci_find_capability(dev, PCI_CAP_ID_EXP))
+ return ;
+
+- /*
+- * Make the bridge be transparent.
+- */
+- dev->transparent = 1;
+-
+- hose = pci_bus_to_host(dev->bus);
+- if (!hose) {
+- printk(KERN_ERR "Can't find hose for bus %d\n",
+- dev->bus->number);
+- return;
+- }
+-
+- /* Clear out any of the virtual P2P bridge registers */
+- pci_write_config_word(dev, PCI_IO_BASE_UPPER16, 0);
+- pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16, 0);
+- pci_write_config_byte(dev, PCI_IO_BASE, 0x10);
+- pci_write_config_byte(dev, PCI_IO_LIMIT, 0);
+- pci_write_config_word(dev, PCI_MEMORY_BASE, 0x10);
+- pci_write_config_word(dev, PCI_MEMORY_LIMIT, 0);
+- pci_write_config_word(dev, PCI_PREF_BASE_UPPER32, 0x0);
+- pci_write_config_word(dev, PCI_PREF_LIMIT_UPPER32, 0x0);
+- pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0x10);
+- pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0);
+-
+- if (hose->io_resource.flags) {
+- res = &dev->resource[res_idx++];
+- res->start = hose->io_resource.start;
+- res->end = hose->io_resource.end;
+- res->flags = hose->io_resource.flags;
+- update_bridge_resource(dev, res);
+- }
+-
+- for (i = 0; i < 3; i++) {
+- res = &dev->resource[res_idx + i];
+- res->start = hose->mem_resources[i].start;
+- res->end = hose->mem_resources[i].end;
+- res->flags = hose->mem_resources[i].flags;
+- update_bridge_resource(dev, res);
+- }
++ dev->class = PCI_CLASS_BRIDGE_PCI << 8;
++ fsl_pcie_bus_fixup = 1;
++ return ;
+ }
+
+ int __init fsl_pcie_check_link(struct pci_controller *hose)
+@@ -172,11 +133,24 @@
+ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
+ int i;
+
+- /* deal with bogus pci_bus when we don't have anything connected on PCIe */
+- if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
+- if (bus->parent) {
+- for (i = 0; i < 4; ++i)
+- bus->resource[i] = bus->parent->resource[i];
++ if ((bus->parent == hose->bus) &&
++ ((fsl_pcie_bus_fixup &&
++ early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) ||
++ (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK)))
++ {
++ for (i = 0; i < 4; ++i) {
++ struct resource *res = bus->resource[i];
++ struct resource *par = bus->parent->resource[i];
++ if (res) {
++ res->start = 0;
++ res->end = 0;
++ res->flags = 0;
++ }
++ if (res && par) {
++ res->start = par->start;
++ res->end = par->end;
++ res->flags = par->flags;
++ }
+ }
+ }
+ }
+@@ -202,7 +176,7 @@
+ printk(KERN_WARNING "Can't get bus-range for %s, assume"
+ " bus 0\n", dev->full_name);
+
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+ hose = pcibios_alloc_controller(dev);
+ if (!hose)
+ return -ENOMEM;
+@@ -222,7 +196,7 @@
+ hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK;
+ }
+
+- printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx."
++ printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx. "
+ "Firmware bus number: %d->%d\n",
+ (unsigned long long)rsrc.start, hose->first_busno,
+ hose->last_busno);
+@@ -240,23 +214,23 @@
+ return 0;
+ }
+
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_transparent);
+-DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_transparent);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
++DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/fsl_rio.c powerpc.git/arch/powerpc/sysdev/fsl_rio.c
+--- linux-2.6.24/arch/powerpc/sysdev/fsl_rio.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/fsl_rio.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,932 @@
++/*
++ * MPC85xx RapidIO support
++ *
++ * Copyright 2005 MontaVista Software, Inc.
++ * Matt Porter <mporter@kernel.crashing.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/dma-mapping.h>
++#include <linux/interrupt.h>
++#include <linux/rio.h>
++#include <linux/rio_drv.h>
++
++#include <asm/io.h>
++
++#define RIO_REGS_BASE (CCSRBAR + 0xc0000)
++#define RIO_ATMU_REGS_OFFSET 0x10c00
++#define RIO_MSG_REGS_OFFSET 0x11000
++#define RIO_MAINT_WIN_SIZE 0x400000
++#define RIO_DBELL_WIN_SIZE 0x1000
++
++#define RIO_MSG_OMR_MUI 0x00000002
++#define RIO_MSG_OSR_TE 0x00000080
++#define RIO_MSG_OSR_QOI 0x00000020
++#define RIO_MSG_OSR_QFI 0x00000010
++#define RIO_MSG_OSR_MUB 0x00000004
++#define RIO_MSG_OSR_EOMI 0x00000002
++#define RIO_MSG_OSR_QEI 0x00000001
++
++#define RIO_MSG_IMR_MI 0x00000002
++#define RIO_MSG_ISR_TE 0x00000080
++#define RIO_MSG_ISR_QFI 0x00000010
++#define RIO_MSG_ISR_DIQI 0x00000001
++
++#define RIO_MSG_DESC_SIZE 32
++#define RIO_MSG_BUFFER_SIZE 4096
++#define RIO_MIN_TX_RING_SIZE 2
++#define RIO_MAX_TX_RING_SIZE 2048
++#define RIO_MIN_RX_RING_SIZE 2
++#define RIO_MAX_RX_RING_SIZE 2048
++
++#define DOORBELL_DMR_DI 0x00000002
++#define DOORBELL_DSR_TE 0x00000080
++#define DOORBELL_DSR_QFI 0x00000010
++#define DOORBELL_DSR_DIQI 0x00000001
++#define DOORBELL_TID_OFFSET 0x03
++#define DOORBELL_SID_OFFSET 0x05
++#define DOORBELL_INFO_OFFSET 0x06
++
++#define DOORBELL_MESSAGE_SIZE 0x08
++#define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET))
++#define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET))
++#define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET))
++
++struct rio_atmu_regs {
++ u32 rowtar;
++ u32 pad1;
++ u32 rowbar;
++ u32 pad2;
++ u32 rowar;
++ u32 pad3[3];
++};
++
++struct rio_msg_regs {
++ u32 omr;
++ u32 osr;
++ u32 pad1;
++ u32 odqdpar;
++ u32 pad2;
++ u32 osar;
++ u32 odpr;
++ u32 odatr;
++ u32 odcr;
++ u32 pad3;
++ u32 odqepar;
++ u32 pad4[13];
++ u32 imr;
++ u32 isr;
++ u32 pad5;
++ u32 ifqdpar;
++ u32 pad6;
++ u32 ifqepar;
++ u32 pad7[250];
++ u32 dmr;
++ u32 dsr;
++ u32 pad8;
++ u32 dqdpar;
++ u32 pad9;
++ u32 dqepar;
++ u32 pad10[26];
++ u32 pwmr;
++ u32 pwsr;
++ u32 pad11;
++ u32 pwqbar;
++};
++
++struct rio_tx_desc {
++ u32 res1;
++ u32 saddr;
++ u32 dport;
++ u32 dattr;
++ u32 res2;
++ u32 res3;
++ u32 dwcnt;
++ u32 res4;
++};
++
++static u32 regs_win;
++static struct rio_atmu_regs *atmu_regs;
++static struct rio_atmu_regs *maint_atmu_regs;
++static struct rio_atmu_regs *dbell_atmu_regs;
++static u32 dbell_win;
++static u32 maint_win;
++static struct rio_msg_regs *msg_regs;
++
++static struct rio_dbell_ring {
++ void *virt;
++ dma_addr_t phys;
++} dbell_ring;
++
++static struct rio_msg_tx_ring {
++ void *virt;
++ dma_addr_t phys;
++ void *virt_buffer[RIO_MAX_TX_RING_SIZE];
++ dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
++ int tx_slot;
++ int size;
++ void *dev_id;
++} msg_tx_ring;
++
++static struct rio_msg_rx_ring {
++ void *virt;
++ dma_addr_t phys;
++ void *virt_buffer[RIO_MAX_RX_RING_SIZE];
++ int rx_slot;
++ int size;
++ void *dev_id;
++} msg_rx_ring;
++
++/**
++ * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
++ * @index: ID of RapidIO interface
++ * @destid: Destination ID of target device
++ * @data: 16-bit info field of RapidIO doorbell message
++ *
++ * Sends a MPC85xx doorbell message. Returns %0 on success or
++ * %-EINVAL on failure.
++ */
++static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
++{
++ pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
++ index, destid, data);
++ out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
++ out_be16((void *)(dbell_win), data);
++
++ return 0;
++}
++
++/**
++ * mpc85xx_local_config_read - Generate a MPC85xx local config space read
++ * @index: ID of RapdiIO interface
++ * @offset: Offset into configuration space
++ * @len: Length (in bytes) of the maintenance transaction
++ * @data: Value to be read into
++ *
++ * Generates a MPC85xx local configuration space read. Returns %0 on
++ * success or %-EINVAL on failure.
++ */
++static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
++{
++ pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
++ offset);
++ *data = in_be32((void *)(regs_win + offset));
++
++ return 0;
++}
++
++/**
++ * mpc85xx_local_config_write - Generate a MPC85xx local config space write
++ * @index: ID of RapdiIO interface
++ * @offset: Offset into configuration space
++ * @len: Length (in bytes) of the maintenance transaction
++ * @data: Value to be written
++ *
++ * Generates a MPC85xx local configuration space write. Returns %0 on
++ * success or %-EINVAL on failure.
++ */
++static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
++{
++ pr_debug
++ ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
++ index, offset, data);
++ out_be32((void *)(regs_win + offset), data);
++
++ return 0;
++}
++
++/**
++ * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
++ * @index: ID of RapdiIO interface
++ * @destid: Destination ID of transaction
++ * @hopcount: Number of hops to target device
++ * @offset: Offset into configuration space
++ * @len: Length (in bytes) of the maintenance transaction
++ * @val: Location to be read into
++ *
++ * Generates a MPC85xx read maintenance transaction. Returns %0 on
++ * success or %-EINVAL on failure.
++ */
++static int
++mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
++ u32 * val)
++{
++ u8 *data;
++
++ pr_debug
++ ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
++ index, destid, hopcount, offset, len);
++ out_be32((void *)&maint_atmu_regs->rowtar,
++ (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
++
++ data = (u8 *) maint_win + offset;
++ switch (len) {
++ case 1:
++ *val = in_8((u8 *) data);
++ break;
++ case 2:
++ *val = in_be16((u16 *) data);
++ break;
++ default:
++ *val = in_be32((u32 *) data);
++ break;
++ }
++
++ return 0;
++}
++
++/**
++ * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
++ * @index: ID of RapdiIO interface
++ * @destid: Destination ID of transaction
++ * @hopcount: Number of hops to target device
++ * @offset: Offset into configuration space
++ * @len: Length (in bytes) of the maintenance transaction
++ * @val: Value to be written
++ *
++ * Generates an MPC85xx write maintenance transaction. Returns %0 on
++ * success or %-EINVAL on failure.
++ */
++static int
++mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
++ int len, u32 val)
++{
++ u8 *data;
++ pr_debug
++ ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
++ index, destid, hopcount, offset, len, val);
++ out_be32((void *)&maint_atmu_regs->rowtar,
++ (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
++
++ data = (u8 *) maint_win + offset;
++ switch (len) {
++ case 1:
++ out_8((u8 *) data, val);
++ break;
++ case 2:
++ out_be16((u16 *) data, val);
++ break;
++ default:
++ out_be32((u32 *) data, val);
++ break;
++ }
++
++ return 0;
++}
++
++/**
++ * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
++ * @mport: Master port with outbound message queue
++ * @rdev: Target of outbound message
++ * @mbox: Outbound mailbox
++ * @buffer: Message to add to outbound queue
++ * @len: Length of message
++ *
++ * Adds the @buffer message to the MPC85xx outbound message queue. Returns
++ * %0 on success or %-EINVAL on failure.
++ */
++int
++rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
++ void *buffer, size_t len)
++{
++ u32 omr;
++ struct rio_tx_desc *desc =
++ (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
++ int ret = 0;
++
++ pr_debug
++ ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
++ rdev->destid, mbox, (int)buffer, len);
++
++ if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
++ ret = -EINVAL;
++ goto out;
++ }
++
++ /* Copy and clear rest of buffer */
++ memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
++ if (len < (RIO_MAX_MSG_SIZE - 4))
++ memset((void *)((u32) msg_tx_ring.
++ virt_buffer[msg_tx_ring.tx_slot] + len), 0,
++ RIO_MAX_MSG_SIZE - len);
++
++ /* Set mbox field for message */
++ desc->dport = mbox & 0x3;
++
++ /* Enable EOMI interrupt, set priority, and set destid */
++ desc->dattr = 0x28000000 | (rdev->destid << 2);
++
++ /* Set transfer size aligned to next power of 2 (in double words) */
++ desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
++
++ /* Set snooping and source buffer address */
++ desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
++
++ /* Increment enqueue pointer */
++ omr = in_be32((void *)&msg_regs->omr);
++ out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
++
++ /* Go to next descriptor */
++ if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
++ msg_tx_ring.tx_slot = 0;
++
++ out:
++ return ret;
++}
++
++EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
++
++/**
++ * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
++ * @irq: Linux interrupt number
++ * @dev_instance: Pointer to interrupt-specific data
++ *
++ * Handles outbound message interrupts. Executes a register outbound
++ * mailbox event handler and acks the interrupt occurrence.
++ */
++static irqreturn_t
++mpc85xx_rio_tx_handler(int irq, void *dev_instance)
++{
++ int osr;
++ struct rio_mport *port = (struct rio_mport *)dev_instance;
++
++ osr = in_be32((void *)&msg_regs->osr);
++
++ if (osr & RIO_MSG_OSR_TE) {
++ pr_info("RIO: outbound message transmission error\n");
++ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
++ goto out;
++ }
++
++ if (osr & RIO_MSG_OSR_QOI) {
++ pr_info("RIO: outbound message queue overflow\n");
++ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
++ goto out;
++ }
++
++ if (osr & RIO_MSG_OSR_EOMI) {
++ u32 dqp = in_be32((void *)&msg_regs->odqdpar);
++ int slot = (dqp - msg_tx_ring.phys) >> 5;
++ port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
++
++ /* Ack the end-of-message interrupt */
++ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
++ }
++
++ out:
++ return IRQ_HANDLED;
++}
++
++/**
++ * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
++ * @mport: Master port implementing the outbound message unit
++ * @dev_id: Device specific pointer to pass on event
++ * @mbox: Mailbox to open
++ * @entries: Number of entries in the outbound mailbox ring
++ *
++ * Initializes buffer ring, request the outbound message interrupt,
++ * and enables the outbound message unit. Returns %0 on success and
++ * %-EINVAL or %-ENOMEM on failure.
++ */
++int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
++{
++ int i, j, rc = 0;
++
++ if ((entries < RIO_MIN_TX_RING_SIZE) ||
++ (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
++ rc = -EINVAL;
++ goto out;
++ }
++
++ /* Initialize shadow copy ring */
++ msg_tx_ring.dev_id = dev_id;
++ msg_tx_ring.size = entries;
++
++ for (i = 0; i < msg_tx_ring.size; i++) {
++ if (!
++ (msg_tx_ring.virt_buffer[i] =
++ dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
++ &msg_tx_ring.phys_buffer[i],
++ GFP_KERNEL))) {
++ rc = -ENOMEM;
++ for (j = 0; j < msg_tx_ring.size; j++)
++ if (msg_tx_ring.virt_buffer[j])
++ dma_free_coherent(NULL,
++ RIO_MSG_BUFFER_SIZE,
++ msg_tx_ring.
++ virt_buffer[j],
++ msg_tx_ring.
++ phys_buffer[j]);
++ goto out;
++ }
++ }
++
++ /* Initialize outbound message descriptor ring */
++ if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
++ msg_tx_ring.size *
++ RIO_MSG_DESC_SIZE,
++ &msg_tx_ring.phys,
++ GFP_KERNEL))) {
++ rc = -ENOMEM;
++ goto out_dma;
++ }
++ memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
++ msg_tx_ring.tx_slot = 0;
++
++ /* Point dequeue/enqueue pointers at first entry in ring */
++ out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
++ out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
++
++ /* Configure for snooping */
++ out_be32((void *)&msg_regs->osar, 0x00000004);
++
++ /* Clear interrupt status */
++ out_be32((void *)&msg_regs->osr, 0x000000b3);
++
++ /* Hook up outbound message handler */
++ if ((rc =
++ request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
++ "msg_tx", (void *)mport)) < 0)
++ goto out_irq;
++
++ /*
++ * Configure outbound message unit
++ * Snooping
++ * Interrupts (all enabled, except QEIE)
++ * Chaining mode
++ * Disable
++ */
++ out_be32((void *)&msg_regs->omr, 0x00100220);
++
++ /* Set number of entries */
++ out_be32((void *)&msg_regs->omr,
++ in_be32((void *)&msg_regs->omr) |
++ ((get_bitmask_order(entries) - 2) << 12));
++
++ /* Now enable the unit */
++ out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
++
++ out:
++ return rc;
++
++ out_irq:
++ dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
++ msg_tx_ring.virt, msg_tx_ring.phys);
++
++ out_dma:
++ for (i = 0; i < msg_tx_ring.size; i++)
++ dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
++ msg_tx_ring.virt_buffer[i],
++ msg_tx_ring.phys_buffer[i]);
++
++ return rc;
++}
++
++/**
++ * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
++ * @mport: Master port implementing the outbound message unit
++ * @mbox: Mailbox to close
++ *
++ * Disables the outbound message unit, free all buffers, and
++ * frees the outbound message interrupt.
++ */
++void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
++{
++ /* Disable inbound message unit */
++ out_be32((void *)&msg_regs->omr, 0);
++
++ /* Free ring */
++ dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
++ msg_tx_ring.virt, msg_tx_ring.phys);
++
++ /* Free interrupt */
++ free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
++}
++
++/**
++ * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
++ * @irq: Linux interrupt number
++ * @dev_instance: Pointer to interrupt-specific data
++ *
++ * Handles inbound message interrupts. Executes a registered inbound
++ * mailbox event handler and acks the interrupt occurrence.
++ */
++static irqreturn_t
++mpc85xx_rio_rx_handler(int irq, void *dev_instance)
++{
++ int isr;
++ struct rio_mport *port = (struct rio_mport *)dev_instance;
++
++ isr = in_be32((void *)&msg_regs->isr);
++
++ if (isr & RIO_MSG_ISR_TE) {
++ pr_info("RIO: inbound message reception error\n");
++ out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
++ goto out;
++ }
++
++ /* XXX Need to check/dispatch until queue empty */
++ if (isr & RIO_MSG_ISR_DIQI) {
++ /*
++ * We implement *only* mailbox 0, but can receive messages
++ * for any mailbox/letter to that mailbox destination. So,
++ * make the callback with an unknown/invalid mailbox number
++ * argument.
++ */
++ port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
++
++ /* Ack the queueing interrupt */
++ out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
++ }
++
++ out:
++ return IRQ_HANDLED;
++}
++
++/**
++ * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
++ * @mport: Master port implementing the inbound message unit
++ * @dev_id: Device specific pointer to pass on event
++ * @mbox: Mailbox to open
++ * @entries: Number of entries in the inbound mailbox ring
++ *
++ * Initializes buffer ring, request the inbound message interrupt,
++ * and enables the inbound message unit. Returns %0 on success
++ * and %-EINVAL or %-ENOMEM on failure.
++ */
++int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
++{
++ int i, rc = 0;
++
++ if ((entries < RIO_MIN_RX_RING_SIZE) ||
++ (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
++ rc = -EINVAL;
++ goto out;
++ }
++
++ /* Initialize client buffer ring */
++ msg_rx_ring.dev_id = dev_id;
++ msg_rx_ring.size = entries;
++ msg_rx_ring.rx_slot = 0;
++ for (i = 0; i < msg_rx_ring.size; i++)
++ msg_rx_ring.virt_buffer[i] = NULL;
++
++ /* Initialize inbound message ring */
++ if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
++ msg_rx_ring.size *
++ RIO_MAX_MSG_SIZE,
++ &msg_rx_ring.phys,
++ GFP_KERNEL))) {
++ rc = -ENOMEM;
++ goto out;
++ }
++
++ /* Point dequeue/enqueue pointers at first entry in ring */
++ out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
++ out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
++
++ /* Clear interrupt status */
++ out_be32((void *)&msg_regs->isr, 0x00000091);
++
++ /* Hook up inbound message handler */
++ if ((rc =
++ request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
++ "msg_rx", (void *)mport)) < 0) {
++ dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
++ msg_tx_ring.virt_buffer[i],
++ msg_tx_ring.phys_buffer[i]);
++ goto out;
++ }
++
++ /*
++ * Configure inbound message unit:
++ * Snooping
++ * 4KB max message size
++ * Unmask all interrupt sources
++ * Disable
++ */
++ out_be32((void *)&msg_regs->imr, 0x001b0060);
++
++ /* Set number of queue entries */
++ out_be32((void *)&msg_regs->imr,
++ in_be32((void *)&msg_regs->imr) |
++ ((get_bitmask_order(entries) - 2) << 12));
++
++ /* Now enable the unit */
++ out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
++
++ out:
++ return rc;
++}
++
++/**
++ * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
++ * @mport: Master port implementing the inbound message unit
++ * @mbox: Mailbox to close
++ *
++ * Disables the inbound message unit, free all buffers, and
++ * frees the inbound message interrupt.
++ */
++void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
++{
++ /* Disable inbound message unit */
++ out_be32((void *)&msg_regs->imr, 0);
++
++ /* Free ring */
++ dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
++ msg_rx_ring.virt, msg_rx_ring.phys);
++
++ /* Free interrupt */
++ free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
++}
++
++/**
++ * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
++ * @mport: Master port implementing the inbound message unit
++ * @mbox: Inbound mailbox number
++ * @buf: Buffer to add to inbound queue
++ *
++ * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
++ * %0 on success or %-EINVAL on failure.
++ */
++int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
++{
++ int rc = 0;
++
++ pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
++ msg_rx_ring.rx_slot);
++
++ if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
++ printk(KERN_ERR
++ "RIO: error adding inbound buffer %d, buffer exists\n",
++ msg_rx_ring.rx_slot);
++ rc = -EINVAL;
++ goto out;
++ }
++
++ msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
++ if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
++ msg_rx_ring.rx_slot = 0;
++
++ out:
++ return rc;
++}
++
++EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
++
++/**
++ * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
++ * @mport: Master port implementing the inbound message unit
++ * @mbox: Inbound mailbox number
++ *
++ * Gets the next available inbound message from the inbound message queue.
++ * A pointer to the message is returned on success or NULL on failure.
++ */
++void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
++{
++ u32 imr;
++ u32 phys_buf, virt_buf;
++ void *buf = NULL;
++ int buf_idx;
++
++ phys_buf = in_be32((void *)&msg_regs->ifqdpar);
++
++ /* If no more messages, then bail out */
++ if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
++ goto out2;
++
++ virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
++ buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
++ buf = msg_rx_ring.virt_buffer[buf_idx];
++
++ if (!buf) {
++ printk(KERN_ERR
++ "RIO: inbound message copy failed, no buffers\n");
++ goto out1;
++ }
++
++ /* Copy max message size, caller is expected to allocate that big */
++ memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
++
++ /* Clear the available buffer */
++ msg_rx_ring.virt_buffer[buf_idx] = NULL;
++
++ out1:
++ imr = in_be32((void *)&msg_regs->imr);
++ out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
++
++ out2:
++ return buf;
++}
++
++EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
++
++/**
++ * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
++ * @irq: Linux interrupt number
++ * @dev_instance: Pointer to interrupt-specific data
++ *
++ * Handles doorbell interrupts. Parses a list of registered
++ * doorbell event handlers and executes a matching event handler.
++ */
++static irqreturn_t
++mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
++{
++ int dsr;
++ struct rio_mport *port = (struct rio_mport *)dev_instance;
++
++ dsr = in_be32((void *)&msg_regs->dsr);
++
++ if (dsr & DOORBELL_DSR_TE) {
++ pr_info("RIO: doorbell reception error\n");
++ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
++ goto out;
++ }
++
++ if (dsr & DOORBELL_DSR_QFI) {
++ pr_info("RIO: doorbell queue full\n");
++ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
++ goto out;
++ }
++
++ /* XXX Need to check/dispatch until queue empty */
++ if (dsr & DOORBELL_DSR_DIQI) {
++ u32 dmsg =
++ (u32) dbell_ring.virt +
++ (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
++ u32 dmr;
++ struct rio_dbell *dbell;
++ int found = 0;
++
++ pr_debug
++ ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
++ DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
++
++ list_for_each_entry(dbell, &port->dbells, node) {
++ if ((dbell->res->start <= DBELL_INF(dmsg)) &&
++ (dbell->res->end >= DBELL_INF(dmsg))) {
++ found = 1;
++ break;
++ }
++ }
++ if (found) {
++ dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
++ DBELL_INF(dmsg));
++ } else {
++ pr_debug
++ ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
++ DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
++ }
++ dmr = in_be32((void *)&msg_regs->dmr);
++ out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
++ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
++ }
++
++ out:
++ return IRQ_HANDLED;
++}
++
++/**
++ * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
++ * @mport: Master port implementing the inbound doorbell unit
++ *
++ * Initializes doorbell unit hardware and inbound DMA buffer
++ * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
++ * or %-ENOMEM on failure.
++ */
++static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
++{
++ int rc = 0;
++
++ /* Map outbound doorbell window immediately after maintenance window */
++ if (!(dbell_win =
++ (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
++ RIO_DBELL_WIN_SIZE))) {
++ printk(KERN_ERR
++ "RIO: unable to map outbound doorbell window\n");
++ rc = -ENOMEM;
++ goto out;
++ }
++
++ /* Initialize inbound doorbells */
++ if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
++ 512 * DOORBELL_MESSAGE_SIZE,
++ &dbell_ring.phys,
++ GFP_KERNEL))) {
++ printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
++ rc = -ENOMEM;
++ iounmap((void *)dbell_win);
++ goto out;
++ }
++
++ /* Point dequeue/enqueue pointers at first entry in ring */
++ out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
++ out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
++
++ /* Clear interrupt status */
++ out_be32((void *)&msg_regs->dsr, 0x00000091);
++
++ /* Hook up doorbell handler */
++ if ((rc =
++ request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
++ "dbell_rx", (void *)mport) < 0)) {
++ iounmap((void *)dbell_win);
++ dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
++ dbell_ring.virt, dbell_ring.phys);
++ printk(KERN_ERR
++ "MPC85xx RIO: unable to request inbound doorbell irq");
++ goto out;
++ }
++
++ /* Configure doorbells for snooping, 512 entries, and enable */
++ out_be32((void *)&msg_regs->dmr, 0x00108161);
++
++ out:
++ return rc;
++}
++
++static char *cmdline = NULL;
++
++static int mpc85xx_rio_get_hdid(int index)
++{
++ /* XXX Need to parse multiple entries in some format */
++ if (!cmdline)
++ return -1;
++
++ return simple_strtol(cmdline, NULL, 0);
++}
++
++static int mpc85xx_rio_get_cmdline(char *s)
++{
++ if (!s)
++ return 0;
++
++ cmdline = s;
++ return 1;
++}
++
++__setup("riohdid=", mpc85xx_rio_get_cmdline);
++
++/**
++ * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
++ * @law_start: Starting physical address of RapidIO LAW
++ * @law_size: Size of RapidIO LAW
++ *
++ * Initializes MPC85xx RapidIO hardware interface, configures
++ * master port with system-specific info, and registers the
++ * master port with the RapidIO subsystem.
++ */
++void mpc85xx_rio_setup(int law_start, int law_size)
++{
++ struct rio_ops *ops;
++ struct rio_mport *port;
++
++ ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
++ ops->lcread = mpc85xx_local_config_read;
++ ops->lcwrite = mpc85xx_local_config_write;
++ ops->cread = mpc85xx_rio_config_read;
++ ops->cwrite = mpc85xx_rio_config_write;
++ ops->dsend = mpc85xx_rio_doorbell_send;
++
++ port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
++ port->id = 0;
++ port->index = 0;
++ INIT_LIST_HEAD(&port->dbells);
++ port->iores.start = law_start;
++ port->iores.end = law_start + law_size;
++ port->iores.flags = IORESOURCE_MEM;
++
++ rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
++ rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
++ rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
++ strcpy(port->name, "RIO0 mport");
++
++ port->ops = ops;
++ port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
++
++ rio_register_mport(port);
++
++ regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
++ atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
++ maint_atmu_regs = atmu_regs + 1;
++ dbell_atmu_regs = atmu_regs + 2;
++ msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
++
++ /* Configure maintenance transaction window */
++ out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
++ out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
++
++ maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
++
++ /* Configure outbound doorbell window */
++ out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
++ out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
++ mpc85xx_rio_doorbell_init(port);
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/fsl_rio.h powerpc.git/arch/powerpc/sysdev/fsl_rio.h
+--- linux-2.6.24/arch/powerpc/sysdev/fsl_rio.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/fsl_rio.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,20 @@
++/*
++ * MPC85xx RapidIO definitions
++ *
++ * Copyright 2005 MontaVista Software, Inc.
++ * Matt Porter <mporter@kernel.crashing.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
++#define __PPC_SYSLIB_PPC85XX_RIO_H
++
++#include <linux/init.h>
++
++extern void mpc85xx_rio_setup(int law_start, int law_size);
++
++#endif /* __PPC_SYSLIB_PPC85XX_RIO_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/fsl_soc.c powerpc.git/arch/powerpc/sysdev/fsl_soc.c
+--- linux-2.6.24/arch/powerpc/sysdev/fsl_soc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/fsl_soc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/of_platform.h>
+ #include <linux/phy.h>
++#include <linux/phy_fixed.h>
+ #include <linux/spi/spi.h>
+ #include <linux/fsl_devices.h>
+ #include <linux/fs_enet_pd.h>
+@@ -54,10 +55,18 @@
+ soc = of_find_node_by_type(NULL, "soc");
+ if (soc) {
+ int size;
+- const void *prop = of_get_property(soc, "reg", &size);
++ u32 naddr;
++ const u32 *prop = of_get_property(soc, "#address-cells", &size);
+
++ if (prop && size == 4)
++ naddr = *prop;
++ else
++ naddr = 2;
++
++ prop = of_get_property(soc, "ranges", &size);
+ if (prop)
+- immrbase = of_translate_address(soc, prop);
++ immrbase = of_translate_address(soc, prop + naddr);
++
+ of_node_put(soc);
+ }
+
+@@ -130,17 +139,51 @@
+ EXPORT_SYMBOL(get_baudrate);
+ #endif /* CONFIG_CPM2 */
+
+-static int __init gfar_mdio_of_init(void)
++#ifdef CONFIG_FIXED_PHY
++static int __init of_add_fixed_phys(void)
+ {
++ int ret;
+ struct device_node *np;
+- unsigned int i;
++ u32 *fixed_link;
++ struct fixed_phy_status status = {};
++
++ for_each_node_by_name(np, "ethernet") {
++ fixed_link = (u32 *)of_get_property(np, "fixed-link", NULL);
++ if (!fixed_link)
++ continue;
++
++ status.link = 1;
++ status.duplex = fixed_link[1];
++ status.speed = fixed_link[2];
++ status.pause = fixed_link[3];
++ status.asym_pause = fixed_link[4];
++
++ ret = fixed_phy_add(PHY_POLL, fixed_link[0], &status);
++ if (ret) {
++ of_node_put(np);
++ return ret;
++ }
++ }
++
++ return 0;
++}
++arch_initcall(of_add_fixed_phys);
++#endif /* CONFIG_FIXED_PHY */
++
++static int __init gfar_mdio_of_init(void)
++{
++ struct device_node *np = NULL;
+ struct platform_device *mdio_dev;
+ struct resource res;
+ int ret;
+
+- for (np = NULL, i = 0;
+- (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL;
+- i++) {
++ np = of_find_compatible_node(np, NULL, "fsl,gianfar-mdio");
++
++ /* try the deprecated version */
++ if (!np)
++ np = of_find_compatible_node(np, "mdio", "gianfar");
++
++ if (np) {
+ int k;
+ struct device_node *child = NULL;
+ struct gianfar_mdio_data mdio_data;
+@@ -179,11 +222,13 @@
+ goto unreg;
+ }
+
++ of_node_put(np);
+ return 0;
+
+ unreg:
+ platform_device_unregister(mdio_dev);
+ err:
++ of_node_put(np);
+ return ret;
+ }
+
+@@ -193,7 +238,6 @@
+ static const char *gfar_rx_intr = "rx";
+ static const char *gfar_err_intr = "error";
+
+-
+ static int __init gfar_of_init(void)
+ {
+ struct device_node *np;
+@@ -277,29 +321,43 @@
+ gfar_data.interface = PHY_INTERFACE_MODE_MII;
+
+ ph = of_get_property(np, "phy-handle", NULL);
+- phy = of_find_node_by_phandle(*ph);
++ if (ph == NULL) {
++ u32 *fixed_link;
+
+- if (phy == NULL) {
+- ret = -ENODEV;
+- goto unreg;
+- }
++ fixed_link = (u32 *)of_get_property(np, "fixed-link",
++ NULL);
++ if (!fixed_link) {
++ ret = -ENODEV;
++ goto unreg;
++ }
+
+- mdio = of_get_parent(phy);
++ gfar_data.bus_id = 0;
++ gfar_data.phy_id = fixed_link[0];
++ } else {
++ phy = of_find_node_by_phandle(*ph);
++
++ if (phy == NULL) {
++ ret = -ENODEV;
++ goto unreg;
++ }
++
++ mdio = of_get_parent(phy);
++
++ id = of_get_property(phy, "reg", NULL);
++ ret = of_address_to_resource(mdio, 0, &res);
++ if (ret) {
++ of_node_put(phy);
++ of_node_put(mdio);
++ goto unreg;
++ }
++
++ gfar_data.phy_id = *id;
++ gfar_data.bus_id = res.start;
+
+- id = of_get_property(phy, "reg", NULL);
+- ret = of_address_to_resource(mdio, 0, &res);
+- if (ret) {
+ of_node_put(phy);
+ of_node_put(mdio);
+- goto unreg;
+ }
+
+- gfar_data.phy_id = *id;
+- gfar_data.bus_id = res.start;
+-
+- of_node_put(phy);
+- of_node_put(mdio);
+-
+ ret =
+ platform_device_add_data(gfar_dev, &gfar_data,
+ sizeof(struct
+@@ -390,13 +448,11 @@
+ static int __init fsl_i2c_of_init(void)
+ {
+ struct device_node *np;
+- unsigned int i;
++ unsigned int i = 0;
+ struct platform_device *i2c_dev;
+ int ret;
+
+- for (np = NULL, i = 0;
+- (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL;
+- i++) {
++ for_each_compatible_node(np, NULL, "fsl-i2c") {
+ struct resource r[2];
+ struct fsl_i2c_platform_data i2c_data;
+ const unsigned char *flags = NULL;
+@@ -432,7 +488,7 @@
+ if (ret)
+ goto unreg;
+
+- of_register_i2c_devices(np, i);
++ of_register_i2c_devices(np, i++);
+ }
+
+ return 0;
+@@ -528,14 +584,12 @@
+ static int __init fsl_usb_of_init(void)
+ {
+ struct device_node *np;
+- unsigned int i;
++ unsigned int i = 0;
+ struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,
+ *usb_dev_dr_client = NULL;
+ int ret;
+
+- for (np = NULL, i = 0;
+- (np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL;
+- i++) {
++ for_each_compatible_node(np, NULL, "fsl-usb2-mph") {
+ struct resource r[2];
+ struct fsl_usb2_platform_data usb_data;
+ const unsigned char *prop = NULL;
+@@ -578,11 +632,10 @@
+ fsl_usb2_platform_data));
+ if (ret)
+ goto unreg_mph;
++ i++;
+ }
+
+- for (np = NULL;
+- (np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL;
+- i++) {
++ for_each_compatible_node(np, NULL, "fsl-usb2-dr") {
+ struct resource r[2];
+ struct fsl_usb2_platform_data usb_data;
+ const unsigned char *prop = NULL;
+@@ -654,6 +707,7 @@
+ fsl_usb2_platform_data))))
+ goto unreg_dr;
+ }
++ i++;
+ }
+ return 0;
+
+@@ -1125,13 +1179,12 @@
+
+ static int __init fsl_pcmcia_of_init(void)
+ {
+- struct device_node *np = NULL;
++ struct device_node *np;
+ /*
+ * Register all the devices which type is "pcmcia"
+ */
+- while ((np = of_find_compatible_node(np,
+- "pcmcia", "fsl,pq-pcmcia")) != NULL)
+- of_platform_device_create(np, "m8xx-pcmcia", NULL);
++ for_each_compatible_node(np, "pcmcia", "fsl,pq-pcmcia")
++ of_platform_device_create(np, "m8xx-pcmcia", NULL);
+ return 0;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/grackle.c powerpc.git/arch/powerpc/sysdev/grackle.c
+--- linux-2.6.24/arch/powerpc/sysdev/grackle.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/grackle.c 2008-01-28 20:25:49.000000000 +0100
+@@ -57,7 +57,7 @@
+ {
+ setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
+ if (machine_is_compatible("PowerMac1,1"))
+- pci_assign_all_buses = 1;
++ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+ if (machine_is_compatible("AAPL,PowerBook1998"))
+ grackle_set_loop_snoop(hose, 1);
+ #if 0 /* Disabled for now, HW problems ??? */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/ipic.c powerpc.git/arch/powerpc/sysdev/ipic.c
+--- linux-2.6.24/arch/powerpc/sysdev/ipic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/ipic.c 2008-01-28 20:25:49.000000000 +0100
+@@ -30,11 +30,67 @@
+ #include "ipic.h"
+
+ static struct ipic * primary_ipic;
++static struct irq_chip ipic_level_irq_chip, ipic_edge_irq_chip;
+ static DEFINE_SPINLOCK(ipic_lock);
+
+ static struct ipic_info ipic_info[] = {
++ [1] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 16,
++ .prio_mask = 0,
++ },
++ [2] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 17,
++ .prio_mask = 1,
++ },
++ [3] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 18,
++ .prio_mask = 2,
++ },
++ [4] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 19,
++ .prio_mask = 3,
++ },
++ [5] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 20,
++ .prio_mask = 4,
++ },
++ [6] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 21,
++ .prio_mask = 5,
++ },
++ [7] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 22,
++ .prio_mask = 6,
++ },
++ [8] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_C,
++ .force = IPIC_SIFCR_H,
++ .bit = 23,
++ .prio_mask = 7,
++ },
+ [9] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+@@ -42,7 +98,6 @@
+ .prio_mask = 0,
+ },
+ [10] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+@@ -50,15 +105,27 @@
+ .prio_mask = 1,
+ },
+ [11] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+ .bit = 26,
+ .prio_mask = 2,
+ },
++ [12] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_D,
++ .force = IPIC_SIFCR_H,
++ .bit = 27,
++ .prio_mask = 3,
++ },
++ [13] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_D,
++ .force = IPIC_SIFCR_H,
++ .bit = 28,
++ .prio_mask = 4,
++ },
+ [14] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+@@ -66,7 +133,6 @@
+ .prio_mask = 5,
+ },
+ [15] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+@@ -74,7 +140,6 @@
+ .prio_mask = 6,
+ },
+ [16] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_D,
+ .force = IPIC_SIFCR_H,
+@@ -82,7 +147,7 @@
+ .prio_mask = 7,
+ },
+ [17] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SEFCR,
+@@ -90,7 +155,7 @@
+ .prio_mask = 5,
+ },
+ [18] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SEFCR,
+@@ -98,7 +163,7 @@
+ .prio_mask = 6,
+ },
+ [19] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SEFCR,
+@@ -106,7 +171,7 @@
+ .prio_mask = 7,
+ },
+ [20] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SEFCR,
+@@ -114,7 +179,7 @@
+ .prio_mask = 4,
+ },
+ [21] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SEFCR,
+@@ -122,7 +187,7 @@
+ .prio_mask = 5,
+ },
+ [22] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SEFCR,
+@@ -130,7 +195,7 @@
+ .prio_mask = 6,
+ },
+ [23] = {
+- .pend = IPIC_SEPNR,
++ .ack = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SEFCR,
+@@ -138,7 +203,6 @@
+ .prio_mask = 7,
+ },
+ [32] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -146,7 +210,6 @@
+ .prio_mask = 0,
+ },
+ [33] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -154,7 +217,6 @@
+ .prio_mask = 1,
+ },
+ [34] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -162,7 +224,6 @@
+ .prio_mask = 2,
+ },
+ [35] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -170,7 +231,6 @@
+ .prio_mask = 3,
+ },
+ [36] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -178,7 +238,6 @@
+ .prio_mask = 4,
+ },
+ [37] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -186,7 +245,6 @@
+ .prio_mask = 5,
+ },
+ [38] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+@@ -194,15 +252,69 @@
+ .prio_mask = 6,
+ },
+ [39] = {
+- .pend = IPIC_SIPNR_H,
+ .mask = IPIC_SIMSR_H,
+ .prio = IPIC_SIPRR_A,
+ .force = IPIC_SIFCR_H,
+ .bit = 7,
+ .prio_mask = 7,
+ },
++ [40] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 8,
++ .prio_mask = 0,
++ },
++ [41] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 9,
++ .prio_mask = 1,
++ },
++ [42] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 10,
++ .prio_mask = 2,
++ },
++ [43] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 11,
++ .prio_mask = 3,
++ },
++ [44] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 12,
++ .prio_mask = 4,
++ },
++ [45] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 13,
++ .prio_mask = 5,
++ },
++ [46] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 14,
++ .prio_mask = 6,
++ },
++ [47] = {
++ .mask = IPIC_SIMSR_H,
++ .prio = IPIC_SIPRR_B,
++ .force = IPIC_SIFCR_H,
++ .bit = 15,
++ .prio_mask = 7,
++ },
+ [48] = {
+- .pend = IPIC_SEPNR,
+ .mask = IPIC_SEMSR,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SEFCR,
+@@ -210,7 +322,6 @@
+ .prio_mask = 4,
+ },
+ [64] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SIFCR_L,
+@@ -218,7 +329,6 @@
+ .prio_mask = 0,
+ },
+ [65] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SIFCR_L,
+@@ -226,7 +336,6 @@
+ .prio_mask = 1,
+ },
+ [66] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SIFCR_L,
+@@ -234,7 +343,6 @@
+ .prio_mask = 2,
+ },
+ [67] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_A,
+ .force = IPIC_SIFCR_L,
+@@ -242,7 +350,6 @@
+ .prio_mask = 3,
+ },
+ [68] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SIFCR_L,
+@@ -250,7 +357,6 @@
+ .prio_mask = 0,
+ },
+ [69] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SIFCR_L,
+@@ -258,7 +364,6 @@
+ .prio_mask = 1,
+ },
+ [70] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SIFCR_L,
+@@ -266,7 +371,6 @@
+ .prio_mask = 2,
+ },
+ [71] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = IPIC_SMPRR_B,
+ .force = IPIC_SIFCR_L,
+@@ -274,91 +378,120 @@
+ .prio_mask = 3,
+ },
+ [72] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 8,
+ },
+ [73] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 9,
+ },
+ [74] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 10,
+ },
+ [75] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 11,
+ },
+ [76] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 12,
+ },
+ [77] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 13,
+ },
+ [78] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 14,
+ },
+ [79] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 15,
+ },
+ [80] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 16,
+ },
++ [81] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 17,
++ },
++ [82] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 18,
++ },
++ [83] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 19,
++ },
+ [84] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 20,
+ },
+ [85] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 21,
+ },
++ [86] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 22,
++ },
++ [87] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 23,
++ },
++ [88] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 24,
++ },
++ [89] = {
++ .mask = IPIC_SIMSR_L,
++ .prio = 0,
++ .force = IPIC_SIFCR_L,
++ .bit = 25,
++ },
+ [90] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+ .bit = 26,
+ },
+ [91] = {
+- .pend = IPIC_SIPNR_L,
+ .mask = IPIC_SIMSR_L,
+ .prio = 0,
+ .force = IPIC_SIFCR_L,
+@@ -412,6 +545,10 @@
+ temp &= ~(1 << (31 - ipic_info[src].bit));
+ ipic_write(ipic->regs, ipic_info[src].mask, temp);
+
++ /* mb() can't guarantee that masking is finished. But it does finish
++ * for nearly all cases. */
++ mb();
++
+ spin_unlock_irqrestore(&ipic_lock, flags);
+ }
+
+@@ -424,9 +561,13 @@
+
+ spin_lock_irqsave(&ipic_lock, flags);
+
+- temp = ipic_read(ipic->regs, ipic_info[src].pend);
++ temp = ipic_read(ipic->regs, ipic_info[src].ack);
+ temp |= (1 << (31 - ipic_info[src].bit));
+- ipic_write(ipic->regs, ipic_info[src].pend, temp);
++ ipic_write(ipic->regs, ipic_info[src].ack, temp);
++
++ /* mb() can't guarantee that ack is finished. But it does finish
++ * for nearly all cases. */
++ mb();
+
+ spin_unlock_irqrestore(&ipic_lock, flags);
+ }
+@@ -444,9 +585,13 @@
+ temp &= ~(1 << (31 - ipic_info[src].bit));
+ ipic_write(ipic->regs, ipic_info[src].mask, temp);
+
+- temp = ipic_read(ipic->regs, ipic_info[src].pend);
++ temp = ipic_read(ipic->regs, ipic_info[src].ack);
+ temp |= (1 << (31 - ipic_info[src].bit));
+- ipic_write(ipic->regs, ipic_info[src].pend, temp);
++ ipic_write(ipic->regs, ipic_info[src].ack, temp);
++
++ /* mb() can't guarantee that ack is finished. But it does finish
++ * for nearly all cases. */
++ mb();
+
+ spin_unlock_irqrestore(&ipic_lock, flags);
+ }
+@@ -468,14 +613,22 @@
+ flow_type);
+ return -EINVAL;
+ }
++ /* ipic supports only edge mode on external interrupts */
++ if ((flow_type & IRQ_TYPE_EDGE_FALLING) && !ipic_info[src].ack) {
++ printk(KERN_ERR "ipic: edge sense not supported on internal "
++ "interrupts\n");
++ return -EINVAL;
++ }
+
+ desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
+ desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
+ if (flow_type & IRQ_TYPE_LEVEL_LOW) {
+ desc->status |= IRQ_LEVEL;
+ desc->handle_irq = handle_level_irq;
++ desc->chip = &ipic_level_irq_chip;
+ } else {
+ desc->handle_irq = handle_edge_irq;
++ desc->chip = &ipic_edge_irq_chip;
+ }
+
+ /* only EXT IRQ senses are programmable on ipic
+@@ -500,7 +653,16 @@
+ return 0;
+ }
+
+-static struct irq_chip ipic_irq_chip = {
++/* level interrupts and edge interrupts have different ack operations */
++static struct irq_chip ipic_level_irq_chip = {
++ .typename = " IPIC ",
++ .unmask = ipic_unmask_irq,
++ .mask = ipic_mask_irq,
++ .mask_ack = ipic_mask_irq,
++ .set_type = ipic_set_irq_type,
++};
++
++static struct irq_chip ipic_edge_irq_chip = {
+ .typename = " IPIC ",
+ .unmask = ipic_unmask_irq,
+ .mask = ipic_mask_irq,
+@@ -519,13 +681,9 @@
+ irq_hw_number_t hw)
+ {
+ struct ipic *ipic = h->host_data;
+- struct irq_chip *chip;
+-
+- /* Default chip */
+- chip = &ipic->hc_irq;
+
+ set_irq_chip_data(virq, ipic);
+- set_irq_chip_and_handler(virq, chip, handle_level_irq);
++ set_irq_chip_and_handler(virq, &ipic_level_irq_chip, handle_level_irq);
+
+ /* Set default irq type */
+ set_irq_type(virq, IRQ_TYPE_NONE);
+@@ -584,7 +742,6 @@
+ ipic->regs = ioremap(res.start, res.end - res.start + 1);
+
+ ipic->irqhost->host_data = ipic;
+- ipic->hc_irq = ipic_irq_chip;
+
+ /* init hw */
+ ipic_write(ipic->regs, IPIC_SICNR, 0x0);
+@@ -593,6 +750,10 @@
+ * configure SICFR accordingly */
+ if (flags & IPIC_SPREADMODE_GRP_A)
+ temp |= SICFR_IPSA;
++ if (flags & IPIC_SPREADMODE_GRP_B)
++ temp |= SICFR_IPSB;
++ if (flags & IPIC_SPREADMODE_GRP_C)
++ temp |= SICFR_IPSC;
+ if (flags & IPIC_SPREADMODE_GRP_D)
+ temp |= SICFR_IPSD;
+ if (flags & IPIC_SPREADMODE_MIX_A)
+@@ -600,7 +761,7 @@
+ if (flags & IPIC_SPREADMODE_MIX_B)
+ temp |= SICFR_MPSB;
+
+- ipic_write(ipic->regs, IPIC_SICNR, temp);
++ ipic_write(ipic->regs, IPIC_SICFR, temp);
+
+ /* handle MCP route */
+ temp = 0;
+@@ -672,10 +833,12 @@
+
+ void ipic_set_default_priority(void)
+ {
+- ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_SIPRR_A_DEFAULT);
+- ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_SIPRR_D_DEFAULT);
+- ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_SMPRR_A_DEFAULT);
+- ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_SMPRR_B_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_PRIORITY_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SIPRR_B, IPIC_PRIORITY_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SIPRR_C, IPIC_PRIORITY_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_PRIORITY_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_PRIORITY_DEFAULT);
++ ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_PRIORITY_DEFAULT);
+ }
+
+ void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/ipic.h powerpc.git/arch/powerpc/sysdev/ipic.h
+--- linux-2.6.24/arch/powerpc/sysdev/ipic.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/ipic.h 2008-01-28 20:25:49.000000000 +0100
+@@ -23,13 +23,12 @@
+ #define IPIC_IRQ_EXT7 23
+
+ /* Default Priority Registers */
+-#define IPIC_SIPRR_A_DEFAULT 0x05309770
+-#define IPIC_SIPRR_D_DEFAULT 0x05309770
+-#define IPIC_SMPRR_A_DEFAULT 0x05309770
+-#define IPIC_SMPRR_B_DEFAULT 0x05309770
++#define IPIC_PRIORITY_DEFAULT 0x05309770
+
+ /* System Global Interrupt Configuration Register */
+ #define SICFR_IPSA 0x00010000
++#define SICFR_IPSB 0x00020000
++#define SICFR_IPSC 0x00040000
+ #define SICFR_IPSD 0x00080000
+ #define SICFR_MPSA 0x00200000
+ #define SICFR_MPSB 0x00400000
+@@ -45,13 +44,11 @@
+
+ /* The remapper for this IPIC */
+ struct irq_host *irqhost;
+-
+- /* The "linux" controller struct */
+- struct irq_chip hc_irq;
+ };
+
+ struct ipic_info {
+- u8 pend; /* pending register offset from base */
++ u8 ack; /* pending register offset from base if the irq
++ supports ack operation */
+ u8 mask; /* mask register offset from base */
+ u8 prio; /* priority register offset from base */
+ u8 force; /* force register offset from base */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mmio_nvram.c powerpc.git/arch/powerpc/sysdev/mmio_nvram.c
+--- linux-2.6.24/arch/powerpc/sysdev/mmio_nvram.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mmio_nvram.c 2008-01-28 20:25:49.000000000 +0100
+@@ -99,7 +99,7 @@
+ nvram_addr = r.start;
+ mmio_nvram_len = r.end - r.start + 1;
+ if ( (!mmio_nvram_len) || (!nvram_addr) ) {
+- printk(KERN_WARNING "nvram: address or lenght is 0\n");
++ printk(KERN_WARNING "nvram: address or length is 0\n");
+ ret = -EIO;
+ goto out;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mpic.c powerpc.git/arch/powerpc/sysdev/mpic.c
+--- linux-2.6.24/arch/powerpc/sysdev/mpic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mpic.c 2008-01-28 20:25:49.000000000 +0100
+@@ -83,6 +83,7 @@
+ MPIC_CPU_WHOAMI,
+ MPIC_CPU_INTACK,
+ MPIC_CPU_EOI,
++ MPIC_CPU_MCACK,
+
+ MPIC_IRQ_BASE,
+ MPIC_IRQ_STRIDE,
+@@ -121,6 +122,7 @@
+ TSI108_CPU_WHOAMI,
+ TSI108_CPU_INTACK,
+ TSI108_CPU_EOI,
++ TSI108_CPU_MCACK,
+
+ TSI108_IRQ_BASE,
+ TSI108_IRQ_STRIDE,
+@@ -265,7 +267,7 @@
+ */
+
+
+-static void _mpic_map_mmio(struct mpic *mpic, unsigned long phys_addr,
++static void _mpic_map_mmio(struct mpic *mpic, phys_addr_t phys_addr,
+ struct mpic_reg_bank *rb, unsigned int offset,
+ unsigned int size)
+ {
+@@ -285,7 +287,7 @@
+ BUG_ON(!DCR_MAP_OK(rb->dhost));
+ }
+
+-static inline void mpic_map(struct mpic *mpic, unsigned long phys_addr,
++static inline void mpic_map(struct mpic *mpic, phys_addr_t phys_addr,
+ struct mpic_reg_bank *rb, unsigned int offset,
+ unsigned int size)
+ {
+@@ -612,12 +614,11 @@
+ }
+
+ #ifdef CONFIG_SMP
+-static irqreturn_t mpic_ipi_action(int irq, void *dev_id)
++static irqreturn_t mpic_ipi_action(int irq, void *data)
+ {
+- struct mpic *mpic;
++ long ipi = (long)data;
+
+- mpic = mpic_find(irq, NULL);
+- smp_message_recv(mpic_irq_to_hw(irq) - mpic->ipi_vecs[0]);
++ smp_message_recv(ipi);
+
+ return IRQ_HANDLED;
+ }
+@@ -842,6 +843,24 @@
+ return 0;
+ }
+
++void mpic_set_vector(unsigned int virq, unsigned int vector)
++{
++ struct mpic *mpic = mpic_from_irq(virq);
++ unsigned int src = mpic_irq_to_hw(virq);
++ unsigned int vecpri;
++
++ DBG("mpic: set_vector(mpic:@%p,virq:%d,src:%d,vector:0x%x)\n",
++ mpic, virq, src, vector);
++
++ if (src >= mpic->irq_count)
++ return;
++
++ vecpri = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI));
++ vecpri = vecpri & ~MPIC_INFO(VECPRI_VECTOR_MASK);
++ vecpri |= vector;
++ mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
++}
++
+ static struct irq_chip mpic_irq_chip = {
+ .mask = mpic_mask_irq,
+ .unmask = mpic_unmask_irq,
+@@ -1109,6 +1128,11 @@
+ mb();
+ }
+
++ if (flags & MPIC_ENABLE_MCK)
++ mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
++ mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
++ | MPIC_GREG_GCONF_MCK);
++
+ /* Read feature register, calculate num CPUs and, for non-ISU
+ * MPICs, num sources as well. On ISU MPICs, sources are counted
+ * as ISUs are added
+@@ -1230,6 +1254,8 @@
+ mpic_u3msi_init(mpic);
+ }
+
++ mpic_pasemi_msi_init(mpic);
++
+ for (i = 0; i < mpic->num_sources; i++) {
+ /* start with vector = source number, and masked */
+ u32 vecpri = MPIC_VECPRI_MASK | i |
+@@ -1253,6 +1279,11 @@
+ mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
+ | MPIC_GREG_GCONF_8259_PTHROU_DIS);
+
++ if (mpic->flags & MPIC_NO_BIAS)
++ mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
++ mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
++ | MPIC_GREG_GCONF_NO_BIAS);
++
+ /* Set current processor priority to 0 */
+ mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
+
+@@ -1419,13 +1450,13 @@
+ mpic_physmask(cpu_mask & cpus_addr(cpu_online_map)[0]));
+ }
+
+-unsigned int mpic_get_one_irq(struct mpic *mpic)
++static unsigned int _mpic_get_one_irq(struct mpic *mpic, int reg)
+ {
+ u32 src;
+
+- src = mpic_cpu_read(MPIC_INFO(CPU_INTACK)) & MPIC_INFO(VECPRI_VECTOR_MASK);
++ src = mpic_cpu_read(reg) & MPIC_INFO(VECPRI_VECTOR_MASK);
+ #ifdef DEBUG_LOW
+- DBG("%s: get_one_irq(): %d\n", mpic->name, src);
++ DBG("%s: get_one_irq(reg 0x%x): %d\n", mpic->name, reg, src);
+ #endif
+ if (unlikely(src == mpic->spurious_vec)) {
+ if (mpic->flags & MPIC_SPV_EOI)
+@@ -1443,6 +1474,11 @@
+ return irq_linear_revmap(mpic->irqhost, src);
+ }
+
++unsigned int mpic_get_one_irq(struct mpic *mpic)
++{
++ return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_INTACK));
++}
++
+ unsigned int mpic_get_irq(void)
+ {
+ struct mpic *mpic = mpic_primary;
+@@ -1452,12 +1488,20 @@
+ return mpic_get_one_irq(mpic);
+ }
+
++unsigned int mpic_get_mcirq(void)
++{
++ struct mpic *mpic = mpic_primary;
++
++ BUG_ON(mpic == NULL);
++
++ return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_MCACK));
++}
+
+ #ifdef CONFIG_SMP
+ void mpic_request_ipis(void)
+ {
+ struct mpic *mpic = mpic_primary;
+- int i, err;
++ long i, err;
+ static char *ipi_names[] = {
+ "IPI0 (call function)",
+ "IPI1 (reschedule)",
+@@ -1472,14 +1516,14 @@
+ unsigned int vipi = irq_create_mapping(mpic->irqhost,
+ mpic->ipi_vecs[0] + i);
+ if (vipi == NO_IRQ) {
+- printk(KERN_ERR "Failed to map IPI %d\n", i);
++ printk(KERN_ERR "Failed to map IPI %ld\n", i);
+ break;
+ }
+ err = request_irq(vipi, mpic_ipi_action,
+ IRQF_DISABLED|IRQF_PERCPU,
+- ipi_names[i], mpic);
++ ipi_names[i], (void *)i);
+ if (err) {
+- printk(KERN_ERR "Request of irq %d for IPI %d failed\n",
++ printk(KERN_ERR "Request of irq %d for IPI %ld failed\n",
+ vipi, i);
+ break;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mpic.h powerpc.git/arch/powerpc/sysdev/mpic.h
+--- linux-2.6.24/arch/powerpc/sysdev/mpic.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mpic.h 2008-01-28 20:25:49.000000000 +0100
+@@ -17,6 +17,7 @@
+ extern irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num);
+ extern void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num);
+ extern int mpic_u3msi_init(struct mpic *mpic);
++extern int mpic_pasemi_msi_init(struct mpic *mpic);
+ #else
+ static inline void mpic_msi_reserve_hwirq(struct mpic *mpic,
+ irq_hw_number_t hwirq)
+@@ -28,12 +29,15 @@
+ {
+ return -1;
+ }
++
++static inline int mpic_pasemi_msi_init(struct mpic *mpic)
++{
++ return -1;
++}
+ #endif
+
+ extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
+-extern void mpic_end_irq(unsigned int irq);
+-extern void mpic_mask_irq(unsigned int irq);
+-extern void mpic_unmask_irq(unsigned int irq);
++extern void mpic_set_vector(unsigned int virq, unsigned int vector);
+ extern void mpic_set_affinity(unsigned int irq, cpumask_t cpumask);
+
+ #endif /* _POWERPC_SYSDEV_MPIC_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mpic_pasemi_msi.c powerpc.git/arch/powerpc/sysdev/mpic_pasemi_msi.c
+--- linux-2.6.24/arch/powerpc/sysdev/mpic_pasemi_msi.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mpic_pasemi_msi.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,172 @@
++/*
++ * Copyright 2007, Olof Johansson, PA Semi
++ *
++ * Based on arch/powerpc/sysdev/mpic_u3msi.c:
++ *
++ * Copyright 2006, Segher Boessenkool, IBM Corporation.
++ * Copyright 2006-2007, Michael Ellerman, IBM Corporation.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; version 2 of the
++ * License.
++ *
++ */
++
++#undef DEBUG
++
++#include <linux/irq.h>
++#include <linux/bootmem.h>
++#include <linux/msi.h>
++#include <asm/mpic.h>
++#include <asm/prom.h>
++#include <asm/hw_irq.h>
++#include <asm/ppc-pci.h>
++
++#include "mpic.h"
++
++/* Allocate 16 interrupts per device, to give an alignment of 16,
++ * since that's the size of the grouping w.r.t. affinity. If someone
++ * needs more than 32 MSI's down the road we'll have to rethink this,
++ * but it should be OK for now.
++ */
++#define ALLOC_CHUNK 16
++
++#define PASEMI_MSI_ADDR 0xfc080000
++
++/* A bit ugly, can we get this from the pci_dev somehow? */
++static struct mpic *msi_mpic;
++
++
++static void mpic_pasemi_msi_mask_irq(unsigned int irq)
++{
++ pr_debug("mpic_pasemi_msi_mask_irq %d\n", irq);
++ mask_msi_irq(irq);
++ mpic_mask_irq(irq);
++}
++
++static void mpic_pasemi_msi_unmask_irq(unsigned int irq)
++{
++ pr_debug("mpic_pasemi_msi_unmask_irq %d\n", irq);
++ mpic_unmask_irq(irq);
++ unmask_msi_irq(irq);
++}
++
++static struct irq_chip mpic_pasemi_msi_chip = {
++ .shutdown = mpic_pasemi_msi_mask_irq,
++ .mask = mpic_pasemi_msi_mask_irq,
++ .unmask = mpic_pasemi_msi_unmask_irq,
++ .eoi = mpic_end_irq,
++ .set_type = mpic_set_irq_type,
++ .set_affinity = mpic_set_affinity,
++ .typename = "PASEMI-MSI ",
++};
++
++static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
++{
++ if (type == PCI_CAP_ID_MSIX)
++ pr_debug("pasemi_msi: MSI-X untested, trying anyway\n");
++
++ return 0;
++}
++
++static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
++{
++ struct msi_desc *entry;
++
++ pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev);
++
++ list_for_each_entry(entry, &pdev->msi_list, list) {
++ if (entry->irq == NO_IRQ)
++ continue;
++
++ set_irq_msi(entry->irq, NULL);
++ mpic_msi_free_hwirqs(msi_mpic, virq_to_hw(entry->irq),
++ ALLOC_CHUNK);
++ irq_dispose_mapping(entry->irq);
++ }
++
++ return;
++}
++
++static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
++{
++ irq_hw_number_t hwirq;
++ unsigned int virq;
++ struct msi_desc *entry;
++ struct msi_msg msg;
++ u64 addr;
++
++ pr_debug("pasemi_msi_setup_msi_irqs, pdev %p nvec %d type %d\n",
++ pdev, nvec, type);
++
++ msg.address_hi = 0;
++ msg.address_lo = PASEMI_MSI_ADDR;
++
++ list_for_each_entry(entry, &pdev->msi_list, list) {
++ /* Allocate 16 interrupts for now, since that's the grouping for
++ * affinity. This can be changed later if it turns out 32 is too
++ * few MSIs for someone, but restrictions will apply to how the
++ * sources can be changed independently.
++ */
++ hwirq = mpic_msi_alloc_hwirqs(msi_mpic, ALLOC_CHUNK);
++ if (hwirq < 0) {
++ pr_debug("pasemi_msi: failed allocating hwirq\n");
++ return hwirq;
++ }
++
++ virq = irq_create_mapping(msi_mpic->irqhost, hwirq);
++ if (virq == NO_IRQ) {
++ pr_debug("pasemi_msi: failed mapping hwirq 0x%lx\n", hwirq);
++ mpic_msi_free_hwirqs(msi_mpic, hwirq, ALLOC_CHUNK);
++ return -ENOSPC;
++ }
++
++ /* Vector on MSI is really an offset, the hardware adds
++ * it to the value written at the magic address. So set
++ * it to 0 to remain sane.
++ */
++ mpic_set_vector(virq, 0);
++
++ set_irq_msi(virq, entry);
++ set_irq_chip(virq, &mpic_pasemi_msi_chip);
++ set_irq_type(virq, IRQ_TYPE_EDGE_RISING);
++
++ pr_debug("pasemi_msi: allocated virq 0x%x (hw 0x%lx) addr 0x%lx\n",
++ virq, hwirq, addr);
++
++ /* Likewise, the device writes [0...511] into the target
++ * register to generate MSI [512...1023]
++ */
++ msg.data = hwirq-0x200;
++ write_msi_msg(virq, &msg);
++ }
++
++ return 0;
++}
++
++int mpic_pasemi_msi_init(struct mpic *mpic)
++{
++ int rc;
++
++ if (!mpic->irqhost->of_node ||
++ !of_device_is_compatible(mpic->irqhost->of_node,
++ "pasemi,pwrficient-openpic"))
++ return -ENODEV;
++
++ rc = mpic_msi_init_allocator(mpic);
++ if (rc) {
++ pr_debug("pasemi_msi: Error allocating bitmap!\n");
++ return rc;
++ }
++
++ pr_debug("pasemi_msi: Registering PA Semi MPIC MSI callbacks\n");
++
++ msi_mpic = mpic;
++ WARN_ON(ppc_md.setup_msi_irqs);
++ ppc_md.setup_msi_irqs = pasemi_msi_setup_msi_irqs;
++ ppc_md.teardown_msi_irqs = pasemi_msi_teardown_msi_irqs;
++ ppc_md.msi_check_device = pasemi_msi_check_device;
++
++ return 0;
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mv64x60_dev.c powerpc.git/arch/powerpc/sysdev/mv64x60_dev.c
+--- linux-2.6.24/arch/powerpc/sysdev/mv64x60_dev.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mv64x60_dev.c 2008-01-28 20:25:49.000000000 +0100
+@@ -241,7 +241,7 @@
+
+ /* only register the shared platform device the first time through */
+ if (id == 0 && (err = eth_register_shared_pdev(np)))
+- return err;;
++ return err;
+
+ memset(r, 0, sizeof(r));
+ of_irq_to_resource(np, 0, &r[0]);
+@@ -451,22 +451,19 @@
+ int id;
+ int err;
+
+- for (id = 0;
+- (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); id++)
+- if ((err = mv64x60_mpsc_device_setup(np, id)))
++ id = 0;
++ for_each_compatible_node(np, "serial", "marvell,mpsc")
++ if ((err = mv64x60_mpsc_device_setup(np, id++)))
+ goto error;
+
+- for (id = 0;
+- (np = of_find_compatible_node(np, "network",
+- "marvell,mv64x60-eth"));
+- id++)
+- if ((err = mv64x60_eth_device_setup(np, id)))
++ id = 0;
++ for_each_compatible_node(np, "network", "marvell,mv64x60-eth")
++ if ((err = mv64x60_eth_device_setup(np, id++)))
+ goto error;
+
+- for (id = 0;
+- (np = of_find_compatible_node(np, "i2c", "marvell,mv64x60-i2c"));
+- id++)
+- if ((err = mv64x60_i2c_device_setup(np, id)))
++ id = 0;
++ for_each_compatible_node(np, "i2c", "marvell,mv64x60-i2c")
++ if ((err = mv64x60_i2c_device_setup(np, id++)))
+ goto error;
+
+ /* support up to one watchdog timer */
+@@ -477,7 +474,6 @@
+ of_node_put(np);
+ }
+
+-
+ return 0;
+
+ error:
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mv64x60_pci.c powerpc.git/arch/powerpc/sysdev/mv64x60_pci.c
+--- linux-2.6.24/arch/powerpc/sysdev/mv64x60_pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mv64x60_pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -164,8 +164,8 @@
+
+ void __init mv64x60_pci_init(void)
+ {
+- struct device_node *np = NULL;
++ struct device_node *np;
+
+- while ((np = of_find_compatible_node(np, "pci", "marvell,mv64x60-pci")))
++ for_each_compatible_node(np, "pci", "marvell,mv64x60-pci")
+ mv64x60_add_bridge(np);
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/mv64x60_udbg.c powerpc.git/arch/powerpc/sysdev/mv64x60_udbg.c
+--- linux-2.6.24/arch/powerpc/sysdev/mv64x60_udbg.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/mv64x60_udbg.c 2008-01-28 20:25:49.000000000 +0100
+@@ -85,10 +85,10 @@
+ if (!stdout)
+ return;
+
+- for (np = NULL;
+- (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); )
++ for_each_compatible_node(np, "serial", "marvell,mpsc") {
+ if (np == stdout)
+ break;
++ }
+
+ of_node_put(stdout);
+ if (!np)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/of_rtc.c powerpc.git/arch/powerpc/sysdev/of_rtc.c
+--- linux-2.6.24/arch/powerpc/sysdev/of_rtc.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/of_rtc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,59 @@
++/*
++ * Instantiate mmio-mapped RTC chips based on device tree information
++ *
++ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++#include <linux/kernel.h>
++#include <linux/of.h>
++#include <linux/init.h>
++#include <linux/of_platform.h>
++
++static __initdata struct {
++ const char *compatible;
++ char *plat_name;
++} of_rtc_table[] = {
++ { "ds1743-nvram", "rtc-ds1742" },
++};
++
++void __init of_instantiate_rtc(void)
++{
++ struct device_node *node;
++ int err;
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
++ char *plat_name = of_rtc_table[i].plat_name;
++
++ for_each_compatible_node(node, NULL,
++ of_rtc_table[i].compatible) {
++ struct resource *res;
++
++ res = kmalloc(sizeof(*res), GFP_KERNEL);
++ if (!res) {
++ printk(KERN_ERR "OF RTC: Out of memory "
++ "allocating resource structure for %s\n",
++ node->full_name);
++ continue;
++ }
++
++ err = of_address_to_resource(node, 0, res);
++ if (err) {
++ printk(KERN_ERR "OF RTC: Error "
++ "translating resources for %s\n",
++ node->full_name);
++ continue;
++ }
++
++ printk(KERN_INFO "OF_RTC: %s is a %s @ 0x%llx-0x%llx\n",
++ node->full_name, plat_name,
++ (unsigned long long)res->start,
++ (unsigned long long)res->end);
++ platform_device_register_simple(plat_name, -1, res, 1);
++ }
++ }
++}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/pmi.c powerpc.git/arch/powerpc/sysdev/pmi.c
+--- linux-2.6.24/arch/powerpc/sysdev/pmi.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/pmi.c 2008-01-28 20:25:49.000000000 +0100
+@@ -28,9 +28,9 @@
+ #include <linux/completion.h>
+ #include <linux/spinlock.h>
+ #include <linux/workqueue.h>
++#include <linux/of_device.h>
++#include <linux/of_platform.h>
+
+-#include <asm/of_device.h>
+-#include <asm/of_platform.h>
+ #include <asm/io.h>
+ #include <asm/pmi.h>
+ #include <asm/prom.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/ppc4xx_pci.c powerpc.git/arch/powerpc/sysdev/ppc4xx_pci.c
+--- linux-2.6.24/arch/powerpc/sysdev/ppc4xx_pci.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/ppc4xx_pci.c 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,1528 @@
++/*
++ * PCI / PCI-X / PCI-Express support for 4xx parts
++ *
++ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
++ *
++ * Most PCI Express code is coming from Stefan Roese implementation for
++ * arch/ppc in the Denx tree, slightly reworked by me.
++ *
++ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
++ *
++ * Some of that comes itself from a previous implementation for 440SPE only
++ * by Roland Dreier:
++ *
++ * Copyright (c) 2005 Cisco Systems. All rights reserved.
++ * Roland Dreier <rolandd@cisco.com>
++ *
++ */
++
++#undef DEBUG
++
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <linux/init.h>
++#include <linux/of.h>
++#include <linux/bootmem.h>
++#include <linux/delay.h>
++
++#include <asm/io.h>
++#include <asm/pci-bridge.h>
++#include <asm/machdep.h>
++#include <asm/dcr.h>
++#include <asm/dcr-regs.h>
++
++#include "ppc4xx_pci.h"
++
++static int dma_offset_set;
++
++/* Move that to a useable header */
++extern unsigned long total_memory;
++
++#define U64_TO_U32_LOW(val) ((u32)((val) & 0x00000000ffffffffULL))
++#define U64_TO_U32_HIGH(val) ((u32)((val) >> 32))
++
++#ifdef CONFIG_RESOURCES_64BIT
++#define RES_TO_U32_LOW(val) U64_TO_U32_LOW(val)
++#define RES_TO_U32_HIGH(val) U64_TO_U32_HIGH(val)
++#else
++#define RES_TO_U32_LOW(val) (val)
++#define RES_TO_U32_HIGH(val) (0)
++#endif
++
++static inline int ppc440spe_revA(void)
++{
++ /* Catch both 440SPe variants, with and without RAID6 support */
++ if ((mfspr(SPRN_PVR) & 0xffefffff) == 0x53421890)
++ return 1;
++ else
++ return 0;
++}
++
++static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev)
++{
++ struct pci_controller *hose;
++ int i;
++
++ if (dev->devfn != 0 || dev->bus->self != NULL)
++ return;
++
++ hose = pci_bus_to_host(dev->bus);
++ if (hose == NULL)
++ return;
++
++ if (!of_device_is_compatible(hose->dn, "ibm,plb-pciex") &&
++ !of_device_is_compatible(hose->dn, "ibm,plb-pcix") &&
++ !of_device_is_compatible(hose->dn, "ibm,plb-pci"))
++ return;
++
++ /* Hide the PCI host BARs from the kernel as their content doesn't
++ * fit well in the resource management
++ */
++ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
++ dev->resource[i].start = dev->resource[i].end = 0;
++ dev->resource[i].flags = 0;
++ }
++
++ printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n",
++ pci_name(dev));
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_ppc4xx_pci_bridge);
++
++static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose,
++ void __iomem *reg,
++ struct resource *res)
++{
++ u64 size;
++ const u32 *ranges;
++ int rlen;
++ int pna = of_n_addr_cells(hose->dn);
++ int np = pna + 5;
++
++ /* Default */
++ res->start = 0;
++ res->end = size = 0x80000000;
++ res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
++
++ /* Get dma-ranges property */
++ ranges = of_get_property(hose->dn, "dma-ranges", &rlen);
++ if (ranges == NULL)
++ goto out;
++
++ /* Walk it */
++ while ((rlen -= np * 4) >= 0) {
++ u32 pci_space = ranges[0];
++ u64 pci_addr = of_read_number(ranges + 1, 2);
++ u64 cpu_addr = of_translate_dma_address(hose->dn, ranges + 3);
++ size = of_read_number(ranges + pna + 3, 2);
++ ranges += np;
++ if (cpu_addr == OF_BAD_ADDR || size == 0)
++ continue;
++
++ /* We only care about memory */
++ if ((pci_space & 0x03000000) != 0x02000000)
++ continue;
++
++ /* We currently only support memory at 0, and pci_addr
++ * within 32 bits space
++ */
++ if (cpu_addr != 0 || pci_addr > 0xffffffff) {
++ printk(KERN_WARNING "%s: Ignored unsupported dma range"
++ " 0x%016llx...0x%016llx -> 0x%016llx\n",
++ hose->dn->full_name,
++ pci_addr, pci_addr + size - 1, cpu_addr);
++ continue;
++ }
++
++ /* Check if not prefetchable */
++ if (!(pci_space & 0x40000000))
++ res->flags &= ~IORESOURCE_PREFETCH;
++
++
++ /* Use that */
++ res->start = pci_addr;
++#ifndef CONFIG_RESOURCES_64BIT
++ /* Beware of 32 bits resources */
++ if ((pci_addr + size) > 0x100000000ull)
++ res->end = 0xffffffff;
++ else
++#endif
++ res->end = res->start + size - 1;
++ break;
++ }
++
++ /* We only support one global DMA offset */
++ if (dma_offset_set && pci_dram_offset != res->start) {
++ printk(KERN_ERR "%s: dma-ranges(s) mismatch\n",
++ hose->dn->full_name);
++ return -ENXIO;
++ }
++
++ /* Check that we can fit all of memory as we don't support
++ * DMA bounce buffers
++ */
++ if (size < total_memory) {
++ printk(KERN_ERR "%s: dma-ranges too small "
++ "(size=%llx total_memory=%lx)\n",
++ hose->dn->full_name, size, total_memory);
++ return -ENXIO;
++ }
++
++ /* Check we are a power of 2 size and that base is a multiple of size*/
++ if (!is_power_of_2(size) ||
++ (res->start & (size - 1)) != 0) {
++ printk(KERN_ERR "%s: dma-ranges unaligned\n",
++ hose->dn->full_name);
++ return -ENXIO;
++ }
++
++ /* Check that we are fully contained within 32 bits space */
++ if (res->end > 0xffffffff) {
++ printk(KERN_ERR "%s: dma-ranges outside of 32 bits space\n",
++ hose->dn->full_name);
++ return -ENXIO;
++ }
++ out:
++ dma_offset_set = 1;
++ pci_dram_offset = res->start;
++
++ printk(KERN_INFO "4xx PCI DMA offset set to 0x%08lx\n",
++ pci_dram_offset);
++ return 0;
++}
++
++/*
++ * 4xx PCI 2.x part
++ */
++
++static void __init ppc4xx_configure_pci_PMMs(struct pci_controller *hose,
++ void __iomem *reg)
++{
++ u32 la, ma, pcila, pciha;
++ int i, j;
++
++ /* Setup outbound memory windows */
++ for (i = j = 0; i < 3; i++) {
++ struct resource *res = &hose->mem_resources[i];
++
++ /* we only care about memory windows */
++ if (!(res->flags & IORESOURCE_MEM))
++ continue;
++ if (j > 2) {
++ printk(KERN_WARNING "%s: Too many ranges\n",
++ hose->dn->full_name);
++ break;
++ }
++
++ /* Calculate register values */
++ la = res->start;
++ pciha = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
++ pcila = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
++
++ ma = res->end + 1 - res->start;
++ if (!is_power_of_2(ma) || ma < 0x1000 || ma > 0xffffffffu) {
++ printk(KERN_WARNING "%s: Resource out of range\n",
++ hose->dn->full_name);
++ continue;
++ }
++ ma = (0xffffffffu << ilog2(ma)) | 0x1;
++ if (res->flags & IORESOURCE_PREFETCH)
++ ma |= 0x2;
++
++ /* Program register values */
++ writel(la, reg + PCIL0_PMM0LA + (0x10 * j));
++ writel(pcila, reg + PCIL0_PMM0PCILA + (0x10 * j));
++ writel(pciha, reg + PCIL0_PMM0PCIHA + (0x10 * j));
++ writel(ma, reg + PCIL0_PMM0MA + (0x10 * j));
++ j++;
++ }
++}
++
++static void __init ppc4xx_configure_pci_PTMs(struct pci_controller *hose,
++ void __iomem *reg,
++ const struct resource *res)
++{
++ resource_size_t size = res->end - res->start + 1;
++ u32 sa;
++
++ /* Calculate window size */
++ sa = (0xffffffffu << ilog2(size)) | 1;
++ sa |= 0x1;
++
++ /* RAM is always at 0 local for now */
++ writel(0, reg + PCIL0_PTM1LA);
++ writel(sa, reg + PCIL0_PTM1MS);
++
++ /* Map on PCI side */
++ early_write_config_dword(hose, hose->first_busno, 0,
++ PCI_BASE_ADDRESS_1, res->start);
++ early_write_config_dword(hose, hose->first_busno, 0,
++ PCI_BASE_ADDRESS_2, 0x00000000);
++ early_write_config_word(hose, hose->first_busno, 0,
++ PCI_COMMAND, 0x0006);
++}
++
++static void __init ppc4xx_probe_pci_bridge(struct device_node *np)
++{
++ /* NYI */
++ struct resource rsrc_cfg;
++ struct resource rsrc_reg;
++ struct resource dma_window;
++ struct pci_controller *hose = NULL;
++ void __iomem *reg = NULL;
++ const int *bus_range;
++ int primary = 0;
++
++ /* Fetch config space registers address */
++ if (of_address_to_resource(np, 0, &rsrc_cfg)) {
++ printk(KERN_ERR "%s:Can't get PCI config register base !",
++ np->full_name);
++ return;
++ }
++ /* Fetch host bridge internal registers address */
++ if (of_address_to_resource(np, 3, &rsrc_reg)) {
++ printk(KERN_ERR "%s: Can't get PCI internal register base !",
++ np->full_name);
++ return;
++ }
++
++ /* Check if primary bridge */
++ if (of_get_property(np, "primary", NULL))
++ primary = 1;
++
++ /* Get bus range if any */
++ bus_range = of_get_property(np, "bus-range", NULL);
++
++ /* Map registers */
++ reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
++ if (reg == NULL) {
++ printk(KERN_ERR "%s: Can't map registers !", np->full_name);
++ goto fail;
++ }
++
++ /* Allocate the host controller data structure */
++ hose = pcibios_alloc_controller(np);
++ if (!hose)
++ goto fail;
++
++ hose->first_busno = bus_range ? bus_range[0] : 0x0;
++ hose->last_busno = bus_range ? bus_range[1] : 0xff;
++
++ /* Setup config space */
++ setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
++
++ /* Disable all windows */
++ writel(0, reg + PCIL0_PMM0MA);
++ writel(0, reg + PCIL0_PMM1MA);
++ writel(0, reg + PCIL0_PMM2MA);
++ writel(0, reg + PCIL0_PTM1MS);
++ writel(0, reg + PCIL0_PTM2MS);
++
++ /* Parse outbound mapping resources */
++ pci_process_bridge_OF_ranges(hose, np, primary);
++
++ /* Parse inbound mapping resources */
++ if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
++ goto fail;
++
++ /* Configure outbound ranges POMs */
++ ppc4xx_configure_pci_PMMs(hose, reg);
++
++ /* Configure inbound ranges PIMs */
++ ppc4xx_configure_pci_PTMs(hose, reg, &dma_window);
++
++ /* We don't need the registers anymore */
++ iounmap(reg);
++ return;
++
++ fail:
++ if (hose)
++ pcibios_free_controller(hose);
++ if (reg)
++ iounmap(reg);
++}
++
++/*
++ * 4xx PCI-X part
++ */
++
++static void __init ppc4xx_configure_pcix_POMs(struct pci_controller *hose,
++ void __iomem *reg)
++{
++ u32 lah, lal, pciah, pcial, sa;
++ int i, j;
++
++ /* Setup outbound memory windows */
++ for (i = j = 0; i < 3; i++) {
++ struct resource *res = &hose->mem_resources[i];
++
++ /* we only care about memory windows */
++ if (!(res->flags & IORESOURCE_MEM))
++ continue;
++ if (j > 1) {
++ printk(KERN_WARNING "%s: Too many ranges\n",
++ hose->dn->full_name);
++ break;
++ }
++
++ /* Calculate register values */
++ lah = RES_TO_U32_HIGH(res->start);
++ lal = RES_TO_U32_LOW(res->start);
++ pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
++ pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
++ sa = res->end + 1 - res->start;
++ if (!is_power_of_2(sa) || sa < 0x100000 ||
++ sa > 0xffffffffu) {
++ printk(KERN_WARNING "%s: Resource out of range\n",
++ hose->dn->full_name);
++ continue;
++ }
++ sa = (0xffffffffu << ilog2(sa)) | 0x1;
++
++ /* Program register values */
++ if (j == 0) {
++ writel(lah, reg + PCIX0_POM0LAH);
++ writel(lal, reg + PCIX0_POM0LAL);
++ writel(pciah, reg + PCIX0_POM0PCIAH);
++ writel(pcial, reg + PCIX0_POM0PCIAL);
++ writel(sa, reg + PCIX0_POM0SA);
++ } else {
++ writel(lah, reg + PCIX0_POM1LAH);
++ writel(lal, reg + PCIX0_POM1LAL);
++ writel(pciah, reg + PCIX0_POM1PCIAH);
++ writel(pcial, reg + PCIX0_POM1PCIAL);
++ writel(sa, reg + PCIX0_POM1SA);
++ }
++ j++;
++ }
++}
++
++static void __init ppc4xx_configure_pcix_PIMs(struct pci_controller *hose,
++ void __iomem *reg,
++ const struct resource *res,
++ int big_pim,
++ int enable_msi_hole)
++{
++ resource_size_t size = res->end - res->start + 1;
++ u32 sa;
++
++ /* RAM is always at 0 */
++ writel(0x00000000, reg + PCIX0_PIM0LAH);
++ writel(0x00000000, reg + PCIX0_PIM0LAL);
++
++ /* Calculate window size */
++ sa = (0xffffffffu << ilog2(size)) | 1;
++ sa |= 0x1;
++ if (res->flags & IORESOURCE_PREFETCH)
++ sa |= 0x2;
++ if (enable_msi_hole)
++ sa |= 0x4;
++ writel(sa, reg + PCIX0_PIM0SA);
++ if (big_pim)
++ writel(0xffffffff, reg + PCIX0_PIM0SAH);
++
++ /* Map on PCI side */
++ writel(0x00000000, reg + PCIX0_BAR0H);
++ writel(res->start, reg + PCIX0_BAR0L);
++ writew(0x0006, reg + PCIX0_COMMAND);
++}
++
++static void __init ppc4xx_probe_pcix_bridge(struct device_node *np)
++{
++ struct resource rsrc_cfg;
++ struct resource rsrc_reg;
++ struct resource dma_window;
++ struct pci_controller *hose = NULL;
++ void __iomem *reg = NULL;
++ const int *bus_range;
++ int big_pim = 0, msi = 0, primary = 0;
++
++ /* Fetch config space registers address */
++ if (of_address_to_resource(np, 0, &rsrc_cfg)) {
++ printk(KERN_ERR "%s:Can't get PCI-X config register base !",
++ np->full_name);
++ return;
++ }
++ /* Fetch host bridge internal registers address */
++ if (of_address_to_resource(np, 3, &rsrc_reg)) {
++ printk(KERN_ERR "%s: Can't get PCI-X internal register base !",
++ np->full_name);
++ return;
++ }
++
++ /* Check if it supports large PIMs (440GX) */
++ if (of_get_property(np, "large-inbound-windows", NULL))
++ big_pim = 1;
++
++ /* Check if we should enable MSIs inbound hole */
++ if (of_get_property(np, "enable-msi-hole", NULL))
++ msi = 1;
++
++ /* Check if primary bridge */
++ if (of_get_property(np, "primary", NULL))
++ primary = 1;
++
++ /* Get bus range if any */
++ bus_range = of_get_property(np, "bus-range", NULL);
++
++ /* Map registers */
++ reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
++ if (reg == NULL) {
++ printk(KERN_ERR "%s: Can't map registers !", np->full_name);
++ goto fail;
++ }
++
++ /* Allocate the host controller data structure */
++ hose = pcibios_alloc_controller(np);
++ if (!hose)
++ goto fail;
++
++ hose->first_busno = bus_range ? bus_range[0] : 0x0;
++ hose->last_busno = bus_range ? bus_range[1] : 0xff;
++
++ /* Setup config space */
++ setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
++
++ /* Disable all windows */
++ writel(0, reg + PCIX0_POM0SA);
++ writel(0, reg + PCIX0_POM1SA);
++ writel(0, reg + PCIX0_POM2SA);
++ writel(0, reg + PCIX0_PIM0SA);
++ writel(0, reg + PCIX0_PIM1SA);
++ writel(0, reg + PCIX0_PIM2SA);
++ if (big_pim) {
++ writel(0, reg + PCIX0_PIM0SAH);
++ writel(0, reg + PCIX0_PIM2SAH);
++ }
++
++ /* Parse outbound mapping resources */
++ pci_process_bridge_OF_ranges(hose, np, primary);
++
++ /* Parse inbound mapping resources */
++ if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
++ goto fail;
++
++ /* Configure outbound ranges POMs */
++ ppc4xx_configure_pcix_POMs(hose, reg);
++
++ /* Configure inbound ranges PIMs */
++ ppc4xx_configure_pcix_PIMs(hose, reg, &dma_window, big_pim, msi);
++
++ /* We don't need the registers anymore */
++ iounmap(reg);
++ return;
++
++ fail:
++ if (hose)
++ pcibios_free_controller(hose);
++ if (reg)
++ iounmap(reg);
++}
++
++#ifdef CONFIG_PPC4xx_PCI_EXPRESS
++
++/*
++ * 4xx PCI-Express part
++ *
++ * We support 3 parts currently based on the compatible property:
++ *
++ * ibm,plb-pciex-440spe
++ * ibm,plb-pciex-405ex
++ *
++ * Anything else will be rejected for now as they are all subtly
++ * different unfortunately.
++ *
++ */
++
++#define MAX_PCIE_BUS_MAPPED 0x40
++
++struct ppc4xx_pciex_port
++{
++ struct pci_controller *hose;
++ struct device_node *node;
++ unsigned int index;
++ int endpoint;
++ int link;
++ int has_ibpre;
++ unsigned int sdr_base;
++ dcr_host_t dcrs;
++ struct resource cfg_space;
++ struct resource utl_regs;
++ void __iomem *utl_base;
++};
++
++static struct ppc4xx_pciex_port *ppc4xx_pciex_ports;
++static unsigned int ppc4xx_pciex_port_count;
++
++struct ppc4xx_pciex_hwops
++{
++ int (*core_init)(struct device_node *np);
++ int (*port_init_hw)(struct ppc4xx_pciex_port *port);
++ int (*setup_utl)(struct ppc4xx_pciex_port *port);
++};
++
++static struct ppc4xx_pciex_hwops *ppc4xx_pciex_hwops;
++
++#ifdef CONFIG_44x
++
++/* Check various reset bits of the 440SPe PCIe core */
++static int __init ppc440spe_pciex_check_reset(struct device_node *np)
++{
++ u32 valPE0, valPE1, valPE2;
++ int err = 0;
++
++ /* SDR0_PEGPLLLCT1 reset */
++ if (!(mfdcri(SDR0, PESDR0_PLLLCT1) & 0x01000000)) {
++ /*
++ * the PCIe core was probably already initialised
++ * by firmware - let's re-reset RCSSET regs
++ *
++ * -- Shouldn't we also re-reset the whole thing ? -- BenH
++ */
++ pr_debug("PCIE: SDR0_PLLLCT1 already reset.\n");
++ mtdcri(SDR0, PESDR0_440SPE_RCSSET, 0x01010000);
++ mtdcri(SDR0, PESDR1_440SPE_RCSSET, 0x01010000);
++ mtdcri(SDR0, PESDR2_440SPE_RCSSET, 0x01010000);
++ }
++
++ valPE0 = mfdcri(SDR0, PESDR0_440SPE_RCSSET);
++ valPE1 = mfdcri(SDR0, PESDR1_440SPE_RCSSET);
++ valPE2 = mfdcri(SDR0, PESDR2_440SPE_RCSSET);
++
++ /* SDR0_PExRCSSET rstgu */
++ if (!(valPE0 & 0x01000000) ||
++ !(valPE1 & 0x01000000) ||
++ !(valPE2 & 0x01000000)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstgu error\n");
++ err = -1;
++ }
++
++ /* SDR0_PExRCSSET rstdl */
++ if (!(valPE0 & 0x00010000) ||
++ !(valPE1 & 0x00010000) ||
++ !(valPE2 & 0x00010000)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstdl error\n");
++ err = -1;
++ }
++
++ /* SDR0_PExRCSSET rstpyn */
++ if ((valPE0 & 0x00001000) ||
++ (valPE1 & 0x00001000) ||
++ (valPE2 & 0x00001000)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstpyn error\n");
++ err = -1;
++ }
++
++ /* SDR0_PExRCSSET hldplb */
++ if ((valPE0 & 0x10000000) ||
++ (valPE1 & 0x10000000) ||
++ (valPE2 & 0x10000000)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET hldplb error\n");
++ err = -1;
++ }
++
++ /* SDR0_PExRCSSET rdy */
++ if ((valPE0 & 0x00100000) ||
++ (valPE1 & 0x00100000) ||
++ (valPE2 & 0x00100000)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rdy error\n");
++ err = -1;
++ }
++
++ /* SDR0_PExRCSSET shutdown */
++ if ((valPE0 & 0x00000100) ||
++ (valPE1 & 0x00000100) ||
++ (valPE2 & 0x00000100)) {
++ printk(KERN_INFO "PCIE: SDR0_PExRCSSET shutdown error\n");
++ err = -1;
++ }
++
++ return err;
++}
++
++/* Global PCIe core initializations for 440SPe core */
++static int __init ppc440spe_pciex_core_init(struct device_node *np)
++{
++ int time_out = 20;
++
++ /* Set PLL clock receiver to LVPECL */
++ mtdcri(SDR0, PESDR0_PLLLCT1, mfdcri(SDR0, PESDR0_PLLLCT1) | 1 << 28);
++
++ /* Shouldn't we do all the calibration stuff etc... here ? */
++ if (ppc440spe_pciex_check_reset(np))
++ return -ENXIO;
++
++ if (!(mfdcri(SDR0, PESDR0_PLLLCT2) & 0x10000)) {
++ printk(KERN_INFO "PCIE: PESDR_PLLCT2 resistance calibration "
++ "failed (0x%08x)\n",
++ mfdcri(SDR0, PESDR0_PLLLCT2));
++ return -1;
++ }
++
++ /* De-assert reset of PCIe PLL, wait for lock */
++ mtdcri(SDR0, PESDR0_PLLLCT1,
++ mfdcri(SDR0, PESDR0_PLLLCT1) & ~(1 << 24));
++ udelay(3);
++
++ while (time_out) {
++ if (!(mfdcri(SDR0, PESDR0_PLLLCT3) & 0x10000000)) {
++ time_out--;
++ udelay(1);
++ } else
++ break;
++ }
++ if (!time_out) {
++ printk(KERN_INFO "PCIE: VCO output not locked\n");
++ return -1;
++ }
++
++ pr_debug("PCIE initialization OK\n");
++
++ return 3;
++}
++
++static int ppc440spe_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
++{
++ u32 val = 1 << 24;
++
++ if (port->endpoint)
++ val = PTYPE_LEGACY_ENDPOINT << 20;
++ else
++ val = PTYPE_ROOT_PORT << 20;
++
++ if (port->index == 0)
++ val |= LNKW_X8 << 12;
++ else
++ val |= LNKW_X4 << 12;
++
++ mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET, val);
++ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x20222222);
++ if (ppc440spe_revA())
++ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x11000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL0SET1, 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL1SET1, 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL2SET1, 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL3SET1, 0x35000000);
++ if (port->index == 0) {
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL4SET1,
++ 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL5SET1,
++ 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL6SET1,
++ 0x35000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL7SET1,
++ 0x35000000);
++ }
++ val = mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET);
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
++ (val & ~(1 << 24 | 1 << 16)) | 1 << 12);
++
++ return 0;
++}
++
++static int ppc440speA_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
++{
++ return ppc440spe_pciex_init_port_hw(port);
++}
++
++static int ppc440speB_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
++{
++ int rc = ppc440spe_pciex_init_port_hw(port);
++
++ port->has_ibpre = 1;
++
++ return rc;
++}
++
++static int ppc440speA_pciex_init_utl(struct ppc4xx_pciex_port *port)
++{
++ /* XXX Check what that value means... I hate magic */
++ dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x68782800);
++
++ /*
++ * Set buffer allocations and then assert VRB and TXE.
++ */
++ out_be32(port->utl_base + PEUTL_OUTTR, 0x08000000);
++ out_be32(port->utl_base + PEUTL_INTR, 0x02000000);
++ out_be32(port->utl_base + PEUTL_OPDBSZ, 0x10000000);
++ out_be32(port->utl_base + PEUTL_PBBSZ, 0x53000000);
++ out_be32(port->utl_base + PEUTL_IPHBSZ, 0x08000000);
++ out_be32(port->utl_base + PEUTL_IPDBSZ, 0x10000000);
++ out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
++ out_be32(port->utl_base + PEUTL_PCTL, 0x80800066);
++
++ return 0;
++}
++
++static int ppc440speB_pciex_init_utl(struct ppc4xx_pciex_port *port)
++{
++ /* Report CRS to the operating system */
++ out_be32(port->utl_base + PEUTL_PBCTL, 0x08000000);
++
++ return 0;
++}
++
++static struct ppc4xx_pciex_hwops ppc440speA_pcie_hwops __initdata =
++{
++ .core_init = ppc440spe_pciex_core_init,
++ .port_init_hw = ppc440speA_pciex_init_port_hw,
++ .setup_utl = ppc440speA_pciex_init_utl,
++};
++
++static struct ppc4xx_pciex_hwops ppc440speB_pcie_hwops __initdata =
++{
++ .core_init = ppc440spe_pciex_core_init,
++ .port_init_hw = ppc440speB_pciex_init_port_hw,
++ .setup_utl = ppc440speB_pciex_init_utl,
++};
++
++#endif /* CONFIG_44x */
++
++#ifdef CONFIG_40x
++
++static int __init ppc405ex_pciex_core_init(struct device_node *np)
++{
++ /* Nothing to do, return 2 ports */
++ return 2;
++}
++
++static void ppc405ex_pcie_phy_reset(struct ppc4xx_pciex_port *port)
++{
++ /* Assert the PE0_PHY reset */
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01010000);
++ msleep(1);
++
++ /* deassert the PE0_hotreset */
++ if (port->endpoint)
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01111000);
++ else
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01101000);
++
++ /* poll for phy !reset */
++ /* XXX FIXME add timeout */
++ while (!(mfdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSTA) & 0x00001000))
++ ;
++
++ /* deassert the PE0_gpl_utl_reset */
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x00101000);
++}
++
++static int ppc405ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
++{
++ u32 val;
++
++ if (port->endpoint)
++ val = PTYPE_LEGACY_ENDPOINT;
++ else
++ val = PTYPE_ROOT_PORT;
++
++ mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET,
++ 1 << 24 | val << 20 | LNKW_X1 << 12);
++
++ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x00000000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x01010000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET1, 0x720F0000);
++ mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET2, 0x70600003);
++
++ /*
++ * Only reset the PHY when no link is currently established.
++ * This is for the Atheros PCIe board which has problems to establish
++ * the link (again) after this PHY reset. All other currently tested
++ * PCIe boards don't show this problem.
++ * This has to be re-tested and fixed in a later release!
++ */
++#if 0 /* XXX FIXME: Not resetting the PHY will leave all resources
++ * configured as done previously by U-Boot. Then Linux will currently
++ * not reassign them. So the PHY reset is now done always. This will
++ * lead to problems with the Atheros PCIe board again.
++ */
++ val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
++ if (!(val & 0x00001000))
++ ppc405ex_pcie_phy_reset(port);
++#else
++ ppc405ex_pcie_phy_reset(port);
++#endif
++
++ dcr_write(port->dcrs, DCRO_PEGPL_CFG, 0x10000000); /* guarded on */
++
++ port->has_ibpre = 1;
++
++ return 0;
++}
++
++static int ppc405ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
++{
++ dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x0);
++
++ /*
++ * Set buffer allocations and then assert VRB and TXE.
++ */
++ out_be32(port->utl_base + PEUTL_OUTTR, 0x02000000);
++ out_be32(port->utl_base + PEUTL_INTR, 0x02000000);
++ out_be32(port->utl_base + PEUTL_OPDBSZ, 0x04000000);
++ out_be32(port->utl_base + PEUTL_PBBSZ, 0x21000000);
++ out_be32(port->utl_base + PEUTL_IPHBSZ, 0x02000000);
++ out_be32(port->utl_base + PEUTL_IPDBSZ, 0x04000000);
++ out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
++ out_be32(port->utl_base + PEUTL_PCTL, 0x80800066);
++
++ out_be32(port->utl_base + PEUTL_PBCTL, 0x08000000);
++
++ return 0;
++}
++
++static struct ppc4xx_pciex_hwops ppc405ex_pcie_hwops __initdata =
++{
++ .core_init = ppc405ex_pciex_core_init,
++ .port_init_hw = ppc405ex_pciex_init_port_hw,
++ .setup_utl = ppc405ex_pciex_init_utl,
++};
++
++#endif /* CONFIG_40x */
++
++
++/* Check that the core has been initied and if not, do it */
++static int __init ppc4xx_pciex_check_core_init(struct device_node *np)
++{
++ static int core_init;
++ int count = -ENODEV;
++
++ if (core_init++)
++ return 0;
++
++#ifdef CONFIG_44x
++ if (of_device_is_compatible(np, "ibm,plb-pciex-440spe")) {
++ if (ppc440spe_revA())
++ ppc4xx_pciex_hwops = &ppc440speA_pcie_hwops;
++ else
++ ppc4xx_pciex_hwops = &ppc440speB_pcie_hwops;
++ }
++#endif /* CONFIG_44x */
++#ifdef CONFIG_40x
++ if (of_device_is_compatible(np, "ibm,plb-pciex-405ex"))
++ ppc4xx_pciex_hwops = &ppc405ex_pcie_hwops;
++#endif
++ if (ppc4xx_pciex_hwops == NULL) {
++ printk(KERN_WARNING "PCIE: unknown host type %s\n",
++ np->full_name);
++ return -ENODEV;
++ }
++
++ count = ppc4xx_pciex_hwops->core_init(np);
++ if (count > 0) {
++ ppc4xx_pciex_ports =
++ kzalloc(count * sizeof(struct ppc4xx_pciex_port),
++ GFP_KERNEL);
++ if (ppc4xx_pciex_ports) {
++ ppc4xx_pciex_port_count = count;
++ return 0;
++ }
++ printk(KERN_WARNING "PCIE: failed to allocate ports array\n");
++ return -ENOMEM;
++ }
++ return -ENODEV;
++}
++
++static void __init ppc4xx_pciex_port_init_mapping(struct ppc4xx_pciex_port *port)
++{
++ /* We map PCI Express configuration based on the reg property */
++ dcr_write(port->dcrs, DCRO_PEGPL_CFGBAH,
++ RES_TO_U32_HIGH(port->cfg_space.start));
++ dcr_write(port->dcrs, DCRO_PEGPL_CFGBAL,
++ RES_TO_U32_LOW(port->cfg_space.start));
++
++ /* XXX FIXME: Use size from reg property. For now, map 512M */
++ dcr_write(port->dcrs, DCRO_PEGPL_CFGMSK, 0xe0000001);
++
++ /* We map UTL registers based on the reg property */
++ dcr_write(port->dcrs, DCRO_PEGPL_REGBAH,
++ RES_TO_U32_HIGH(port->utl_regs.start));
++ dcr_write(port->dcrs, DCRO_PEGPL_REGBAL,
++ RES_TO_U32_LOW(port->utl_regs.start));
++
++ /* XXX FIXME: Use size from reg property */
++ dcr_write(port->dcrs, DCRO_PEGPL_REGMSK, 0x00007001);
++
++ /* Disable all other outbound windows */
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, 0);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, 0);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0);
++ dcr_write(port->dcrs, DCRO_PEGPL_MSGMSK, 0);
++}
++
++static int __init ppc4xx_pciex_wait_on_sdr(struct ppc4xx_pciex_port *port,
++ unsigned int sdr_offset,
++ unsigned int mask,
++ unsigned int value,
++ int timeout_ms)
++{
++ u32 val;
++
++ while(timeout_ms--) {
++ val = mfdcri(SDR0, port->sdr_base + sdr_offset);
++ if ((val & mask) == value) {
++ pr_debug("PCIE%d: Wait on SDR %x success with tm %d (%08x)\n",
++ port->index, sdr_offset, timeout_ms, val);
++ return 0;
++ }
++ msleep(1);
++ }
++ return -1;
++}
++
++static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
++{
++ int rc = 0;
++
++ /* Init HW */
++ if (ppc4xx_pciex_hwops->port_init_hw)
++ rc = ppc4xx_pciex_hwops->port_init_hw(port);
++ if (rc != 0)
++ return rc;
++
++ printk(KERN_INFO "PCIE%d: Checking link...\n",
++ port->index);
++
++ /* Wait for reset to complete */
++ if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS, 1 << 20, 0, 10)) {
++ printk(KERN_WARNING "PCIE%d: PGRST failed\n",
++ port->index);
++ return -1;
++ }
++
++ /* Check for card presence detect if supported, if not, just wait for
++ * link unconditionally.
++ *
++ * note that we don't fail if there is no link, we just filter out
++ * config space accesses. That way, it will be easier to implement
++ * hotplug later on.
++ */
++ if (!port->has_ibpre ||
++ !ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
++ 1 << 28, 1 << 28, 100)) {
++ printk(KERN_INFO
++ "PCIE%d: Device detected, waiting for link...\n",
++ port->index);
++ if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
++ 0x1000, 0x1000, 2000))
++ printk(KERN_WARNING
++ "PCIE%d: Link up failed\n", port->index);
++ else {
++ printk(KERN_INFO
++ "PCIE%d: link is up !\n", port->index);
++ port->link = 1;
++ }
++ } else
++ printk(KERN_INFO "PCIE%d: No device detected.\n", port->index);
++
++ /*
++ * Initialize mapping: disable all regions and configure
++ * CFG and REG regions based on resources in the device tree
++ */
++ ppc4xx_pciex_port_init_mapping(port);
++
++ /*
++ * Map UTL
++ */
++ port->utl_base = ioremap(port->utl_regs.start, 0x100);
++ BUG_ON(port->utl_base == NULL);
++
++ /*
++ * Setup UTL registers --BenH.
++ */
++ if (ppc4xx_pciex_hwops->setup_utl)
++ ppc4xx_pciex_hwops->setup_utl(port);
++
++ /*
++ * Check for VC0 active and assert RDY.
++ */
++ if (port->link &&
++ ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS,
++ 1 << 16, 1 << 16, 5000)) {
++ printk(KERN_INFO "PCIE%d: VC0 not active\n", port->index);
++ port->link = 0;
++ }
++
++ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
++ mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) | 1 << 20);
++ msleep(100);
++
++ return 0;
++}
++
++static int ppc4xx_pciex_validate_bdf(struct ppc4xx_pciex_port *port,
++ struct pci_bus *bus,
++ unsigned int devfn)
++{
++ static int message;
++
++ /* Endpoint can not generate upstream(remote) config cycles */
++ if (port->endpoint && bus->number != port->hose->first_busno)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ /* Check we are within the mapped range */
++ if (bus->number > port->hose->last_busno) {
++ if (!message) {
++ printk(KERN_WARNING "Warning! Probing bus %u"
++ " out of range !\n", bus->number);
++ message++;
++ }
++ return PCIBIOS_DEVICE_NOT_FOUND;
++ }
++
++ /* The root complex has only one device / function */
++ if (bus->number == port->hose->first_busno && devfn != 0)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ /* The other side of the RC has only one device as well */
++ if (bus->number == (port->hose->first_busno + 1) &&
++ PCI_SLOT(devfn) != 0)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ /* Check if we have a link */
++ if ((bus->number != port->hose->first_busno) && !port->link)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ return 0;
++}
++
++static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port,
++ struct pci_bus *bus,
++ unsigned int devfn)
++{
++ int relbus;
++
++ /* Remove the casts when we finally remove the stupid volatile
++ * in struct pci_controller
++ */
++ if (bus->number == port->hose->first_busno)
++ return (void __iomem *)port->hose->cfg_addr;
++
++ relbus = bus->number - (port->hose->first_busno + 1);
++ return (void __iomem *)port->hose->cfg_data +
++ ((relbus << 20) | (devfn << 12));
++}
++
++static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn,
++ int offset, int len, u32 *val)
++{
++ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
++ struct ppc4xx_pciex_port *port =
++ &ppc4xx_pciex_ports[hose->indirect_type];
++ void __iomem *addr;
++ u32 gpl_cfg;
++
++ BUG_ON(hose != port->hose);
++
++ if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
++
++ /*
++ * Reading from configuration space of non-existing device can
++ * generate transaction errors. For the read duration we suppress
++ * assertion of machine check exceptions to avoid those.
++ */
++ gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
++ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
++
++ /* Make sure no CRS is recorded */
++ out_be32(port->utl_base + PEUTL_RCSTA, 0x00040000);
++
++ switch (len) {
++ case 1:
++ *val = in_8((u8 *)(addr + offset));
++ break;
++ case 2:
++ *val = in_le16((u16 *)(addr + offset));
++ break;
++ default:
++ *val = in_le32((u32 *)(addr + offset));
++ break;
++ }
++
++ pr_debug("pcie-config-read: bus=%3d [%3d..%3d] devfn=0x%04x"
++ " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
++ bus->number, hose->first_busno, hose->last_busno,
++ devfn, offset, len, addr + offset, *val);
++
++ /* Check for CRS (440SPe rev B does that for us but heh ..) */
++ if (in_be32(port->utl_base + PEUTL_RCSTA) & 0x00040000) {
++ pr_debug("Got CRS !\n");
++ if (len != 4 || offset != 0)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++ *val = 0xffff0001;
++ }
++
++ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn,
++ int offset, int len, u32 val)
++{
++ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
++ struct ppc4xx_pciex_port *port =
++ &ppc4xx_pciex_ports[hose->indirect_type];
++ void __iomem *addr;
++ u32 gpl_cfg;
++
++ if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
++ return PCIBIOS_DEVICE_NOT_FOUND;
++
++ addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
++
++ /*
++ * Reading from configuration space of non-existing device can
++ * generate transaction errors. For the read duration we suppress
++ * assertion of machine check exceptions to avoid those.
++ */
++ gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
++ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
++
++ pr_debug("pcie-config-write: bus=%3d [%3d..%3d] devfn=0x%04x"
++ " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
++ bus->number, hose->first_busno, hose->last_busno,
++ devfn, offset, len, addr + offset, val);
++
++ switch (len) {
++ case 1:
++ out_8((u8 *)(addr + offset), val);
++ break;
++ case 2:
++ out_le16((u16 *)(addr + offset), val);
++ break;
++ default:
++ out_le32((u32 *)(addr + offset), val);
++ break;
++ }
++
++ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++static struct pci_ops ppc4xx_pciex_pci_ops =
++{
++ .read = ppc4xx_pciex_read_config,
++ .write = ppc4xx_pciex_write_config,
++};
++
++static void __init ppc4xx_configure_pciex_POMs(struct ppc4xx_pciex_port *port,
++ struct pci_controller *hose,
++ void __iomem *mbase)
++{
++ u32 lah, lal, pciah, pcial, sa;
++ int i, j;
++
++ /* Setup outbound memory windows */
++ for (i = j = 0; i < 3; i++) {
++ struct resource *res = &hose->mem_resources[i];
++
++ /* we only care about memory windows */
++ if (!(res->flags & IORESOURCE_MEM))
++ continue;
++ if (j > 1) {
++ printk(KERN_WARNING "%s: Too many ranges\n",
++ port->node->full_name);
++ break;
++ }
++
++ /* Calculate register values */
++ lah = RES_TO_U32_HIGH(res->start);
++ lal = RES_TO_U32_LOW(res->start);
++ pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
++ pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
++ sa = res->end + 1 - res->start;
++ if (!is_power_of_2(sa) || sa < 0x100000 ||
++ sa > 0xffffffffu) {
++ printk(KERN_WARNING "%s: Resource out of range\n",
++ port->node->full_name);
++ continue;
++ }
++ sa = (0xffffffffu << ilog2(sa)) | 0x1;
++
++ /* Program register values */
++ switch (j) {
++ case 0:
++ out_le32(mbase + PECFG_POM0LAH, pciah);
++ out_le32(mbase + PECFG_POM0LAL, pcial);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAH, lah);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAL, lal);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKH, 0x7fffffff);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, sa | 3);
++ break;
++ case 1:
++ out_le32(mbase + PECFG_POM1LAH, pciah);
++ out_le32(mbase + PECFG_POM1LAL, pcial);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAH, lah);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAL, lal);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKH, 0x7fffffff);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, sa | 3);
++ break;
++ }
++ j++;
++ }
++
++ /* Configure IO, always 64K starting at 0 */
++ if (hose->io_resource.flags & IORESOURCE_IO) {
++ lah = RES_TO_U32_HIGH(hose->io_base_phys);
++ lal = RES_TO_U32_LOW(hose->io_base_phys);
++ out_le32(mbase + PECFG_POM2LAH, 0);
++ out_le32(mbase + PECFG_POM2LAL, 0);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAH, lah);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAL, lal);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKH, 0x7fffffff);
++ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0xffff0000 | 3);
++ }
++}
++
++static void __init ppc4xx_configure_pciex_PIMs(struct ppc4xx_pciex_port *port,
++ struct pci_controller *hose,
++ void __iomem *mbase,
++ struct resource *res)
++{
++ resource_size_t size = res->end - res->start + 1;
++ u64 sa;
++
++ /* Calculate window size */
++ sa = (0xffffffffffffffffull << ilog2(size));;
++ if (res->flags & IORESOURCE_PREFETCH)
++ sa |= 0x8;
++
++ out_le32(mbase + PECFG_BAR0HMPA, RES_TO_U32_HIGH(sa));
++ out_le32(mbase + PECFG_BAR0LMPA, RES_TO_U32_LOW(sa));
++
++ /* The setup of the split looks weird to me ... let's see if it works */
++ out_le32(mbase + PECFG_PIM0LAL, 0x00000000);
++ out_le32(mbase + PECFG_PIM0LAH, 0x00000000);
++ out_le32(mbase + PECFG_PIM1LAL, 0x00000000);
++ out_le32(mbase + PECFG_PIM1LAH, 0x00000000);
++ out_le32(mbase + PECFG_PIM01SAH, 0xffff0000);
++ out_le32(mbase + PECFG_PIM01SAL, 0x00000000);
++
++ /* Enable inbound mapping */
++ out_le32(mbase + PECFG_PIMEN, 0x1);
++
++ out_le32(mbase + PCI_BASE_ADDRESS_0, RES_TO_U32_LOW(res->start));
++ out_le32(mbase + PCI_BASE_ADDRESS_1, RES_TO_U32_HIGH(res->start));
++
++ /* Enable I/O, Mem, and Busmaster cycles */
++ out_le16(mbase + PCI_COMMAND,
++ in_le16(mbase + PCI_COMMAND) |
++ PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
++}
++
++static void __init ppc4xx_pciex_port_setup_hose(struct ppc4xx_pciex_port *port)
++{
++ struct resource dma_window;
++ struct pci_controller *hose = NULL;
++ const int *bus_range;
++ int primary = 0, busses;
++ void __iomem *mbase = NULL, *cfg_data = NULL;
++
++ /* XXX FIXME: Handle endpoint mode properly */
++ if (port->endpoint) {
++ printk(KERN_WARNING "PCIE%d: Port in endpoint mode !\n",
++ port->index);
++ return;
++ }
++
++ /* Check if primary bridge */
++ if (of_get_property(port->node, "primary", NULL))
++ primary = 1;
++
++ /* Get bus range if any */
++ bus_range = of_get_property(port->node, "bus-range", NULL);
++
++ /* Allocate the host controller data structure */
++ hose = pcibios_alloc_controller(port->node);
++ if (!hose)
++ goto fail;
++
++ /* We stick the port number in "indirect_type" so the config space
++ * ops can retrieve the port data structure easily
++ */
++ hose->indirect_type = port->index;
++
++ /* Get bus range */
++ hose->first_busno = bus_range ? bus_range[0] : 0x0;
++ hose->last_busno = bus_range ? bus_range[1] : 0xff;
++
++ /* Because of how big mapping the config space is (1M per bus), we
++ * limit how many busses we support. In the long run, we could replace
++ * that with something akin to kmap_atomic instead. We set aside 1 bus
++ * for the host itself too.
++ */
++ busses = hose->last_busno - hose->first_busno; /* This is off by 1 */
++ if (busses > MAX_PCIE_BUS_MAPPED) {
++ busses = MAX_PCIE_BUS_MAPPED;
++ hose->last_busno = hose->first_busno + busses;
++ }
++
++ /* We map the external config space in cfg_data and the host config
++ * space in cfg_addr. External space is 1M per bus, internal space
++ * is 4K
++ */
++ cfg_data = ioremap(port->cfg_space.start +
++ (hose->first_busno + 1) * 0x100000,
++ busses * 0x100000);
++ mbase = ioremap(port->cfg_space.start + 0x10000000, 0x1000);
++ if (cfg_data == NULL || mbase == NULL) {
++ printk(KERN_ERR "%s: Can't map config space !",
++ port->node->full_name);
++ goto fail;
++ }
++
++ hose->cfg_data = cfg_data;
++ hose->cfg_addr = mbase;
++
++ pr_debug("PCIE %s, bus %d..%d\n", port->node->full_name,
++ hose->first_busno, hose->last_busno);
++ pr_debug(" config space mapped at: root @0x%p, other @0x%p\n",
++ hose->cfg_addr, hose->cfg_data);
++
++ /* Setup config space */
++ hose->ops = &ppc4xx_pciex_pci_ops;
++ port->hose = hose;
++ mbase = (void __iomem *)hose->cfg_addr;
++
++ /*
++ * Set bus numbers on our root port
++ */
++ out_8(mbase + PCI_PRIMARY_BUS, hose->first_busno);
++ out_8(mbase + PCI_SECONDARY_BUS, hose->first_busno + 1);
++ out_8(mbase + PCI_SUBORDINATE_BUS, hose->last_busno);
++
++ /*
++ * OMRs are already reset, also disable PIMs
++ */
++ out_le32(mbase + PECFG_PIMEN, 0);
++
++ /* Parse outbound mapping resources */
++ pci_process_bridge_OF_ranges(hose, port->node, primary);
++
++ /* Parse inbound mapping resources */
++ if (ppc4xx_parse_dma_ranges(hose, mbase, &dma_window) != 0)
++ goto fail;
++
++ /* Configure outbound ranges POMs */
++ ppc4xx_configure_pciex_POMs(port, hose, mbase);
++
++ /* Configure inbound ranges PIMs */
++ ppc4xx_configure_pciex_PIMs(port, hose, mbase, &dma_window);
++
++ /* The root complex doesn't show up if we don't set some vendor
++ * and device IDs into it. Those are the same bogus one that the
++ * initial code in arch/ppc add. We might want to change that.
++ */
++ out_le16(mbase + 0x200, 0xaaa0 + port->index);
++ out_le16(mbase + 0x202, 0xbed0 + port->index);
++
++ /* Set Class Code to PCI-PCI bridge and Revision Id to 1 */
++ out_le32(mbase + 0x208, 0x06040001);
++
++ printk(KERN_INFO "PCIE%d: successfully set as root-complex\n",
++ port->index);
++ return;
++ fail:
++ if (hose)
++ pcibios_free_controller(hose);
++ if (cfg_data)
++ iounmap(cfg_data);
++ if (mbase)
++ iounmap(mbase);
++}
++
++static void __init ppc4xx_probe_pciex_bridge(struct device_node *np)
++{
++ struct ppc4xx_pciex_port *port;
++ const u32 *pval;
++ int portno;
++ unsigned int dcrs;
++
++ /* First, proceed to core initialization as we assume there's
++ * only one PCIe core in the system
++ */
++ if (ppc4xx_pciex_check_core_init(np))
++ return;
++
++ /* Get the port number from the device-tree */
++ pval = of_get_property(np, "port", NULL);
++ if (pval == NULL) {
++ printk(KERN_ERR "PCIE: Can't find port number for %s\n",
++ np->full_name);
++ return;
++ }
++ portno = *pval;
++ if (portno >= ppc4xx_pciex_port_count) {
++ printk(KERN_ERR "PCIE: port number out of range for %s\n",
++ np->full_name);
++ return;
++ }
++ port = &ppc4xx_pciex_ports[portno];
++ port->index = portno;
++ port->node = of_node_get(np);
++ pval = of_get_property(np, "sdr-base", NULL);
++ if (pval == NULL) {
++ printk(KERN_ERR "PCIE: missing sdr-base for %s\n",
++ np->full_name);
++ return;
++ }
++ port->sdr_base = *pval;
++
++ /* XXX Currently, we only support root complex mode */
++ port->endpoint = 0;
++
++ /* Fetch config space registers address */
++ if (of_address_to_resource(np, 0, &port->cfg_space)) {
++ printk(KERN_ERR "%s: Can't get PCI-E config space !",
++ np->full_name);
++ return;
++ }
++ /* Fetch host bridge internal registers address */
++ if (of_address_to_resource(np, 1, &port->utl_regs)) {
++ printk(KERN_ERR "%s: Can't get UTL register base !",
++ np->full_name);
++ return;
++ }
++
++ /* Map DCRs */
++ dcrs = dcr_resource_start(np, 0);
++ if (dcrs == 0) {
++ printk(KERN_ERR "%s: Can't get DCR register base !",
++ np->full_name);
++ return;
++ }
++ port->dcrs = dcr_map(np, dcrs, dcr_resource_len(np, 0));
++
++ /* Initialize the port specific registers */
++ if (ppc4xx_pciex_port_init(port)) {
++ printk(KERN_WARNING "PCIE%d: Port init failed\n", port->index);
++ return;
++ }
++
++ /* Setup the linux hose data structure */
++ ppc4xx_pciex_port_setup_hose(port);
++}
++
++#endif /* CONFIG_PPC4xx_PCI_EXPRESS */
++
++static int __init ppc4xx_pci_find_bridges(void)
++{
++ struct device_node *np;
++
++#ifdef CONFIG_PPC4xx_PCI_EXPRESS
++ for_each_compatible_node(np, NULL, "ibm,plb-pciex")
++ ppc4xx_probe_pciex_bridge(np);
++#endif
++ for_each_compatible_node(np, NULL, "ibm,plb-pcix")
++ ppc4xx_probe_pcix_bridge(np);
++ for_each_compatible_node(np, NULL, "ibm,plb-pci")
++ ppc4xx_probe_pci_bridge(np);
++
++ return 0;
++}
++arch_initcall(ppc4xx_pci_find_bridges);
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/ppc4xx_pci.h powerpc.git/arch/powerpc/sysdev/ppc4xx_pci.h
+--- linux-2.6.24/arch/powerpc/sysdev/ppc4xx_pci.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/ppc4xx_pci.h 2008-01-28 20:25:49.000000000 +0100
+@@ -0,0 +1,369 @@
++/*
++ * PCI / PCI-X / PCI-Express support for 4xx parts
++ *
++ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
++ *
++ * Bits and pieces extracted from arch/ppc support by
++ *
++ * Matt Porter <mporter@kernel.crashing.org>
++ *
++ * Copyright 2002-2005 MontaVista Software Inc.
++ */
++#ifndef __PPC4XX_PCI_H__
++#define __PPC4XX_PCI_H__
++
++/*
++ * 4xx PCI-X bridge register definitions
++ */
++#define PCIX0_VENDID 0x000
++#define PCIX0_DEVID 0x002
++#define PCIX0_COMMAND 0x004
++#define PCIX0_STATUS 0x006
++#define PCIX0_REVID 0x008
++#define PCIX0_CLS 0x009
++#define PCIX0_CACHELS 0x00c
++#define PCIX0_LATTIM 0x00d
++#define PCIX0_HDTYPE 0x00e
++#define PCIX0_BIST 0x00f
++#define PCIX0_BAR0L 0x010
++#define PCIX0_BAR0H 0x014
++#define PCIX0_BAR1 0x018
++#define PCIX0_BAR2L 0x01c
++#define PCIX0_BAR2H 0x020
++#define PCIX0_BAR3 0x024
++#define PCIX0_CISPTR 0x028
++#define PCIX0_SBSYSVID 0x02c
++#define PCIX0_SBSYSID 0x02e
++#define PCIX0_EROMBA 0x030
++#define PCIX0_CAP 0x034
++#define PCIX0_RES0 0x035
++#define PCIX0_RES1 0x036
++#define PCIX0_RES2 0x038
++#define PCIX0_INTLN 0x03c
++#define PCIX0_INTPN 0x03d
++#define PCIX0_MINGNT 0x03e
++#define PCIX0_MAXLTNCY 0x03f
++#define PCIX0_BRDGOPT1 0x040
++#define PCIX0_BRDGOPT2 0x044
++#define PCIX0_ERREN 0x050
++#define PCIX0_ERRSTS 0x054
++#define PCIX0_PLBBESR 0x058
++#define PCIX0_PLBBEARL 0x05c
++#define PCIX0_PLBBEARH 0x060
++#define PCIX0_POM0LAL 0x068
++#define PCIX0_POM0LAH 0x06c
++#define PCIX0_POM0SA 0x070
++#define PCIX0_POM0PCIAL 0x074
++#define PCIX0_POM0PCIAH 0x078
++#define PCIX0_POM1LAL 0x07c
++#define PCIX0_POM1LAH 0x080
++#define PCIX0_POM1SA 0x084
++#define PCIX0_POM1PCIAL 0x088
++#define PCIX0_POM1PCIAH 0x08c
++#define PCIX0_POM2SA 0x090
++#define PCIX0_PIM0SAL 0x098
++#define PCIX0_PIM0SA PCIX0_PIM0SAL
++#define PCIX0_PIM0LAL 0x09c
++#define PCIX0_PIM0LAH 0x0a0
++#define PCIX0_PIM1SA 0x0a4
++#define PCIX0_PIM1LAL 0x0a8
++#define PCIX0_PIM1LAH 0x0ac
++#define PCIX0_PIM2SAL 0x0b0
++#define PCIX0_PIM2SA PCIX0_PIM2SAL
++#define PCIX0_PIM2LAL 0x0b4
++#define PCIX0_PIM2LAH 0x0b8
++#define PCIX0_OMCAPID 0x0c0
++#define PCIX0_OMNIPTR 0x0c1
++#define PCIX0_OMMC 0x0c2
++#define PCIX0_OMMA 0x0c4
++#define PCIX0_OMMUA 0x0c8
++#define PCIX0_OMMDATA 0x0cc
++#define PCIX0_OMMEOI 0x0ce
++#define PCIX0_PMCAPID 0x0d0
++#define PCIX0_PMNIPTR 0x0d1
++#define PCIX0_PMC 0x0d2
++#define PCIX0_PMCSR 0x0d4
++#define PCIX0_PMCSRBSE 0x0d6
++#define PCIX0_PMDATA 0x0d7
++#define PCIX0_PMSCRR 0x0d8
++#define PCIX0_CAPID 0x0dc
++#define PCIX0_NIPTR 0x0dd
++#define PCIX0_CMD 0x0de
++#define PCIX0_STS 0x0e0
++#define PCIX0_IDR 0x0e4
++#define PCIX0_CID 0x0e8
++#define PCIX0_RID 0x0ec
++#define PCIX0_PIM0SAH 0x0f8
++#define PCIX0_PIM2SAH 0x0fc
++#define PCIX0_MSGIL 0x100
++#define PCIX0_MSGIH 0x104
++#define PCIX0_MSGOL 0x108
++#define PCIX0_MSGOH 0x10c
++#define PCIX0_IM 0x1f8
++
++/*
++ * 4xx PCI bridge register definitions
++ */
++#define PCIL0_PMM0LA 0x00
++#define PCIL0_PMM0MA 0x04
++#define PCIL0_PMM0PCILA 0x08
++#define PCIL0_PMM0PCIHA 0x0c
++#define PCIL0_PMM1LA 0x10
++#define PCIL0_PMM1MA 0x14
++#define PCIL0_PMM1PCILA 0x18
++#define PCIL0_PMM1PCIHA 0x1c
++#define PCIL0_PMM2LA 0x20
++#define PCIL0_PMM2MA 0x24
++#define PCIL0_PMM2PCILA 0x28
++#define PCIL0_PMM2PCIHA 0x2c
++#define PCIL0_PTM1MS 0x30
++#define PCIL0_PTM1LA 0x34
++#define PCIL0_PTM2MS 0x38
++#define PCIL0_PTM2LA 0x3c
++
++/*
++ * 4xx PCIe bridge register definitions
++ */
++
++/* DCR offsets */
++#define DCRO_PEGPL_CFGBAH 0x00
++#define DCRO_PEGPL_CFGBAL 0x01
++#define DCRO_PEGPL_CFGMSK 0x02
++#define DCRO_PEGPL_MSGBAH 0x03
++#define DCRO_PEGPL_MSGBAL 0x04
++#define DCRO_PEGPL_MSGMSK 0x05
++#define DCRO_PEGPL_OMR1BAH 0x06
++#define DCRO_PEGPL_OMR1BAL 0x07
++#define DCRO_PEGPL_OMR1MSKH 0x08
++#define DCRO_PEGPL_OMR1MSKL 0x09
++#define DCRO_PEGPL_OMR2BAH 0x0a
++#define DCRO_PEGPL_OMR2BAL 0x0b
++#define DCRO_PEGPL_OMR2MSKH 0x0c
++#define DCRO_PEGPL_OMR2MSKL 0x0d
++#define DCRO_PEGPL_OMR3BAH 0x0e
++#define DCRO_PEGPL_OMR3BAL 0x0f
++#define DCRO_PEGPL_OMR3MSKH 0x10
++#define DCRO_PEGPL_OMR3MSKL 0x11
++#define DCRO_PEGPL_REGBAH 0x12
++#define DCRO_PEGPL_REGBAL 0x13
++#define DCRO_PEGPL_REGMSK 0x14
++#define DCRO_PEGPL_SPECIAL 0x15
++#define DCRO_PEGPL_CFG 0x16
++#define DCRO_PEGPL_ESR 0x17
++#define DCRO_PEGPL_EARH 0x18
++#define DCRO_PEGPL_EARL 0x19
++#define DCRO_PEGPL_EATR 0x1a
++
++/* DMER mask */
++#define GPL_DMER_MASK_DISA 0x02000000
++
++/*
++ * System DCRs (SDRs)
++ */
++#define PESDR0_PLLLCT1 0x03a0
++#define PESDR0_PLLLCT2 0x03a1
++#define PESDR0_PLLLCT3 0x03a2
++
++/*
++ * 440SPe additional DCRs
++ */
++#define PESDR0_440SPE_UTLSET1 0x0300
++#define PESDR0_440SPE_UTLSET2 0x0301
++#define PESDR0_440SPE_DLPSET 0x0302
++#define PESDR0_440SPE_LOOP 0x0303
++#define PESDR0_440SPE_RCSSET 0x0304
++#define PESDR0_440SPE_RCSSTS 0x0305
++#define PESDR0_440SPE_HSSL0SET1 0x0306
++#define PESDR0_440SPE_HSSL0SET2 0x0307
++#define PESDR0_440SPE_HSSL0STS 0x0308
++#define PESDR0_440SPE_HSSL1SET1 0x0309
++#define PESDR0_440SPE_HSSL1SET2 0x030a
++#define PESDR0_440SPE_HSSL1STS 0x030b
++#define PESDR0_440SPE_HSSL2SET1 0x030c
++#define PESDR0_440SPE_HSSL2SET2 0x030d
++#define PESDR0_440SPE_HSSL2STS 0x030e
++#define PESDR0_440SPE_HSSL3SET1 0x030f
++#define PESDR0_440SPE_HSSL3SET2 0x0310
++#define PESDR0_440SPE_HSSL3STS 0x0311
++#define PESDR0_440SPE_HSSL4SET1 0x0312
++#define PESDR0_440SPE_HSSL4SET2 0x0313
++#define PESDR0_440SPE_HSSL4STS 0x0314
++#define PESDR0_440SPE_HSSL5SET1 0x0315
++#define PESDR0_440SPE_HSSL5SET2 0x0316
++#define PESDR0_440SPE_HSSL5STS 0x0317
++#define PESDR0_440SPE_HSSL6SET1 0x0318
++#define PESDR0_440SPE_HSSL6SET2 0x0319
++#define PESDR0_440SPE_HSSL6STS 0x031a
++#define PESDR0_440SPE_HSSL7SET1 0x031b
++#define PESDR0_440SPE_HSSL7SET2 0x031c
++#define PESDR0_440SPE_HSSL7STS 0x031d
++#define PESDR0_440SPE_HSSCTLSET 0x031e
++#define PESDR0_440SPE_LANE_ABCD 0x031f
++#define PESDR0_440SPE_LANE_EFGH 0x0320
++
++#define PESDR1_440SPE_UTLSET1 0x0340
++#define PESDR1_440SPE_UTLSET2 0x0341
++#define PESDR1_440SPE_DLPSET 0x0342
++#define PESDR1_440SPE_LOOP 0x0343
++#define PESDR1_440SPE_RCSSET 0x0344
++#define PESDR1_440SPE_RCSSTS 0x0345
++#define PESDR1_440SPE_HSSL0SET1 0x0346
++#define PESDR1_440SPE_HSSL0SET2 0x0347
++#define PESDR1_440SPE_HSSL0STS 0x0348
++#define PESDR1_440SPE_HSSL1SET1 0x0349
++#define PESDR1_440SPE_HSSL1SET2 0x034a
++#define PESDR1_440SPE_HSSL1STS 0x034b
++#define PESDR1_440SPE_HSSL2SET1 0x034c
++#define PESDR1_440SPE_HSSL2SET2 0x034d
++#define PESDR1_440SPE_HSSL2STS 0x034e
++#define PESDR1_440SPE_HSSL3SET1 0x034f
++#define PESDR1_440SPE_HSSL3SET2 0x0350
++#define PESDR1_440SPE_HSSL3STS 0x0351
++#define PESDR1_440SPE_HSSCTLSET 0x0352
++#define PESDR1_440SPE_LANE_ABCD 0x0353
++
++#define PESDR2_440SPE_UTLSET1 0x0370
++#define PESDR2_440SPE_UTLSET2 0x0371
++#define PESDR2_440SPE_DLPSET 0x0372
++#define PESDR2_440SPE_LOOP 0x0373
++#define PESDR2_440SPE_RCSSET 0x0374
++#define PESDR2_440SPE_RCSSTS 0x0375
++#define PESDR2_440SPE_HSSL0SET1 0x0376
++#define PESDR2_440SPE_HSSL0SET2 0x0377
++#define PESDR2_440SPE_HSSL0STS 0x0378
++#define PESDR2_440SPE_HSSL1SET1 0x0379
++#define PESDR2_440SPE_HSSL1SET2 0x037a
++#define PESDR2_440SPE_HSSL1STS 0x037b
++#define PESDR2_440SPE_HSSL2SET1 0x037c
++#define PESDR2_440SPE_HSSL2SET2 0x037d
++#define PESDR2_440SPE_HSSL2STS 0x037e
++#define PESDR2_440SPE_HSSL3SET1 0x037f
++#define PESDR2_440SPE_HSSL3SET2 0x0380
++#define PESDR2_440SPE_HSSL3STS 0x0381
++#define PESDR2_440SPE_HSSCTLSET 0x0382
++#define PESDR2_440SPE_LANE_ABCD 0x0383
++
++/*
++ * 405EX additional DCRs
++ */
++#define PESDR0_405EX_UTLSET1 0x0400
++#define PESDR0_405EX_UTLSET2 0x0401
++#define PESDR0_405EX_DLPSET 0x0402
++#define PESDR0_405EX_LOOP 0x0403
++#define PESDR0_405EX_RCSSET 0x0404
++#define PESDR0_405EX_RCSSTS 0x0405
++#define PESDR0_405EX_PHYSET1 0x0406
++#define PESDR0_405EX_PHYSET2 0x0407
++#define PESDR0_405EX_BIST 0x0408
++#define PESDR0_405EX_LPB 0x040B
++#define PESDR0_405EX_PHYSTA 0x040C
++
++#define PESDR1_405EX_UTLSET1 0x0440
++#define PESDR1_405EX_UTLSET2 0x0441
++#define PESDR1_405EX_DLPSET 0x0442
++#define PESDR1_405EX_LOOP 0x0443
++#define PESDR1_405EX_RCSSET 0x0444
++#define PESDR1_405EX_RCSSTS 0x0445
++#define PESDR1_405EX_PHYSET1 0x0446
++#define PESDR1_405EX_PHYSET2 0x0447
++#define PESDR1_405EX_BIST 0x0448
++#define PESDR1_405EX_LPB 0x044B
++#define PESDR1_405EX_PHYSTA 0x044C
++
++/*
++ * Of the above, some are common offsets from the base
++ */
++#define PESDRn_UTLSET1 0x00
++#define PESDRn_UTLSET2 0x01
++#define PESDRn_DLPSET 0x02
++#define PESDRn_LOOP 0x03
++#define PESDRn_RCSSET 0x04
++#define PESDRn_RCSSTS 0x05
++
++/* 440spe only */
++#define PESDRn_440SPE_HSSL0SET1 0x06
++#define PESDRn_440SPE_HSSL0SET2 0x07
++#define PESDRn_440SPE_HSSL0STS 0x08
++#define PESDRn_440SPE_HSSL1SET1 0x09
++#define PESDRn_440SPE_HSSL1SET2 0x0a
++#define PESDRn_440SPE_HSSL1STS 0x0b
++#define PESDRn_440SPE_HSSL2SET1 0x0c
++#define PESDRn_440SPE_HSSL2SET2 0x0d
++#define PESDRn_440SPE_HSSL2STS 0x0e
++#define PESDRn_440SPE_HSSL3SET1 0x0f
++#define PESDRn_440SPE_HSSL3SET2 0x10
++#define PESDRn_440SPE_HSSL3STS 0x11
++
++/* 440spe port 0 only */
++#define PESDRn_440SPE_HSSL4SET1 0x12
++#define PESDRn_440SPE_HSSL4SET2 0x13
++#define PESDRn_440SPE_HSSL4STS 0x14
++#define PESDRn_440SPE_HSSL5SET1 0x15
++#define PESDRn_440SPE_HSSL5SET2 0x16
++#define PESDRn_440SPE_HSSL5STS 0x17
++#define PESDRn_440SPE_HSSL6SET1 0x18
++#define PESDRn_440SPE_HSSL6SET2 0x19
++#define PESDRn_440SPE_HSSL6STS 0x1a
++#define PESDRn_440SPE_HSSL7SET1 0x1b
++#define PESDRn_440SPE_HSSL7SET2 0x1c
++#define PESDRn_440SPE_HSSL7STS 0x1d
++
++/* 405ex only */
++#define PESDRn_405EX_PHYSET1 0x06
++#define PESDRn_405EX_PHYSET2 0x07
++#define PESDRn_405EX_PHYSTA 0x0c
++
++/*
++ * UTL register offsets
++ */
++#define PEUTL_PBCTL 0x00
++#define PEUTL_PBBSZ 0x20
++#define PEUTL_OPDBSZ 0x68
++#define PEUTL_IPHBSZ 0x70
++#define PEUTL_IPDBSZ 0x78
++#define PEUTL_OUTTR 0x90
++#define PEUTL_INTR 0x98
++#define PEUTL_PCTL 0xa0
++#define PEUTL_RCSTA 0xB0
++#define PEUTL_RCIRQEN 0xb8
++
++/*
++ * Config space register offsets
++ */
++#define PECFG_ECRTCTL 0x074
++
++#define PECFG_BAR0LMPA 0x210
++#define PECFG_BAR0HMPA 0x214
++#define PECFG_BAR1MPA 0x218
++#define PECFG_BAR2LMPA 0x220
++#define PECFG_BAR2HMPA 0x224
++
++#define PECFG_PIMEN 0x33c
++#define PECFG_PIM0LAL 0x340
++#define PECFG_PIM0LAH 0x344
++#define PECFG_PIM1LAL 0x348
++#define PECFG_PIM1LAH 0x34c
++#define PECFG_PIM01SAL 0x350
++#define PECFG_PIM01SAH 0x354
++
++#define PECFG_POM0LAL 0x380
++#define PECFG_POM0LAH 0x384
++#define PECFG_POM1LAL 0x388
++#define PECFG_POM1LAH 0x38c
++#define PECFG_POM2LAL 0x390
++#define PECFG_POM2LAH 0x394
++
++
++enum
++{
++ PTYPE_ENDPOINT = 0x0,
++ PTYPE_LEGACY_ENDPOINT = 0x1,
++ PTYPE_ROOT_PORT = 0x4,
++
++ LNKW_X1 = 0x1,
++ LNKW_X4 = 0x4,
++ LNKW_X8 = 0x8
++};
++
++
++#endif /* __PPC4XX_PCI_H__ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/qe_lib/Kconfig powerpc.git/arch/powerpc/sysdev/qe_lib/Kconfig
+--- linux-2.6.24/arch/powerpc/sysdev/qe_lib/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/qe_lib/Kconfig 2008-01-28 20:25:49.000000000 +0100
+@@ -4,7 +4,7 @@
+
+ config UCC_SLOW
+ bool
+- default n
++ default y if SERIAL_QE
+ help
+ This option provides qe_lib support to UCC slow
+ protocols: UART, BISYNC, QMC
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/qe_lib/qe.c powerpc.git/arch/powerpc/sysdev/qe_lib/qe.c
+--- linux-2.6.24/arch/powerpc/sysdev/qe_lib/qe.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/qe_lib/qe.c 2008-01-28 20:25:49.000000000 +0100
+@@ -25,6 +25,7 @@
+ #include <linux/module.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
++#include <linux/crc32.h>
+ #include <asm/irq.h>
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+@@ -167,19 +168,20 @@
+
+ /* Program the BRG to the given sampling rate and multiplier
+ *
+- * @brg: the BRG, 1-16
++ * @brg: the BRG, QE_BRG1 - QE_BRG16
+ * @rate: the desired sampling rate
+ * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
+ * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
+ * then 'multiplier' should be 8.
+- *
+- * Also note that the value programmed into the BRGC register must be even.
+ */
+-void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier)
++int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
+ {
+ u32 divisor, tempval;
+ u32 div16 = 0;
+
++ if ((brg < QE_BRG1) || (brg > QE_BRG16))
++ return -EINVAL;
++
+ divisor = get_brg_clk() / (rate * multiplier);
+
+ if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
+@@ -196,8 +198,43 @@
+ tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
+ QE_BRGC_ENABLE | div16;
+
+- out_be32(&qe_immr->brg.brgc[brg - 1], tempval);
++ out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
++
++ return 0;
++}
++EXPORT_SYMBOL(qe_setbrg);
++
++/* Convert a string to a QE clock source enum
++ *
++ * This function takes a string, typically from a property in the device
++ * tree, and returns the corresponding "enum qe_clock" value.
++*/
++enum qe_clock qe_clock_source(const char *source)
++{
++ unsigned int i;
++
++ if (strcasecmp(source, "none") == 0)
++ return QE_CLK_NONE;
++
++ if (strncasecmp(source, "brg", 3) == 0) {
++ i = simple_strtoul(source + 3, NULL, 10);
++ if ((i >= 1) && (i <= 16))
++ return (QE_BRG1 - 1) + i;
++ else
++ return QE_CLK_DUMMY;
++ }
++
++ if (strncasecmp(source, "clk", 3) == 0) {
++ i = simple_strtoul(source + 3, NULL, 10);
++ if ((i >= 1) && (i <= 24))
++ return (QE_CLK1 - 1) + i;
++ else
++ return QE_CLK_DUMMY;
++ }
++
++ return QE_CLK_DUMMY;
+ }
++EXPORT_SYMBOL(qe_clock_source);
+
+ /* Initialize SNUMs (thread serial numbers) according to
+ * QE Module Control chapter, SNUM table
+@@ -358,3 +395,249 @@
+ return (void *)&qe_immr->muram[offset];
+ }
+ EXPORT_SYMBOL(qe_muram_addr);
++
++/* The maximum number of RISCs we support */
++#define MAX_QE_RISC 2
++
++/* Firmware information stored here for qe_get_firmware_info() */
++static struct qe_firmware_info qe_firmware_info;
++
++/*
++ * Set to 1 if QE firmware has been uploaded, and therefore
++ * qe_firmware_info contains valid data.
++ */
++static int qe_firmware_uploaded;
++
++/*
++ * Upload a QE microcode
++ *
++ * This function is a worker function for qe_upload_firmware(). It does
++ * the actual uploading of the microcode.
++ */
++static void qe_upload_microcode(const void *base,
++ const struct qe_microcode *ucode)
++{
++ const __be32 *code = base + be32_to_cpu(ucode->code_offset);
++ unsigned int i;
++
++ if (ucode->major || ucode->minor || ucode->revision)
++ printk(KERN_INFO "qe-firmware: "
++ "uploading microcode '%s' version %u.%u.%u\n",
++ ucode->id, ucode->major, ucode->minor, ucode->revision);
++ else
++ printk(KERN_INFO "qe-firmware: "
++ "uploading microcode '%s'\n", ucode->id);
++
++ /* Use auto-increment */
++ out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
++ QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
++
++ for (i = 0; i < be32_to_cpu(ucode->count); i++)
++ out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
++}
++
++/*
++ * Upload a microcode to the I-RAM at a specific address.
++ *
++ * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
++ * uploading.
++ *
++ * Currently, only version 1 is supported, so the 'version' field must be
++ * set to 1.
++ *
++ * The SOC model and revision are not validated, they are only displayed for
++ * informational purposes.
++ *
++ * 'calc_size' is the calculated size, in bytes, of the firmware structure and
++ * all of the microcode structures, minus the CRC.
++ *
++ * 'length' is the size that the structure says it is, including the CRC.
++ */
++int qe_upload_firmware(const struct qe_firmware *firmware)
++{
++ unsigned int i;
++ unsigned int j;
++ u32 crc;
++ size_t calc_size = sizeof(struct qe_firmware);
++ size_t length;
++ const struct qe_header *hdr;
++
++ if (!firmware) {
++ printk(KERN_ERR "qe-firmware: invalid pointer\n");
++ return -EINVAL;
++ }
++
++ hdr = &firmware->header;
++ length = be32_to_cpu(hdr->length);
++
++ /* Check the magic */
++ if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
++ (hdr->magic[2] != 'F')) {
++ printk(KERN_ERR "qe-firmware: not a microcode\n");
++ return -EPERM;
++ }
++
++ /* Check the version */
++ if (hdr->version != 1) {
++ printk(KERN_ERR "qe-firmware: unsupported version\n");
++ return -EPERM;
++ }
++
++ /* Validate some of the fields */
++ if ((firmware->count < 1) || (firmware->count >= MAX_QE_RISC)) {
++ printk(KERN_ERR "qe-firmware: invalid data\n");
++ return -EINVAL;
++ }
++
++ /* Validate the length and check if there's a CRC */
++ calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
++
++ for (i = 0; i < firmware->count; i++)
++ /*
++ * For situations where the second RISC uses the same microcode
++ * as the first, the 'code_offset' and 'count' fields will be
++ * zero, so it's okay to add those.
++ */
++ calc_size += sizeof(__be32) *
++ be32_to_cpu(firmware->microcode[i].count);
++
++ /* Validate the length */
++ if (length != calc_size + sizeof(__be32)) {
++ printk(KERN_ERR "qe-firmware: invalid length\n");
++ return -EPERM;
++ }
++
++ /* Validate the CRC */
++ crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
++ if (crc != crc32(0, firmware, calc_size)) {
++ printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
++ return -EIO;
++ }
++
++ /*
++ * If the microcode calls for it, split the I-RAM.
++ */
++ if (!firmware->split)
++ setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
++
++ if (firmware->soc.model)
++ printk(KERN_INFO
++ "qe-firmware: firmware '%s' for %u V%u.%u\n",
++ firmware->id, be16_to_cpu(firmware->soc.model),
++ firmware->soc.major, firmware->soc.minor);
++ else
++ printk(KERN_INFO "qe-firmware: firmware '%s'\n",
++ firmware->id);
++
++ /*
++ * The QE only supports one microcode per RISC, so clear out all the
++ * saved microcode information and put in the new.
++ */
++ memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
++ strcpy(qe_firmware_info.id, firmware->id);
++ qe_firmware_info.extended_modes = firmware->extended_modes;
++ memcpy(qe_firmware_info.vtraps, firmware->vtraps,
++ sizeof(firmware->vtraps));
++
++ /* Loop through each microcode. */
++ for (i = 0; i < firmware->count; i++) {
++ const struct qe_microcode *ucode = &firmware->microcode[i];
++
++ /* Upload a microcode if it's present */
++ if (ucode->code_offset)
++ qe_upload_microcode(firmware, ucode);
++
++ /* Program the traps for this processor */
++ for (j = 0; j < 16; j++) {
++ u32 trap = be32_to_cpu(ucode->traps[j]);
++
++ if (trap)
++ out_be32(&qe_immr->rsp[i].tibcr[j], trap);
++ }
++
++ /* Enable traps */
++ out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
++ }
++
++ qe_firmware_uploaded = 1;
++
++ return 0;
++}
++EXPORT_SYMBOL(qe_upload_firmware);
++
++/*
++ * Get info on the currently-loaded firmware
++ *
++ * This function also checks the device tree to see if the boot loader has
++ * uploaded a firmware already.
++ */
++struct qe_firmware_info *qe_get_firmware_info(void)
++{
++ static int initialized;
++ struct property *prop;
++ struct device_node *qe;
++ struct device_node *fw = NULL;
++ const char *sprop;
++ unsigned int i;
++
++ /*
++ * If we haven't checked yet, and a driver hasn't uploaded a firmware
++ * yet, then check the device tree for information.
++ */
++ if (initialized || qe_firmware_uploaded)
++ return NULL;
++
++ initialized = 1;
++
++ /*
++ * Newer device trees have an "fsl,qe" compatible property for the QE
++ * node, but we still need to support older device trees.
++ */
++ qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
++ if (!qe) {
++ qe = of_find_node_by_type(NULL, "qe");
++ if (!qe)
++ return NULL;
++ }
++
++ /* Find the 'firmware' child node */
++ for_each_child_of_node(qe, fw) {
++ if (strcmp(fw->name, "firmware") == 0)
++ break;
++ }
++
++ of_node_put(qe);
++
++ /* Did we find the 'firmware' node? */
++ if (!fw)
++ return NULL;
++
++ qe_firmware_uploaded = 1;
++
++ /* Copy the data into qe_firmware_info*/
++ sprop = of_get_property(fw, "id", NULL);
++ if (sprop)
++ strncpy(qe_firmware_info.id, sprop,
++ sizeof(qe_firmware_info.id) - 1);
++
++ prop = of_find_property(fw, "extended-modes", NULL);
++ if (prop && (prop->length == sizeof(u64))) {
++ const u64 *iprop = prop->value;
++
++ qe_firmware_info.extended_modes = *iprop;
++ }
++
++ prop = of_find_property(fw, "virtual-traps", NULL);
++ if (prop && (prop->length == 32)) {
++ const u32 *iprop = prop->value;
++
++ for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
++ qe_firmware_info.vtraps[i] = iprop[i];
++ }
++
++ of_node_put(fw);
++
++ return &qe_firmware_info;
++}
++EXPORT_SYMBOL(qe_get_firmware_info);
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/qe_lib/ucc_slow.c powerpc.git/arch/powerpc/sysdev/qe_lib/ucc_slow.c
+--- linux-2.6.24/arch/powerpc/sysdev/qe_lib/ucc_slow.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/qe_lib/ucc_slow.c 2008-01-28 20:25:49.000000000 +0100
+@@ -19,6 +19,7 @@
+ #include <linux/stddef.h>
+ #include <linux/interrupt.h>
+ #include <linux/err.h>
++#include <linux/module.h>
+
+ #include <asm/io.h>
+ #include <asm/immap_qe.h>
+@@ -41,6 +42,7 @@
+ default: return QE_CR_SUBBLOCK_INVALID;
+ }
+ }
++EXPORT_SYMBOL(ucc_slow_get_qe_cr_subblock);
+
+ void ucc_slow_poll_transmitter_now(struct ucc_slow_private * uccs)
+ {
+@@ -56,6 +58,7 @@
+ qe_issue_cmd(QE_GRACEFUL_STOP_TX, id,
+ QE_CR_PROTOCOL_UNSPECIFIED, 0);
+ }
++EXPORT_SYMBOL(ucc_slow_graceful_stop_tx);
+
+ void ucc_slow_stop_tx(struct ucc_slow_private * uccs)
+ {
+@@ -65,6 +68,7 @@
+ id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
+ qe_issue_cmd(QE_STOP_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
+ }
++EXPORT_SYMBOL(ucc_slow_stop_tx);
+
+ void ucc_slow_restart_tx(struct ucc_slow_private * uccs)
+ {
+@@ -74,6 +78,7 @@
+ id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
+ qe_issue_cmd(QE_RESTART_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
+ }
++EXPORT_SYMBOL(ucc_slow_restart_tx);
+
+ void ucc_slow_enable(struct ucc_slow_private * uccs, enum comm_dir mode)
+ {
+@@ -94,6 +99,7 @@
+ }
+ out_be32(&us_regs->gumr_l, gumr_l);
+ }
++EXPORT_SYMBOL(ucc_slow_enable);
+
+ void ucc_slow_disable(struct ucc_slow_private * uccs, enum comm_dir mode)
+ {
+@@ -114,6 +120,7 @@
+ }
+ out_be32(&us_regs->gumr_l, gumr_l);
+ }
++EXPORT_SYMBOL(ucc_slow_disable);
+
+ /* Initialize the UCC for Slow operations
+ *
+@@ -347,6 +354,7 @@
+ *uccs_ret = uccs;
+ return 0;
+ }
++EXPORT_SYMBOL(ucc_slow_init);
+
+ void ucc_slow_free(struct ucc_slow_private * uccs)
+ {
+@@ -366,5 +374,5 @@
+
+ kfree(uccs);
+ }
+-
++EXPORT_SYMBOL(ucc_slow_free);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/tsi108_dev.c powerpc.git/arch/powerpc/sysdev/tsi108_dev.c
+--- linux-2.6.24/arch/powerpc/sysdev/tsi108_dev.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/tsi108_dev.c 2008-01-28 20:25:49.000000000 +0100
+@@ -66,14 +66,12 @@
+ static int __init tsi108_eth_of_init(void)
+ {
+ struct device_node *np;
+- unsigned int i;
++ unsigned int i = 0;
+ struct platform_device *tsi_eth_dev;
+ struct resource res;
+ int ret;
+
+- for (np = NULL, i = 0;
+- (np = of_find_compatible_node(np, "network", "tsi108-ethernet")) != NULL;
+- i++) {
++ for_each_compatible_node(np, "network", "tsi108-ethernet") {
+ struct resource r[2];
+ struct device_node *phy, *mdio;
+ hw_info tsi_eth_data;
+@@ -98,7 +96,7 @@
+ __FUNCTION__,r[1].name, r[1].start, r[1].end);
+
+ tsi_eth_dev =
+- platform_device_register_simple("tsi-ethernet", i, &r[0],
++ platform_device_register_simple("tsi-ethernet", i++, &r[0],
+ 1);
+
+ if (IS_ERR(tsi_eth_dev)) {
+@@ -154,6 +152,7 @@
+ unreg:
+ platform_device_unregister(tsi_eth_dev);
+ err:
++ of_node_put(np);
+ return ret;
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/uic.c powerpc.git/arch/powerpc/sysdev/uic.c
+--- linux-2.6.24/arch/powerpc/sysdev/uic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/uic.c 2008-01-28 20:25:49.000000000 +0100
+@@ -53,21 +53,23 @@
+
+ /* The remapper for this UIC */
+ struct irq_host *irqhost;
+-
+- /* For secondary UICs, the cascade interrupt's irqaction */
+- struct irqaction cascade;
+ };
+
+ static void uic_unmask_irq(unsigned int virq)
+ {
++ struct irq_desc *desc = get_irq_desc(virq);
+ struct uic *uic = get_irq_chip_data(virq);
+ unsigned int src = uic_irq_to_hw(virq);
+ unsigned long flags;
+- u32 er;
++ u32 er, sr;
+
++ sr = 1 << (31-src);
+ spin_lock_irqsave(&uic->lock, flags);
++ /* ack level-triggered interrupts here */
++ if (desc->status & IRQ_LEVEL)
++ mtdcr(uic->dcrbase + UIC_SR, sr);
+ er = mfdcr(uic->dcrbase + UIC_ER);
+- er |= 1 << (31 - src);
++ er |= sr;
+ mtdcr(uic->dcrbase + UIC_ER, er);
+ spin_unlock_irqrestore(&uic->lock, flags);
+ }
+@@ -99,6 +101,7 @@
+
+ static void uic_mask_ack_irq(unsigned int virq)
+ {
++ struct irq_desc *desc = get_irq_desc(virq);
+ struct uic *uic = get_irq_chip_data(virq);
+ unsigned int src = uic_irq_to_hw(virq);
+ unsigned long flags;
+@@ -109,7 +112,16 @@
+ er = mfdcr(uic->dcrbase + UIC_ER);
+ er &= ~sr;
+ mtdcr(uic->dcrbase + UIC_ER, er);
+- mtdcr(uic->dcrbase + UIC_SR, sr);
++ /* On the UIC, acking (i.e. clearing the SR bit)
++ * a level irq will have no effect if the interrupt
++ * is still asserted by the device, even if
++ * the interrupt is already masked. Therefore
++ * we only ack the egde interrupts here, while
++ * level interrupts are ack'ed after the actual
++ * isr call in the uic_unmask_irq()
++ */
++ if (!(desc->status & IRQ_LEVEL))
++ mtdcr(uic->dcrbase + UIC_SR, sr);
+ spin_unlock_irqrestore(&uic->lock, flags);
+ }
+
+@@ -173,64 +185,6 @@
+ .set_type = uic_set_irq_type,
+ };
+
+-/**
+- * handle_uic_irq - irq flow handler for UIC
+- * @irq: the interrupt number
+- * @desc: the interrupt description structure for this irq
+- *
+- * This is modified version of the generic handle_level_irq() suitable
+- * for the UIC. On the UIC, acking (i.e. clearing the SR bit) a level
+- * irq will have no effect if the interrupt is still asserted by the
+- * device, even if the interrupt is already masked. Therefore, unlike
+- * the standard handle_level_irq(), we must ack the interrupt *after*
+- * invoking the ISR (which should have de-asserted the interrupt in
+- * the external source). For edge interrupts we ack at the beginning
+- * instead of the end, to keep the window in which we can miss an
+- * interrupt as small as possible.
+- */
+-void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc)
+-{
+- unsigned int cpu = smp_processor_id();
+- struct irqaction *action;
+- irqreturn_t action_ret;
+-
+- spin_lock(&desc->lock);
+- if (desc->status & IRQ_LEVEL)
+- desc->chip->mask(irq);
+- else
+- desc->chip->mask_ack(irq);
+-
+- if (unlikely(desc->status & IRQ_INPROGRESS))
+- goto out_unlock;
+- desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
+- kstat_cpu(cpu).irqs[irq]++;
+-
+- /*
+- * If its disabled or no action available
+- * keep it masked and get out of here
+- */
+- action = desc->action;
+- if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
+- desc->status |= IRQ_PENDING;
+- goto out_unlock;
+- }
+-
+- desc->status |= IRQ_INPROGRESS;
+- desc->status &= ~IRQ_PENDING;
+- spin_unlock(&desc->lock);
+-
+- action_ret = handle_IRQ_event(irq, action);
+-
+- spin_lock(&desc->lock);
+- desc->status &= ~IRQ_INPROGRESS;
+- if (desc->status & IRQ_LEVEL)
+- desc->chip->ack(irq);
+- if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
+- desc->chip->unmask(irq);
+-out_unlock:
+- spin_unlock(&desc->lock);
+-}
+-
+ static int uic_host_map(struct irq_host *h, unsigned int virq,
+ irq_hw_number_t hw)
+ {
+@@ -239,7 +193,7 @@
+ set_irq_chip_data(virq, uic);
+ /* Despite the name, handle_level_irq() works for both level
+ * and edge irqs on UIC. FIXME: check this is correct */
+- set_irq_chip_and_handler(virq, &uic_irq_chip, handle_uic_irq);
++ set_irq_chip_and_handler(virq, &uic_irq_chip, handle_level_irq);
+
+ /* Set default irq type */
+ set_irq_type(virq, IRQ_TYPE_NONE);
+@@ -264,23 +218,36 @@
+ .xlate = uic_host_xlate,
+ };
+
+-irqreturn_t uic_cascade(int virq, void *data)
++void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)
+ {
+- struct uic *uic = data;
++ struct uic *uic = get_irq_data(virq);
+ u32 msr;
+ int src;
+ int subvirq;
+
++ spin_lock(&desc->lock);
++ if (desc->status & IRQ_LEVEL)
++ desc->chip->mask(virq);
++ else
++ desc->chip->mask_ack(virq);
++ spin_unlock(&desc->lock);
++
+ msr = mfdcr(uic->dcrbase + UIC_MSR);
+ if (!msr) /* spurious interrupt */
+- return IRQ_HANDLED;
++ goto uic_irq_ret;
+
+ src = 32 - ffs(msr);
+
+ subvirq = irq_linear_revmap(uic->irqhost, src);
+ generic_handle_irq(subvirq);
+
+- return IRQ_HANDLED;
++uic_irq_ret:
++ spin_lock(&desc->lock);
++ if (desc->status & IRQ_LEVEL)
++ desc->chip->ack(virq);
++ if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
++ desc->chip->unmask(virq);
++ spin_unlock(&desc->lock);
+ }
+
+ static struct uic * __init uic_init_one(struct device_node *node)
+@@ -342,33 +309,27 @@
+ const u32 *interrupts;
+
+ /* First locate and initialize the top-level UIC */
+-
+- np = of_find_compatible_node(NULL, NULL, "ibm,uic");
+- while (np) {
++ for_each_compatible_node(np, NULL, "ibm,uic") {
+ interrupts = of_get_property(np, "interrupts", NULL);
+- if (! interrupts)
++ if (!interrupts)
+ break;
+-
+- np = of_find_compatible_node(np, NULL, "ibm,uic");
+ }
+
+ BUG_ON(!np); /* uic_init_tree() assumes there's a UIC as the
+ * top-level interrupt controller */
+ primary_uic = uic_init_one(np);
+- if (! primary_uic)
++ if (!primary_uic)
+ panic("Unable to initialize primary UIC %s\n", np->full_name);
+
+ irq_set_default_host(primary_uic->irqhost);
+ of_node_put(np);
+
+ /* The scan again for cascaded UICs */
+- np = of_find_compatible_node(NULL, NULL, "ibm,uic");
+- while (np) {
++ for_each_compatible_node(np, NULL, "ibm,uic") {
+ interrupts = of_get_property(np, "interrupts", NULL);
+ if (interrupts) {
+ /* Secondary UIC */
+ int cascade_virq;
+- int ret;
+
+ uic = uic_init_one(np);
+ if (! uic)
+@@ -377,20 +338,11 @@
+
+ cascade_virq = irq_of_parse_and_map(np, 0);
+
+- uic->cascade.handler = uic_cascade;
+- uic->cascade.name = "UIC cascade";
+- uic->cascade.dev_id = uic;
+-
+- ret = setup_irq(cascade_virq, &uic->cascade);
+- if (ret)
+- printk(KERN_ERR "Failed to setup_irq(%d) for "
+- "UIC%d cascade\n", cascade_virq,
+- uic->index);
++ set_irq_data(cascade_virq, uic);
++ set_irq_chained_handler(cascade_virq, uic_irq_cascade);
+
+ /* FIXME: setup critical cascade?? */
+ }
+-
+- np = of_find_compatible_node(np, NULL, "ibm,uic");
+ }
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/sysdev/xilinx_intc.c powerpc.git/arch/powerpc/sysdev/xilinx_intc.c
+--- linux-2.6.24/arch/powerpc/sysdev/xilinx_intc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/sysdev/xilinx_intc.c 2008-01-28 20:25:49.000000000 +0100
+@@ -135,10 +135,16 @@
+ struct device_node *np;
+
+ /* find top level interrupt controller */
+- for_each_compatible_node(np, NULL, "xilinx,intc") {
++ for_each_compatible_node(np, NULL, "xlnx,opb-intc-1.00.c") {
+ if (!of_get_property(np, "interrupts", NULL))
+ break;
+ }
++ if (!np) {
++ for_each_compatible_node(np, NULL, "xlnx,xps-intc-1.00.a") {
++ if (!of_get_property(np, "interrupts", NULL))
++ break;
++ }
++ }
+
+ /* xilinx interrupt controller needs to be top level */
+ BUG_ON(!np);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/xmon/setjmp.S powerpc.git/arch/powerpc/xmon/setjmp.S
+--- linux-2.6.24/arch/powerpc/xmon/setjmp.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/xmon/setjmp.S 2008-01-28 20:25:49.000000000 +0100
+@@ -12,67 +12,6 @@
+ #include <asm/ppc_asm.h>
+ #include <asm/asm-offsets.h>
+
+-_GLOBAL(xmon_setjmp)
+- mflr r0
+- PPC_STL r0,0(r3)
+- PPC_STL r1,SZL(r3)
+- PPC_STL r2,2*SZL(r3)
+- mfcr r0
+- PPC_STL r0,3*SZL(r3)
+- PPC_STL r13,4*SZL(r3)
+- PPC_STL r14,5*SZL(r3)
+- PPC_STL r15,6*SZL(r3)
+- PPC_STL r16,7*SZL(r3)
+- PPC_STL r17,8*SZL(r3)
+- PPC_STL r18,9*SZL(r3)
+- PPC_STL r19,10*SZL(r3)
+- PPC_STL r20,11*SZL(r3)
+- PPC_STL r21,12*SZL(r3)
+- PPC_STL r22,13*SZL(r3)
+- PPC_STL r23,14*SZL(r3)
+- PPC_STL r24,15*SZL(r3)
+- PPC_STL r25,16*SZL(r3)
+- PPC_STL r26,17*SZL(r3)
+- PPC_STL r27,18*SZL(r3)
+- PPC_STL r28,19*SZL(r3)
+- PPC_STL r29,20*SZL(r3)
+- PPC_STL r30,21*SZL(r3)
+- PPC_STL r31,22*SZL(r3)
+- li r3,0
+- blr
+-
+-_GLOBAL(xmon_longjmp)
+- PPC_LCMPI r4,0
+- bne 1f
+- li r4,1
+-1: PPC_LL r13,4*SZL(r3)
+- PPC_LL r14,5*SZL(r3)
+- PPC_LL r15,6*SZL(r3)
+- PPC_LL r16,7*SZL(r3)
+- PPC_LL r17,8*SZL(r3)
+- PPC_LL r18,9*SZL(r3)
+- PPC_LL r19,10*SZL(r3)
+- PPC_LL r20,11*SZL(r3)
+- PPC_LL r21,12*SZL(r3)
+- PPC_LL r22,13*SZL(r3)
+- PPC_LL r23,14*SZL(r3)
+- PPC_LL r24,15*SZL(r3)
+- PPC_LL r25,16*SZL(r3)
+- PPC_LL r26,17*SZL(r3)
+- PPC_LL r27,18*SZL(r3)
+- PPC_LL r28,19*SZL(r3)
+- PPC_LL r29,20*SZL(r3)
+- PPC_LL r30,21*SZL(r3)
+- PPC_LL r31,22*SZL(r3)
+- PPC_LL r0,3*SZL(r3)
+- mtcrf 0x38,r0
+- PPC_LL r0,0(r3)
+- PPC_LL r1,SZL(r3)
+- PPC_LL r2,2*SZL(r3)
+- mtlr r0
+- mr r3,r4
+- blr
+-
+ /*
+ * Grab the register values as they are now.
+ * This won't do a particularily good job because we really
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/powerpc/xmon/xmon.c powerpc.git/arch/powerpc/xmon/xmon.c
+--- linux-2.6.24/arch/powerpc/xmon/xmon.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/powerpc/xmon/xmon.c 2008-01-28 20:25:49.000000000 +0100
+@@ -40,6 +40,7 @@
+ #include <asm/spu.h>
+ #include <asm/spu_priv1.h>
+ #include <asm/firmware.h>
++#include <asm/setjmp.h>
+
+ #ifdef CONFIG_PPC64
+ #include <asm/hvcall.h>
+@@ -71,12 +72,9 @@
+ static int termch;
+ static char tmpstr[128];
+
+-#define JMP_BUF_LEN 23
+ static long bus_error_jmp[JMP_BUF_LEN];
+ static int catch_memory_errors;
+ static long *xmon_fault_jmp[NR_CPUS];
+-#define setjmp xmon_setjmp
+-#define longjmp xmon_longjmp
+
+ /* Breakpoint stuff */
+ struct bpt {
+@@ -153,13 +151,15 @@
+
+ static int do_spu_cmd(void);
+
++#ifdef CONFIG_44x
++static void dump_tlb_44x(void);
++#endif
++
+ int xmon_no_auto_backtrace;
+
+ extern void xmon_enter(void);
+ extern void xmon_leave(void);
+
+-extern long setjmp(long *);
+-extern void longjmp(long *, long);
+ extern void xmon_save_regs(struct pt_regs *);
+
+ #ifdef CONFIG_PPC64
+@@ -231,6 +231,9 @@
+ #ifdef CONFIG_PPC_STD_MMU_32
+ " u dump segment registers\n"
+ #endif
++#ifdef CONFIG_44x
++" u dump TLB\n"
++#endif
+ " ? help\n"
+ " zr reboot\n\
+ zh halt\n"
+@@ -856,6 +859,11 @@
+ dump_segments();
+ break;
+ #endif
++#ifdef CONFIG_4xx
++ case 'u':
++ dump_tlb_44x();
++ break;
++#endif
+ default:
+ printf("Unrecognized command: ");
+ do {
+@@ -2527,16 +2535,33 @@
+ static void dump_slb(void)
+ {
+ int i;
+- unsigned long tmp;
++ unsigned long esid,vsid,valid;
++ unsigned long llp;
+
+ printf("SLB contents of cpu %x\n", smp_processor_id());
+
+- for (i = 0; i < SLB_NUM_ENTRIES; i++) {
+- asm volatile("slbmfee %0,%1" : "=r" (tmp) : "r" (i));
+- printf("%02d %016lx ", i, tmp);
+-
+- asm volatile("slbmfev %0,%1" : "=r" (tmp) : "r" (i));
+- printf("%016lx\n", tmp);
++ for (i = 0; i < mmu_slb_size; i++) {
++ asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
++ asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
++ valid = (esid & SLB_ESID_V);
++ if (valid | esid | vsid) {
++ printf("%02d %016lx %016lx", i, esid, vsid);
++ if (valid) {
++ llp = vsid & SLB_VSID_LLP;
++ if (vsid & SLB_VSID_B_1T) {
++ printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
++ GET_ESID_1T(esid),
++ (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
++ llp);
++ } else {
++ printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
++ GET_ESID(esid),
++ (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
++ llp);
++ }
++ } else
++ printf("\n");
++ }
+ }
+ }
+
+@@ -2581,6 +2606,32 @@
+ }
+ #endif
+
++#ifdef CONFIG_44x
++static void dump_tlb_44x(void)
++{
++ int i;
++
++ for (i = 0; i < PPC44x_TLB_SIZE; i++) {
++ unsigned long w0,w1,w2;
++ asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
++ asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
++ asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
++ printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
++ if (w0 & PPC44x_TLB_VALID) {
++ printf("V %08x -> %01x%08x %c%c%c%c%c",
++ w0 & PPC44x_TLB_EPN_MASK,
++ w1 & PPC44x_TLB_ERPN_MASK,
++ w1 & PPC44x_TLB_RPN_MASK,
++ (w2 & PPC44x_TLB_W) ? 'W' : 'w',
++ (w2 & PPC44x_TLB_I) ? 'I' : 'i',
++ (w2 & PPC44x_TLB_M) ? 'M' : 'm',
++ (w2 & PPC44x_TLB_G) ? 'G' : 'g',
++ (w2 & PPC44x_TLB_E) ? 'E' : 'e');
++ }
++ printf("\n");
++ }
++}
++#endif /* CONFIG_44x */
+ void xmon_init(int enable)
+ {
+ #ifdef CONFIG_PPC_ISERIES
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/Makefile powerpc.git/arch/ppc/kernel/Makefile
+--- linux-2.6.24/arch/ppc/kernel/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/Makefile 2008-01-28 20:25:50.000000000 +0100
+@@ -13,7 +13,6 @@
+ ppc_htab.o
+ obj-$(CONFIG_MODULES) += ppc_ksyms.o
+ obj-$(CONFIG_PCI) += pci.o
+-obj-$(CONFIG_RAPIDIO) += rio.o
+ obj-$(CONFIG_KGDB) += ppc-stub.o
+ obj-$(CONFIG_SMP) += smp.o smp-tbsync.o
+ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/head_44x.S powerpc.git/arch/ppc/kernel/head_44x.S
+--- linux-2.6.24/arch/ppc/kernel/head_44x.S 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/head_44x.S 2008-01-28 20:25:50.000000000 +0100
+@@ -195,7 +195,7 @@
+ li r5,0
+ ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G)
+
+- li r0,0 /* TLB slot 0 */
++ li r0,62 /* TLB slot 62 */
+
+ tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */
+ tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/ppc_htab.c powerpc.git/arch/ppc/kernel/ppc_htab.c
+--- linux-2.6.24/arch/ppc/kernel/ppc_htab.c 2008-01-28 20:50:10.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/ppc_htab.c 2008-01-28 20:25:50.000000000 +0100
+@@ -436,6 +436,7 @@
+ */
+ static ctl_table htab_ctl_table[]={
+ {
++ .ctl_name = KERN_PPC_L2CR,
+ .procname = "l2cr",
+ .mode = 0644,
+ .proc_handler = &proc_dol2crvec,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/rio.c powerpc.git/arch/ppc/kernel/rio.c
+--- linux-2.6.24/arch/ppc/kernel/rio.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/rio.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,52 +0,0 @@
+-/*
+- * RapidIO PPC32 support
+- *
+- * Copyright 2005 MontaVista Software, Inc.
+- * Matt Porter <mporter@kernel.crashing.org>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
+- */
+-
+-#include <linux/init.h>
+-#include <linux/kernel.h>
+-#include <linux/rio.h>
+-
+-#include <asm/rio.h>
+-
+-/**
+- * platform_rio_init - Do platform specific RIO init
+- *
+- * Any platform specific initialization of RapdIO
+- * hardware is done here as well as registration
+- * of any active master ports in the system.
+- */
+-void __attribute__ ((weak))
+- platform_rio_init(void)
+-{
+- printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
+-}
+-
+-/**
+- * ppc_rio_init - Do PPC32 RIO init
+- *
+- * Calls platform-specific RIO init code and then calls
+- * rio_init_mports() to initialize any master ports that
+- * have been registered with the RIO subsystem.
+- */
+-static int __init ppc_rio_init(void)
+-{
+- printk(KERN_INFO "RIO: RapidIO init\n");
+-
+- /* Platform specific initialization */
+- platform_rio_init();
+-
+- /* Enumerate all registered ports */
+- rio_init_mports();
+-
+- return 0;
+-}
+-
+-subsys_initcall(ppc_rio_init);
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/setup.c powerpc.git/arch/ppc/kernel/setup.c
+--- linux-2.6.24/arch/ppc/kernel/setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/setup.c 2008-01-28 20:25:50.000000000 +0100
+@@ -37,7 +37,6 @@
+ #include <asm/nvram.h>
+ #include <asm/xmon.h>
+ #include <asm/ocp.h>
+-#include <asm/prom.h>
+
+ #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \
+ defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/kernel/traps.c powerpc.git/arch/ppc/kernel/traps.c
+--- linux-2.6.24/arch/ppc/kernel/traps.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/kernel/traps.c 2008-01-28 20:25:50.000000000 +0100
+@@ -231,39 +231,25 @@
+ {
+ }
+
+-void machine_check_exception(struct pt_regs *regs)
++#if defined(CONFIG_4xx)
++int machine_check_4xx(struct pt_regs *regs)
+ {
+ unsigned long reason = get_mc_reason(regs);
+
+- if (user_mode(regs)) {
+- regs->msr |= MSR_RI;
+- _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
+- return;
+- }
+-
+-#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
+- /* the qspan pci read routines can cause machine checks -- Cort */
+- bad_page_fault(regs, regs->dar, SIGBUS);
+- return;
+-#endif
+-
+- if (debugger_fault_handler) {
+- debugger_fault_handler(regs);
+- regs->msr |= MSR_RI;
+- return;
+- }
+-
+- if (check_io_access(regs))
+- return;
+-
+-#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
+ if (reason & ESR_IMCP) {
+ printk("Instruction");
+ mtspr(SPRN_ESR, reason & ~ESR_IMCP);
+ } else
+ printk("Data");
+ printk(" machine check in kernel mode.\n");
+-#elif defined(CONFIG_440A)
++
++ return 0;
++}
++
++int machine_check_440A(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ if (reason & ESR_IMCP){
+ printk("Instruction Synchronous Machine Check exception\n");
+@@ -293,7 +279,13 @@
+ /* Clear MCSR */
+ mtspr(SPRN_MCSR, mcsr);
+ }
+-#elif defined (CONFIG_E500)
++ return 0;
++}
++#elif defined(CONFIG_E500)
++int machine_check_e500(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from MCSR=%lx): ", reason);
+
+@@ -305,8 +297,6 @@
+ printk("Data Cache Push Parity Error\n");
+ if (reason & MCSR_DCPERR)
+ printk("Data Cache Parity Error\n");
+- if (reason & MCSR_GL_CI)
+- printk("Guarded Load or Cache-Inhibited stwcx.\n");
+ if (reason & MCSR_BUS_IAERR)
+ printk("Bus - Instruction Address Error\n");
+ if (reason & MCSR_BUS_RAERR)
+@@ -318,12 +308,19 @@
+ if (reason & MCSR_BUS_RBERR)
+ printk("Bus - Read Data Bus Error\n");
+ if (reason & MCSR_BUS_WBERR)
+- printk("Bus - Write Data Bus Error\n");
++ printk("Bus - Read Data Bus Error\n");
+ if (reason & MCSR_BUS_IPERR)
+ printk("Bus - Instruction Parity Error\n");
+ if (reason & MCSR_BUS_RPERR)
+ printk("Bus - Read Parity Error\n");
+-#elif defined (CONFIG_E200)
++
++ return 0;
++}
++#elif defined(CONFIG_E200)
++int machine_check_e200(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from MCSR=%lx): ", reason);
+
+@@ -341,7 +338,14 @@
+ printk("Bus - Read Bus Error on data load\n");
+ if (reason & MCSR_BUS_WRERR)
+ printk("Bus - Write Bus Error on buffered store or cache line push\n");
+-#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
++
++ return 0;
++}
++#else
++int machine_check_generic(struct pt_regs *regs)
++{
++ unsigned long reason = get_mc_reason(regs);
++
+ printk("Machine check in kernel mode.\n");
+ printk("Caused by (from SRR1=%lx): ", reason);
+ switch (reason & 0x601F0000) {
+@@ -371,7 +375,39 @@
+ default:
+ printk("Unknown values in msr\n");
+ }
+-#endif /* CONFIG_4xx */
++ return 0;
++}
++#endif /* everything else */
++
++void machine_check_exception(struct pt_regs *regs)
++{
++ int recover = 0;
++
++ if (cur_cpu_spec->machine_check)
++ recover = cur_cpu_spec->machine_check(regs);
++ if (recover > 0)
++ return;
++
++ if (user_mode(regs)) {
++ regs->msr |= MSR_RI;
++ _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
++ return;
++ }
++
++#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
++ /* the qspan pci read routines can cause machine checks -- Cort */
++ bad_page_fault(regs, regs->dar, SIGBUS);
++ return;
++#endif
++
++ if (debugger_fault_handler) {
++ debugger_fault_handler(regs);
++ regs->msr |= MSR_RI;
++ return;
++ }
++
++ if (check_io_access(regs))
++ return;
+
+ /*
+ * Optional platform-provided routine to print out
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/mm/44x_mmu.c powerpc.git/arch/ppc/mm/44x_mmu.c
+--- linux-2.6.24/arch/ppc/mm/44x_mmu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/mm/44x_mmu.c 2008-01-28 20:25:51.000000000 +0100
+@@ -60,38 +60,28 @@
+ * Just needed it declared someplace.
+ */
+ unsigned int tlb_44x_index = 0;
+-unsigned int tlb_44x_hwater = 62;
++unsigned int tlb_44x_hwater = PPC4XX_TLB_SIZE - 1 - PPC44x_EARLY_TLBS;
+ int icache_44x_need_flush;
+
+ /*
+ * "Pins" a 256MB TLB entry in AS0 for kernel lowmem
+ */
+-static void __init
+-ppc44x_pin_tlb(int slot, unsigned int virt, unsigned int phys)
++static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys)
+ {
+- unsigned long attrib = 0;
+-
+- __asm__ __volatile__("\
+- clrrwi %2,%2,10\n\
+- ori %2,%2,%4\n\
+- clrrwi %1,%1,10\n\
+- li %0,0\n\
+- ori %0,%0,%5\n\
+- tlbwe %2,%3,%6\n\
+- tlbwe %1,%3,%7\n\
+- tlbwe %0,%3,%8"
++ __asm__ __volatile__(
++ "tlbwe %2,%3,%4\n"
++ "tlbwe %1,%3,%5\n"
++ "tlbwe %0,%3,%6\n"
+ :
+- : "r" (attrib), "r" (phys), "r" (virt), "r" (slot),
+- "i" (PPC44x_TLB_VALID | PPC44x_TLB_256M),
+- "i" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
++ : "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
++ "r" (phys),
++ "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M),
++ "r" (tlb_44x_hwater--), /* slot for this TLB entry */
+ "i" (PPC44x_TLB_PAGEID),
+ "i" (PPC44x_TLB_XLAT),
+ "i" (PPC44x_TLB_ATTRIB));
+ }
+
+-/*
+- * MMU_init_hw does the chip-specific initialization of the MMU hardware.
+- */
+ void __init MMU_init_hw(void)
+ {
+ flush_instruction_cache();
+@@ -99,22 +89,13 @@
+
+ unsigned long __init mmu_mapin_ram(void)
+ {
+- unsigned int pinned_tlbs = 1;
+- int i;
+-
+- /* Determine number of entries necessary to cover lowmem */
+- pinned_tlbs = (unsigned int)
+- (_ALIGN(total_lowmem, PPC_PIN_SIZE) >> PPC44x_PIN_SHIFT);
+-
+- /* Write upper watermark to save location */
+- tlb_44x_hwater = PPC44x_LOW_SLOT - pinned_tlbs;
++ unsigned long addr;
+
+- /* If necessary, set additional pinned TLBs */
+- if (pinned_tlbs > 1)
+- for (i = (PPC44x_LOW_SLOT-(pinned_tlbs-1)); i < PPC44x_LOW_SLOT; i++) {
+- unsigned int phys_addr = (PPC44x_LOW_SLOT-i) * PPC_PIN_SIZE;
+- ppc44x_pin_tlb(i, phys_addr+PAGE_OFFSET, phys_addr);
+- }
++ /* Pin in enough TLBs to cover any lowmem not covered by the
++ * initial 256M mapping established in head_44x.S */
++ for (addr = PPC_PIN_SIZE; addr < total_lowmem;
++ addr += PPC_PIN_SIZE)
++ ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
+
+ return total_lowmem;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/platforms/85xx/mpc85xx_ads_common.c powerpc.git/arch/ppc/platforms/85xx/mpc85xx_ads_common.c
+--- linux-2.6.24/arch/ppc/platforms/85xx/mpc85xx_ads_common.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/platforms/85xx/mpc85xx_ads_common.c 2008-01-28 20:25:51.000000000 +0100
+@@ -42,8 +42,6 @@
+
+ #include <mm/mmu_decl.h>
+
+-#include <syslib/ppc85xx_rio.h>
+-
+ #include <platforms/85xx/mpc85xx_ads_common.h>
+
+ #ifndef CONFIG_PCI
+@@ -190,6 +188,7 @@
+ #endif /* CONFIG_PCI */
+
+ #ifdef CONFIG_RAPIDIO
++extern void mpc85xx_rio_setup(int law_start, int law_size);
+ void platform_rio_init(void)
+ {
+ /* 512MB RIO LAW at 0xc0000000 */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/platforms/85xx/stx_gp3.c powerpc.git/arch/ppc/platforms/85xx/stx_gp3.c
+--- linux-2.6.24/arch/ppc/platforms/85xx/stx_gp3.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/platforms/85xx/stx_gp3.c 2008-01-28 20:25:51.000000000 +0100
+@@ -50,12 +50,10 @@
+ #include <asm/irq.h>
+ #include <asm/immap_85xx.h>
+ #include <asm/cpm2.h>
+-#include <asm/mpc85xx.h>
+ #include <asm/ppc_sys.h>
+
+ #include <syslib/cpm2_pic.h>
+ #include <syslib/ppc85xx_common.h>
+-#include <syslib/ppc85xx_rio.h>
+
+
+ unsigned char __res[sizeof(bd_t)];
+@@ -271,6 +269,7 @@
+ #endif /* CONFIG_PCI */
+
+ #ifdef CONFIG_RAPIDIO
++extern void mpc85xx_rio_setup(int law_start, int law_size);
+ void
+ platform_rio_init(void)
+ {
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/platforms/85xx/tqm85xx.c powerpc.git/arch/ppc/platforms/85xx/tqm85xx.c
+--- linux-2.6.24/arch/ppc/platforms/85xx/tqm85xx.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/platforms/85xx/tqm85xx.c 2008-01-28 20:25:51.000000000 +0100
+@@ -54,7 +54,6 @@
+ #include <syslib/ppc85xx_setup.h>
+ #include <syslib/cpm2_pic.h>
+ #include <syslib/ppc85xx_common.h>
+-#include <syslib/ppc85xx_rio.h>
+
+ #ifndef CONFIG_PCI
+ unsigned long isa_io_base = 0;
+@@ -309,6 +308,7 @@
+ #endif /* CONFIG_PCI */
+
+ #ifdef CONFIG_RAPIDIO
++extern void mpc85xx_rio_setup(int law_start, int law_size);
+ void platform_rio_init(void)
+ {
+ /* 512MB RIO LAW at 0xc0000000 */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/platforms/ev64260.c powerpc.git/arch/ppc/platforms/ev64260.c
+--- linux-2.6.24/arch/ppc/platforms/ev64260.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/platforms/ev64260.c 2008-01-28 20:25:51.000000000 +0100
+@@ -336,7 +336,7 @@
+ #endif
+
+ if (early_serial_setup(&port) != 0)
+- printk(KERN_WARNING "Early serial init of port 0"
++ printk(KERN_WARNING "Early serial init of port 0 "
+ "failed\n");
+
+ first_time = 0;
+@@ -388,7 +388,7 @@
+ ev64260_early_serial_map();
+ #endif
+
+- printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc."
++ printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc. "
+ "(source@mvista.com)\n", BOARD_VENDOR, BOARD_MACHINE);
+
+ if (ppc_md.progress)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/platforms/prep_pci.c powerpc.git/arch/ppc/platforms/prep_pci.c
+--- linux-2.6.24/arch/ppc/platforms/prep_pci.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/platforms/prep_pci.c 2008-01-28 20:25:52.000000000 +0100
+@@ -1099,7 +1099,6 @@
+ pci_write_config_byte(dev, 0x43, reg);
+ }
+ }
+- pci_dev_put(dev);
+ }
+
+ if ((dev = pci_get_device(PCI_VENDOR_ID_WINBOND,
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/Makefile powerpc.git/arch/ppc/syslib/Makefile
+--- linux-2.6.24/arch/ppc/syslib/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/Makefile 2008-01-28 20:25:52.000000000 +0100
+@@ -93,7 +93,6 @@
+ ifeq ($(CONFIG_85xx),y)
+ obj-$(CONFIG_PCI) += pci_auto.o
+ endif
+-obj-$(CONFIG_RAPIDIO) += ppc85xx_rio.o
+ obj-$(CONFIG_83xx) += ppc83xx_setup.o ppc_sys.o \
+ mpc83xx_sys.o mpc83xx_devices.o ipic.o
+ ifeq ($(CONFIG_83xx),y)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/gt64260_pic.c powerpc.git/arch/ppc/syslib/gt64260_pic.c
+--- linux-2.6.24/arch/ppc/syslib/gt64260_pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/gt64260_pic.c 2008-01-28 20:25:52.000000000 +0100
+@@ -35,7 +35,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/sched.h>
+ #include <linux/signal.h>
+-#include <linux/stddef.h>
+ #include <linux/delay.h>
+ #include <linux/irq.h>
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/mpc52xx_pic.c powerpc.git/arch/ppc/syslib/mpc52xx_pic.c
+--- linux-2.6.24/arch/ppc/syslib/mpc52xx_pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/mpc52xx_pic.c 2008-01-28 20:25:52.000000000 +0100
+@@ -20,7 +20,6 @@
+ #include <linux/init.h>
+ #include <linux/sched.h>
+ #include <linux/signal.h>
+-#include <linux/stddef.h>
+ #include <linux/delay.h>
+ #include <linux/irq.h>
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/mv64360_pic.c powerpc.git/arch/ppc/syslib/mv64360_pic.c
+--- linux-2.6.24/arch/ppc/syslib/mv64360_pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/mv64360_pic.c 2008-01-28 20:25:52.000000000 +0100
+@@ -36,7 +36,6 @@
+ #include <linux/init.h>
+ #include <linux/sched.h>
+ #include <linux/signal.h>
+-#include <linux/stddef.h>
+ #include <linux/delay.h>
+ #include <linux/irq.h>
+ #include <linux/interrupt.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ocp.c powerpc.git/arch/ppc/syslib/ocp.c
+--- linux-2.6.24/arch/ppc/syslib/ocp.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ocp.c 2008-01-28 20:25:52.000000000 +0100
+@@ -376,7 +376,7 @@
+
+ down_write(&ocp_devices_sem);
+ dev = __ocp_find_device(vendor, function, index);
+- list_del((struct list_head *)dev);
++ list_del(&dev->link);
+ up_write(&ocp_devices_sem);
+
+ DBG(("ocp: ocp_remove_one_device(vendor: %x, function: %x, index: %d)... done.\n", vendor, function, index));
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ppc83xx_setup.c powerpc.git/arch/ppc/syslib/ppc83xx_setup.c
+--- linux-2.6.24/arch/ppc/syslib/ppc83xx_setup.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ppc83xx_setup.c 2008-01-28 20:25:52.000000000 +0100
+@@ -41,7 +41,6 @@
+
+ #include <syslib/ppc83xx_setup.h>
+ #if defined(CONFIG_PCI)
+-#include <asm/delay.h>
+ #include <syslib/ppc83xx_pci.h>
+ #endif
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ppc85xx_rio.c powerpc.git/arch/ppc/syslib/ppc85xx_rio.c
+--- linux-2.6.24/arch/ppc/syslib/ppc85xx_rio.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ppc85xx_rio.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,932 +0,0 @@
+-/*
+- * MPC85xx RapidIO support
+- *
+- * Copyright 2005 MontaVista Software, Inc.
+- * Matt Porter <mporter@kernel.crashing.org>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
+- */
+-
+-#include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/types.h>
+-#include <linux/dma-mapping.h>
+-#include <linux/interrupt.h>
+-#include <linux/rio.h>
+-#include <linux/rio_drv.h>
+-
+-#include <asm/io.h>
+-
+-#define RIO_REGS_BASE (CCSRBAR + 0xc0000)
+-#define RIO_ATMU_REGS_OFFSET 0x10c00
+-#define RIO_MSG_REGS_OFFSET 0x11000
+-#define RIO_MAINT_WIN_SIZE 0x400000
+-#define RIO_DBELL_WIN_SIZE 0x1000
+-
+-#define RIO_MSG_OMR_MUI 0x00000002
+-#define RIO_MSG_OSR_TE 0x00000080
+-#define RIO_MSG_OSR_QOI 0x00000020
+-#define RIO_MSG_OSR_QFI 0x00000010
+-#define RIO_MSG_OSR_MUB 0x00000004
+-#define RIO_MSG_OSR_EOMI 0x00000002
+-#define RIO_MSG_OSR_QEI 0x00000001
+-
+-#define RIO_MSG_IMR_MI 0x00000002
+-#define RIO_MSG_ISR_TE 0x00000080
+-#define RIO_MSG_ISR_QFI 0x00000010
+-#define RIO_MSG_ISR_DIQI 0x00000001
+-
+-#define RIO_MSG_DESC_SIZE 32
+-#define RIO_MSG_BUFFER_SIZE 4096
+-#define RIO_MIN_TX_RING_SIZE 2
+-#define RIO_MAX_TX_RING_SIZE 2048
+-#define RIO_MIN_RX_RING_SIZE 2
+-#define RIO_MAX_RX_RING_SIZE 2048
+-
+-#define DOORBELL_DMR_DI 0x00000002
+-#define DOORBELL_DSR_TE 0x00000080
+-#define DOORBELL_DSR_QFI 0x00000010
+-#define DOORBELL_DSR_DIQI 0x00000001
+-#define DOORBELL_TID_OFFSET 0x03
+-#define DOORBELL_SID_OFFSET 0x05
+-#define DOORBELL_INFO_OFFSET 0x06
+-
+-#define DOORBELL_MESSAGE_SIZE 0x08
+-#define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET))
+-#define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET))
+-#define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET))
+-
+-struct rio_atmu_regs {
+- u32 rowtar;
+- u32 pad1;
+- u32 rowbar;
+- u32 pad2;
+- u32 rowar;
+- u32 pad3[3];
+-};
+-
+-struct rio_msg_regs {
+- u32 omr;
+- u32 osr;
+- u32 pad1;
+- u32 odqdpar;
+- u32 pad2;
+- u32 osar;
+- u32 odpr;
+- u32 odatr;
+- u32 odcr;
+- u32 pad3;
+- u32 odqepar;
+- u32 pad4[13];
+- u32 imr;
+- u32 isr;
+- u32 pad5;
+- u32 ifqdpar;
+- u32 pad6;
+- u32 ifqepar;
+- u32 pad7[250];
+- u32 dmr;
+- u32 dsr;
+- u32 pad8;
+- u32 dqdpar;
+- u32 pad9;
+- u32 dqepar;
+- u32 pad10[26];
+- u32 pwmr;
+- u32 pwsr;
+- u32 pad11;
+- u32 pwqbar;
+-};
+-
+-struct rio_tx_desc {
+- u32 res1;
+- u32 saddr;
+- u32 dport;
+- u32 dattr;
+- u32 res2;
+- u32 res3;
+- u32 dwcnt;
+- u32 res4;
+-};
+-
+-static u32 regs_win;
+-static struct rio_atmu_regs *atmu_regs;
+-static struct rio_atmu_regs *maint_atmu_regs;
+-static struct rio_atmu_regs *dbell_atmu_regs;
+-static u32 dbell_win;
+-static u32 maint_win;
+-static struct rio_msg_regs *msg_regs;
+-
+-static struct rio_dbell_ring {
+- void *virt;
+- dma_addr_t phys;
+-} dbell_ring;
+-
+-static struct rio_msg_tx_ring {
+- void *virt;
+- dma_addr_t phys;
+- void *virt_buffer[RIO_MAX_TX_RING_SIZE];
+- dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
+- int tx_slot;
+- int size;
+- void *dev_id;
+-} msg_tx_ring;
+-
+-static struct rio_msg_rx_ring {
+- void *virt;
+- dma_addr_t phys;
+- void *virt_buffer[RIO_MAX_RX_RING_SIZE];
+- int rx_slot;
+- int size;
+- void *dev_id;
+-} msg_rx_ring;
+-
+-/**
+- * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
+- * @index: ID of RapidIO interface
+- * @destid: Destination ID of target device
+- * @data: 16-bit info field of RapidIO doorbell message
+- *
+- * Sends a MPC85xx doorbell message. Returns %0 on success or
+- * %-EINVAL on failure.
+- */
+-static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
+-{
+- pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
+- index, destid, data);
+- out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
+- out_be16((void *)(dbell_win), data);
+-
+- return 0;
+-}
+-
+-/**
+- * mpc85xx_local_config_read - Generate a MPC85xx local config space read
+- * @index: ID of RapdiIO interface
+- * @offset: Offset into configuration space
+- * @len: Length (in bytes) of the maintenance transaction
+- * @data: Value to be read into
+- *
+- * Generates a MPC85xx local configuration space read. Returns %0 on
+- * success or %-EINVAL on failure.
+- */
+-static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
+-{
+- pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
+- offset);
+- *data = in_be32((void *)(regs_win + offset));
+-
+- return 0;
+-}
+-
+-/**
+- * mpc85xx_local_config_write - Generate a MPC85xx local config space write
+- * @index: ID of RapdiIO interface
+- * @offset: Offset into configuration space
+- * @len: Length (in bytes) of the maintenance transaction
+- * @data: Value to be written
+- *
+- * Generates a MPC85xx local configuration space write. Returns %0 on
+- * success or %-EINVAL on failure.
+- */
+-static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
+-{
+- pr_debug
+- ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
+- index, offset, data);
+- out_be32((void *)(regs_win + offset), data);
+-
+- return 0;
+-}
+-
+-/**
+- * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
+- * @index: ID of RapdiIO interface
+- * @destid: Destination ID of transaction
+- * @hopcount: Number of hops to target device
+- * @offset: Offset into configuration space
+- * @len: Length (in bytes) of the maintenance transaction
+- * @val: Location to be read into
+- *
+- * Generates a MPC85xx read maintenance transaction. Returns %0 on
+- * success or %-EINVAL on failure.
+- */
+-static int
+-mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
+- u32 * val)
+-{
+- u8 *data;
+-
+- pr_debug
+- ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
+- index, destid, hopcount, offset, len);
+- out_be32((void *)&maint_atmu_regs->rowtar,
+- (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
+-
+- data = (u8 *) maint_win + offset;
+- switch (len) {
+- case 1:
+- *val = in_8((u8 *) data);
+- break;
+- case 2:
+- *val = in_be16((u16 *) data);
+- break;
+- default:
+- *val = in_be32((u32 *) data);
+- break;
+- }
+-
+- return 0;
+-}
+-
+-/**
+- * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
+- * @index: ID of RapdiIO interface
+- * @destid: Destination ID of transaction
+- * @hopcount: Number of hops to target device
+- * @offset: Offset into configuration space
+- * @len: Length (in bytes) of the maintenance transaction
+- * @val: Value to be written
+- *
+- * Generates an MPC85xx write maintenance transaction. Returns %0 on
+- * success or %-EINVAL on failure.
+- */
+-static int
+-mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
+- int len, u32 val)
+-{
+- u8 *data;
+- pr_debug
+- ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
+- index, destid, hopcount, offset, len, val);
+- out_be32((void *)&maint_atmu_regs->rowtar,
+- (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
+-
+- data = (u8 *) maint_win + offset;
+- switch (len) {
+- case 1:
+- out_8((u8 *) data, val);
+- break;
+- case 2:
+- out_be16((u16 *) data, val);
+- break;
+- default:
+- out_be32((u32 *) data, val);
+- break;
+- }
+-
+- return 0;
+-}
+-
+-/**
+- * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
+- * @mport: Master port with outbound message queue
+- * @rdev: Target of outbound message
+- * @mbox: Outbound mailbox
+- * @buffer: Message to add to outbound queue
+- * @len: Length of message
+- *
+- * Adds the @buffer message to the MPC85xx outbound message queue. Returns
+- * %0 on success or %-EINVAL on failure.
+- */
+-int
+-rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
+- void *buffer, size_t len)
+-{
+- u32 omr;
+- struct rio_tx_desc *desc =
+- (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
+- int ret = 0;
+-
+- pr_debug
+- ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
+- rdev->destid, mbox, (int)buffer, len);
+-
+- if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
+- ret = -EINVAL;
+- goto out;
+- }
+-
+- /* Copy and clear rest of buffer */
+- memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
+- if (len < (RIO_MAX_MSG_SIZE - 4))
+- memset((void *)((u32) msg_tx_ring.
+- virt_buffer[msg_tx_ring.tx_slot] + len), 0,
+- RIO_MAX_MSG_SIZE - len);
+-
+- /* Set mbox field for message */
+- desc->dport = mbox & 0x3;
+-
+- /* Enable EOMI interrupt, set priority, and set destid */
+- desc->dattr = 0x28000000 | (rdev->destid << 2);
+-
+- /* Set transfer size aligned to next power of 2 (in double words) */
+- desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
+-
+- /* Set snooping and source buffer address */
+- desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
+-
+- /* Increment enqueue pointer */
+- omr = in_be32((void *)&msg_regs->omr);
+- out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
+-
+- /* Go to next descriptor */
+- if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
+- msg_tx_ring.tx_slot = 0;
+-
+- out:
+- return ret;
+-}
+-
+-EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
+-
+-/**
+- * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
+- * @irq: Linux interrupt number
+- * @dev_instance: Pointer to interrupt-specific data
+- *
+- * Handles outbound message interrupts. Executes a register outbound
+- * mailbox event handler and acks the interrupt occurrence.
+- */
+-static irqreturn_t
+-mpc85xx_rio_tx_handler(int irq, void *dev_instance)
+-{
+- int osr;
+- struct rio_mport *port = (struct rio_mport *)dev_instance;
+-
+- osr = in_be32((void *)&msg_regs->osr);
+-
+- if (osr & RIO_MSG_OSR_TE) {
+- pr_info("RIO: outbound message transmission error\n");
+- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
+- goto out;
+- }
+-
+- if (osr & RIO_MSG_OSR_QOI) {
+- pr_info("RIO: outbound message queue overflow\n");
+- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
+- goto out;
+- }
+-
+- if (osr & RIO_MSG_OSR_EOMI) {
+- u32 dqp = in_be32((void *)&msg_regs->odqdpar);
+- int slot = (dqp - msg_tx_ring.phys) >> 5;
+- port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
+-
+- /* Ack the end-of-message interrupt */
+- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
+- }
+-
+- out:
+- return IRQ_HANDLED;
+-}
+-
+-/**
+- * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
+- * @mport: Master port implementing the outbound message unit
+- * @dev_id: Device specific pointer to pass on event
+- * @mbox: Mailbox to open
+- * @entries: Number of entries in the outbound mailbox ring
+- *
+- * Initializes buffer ring, request the outbound message interrupt,
+- * and enables the outbound message unit. Returns %0 on success and
+- * %-EINVAL or %-ENOMEM on failure.
+- */
+-int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
+-{
+- int i, j, rc = 0;
+-
+- if ((entries < RIO_MIN_TX_RING_SIZE) ||
+- (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
+- rc = -EINVAL;
+- goto out;
+- }
+-
+- /* Initialize shadow copy ring */
+- msg_tx_ring.dev_id = dev_id;
+- msg_tx_ring.size = entries;
+-
+- for (i = 0; i < msg_tx_ring.size; i++) {
+- if (!
+- (msg_tx_ring.virt_buffer[i] =
+- dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
+- &msg_tx_ring.phys_buffer[i],
+- GFP_KERNEL))) {
+- rc = -ENOMEM;
+- for (j = 0; j < msg_tx_ring.size; j++)
+- if (msg_tx_ring.virt_buffer[j])
+- dma_free_coherent(NULL,
+- RIO_MSG_BUFFER_SIZE,
+- msg_tx_ring.
+- virt_buffer[j],
+- msg_tx_ring.
+- phys_buffer[j]);
+- goto out;
+- }
+- }
+-
+- /* Initialize outbound message descriptor ring */
+- if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
+- msg_tx_ring.size *
+- RIO_MSG_DESC_SIZE,
+- &msg_tx_ring.phys,
+- GFP_KERNEL))) {
+- rc = -ENOMEM;
+- goto out_dma;
+- }
+- memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
+- msg_tx_ring.tx_slot = 0;
+-
+- /* Point dequeue/enqueue pointers at first entry in ring */
+- out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
+- out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
+-
+- /* Configure for snooping */
+- out_be32((void *)&msg_regs->osar, 0x00000004);
+-
+- /* Clear interrupt status */
+- out_be32((void *)&msg_regs->osr, 0x000000b3);
+-
+- /* Hook up outbound message handler */
+- if ((rc =
+- request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
+- "msg_tx", (void *)mport)) < 0)
+- goto out_irq;
+-
+- /*
+- * Configure outbound message unit
+- * Snooping
+- * Interrupts (all enabled, except QEIE)
+- * Chaining mode
+- * Disable
+- */
+- out_be32((void *)&msg_regs->omr, 0x00100220);
+-
+- /* Set number of entries */
+- out_be32((void *)&msg_regs->omr,
+- in_be32((void *)&msg_regs->omr) |
+- ((get_bitmask_order(entries) - 2) << 12));
+-
+- /* Now enable the unit */
+- out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
+-
+- out:
+- return rc;
+-
+- out_irq:
+- dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
+- msg_tx_ring.virt, msg_tx_ring.phys);
+-
+- out_dma:
+- for (i = 0; i < msg_tx_ring.size; i++)
+- dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
+- msg_tx_ring.virt_buffer[i],
+- msg_tx_ring.phys_buffer[i]);
+-
+- return rc;
+-}
+-
+-/**
+- * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
+- * @mport: Master port implementing the outbound message unit
+- * @mbox: Mailbox to close
+- *
+- * Disables the outbound message unit, free all buffers, and
+- * frees the outbound message interrupt.
+- */
+-void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
+-{
+- /* Disable inbound message unit */
+- out_be32((void *)&msg_regs->omr, 0);
+-
+- /* Free ring */
+- dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
+- msg_tx_ring.virt, msg_tx_ring.phys);
+-
+- /* Free interrupt */
+- free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
+-}
+-
+-/**
+- * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
+- * @irq: Linux interrupt number
+- * @dev_instance: Pointer to interrupt-specific data
+- *
+- * Handles inbound message interrupts. Executes a registered inbound
+- * mailbox event handler and acks the interrupt occurrence.
+- */
+-static irqreturn_t
+-mpc85xx_rio_rx_handler(int irq, void *dev_instance)
+-{
+- int isr;
+- struct rio_mport *port = (struct rio_mport *)dev_instance;
+-
+- isr = in_be32((void *)&msg_regs->isr);
+-
+- if (isr & RIO_MSG_ISR_TE) {
+- pr_info("RIO: inbound message reception error\n");
+- out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
+- goto out;
+- }
+-
+- /* XXX Need to check/dispatch until queue empty */
+- if (isr & RIO_MSG_ISR_DIQI) {
+- /*
+- * We implement *only* mailbox 0, but can receive messages
+- * for any mailbox/letter to that mailbox destination. So,
+- * make the callback with an unknown/invalid mailbox number
+- * argument.
+- */
+- port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
+-
+- /* Ack the queueing interrupt */
+- out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
+- }
+-
+- out:
+- return IRQ_HANDLED;
+-}
+-
+-/**
+- * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
+- * @mport: Master port implementing the inbound message unit
+- * @dev_id: Device specific pointer to pass on event
+- * @mbox: Mailbox to open
+- * @entries: Number of entries in the inbound mailbox ring
+- *
+- * Initializes buffer ring, request the inbound message interrupt,
+- * and enables the inbound message unit. Returns %0 on success
+- * and %-EINVAL or %-ENOMEM on failure.
+- */
+-int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
+-{
+- int i, rc = 0;
+-
+- if ((entries < RIO_MIN_RX_RING_SIZE) ||
+- (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
+- rc = -EINVAL;
+- goto out;
+- }
+-
+- /* Initialize client buffer ring */
+- msg_rx_ring.dev_id = dev_id;
+- msg_rx_ring.size = entries;
+- msg_rx_ring.rx_slot = 0;
+- for (i = 0; i < msg_rx_ring.size; i++)
+- msg_rx_ring.virt_buffer[i] = NULL;
+-
+- /* Initialize inbound message ring */
+- if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
+- msg_rx_ring.size *
+- RIO_MAX_MSG_SIZE,
+- &msg_rx_ring.phys,
+- GFP_KERNEL))) {
+- rc = -ENOMEM;
+- goto out;
+- }
+-
+- /* Point dequeue/enqueue pointers at first entry in ring */
+- out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
+- out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
+-
+- /* Clear interrupt status */
+- out_be32((void *)&msg_regs->isr, 0x00000091);
+-
+- /* Hook up inbound message handler */
+- if ((rc =
+- request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
+- "msg_rx", (void *)mport)) < 0) {
+- dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
+- msg_tx_ring.virt_buffer[i],
+- msg_tx_ring.phys_buffer[i]);
+- goto out;
+- }
+-
+- /*
+- * Configure inbound message unit:
+- * Snooping
+- * 4KB max message size
+- * Unmask all interrupt sources
+- * Disable
+- */
+- out_be32((void *)&msg_regs->imr, 0x001b0060);
+-
+- /* Set number of queue entries */
+- out_be32((void *)&msg_regs->imr,
+- in_be32((void *)&msg_regs->imr) |
+- ((get_bitmask_order(entries) - 2) << 12));
+-
+- /* Now enable the unit */
+- out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
+-
+- out:
+- return rc;
+-}
+-
+-/**
+- * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
+- * @mport: Master port implementing the inbound message unit
+- * @mbox: Mailbox to close
+- *
+- * Disables the inbound message unit, free all buffers, and
+- * frees the inbound message interrupt.
+- */
+-void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
+-{
+- /* Disable inbound message unit */
+- out_be32((void *)&msg_regs->imr, 0);
+-
+- /* Free ring */
+- dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
+- msg_rx_ring.virt, msg_rx_ring.phys);
+-
+- /* Free interrupt */
+- free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
+-}
+-
+-/**
+- * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
+- * @mport: Master port implementing the inbound message unit
+- * @mbox: Inbound mailbox number
+- * @buf: Buffer to add to inbound queue
+- *
+- * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
+- * %0 on success or %-EINVAL on failure.
+- */
+-int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
+-{
+- int rc = 0;
+-
+- pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
+- msg_rx_ring.rx_slot);
+-
+- if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
+- printk(KERN_ERR
+- "RIO: error adding inbound buffer %d, buffer exists\n",
+- msg_rx_ring.rx_slot);
+- rc = -EINVAL;
+- goto out;
+- }
+-
+- msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
+- if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
+- msg_rx_ring.rx_slot = 0;
+-
+- out:
+- return rc;
+-}
+-
+-EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
+-
+-/**
+- * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
+- * @mport: Master port implementing the inbound message unit
+- * @mbox: Inbound mailbox number
+- *
+- * Gets the next available inbound message from the inbound message queue.
+- * A pointer to the message is returned on success or NULL on failure.
+- */
+-void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
+-{
+- u32 imr;
+- u32 phys_buf, virt_buf;
+- void *buf = NULL;
+- int buf_idx;
+-
+- phys_buf = in_be32((void *)&msg_regs->ifqdpar);
+-
+- /* If no more messages, then bail out */
+- if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
+- goto out2;
+-
+- virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
+- buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
+- buf = msg_rx_ring.virt_buffer[buf_idx];
+-
+- if (!buf) {
+- printk(KERN_ERR
+- "RIO: inbound message copy failed, no buffers\n");
+- goto out1;
+- }
+-
+- /* Copy max message size, caller is expected to allocate that big */
+- memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
+-
+- /* Clear the available buffer */
+- msg_rx_ring.virt_buffer[buf_idx] = NULL;
+-
+- out1:
+- imr = in_be32((void *)&msg_regs->imr);
+- out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
+-
+- out2:
+- return buf;
+-}
+-
+-EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
+-
+-/**
+- * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
+- * @irq: Linux interrupt number
+- * @dev_instance: Pointer to interrupt-specific data
+- *
+- * Handles doorbell interrupts. Parses a list of registered
+- * doorbell event handlers and executes a matching event handler.
+- */
+-static irqreturn_t
+-mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
+-{
+- int dsr;
+- struct rio_mport *port = (struct rio_mport *)dev_instance;
+-
+- dsr = in_be32((void *)&msg_regs->dsr);
+-
+- if (dsr & DOORBELL_DSR_TE) {
+- pr_info("RIO: doorbell reception error\n");
+- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
+- goto out;
+- }
+-
+- if (dsr & DOORBELL_DSR_QFI) {
+- pr_info("RIO: doorbell queue full\n");
+- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
+- goto out;
+- }
+-
+- /* XXX Need to check/dispatch until queue empty */
+- if (dsr & DOORBELL_DSR_DIQI) {
+- u32 dmsg =
+- (u32) dbell_ring.virt +
+- (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
+- u32 dmr;
+- struct rio_dbell *dbell;
+- int found = 0;
+-
+- pr_debug
+- ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
+- DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
+-
+- list_for_each_entry(dbell, &port->dbells, node) {
+- if ((dbell->res->start <= DBELL_INF(dmsg)) &&
+- (dbell->res->end >= DBELL_INF(dmsg))) {
+- found = 1;
+- break;
+- }
+- }
+- if (found) {
+- dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
+- DBELL_INF(dmsg));
+- } else {
+- pr_debug
+- ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
+- DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
+- }
+- dmr = in_be32((void *)&msg_regs->dmr);
+- out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
+- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
+- }
+-
+- out:
+- return IRQ_HANDLED;
+-}
+-
+-/**
+- * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
+- * @mport: Master port implementing the inbound doorbell unit
+- *
+- * Initializes doorbell unit hardware and inbound DMA buffer
+- * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
+- * or %-ENOMEM on failure.
+- */
+-static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
+-{
+- int rc = 0;
+-
+- /* Map outbound doorbell window immediately after maintenance window */
+- if (!(dbell_win =
+- (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
+- RIO_DBELL_WIN_SIZE))) {
+- printk(KERN_ERR
+- "RIO: unable to map outbound doorbell window\n");
+- rc = -ENOMEM;
+- goto out;
+- }
+-
+- /* Initialize inbound doorbells */
+- if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
+- 512 * DOORBELL_MESSAGE_SIZE,
+- &dbell_ring.phys,
+- GFP_KERNEL))) {
+- printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
+- rc = -ENOMEM;
+- iounmap((void *)dbell_win);
+- goto out;
+- }
+-
+- /* Point dequeue/enqueue pointers at first entry in ring */
+- out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
+- out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
+-
+- /* Clear interrupt status */
+- out_be32((void *)&msg_regs->dsr, 0x00000091);
+-
+- /* Hook up doorbell handler */
+- if ((rc =
+- request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
+- "dbell_rx", (void *)mport) < 0)) {
+- iounmap((void *)dbell_win);
+- dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
+- dbell_ring.virt, dbell_ring.phys);
+- printk(KERN_ERR
+- "MPC85xx RIO: unable to request inbound doorbell irq");
+- goto out;
+- }
+-
+- /* Configure doorbells for snooping, 512 entries, and enable */
+- out_be32((void *)&msg_regs->dmr, 0x00108161);
+-
+- out:
+- return rc;
+-}
+-
+-static char *cmdline = NULL;
+-
+-static int mpc85xx_rio_get_hdid(int index)
+-{
+- /* XXX Need to parse multiple entries in some format */
+- if (!cmdline)
+- return -1;
+-
+- return simple_strtol(cmdline, NULL, 0);
+-}
+-
+-static int mpc85xx_rio_get_cmdline(char *s)
+-{
+- if (!s)
+- return 0;
+-
+- cmdline = s;
+- return 1;
+-}
+-
+-__setup("riohdid=", mpc85xx_rio_get_cmdline);
+-
+-/**
+- * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
+- * @law_start: Starting physical address of RapidIO LAW
+- * @law_size: Size of RapidIO LAW
+- *
+- * Initializes MPC85xx RapidIO hardware interface, configures
+- * master port with system-specific info, and registers the
+- * master port with the RapidIO subsystem.
+- */
+-void mpc85xx_rio_setup(int law_start, int law_size)
+-{
+- struct rio_ops *ops;
+- struct rio_mport *port;
+-
+- ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
+- ops->lcread = mpc85xx_local_config_read;
+- ops->lcwrite = mpc85xx_local_config_write;
+- ops->cread = mpc85xx_rio_config_read;
+- ops->cwrite = mpc85xx_rio_config_write;
+- ops->dsend = mpc85xx_rio_doorbell_send;
+-
+- port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
+- port->id = 0;
+- port->index = 0;
+- INIT_LIST_HEAD(&port->dbells);
+- port->iores.start = law_start;
+- port->iores.end = law_start + law_size;
+- port->iores.flags = IORESOURCE_MEM;
+-
+- rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
+- rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
+- rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
+- strcpy(port->name, "RIO0 mport");
+-
+- port->ops = ops;
+- port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
+-
+- rio_register_mport(port);
+-
+- regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
+- atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
+- maint_atmu_regs = atmu_regs + 1;
+- dbell_atmu_regs = atmu_regs + 2;
+- msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
+-
+- /* Configure maintenance transaction window */
+- out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
+- out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
+-
+- maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
+-
+- /* Configure outbound doorbell window */
+- out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
+- out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
+- mpc85xx_rio_doorbell_init(port);
+-}
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ppc85xx_rio.h powerpc.git/arch/ppc/syslib/ppc85xx_rio.h
+--- linux-2.6.24/arch/ppc/syslib/ppc85xx_rio.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ppc85xx_rio.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-/*
+- * MPC85xx RapidIO definitions
+- *
+- * Copyright 2005 MontaVista Software, Inc.
+- * Matt Porter <mporter@kernel.crashing.org>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
+- */
+-
+-#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
+-#define __PPC_SYSLIB_PPC85XX_RIO_H
+-
+-#include <linux/init.h>
+-
+-extern void mpc85xx_rio_setup(int law_start, int law_size);
+-
+-#endif /* __PPC_SYSLIB_PPC85XX_RIO_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ppc8xx_pic.c powerpc.git/arch/ppc/syslib/ppc8xx_pic.c
+--- linux-2.6.24/arch/ppc/syslib/ppc8xx_pic.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ppc8xx_pic.c 2008-01-28 20:25:52.000000000 +0100
+@@ -16,7 +16,7 @@
+ * the only interrupt controller. Some boards, like the MBX and
+ * Sandpoint have the 8259 as a secondary controller. Depending
+ * upon the processor type, the internal controller can have as
+- * few as 16 interrups or as many as 64. We could use the
++ * few as 16 interrupts or as many as 64. We could use the
+ * "clear_bit()" and "set_bit()" functions like other platforms,
+ * but they are overkill for us.
+ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/syslib/ppc_sys.c powerpc.git/arch/ppc/syslib/ppc_sys.c
+--- linux-2.6.24/arch/ppc/syslib/ppc_sys.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/syslib/ppc_sys.c 2008-01-28 20:25:52.000000000 +0100
+@@ -185,7 +185,7 @@
+ */
+
+ /*
+- Here we'll replace .name pointers with fixed-lenght strings
++ Here we'll replace .name pointers with fixed-length strings
+ Hereby, this should be called *before* any func stuff triggeded.
+ */
+ void ppc_sys_device_initfunc(void)
+diff -x .git -x .gitignore -Nur linux-2.6.24/arch/ppc/xmon/start.c powerpc.git/arch/ppc/xmon/start.c
+--- linux-2.6.24/arch/ppc/xmon/start.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/arch/ppc/xmon/start.c 2008-01-28 20:25:52.000000000 +0100
+@@ -10,7 +10,6 @@
+ #include <linux/sysrq.h>
+ #include <linux/bitops.h>
+ #include <asm/xmon.h>
+-#include <asm/machdep.h>
+ #include <asm/errno.h>
+ #include <asm/processor.h>
+ #include <asm/delay.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ata/Kconfig powerpc.git/drivers/ata/Kconfig
+--- linux-2.6.24/drivers/ata/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ata/Kconfig 2008-01-28 20:25:59.000000000 +0100
+@@ -607,13 +607,23 @@
+
+ config PATA_PLATFORM
+ tristate "Generic platform device PATA support"
+- depends on EMBEDDED || ARCH_RPC
++ depends on EMBEDDED || ARCH_RPC || PPC
+ help
+ This option enables support for generic directly connected ATA
+ devices commonly found on embedded systems.
+
+ If unsure, say N.
+
++config PATA_OF_PLATFORM
++ tristate "OpenFirmware platform device PATA support"
++ depends on PATA_PLATFORM && PPC_OF
++ help
++ This option enables support for generic directly connected ATA
++ devices commonly found on embedded systems with OpenFirmware
++ bindings.
++
++ If unsure, say N.
++
+ config PATA_ICSIDE
+ tristate "Acorn ICS PATA support"
+ depends on ARM && ARCH_ACORN
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ata/Makefile powerpc.git/drivers/ata/Makefile
+--- linux-2.6.24/drivers/ata/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ata/Makefile 2008-01-28 20:25:59.000000000 +0100
+@@ -67,6 +67,7 @@
+ obj-$(CONFIG_PATA_SCC) += pata_scc.o
+ obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o
+ obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o
++obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o
+ obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o
+ # Should be last but two libata driver
+ obj-$(CONFIG_PATA_ACPI) += pata_acpi.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ata/pata_of_platform.c powerpc.git/drivers/ata/pata_of_platform.c
+--- linux-2.6.24/drivers/ata/pata_of_platform.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/drivers/ata/pata_of_platform.c 2008-01-28 20:25:59.000000000 +0100
+@@ -0,0 +1,114 @@
++/*
++ * OF-platform PATA driver
++ *
++ * Copyright (c) 2007 MontaVista Software, Inc.
++ * Anton Vorontsov <avorontsov@ru.mvista.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License (Version 2) as
++ * published by the Free Software Foundation.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/of_platform.h>
++#include <linux/pata_platform.h>
++
++static int __devinit pata_of_platform_probe(struct of_device *ofdev,
++ const struct of_device_id *match)
++{
++ int ret;
++ struct device_node *dn = ofdev->node;
++ struct resource io_res;
++ struct resource ctl_res;
++ struct resource irq_res;
++ unsigned int reg_shift = 0;
++ int pio_mode = 0;
++ int pio_mask;
++ const u32 *prop;
++
++ ret = of_address_to_resource(dn, 0, &io_res);
++ if (ret) {
++ dev_err(&ofdev->dev, "can't get IO address from "
++ "device tree\n");
++ return -EINVAL;
++ }
++
++ if (of_device_is_compatible(dn, "electra-ide")) {
++ /* Altstatus is really at offset 0x3f6 from the primary window
++ * on electra-ide. Adjust ctl_res and io_res accordingly.
++ */
++ ctl_res = io_res;
++ ctl_res.start = ctl_res.start+0x3f6;
++ io_res.end = ctl_res.start-1;
++ } else {
++ ret = of_address_to_resource(dn, 1, &ctl_res);
++ if (ret) {
++ dev_err(&ofdev->dev, "can't get CTL address from "
++ "device tree\n");
++ return -EINVAL;
++ }
++ }
++
++ ret = of_irq_to_resource(dn, 0, &irq_res);
++ if (ret == NO_IRQ)
++ irq_res.start = irq_res.end = -1;
++ else
++ irq_res.flags = 0;
++
++ prop = of_get_property(dn, "reg-shift", NULL);
++ if (prop)
++ reg_shift = *prop;
++
++ prop = of_get_property(dn, "pio-mode", NULL);
++ if (prop) {
++ pio_mode = *prop;
++ if (pio_mode > 6) {
++ dev_err(&ofdev->dev, "invalid pio-mode\n");
++ return -EINVAL;
++ }
++ } else {
++ dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n");
++ }
++
++ pio_mask = 1 << pio_mode;
++ pio_mask |= (1 << pio_mode) - 1;
++
++ return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res,
++ reg_shift, pio_mask);
++}
++
++static int __devexit pata_of_platform_remove(struct of_device *ofdev)
++{
++ return __pata_platform_remove(&ofdev->dev);
++}
++
++static struct of_device_id pata_of_platform_match[] = {
++ { .compatible = "ata-generic", },
++ { .compatible = "electra-ide", },
++ {},
++};
++MODULE_DEVICE_TABLE(of, pata_of_platform_match);
++
++static struct of_platform_driver pata_of_platform_driver = {
++ .name = "pata_of_platform",
++ .match_table = pata_of_platform_match,
++ .probe = pata_of_platform_probe,
++ .remove = __devexit_p(pata_of_platform_remove),
++};
++
++static int __init pata_of_platform_init(void)
++{
++ return of_register_platform_driver(&pata_of_platform_driver);
++}
++module_init(pata_of_platform_init);
++
++static void __exit pata_of_platform_exit(void)
++{
++ of_unregister_platform_driver(&pata_of_platform_driver);
++}
++module_exit(pata_of_platform_exit);
++
++MODULE_DESCRIPTION("OF-platform PATA driver");
++MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>");
++MODULE_LICENSE("GPL");
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ata/pata_platform.c powerpc.git/drivers/ata/pata_platform.c
+--- linux-2.6.24/drivers/ata/pata_platform.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ata/pata_platform.c 2008-01-28 20:25:59.000000000 +0100
+@@ -93,14 +93,9 @@
+ };
+
+ static void pata_platform_setup_port(struct ata_ioports *ioaddr,
+- struct pata_platform_info *info)
++ unsigned int shift)
+ {
+- unsigned int shift = 0;
+-
+ /* Fixup the port shift for platforms that need it */
+- if (info && info->ioport_shift)
+- shift = info->ioport_shift;
+-
+ ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << shift);
+ ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << shift);
+ ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
+@@ -114,8 +109,13 @@
+ }
+
+ /**
+- * pata_platform_probe - attach a platform interface
+- * @pdev: platform device
++ * __pata_platform_probe - attach a platform interface
++ * @dev: device
++ * @io_res: Resource representing I/O base
++ * @ctl_res: Resource representing CTL base
++ * @irq_res: Resource representing IRQ and its flags
++ * @ioport_shift: I/O port shift
++ * @__pio_mask: PIO mask
+ *
+ * Register a platform bus IDE interface. Such interfaces are PIO and we
+ * assume do not support IRQ sharing.
+@@ -135,42 +135,18 @@
+ *
+ * If no IRQ resource is present, PIO polling mode is used instead.
+ */
+-static int __devinit pata_platform_probe(struct platform_device *pdev)
++int __devinit __pata_platform_probe(struct device *dev,
++ struct resource *io_res,
++ struct resource *ctl_res,
++ struct resource *irq_res,
++ unsigned int ioport_shift,
++ int __pio_mask)
+ {
+- struct resource *io_res, *ctl_res;
+ struct ata_host *host;
+ struct ata_port *ap;
+- struct pata_platform_info *pp_info;
+ unsigned int mmio;
+- int irq;
+-
+- /*
+- * Simple resource validation ..
+- */
+- if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
+- dev_err(&pdev->dev, "invalid number of resources\n");
+- return -EINVAL;
+- }
+-
+- /*
+- * Get the I/O base first
+- */
+- io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+- if (io_res == NULL) {
+- io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (unlikely(io_res == NULL))
+- return -EINVAL;
+- }
+-
+- /*
+- * Then the CTL base
+- */
+- ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
+- if (ctl_res == NULL) {
+- ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+- if (unlikely(ctl_res == NULL))
+- return -EINVAL;
+- }
++ int irq = 0;
++ int irq_flags = 0;
+
+ /*
+ * Check for MMIO
+@@ -181,20 +157,21 @@
+ /*
+ * And the IRQ
+ */
+- irq = platform_get_irq(pdev, 0);
+- if (irq < 0)
+- irq = 0; /* no irq */
++ if (irq_res && irq_res->start > 0) {
++ irq = irq_res->start;
++ irq_flags = irq_res->flags;
++ }
+
+ /*
+ * Now that that's out of the way, wire up the port..
+ */
+- host = ata_host_alloc(&pdev->dev, 1);
++ host = ata_host_alloc(dev, 1);
+ if (!host)
+ return -ENOMEM;
+ ap = host->ports[0];
+
+ ap->ops = &pata_platform_port_ops;
+- ap->pio_mask = pio_mask;
++ ap->pio_mask = __pio_mask;
+ ap->flags |= ATA_FLAG_SLAVE_POSS;
+
+ /*
+@@ -209,25 +186,24 @@
+ * Handle the MMIO case
+ */
+ if (mmio) {
+- ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, io_res->start,
++ ap->ioaddr.cmd_addr = devm_ioremap(dev, io_res->start,
+ io_res->end - io_res->start + 1);
+- ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
++ ap->ioaddr.ctl_addr = devm_ioremap(dev, ctl_res->start,
+ ctl_res->end - ctl_res->start + 1);
+ } else {
+- ap->ioaddr.cmd_addr = devm_ioport_map(&pdev->dev, io_res->start,
++ ap->ioaddr.cmd_addr = devm_ioport_map(dev, io_res->start,
+ io_res->end - io_res->start + 1);
+- ap->ioaddr.ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start,
++ ap->ioaddr.ctl_addr = devm_ioport_map(dev, ctl_res->start,
+ ctl_res->end - ctl_res->start + 1);
+ }
+ if (!ap->ioaddr.cmd_addr || !ap->ioaddr.ctl_addr) {
+- dev_err(&pdev->dev, "failed to map IO/CTL base\n");
++ dev_err(dev, "failed to map IO/CTL base\n");
+ return -ENOMEM;
+ }
+
+ ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
+
+- pp_info = pdev->dev.platform_data;
+- pata_platform_setup_port(&ap->ioaddr, pp_info);
++ pata_platform_setup_port(&ap->ioaddr, ioport_shift);
+
+ ata_port_desc(ap, "%s cmd 0x%llx ctl 0x%llx", mmio ? "mmio" : "ioport",
+ (unsigned long long)io_res->start,
+@@ -235,26 +211,78 @@
+
+ /* activate */
+ return ata_host_activate(host, irq, irq ? ata_interrupt : NULL,
+- pp_info ? pp_info->irq_flags : 0,
+- &pata_platform_sht);
++ irq_flags, &pata_platform_sht);
+ }
++EXPORT_SYMBOL_GPL(__pata_platform_probe);
+
+ /**
+- * pata_platform_remove - unplug a platform interface
+- * @pdev: platform device
++ * __pata_platform_remove - unplug a platform interface
++ * @dev: device
+ *
+ * A platform bus ATA device has been unplugged. Perform the needed
+ * cleanup. Also called on module unload for any active devices.
+ */
+-static int __devexit pata_platform_remove(struct platform_device *pdev)
++int __devexit __pata_platform_remove(struct device *dev)
+ {
+- struct device *dev = &pdev->dev;
+ struct ata_host *host = dev_get_drvdata(dev);
+
+ ata_host_detach(host);
+
+ return 0;
+ }
++EXPORT_SYMBOL_GPL(__pata_platform_remove);
++
++static int __devinit pata_platform_probe(struct platform_device *pdev)
++{
++ struct resource *io_res;
++ struct resource *ctl_res;
++ struct resource *irq_res;
++ struct pata_platform_info *pp_info = pdev->dev.platform_data;
++
++ /*
++ * Simple resource validation ..
++ */
++ if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
++ dev_err(&pdev->dev, "invalid number of resources\n");
++ return -EINVAL;
++ }
++
++ /*
++ * Get the I/O base first
++ */
++ io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
++ if (io_res == NULL) {
++ io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (unlikely(io_res == NULL))
++ return -EINVAL;
++ }
++
++ /*
++ * Then the CTL base
++ */
++ ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
++ if (ctl_res == NULL) {
++ ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ if (unlikely(ctl_res == NULL))
++ return -EINVAL;
++ }
++
++ /*
++ * And the IRQ
++ */
++ irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
++ if (irq_res)
++ irq_res->flags = pp_info ? pp_info->irq_flags : 0;
++
++ return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res,
++ pp_info ? pp_info->ioport_shift : 0,
++ pio_mask);
++}
++
++static int __devexit pata_platform_remove(struct platform_device *pdev)
++{
++ return __pata_platform_remove(&pdev->dev);
++}
+
+ static struct platform_driver pata_platform_driver = {
+ .probe = pata_platform_probe,
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/char/hw_random/Kconfig powerpc.git/drivers/char/hw_random/Kconfig
+--- linux-2.6.24/drivers/char/hw_random/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/char/hw_random/Kconfig 2008-01-28 20:25:59.000000000 +0100
+@@ -98,7 +98,7 @@
+ default HW_RANDOM
+ ---help---
+ This driver provides kernel-side support for the Random Number
+- Generator hardware found on PA6T-1682M processor.
++ Generator hardware found on PA Semi PWRficient SoCs.
+
+ To compile this driver as a module, choose M here: the
+ module will be called pasemi-rng.
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/char/hw_random/pasemi-rng.c powerpc.git/drivers/char/hw_random/pasemi-rng.c
+--- linux-2.6.24/drivers/char/hw_random/pasemi-rng.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/char/hw_random/pasemi-rng.c 2008-01-28 20:25:59.000000000 +0100
+@@ -126,10 +126,9 @@
+ }
+
+ static struct of_device_id rng_match[] = {
+- {
+- .compatible = "1682m-rng",
+- },
+- {},
++ { .compatible = "1682m-rng", },
++ { .compatible = "pasemi,pwrficient-rng", },
++ { },
+ };
+
+ static struct of_platform_driver rng_driver = {
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/edac/pasemi_edac.c powerpc.git/drivers/edac/pasemi_edac.c
+--- linux-2.6.24/drivers/edac/pasemi_edac.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/edac/pasemi_edac.c 2008-01-28 20:26:00.000000000 +0100
+@@ -225,7 +225,7 @@
+ EDAC_FLAG_NONE;
+ mci->mod_name = MODULE_NAME;
+ mci->dev_name = pci_name(pdev);
+- mci->ctl_name = "pasemi,1682m-mc";
++ mci->ctl_name = "pasemi,pwrficient-mc";
+ mci->edac_check = pasemi_edac_check;
+ mci->ctl_page_to_phys = NULL;
+ pci_read_config_dword(pdev, MCCFG_SCRUB, &scrub);
+@@ -297,4 +297,4 @@
+
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>");
+-MODULE_DESCRIPTION("MC support for PA Semi PA6T-1682M memory controller");
++MODULE_DESCRIPTION("MC support for PA Semi PWRficient memory controller");
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/adb.c powerpc.git/drivers/macintosh/adb.c
+--- linux-2.6.24/drivers/macintosh/adb.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/adb.c 2008-01-28 20:26:08.000000000 +0100
+@@ -35,6 +35,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/completion.h>
+ #include <linux/device.h>
++#include <linux/kthread.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/semaphore.h>
+@@ -82,21 +83,11 @@
+ BLOCKING_NOTIFIER_HEAD(adb_client_list);
+ static int adb_got_sleep;
+ static int adb_inited;
+-static pid_t adb_probe_task_pid;
+ static DECLARE_MUTEX(adb_probe_mutex);
+-static struct completion adb_probe_task_comp;
+ static int sleepy_trackpad;
+ static int autopoll_devs;
+ int __adb_probe_sync;
+
+-#ifdef CONFIG_PM_SLEEP
+-static void adb_notify_sleep(struct pmu_sleep_notifier *self, int when);
+-static struct pmu_sleep_notifier adb_sleep_notifier = {
+- adb_notify_sleep,
+- SLEEP_LEVEL_ADB,
+-};
+-#endif
+-
+ static int adb_scan_bus(void);
+ static int do_adb_reset_bus(void);
+ static void adbdev_init(void);
+@@ -134,16 +125,6 @@
+ }
+ #endif
+
+-
+-static __inline__ void adb_wait_ms(unsigned int ms)
+-{
+- if (current->pid && adb_probe_task_pid &&
+- adb_probe_task_pid == current->pid)
+- msleep(ms);
+- else
+- mdelay(ms);
+-}
+-
+ static int adb_scan_bus(void)
+ {
+ int i, highFree=0, noMovement;
+@@ -248,13 +229,10 @@
+ static int
+ adb_probe_task(void *x)
+ {
+- strcpy(current->comm, "kadbprobe");
+-
+ printk(KERN_INFO "adb: starting probe task...\n");
+ do_adb_reset_bus();
+ printk(KERN_INFO "adb: finished probe task...\n");
+
+- adb_probe_task_pid = 0;
+ up(&adb_probe_mutex);
+
+ return 0;
+@@ -263,7 +241,7 @@
+ static void
+ __adb_probe_task(struct work_struct *bullshit)
+ {
+- adb_probe_task_pid = kernel_thread(adb_probe_task, NULL, SIGCHLD | CLONE_KERNEL);
++ kthread_run(adb_probe_task, NULL, "kadbprobe");
+ }
+
+ static DECLARE_WORK(adb_reset_work, __adb_probe_task);
+@@ -281,6 +259,36 @@
+ return 0;
+ }
+
++#ifdef CONFIG_PM
++/*
++ * notify clients before sleep
++ */
++static int adb_suspend(struct platform_device *dev, pm_message_t state)
++{
++ adb_got_sleep = 1;
++ /* We need to get a lock on the probe thread */
++ down(&adb_probe_mutex);
++ /* Stop autopoll */
++ if (adb_controller->autopoll)
++ adb_controller->autopoll(0);
++ blocking_notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
++
++ return 0;
++}
++
++/*
++ * reset bus after sleep
++ */
++static int adb_resume(struct platform_device *dev)
++{
++ adb_got_sleep = 0;
++ up(&adb_probe_mutex);
++ adb_reset_bus();
++
++ return 0;
++}
++#endif /* CONFIG_PM */
++
+ int __init adb_init(void)
+ {
+ struct adb_driver *driver;
+@@ -313,15 +321,12 @@
+ printk(KERN_WARNING "Warning: no ADB interface detected\n");
+ adb_controller = NULL;
+ } else {
+-#ifdef CONFIG_PM_SLEEP
+- pmu_register_sleep_notifier(&adb_sleep_notifier);
+-#endif /* CONFIG_PM */
+ #ifdef CONFIG_PPC
+ if (machine_is_compatible("AAPL,PowerBook1998") ||
+ machine_is_compatible("PowerBook1,1"))
+ sleepy_trackpad = 1;
+ #endif /* CONFIG_PPC */
+- init_completion(&adb_probe_task_comp);
++
+ adbdev_init();
+ adb_reset_bus();
+ }
+@@ -330,33 +335,6 @@
+
+ __initcall(adb_init);
+
+-#ifdef CONFIG_PM
+-/*
+- * notify clients before sleep and reset bus afterwards
+- */
+-void
+-adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
+-{
+- switch (when) {
+- case PBOOK_SLEEP_REQUEST:
+- adb_got_sleep = 1;
+- /* We need to get a lock on the probe thread */
+- down(&adb_probe_mutex);
+- /* Stop autopoll */
+- if (adb_controller->autopoll)
+- adb_controller->autopoll(0);
+- blocking_notifier_call_chain(&adb_client_list,
+- ADB_MSG_POWERDOWN, NULL);
+- break;
+- case PBOOK_WAKE:
+- adb_got_sleep = 0;
+- up(&adb_probe_mutex);
+- adb_reset_bus();
+- break;
+- }
+-}
+-#endif /* CONFIG_PM */
+-
+ static int
+ do_adb_reset_bus(void)
+ {
+@@ -373,7 +351,7 @@
+
+ if (sleepy_trackpad) {
+ /* Let the trackpad settle down */
+- adb_wait_ms(500);
++ msleep(500);
+ }
+
+ down(&adb_handler_sem);
+@@ -389,7 +367,7 @@
+
+ if (sleepy_trackpad) {
+ /* Let the trackpad settle down */
+- adb_wait_ms(1500);
++ msleep(1500);
+ }
+
+ if (!ret) {
+@@ -413,41 +391,27 @@
+ adb_controller->poll();
+ }
+
+-static void
+-adb_probe_wakeup(struct adb_request *req)
++static void adb_sync_req_done(struct adb_request *req)
+ {
+- complete(&adb_probe_task_comp);
+-}
++ struct completion *comp = req->arg;
+
+-/* Static request used during probe */
+-static struct adb_request adb_sreq;
+-static unsigned long adb_sreq_lock; // Use semaphore ! */
++ complete(comp);
++}
+
+ int
+ adb_request(struct adb_request *req, void (*done)(struct adb_request *),
+ int flags, int nbytes, ...)
+ {
+ va_list list;
+- int i, use_sreq;
++ int i;
+ int rc;
++ struct completion comp;
+
+ if ((adb_controller == NULL) || (adb_controller->send_request == NULL))
+ return -ENXIO;
+ if (nbytes < 1)
+ return -EINVAL;
+- if (req == NULL && (flags & ADBREQ_NOSEND))
+- return -EINVAL;
+-
+- if (req == NULL) {
+- if (test_and_set_bit(0,&adb_sreq_lock)) {
+- printk("adb.c: Warning: contention on static request !\n");
+- return -EPERM;
+- }
+- req = &adb_sreq;
+- flags |= ADBREQ_SYNC;
+- use_sreq = 1;
+- } else
+- use_sreq = 0;
++
+ req->nbytes = nbytes+1;
+ req->done = done;
+ req->reply_expected = flags & ADBREQ_REPLY;
+@@ -460,25 +424,18 @@
+ if (flags & ADBREQ_NOSEND)
+ return 0;
+
+- /* Synchronous requests send from the probe thread cause it to
+- * block. Beware that the "done" callback will be overriden !
+- */
+- if ((flags & ADBREQ_SYNC) &&
+- (current->pid && adb_probe_task_pid &&
+- adb_probe_task_pid == current->pid)) {
+- req->done = adb_probe_wakeup;
+- rc = adb_controller->send_request(req, 0);
+- if (rc || req->complete)
+- goto bail;
+- wait_for_completion(&adb_probe_task_comp);
+- rc = 0;
+- goto bail;
+- }
+-
+- rc = adb_controller->send_request(req, flags & ADBREQ_SYNC);
+-bail:
+- if (use_sreq)
+- clear_bit(0, &adb_sreq_lock);
++ /* Synchronous requests block using an on-stack completion */
++ if (flags & ADBREQ_SYNC) {
++ WARN_ON(done);
++ req->done = adb_sync_req_done;
++ req->arg = &comp;
++ init_completion(&comp);
++ }
++
++ rc = adb_controller->send_request(req, 0);
++
++ if ((flags & ADBREQ_SYNC) && !rc && !req->complete)
++ wait_for_completion(&comp);
+
+ return rc;
+ }
+@@ -864,7 +821,29 @@
+ .release = adb_release,
+ };
+
+-static void
++static struct platform_driver adb_pfdrv = {
++ .driver = {
++ .name = "adb",
++ },
++#ifdef CONFIG_PM
++ .suspend = adb_suspend,
++ .resume = adb_resume,
++#endif
++};
++
++static struct platform_device adb_pfdev = {
++ .name = "adb",
++};
++
++static int __init
++adb_dummy_probe(struct platform_device *dev)
++{
++ if (dev == &adb_pfdev)
++ return 0;
++ return -ENODEV;
++}
++
++static void __init
+ adbdev_init(void)
+ {
+ if (register_chrdev(ADB_MAJOR, "adb", &adb_fops)) {
+@@ -876,4 +855,7 @@
+ if (IS_ERR(adb_dev_class))
+ return;
+ class_device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
++
++ platform_device_register(&adb_pfdev);
++ platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/mediabay.c powerpc.git/drivers/macintosh/mediabay.c
+--- linux-2.6.24/drivers/macintosh/mediabay.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/mediabay.c 2008-01-28 20:26:08.000000000 +0100
+@@ -20,6 +20,7 @@
+ #include <linux/stddef.h>
+ #include <linux/init.h>
+ #include <linux/ide.h>
++#include <linux/kthread.h>
+ #include <asm/prom.h>
+ #include <asm/pgtable.h>
+ #include <asm/io.h>
+@@ -35,7 +36,6 @@
+
+
+ #define MB_DEBUG
+-#define MB_IGNORE_SIGNALS
+
+ #ifdef MB_DEBUG
+ #define MBDBG(fmt, arg...) printk(KERN_INFO fmt , ## arg)
+@@ -622,12 +622,7 @@
+ {
+ int i;
+
+- strcpy(current->comm, "media-bay");
+-#ifdef MB_IGNORE_SIGNALS
+- sigfillset(&current->blocked);
+-#endif
+-
+- for (;;) {
++ while (!kthread_should_stop()) {
+ for (i = 0; i < media_bay_count; ++i) {
+ down(&media_bays[i].lock);
+ if (!media_bays[i].sleeping)
+@@ -636,9 +631,8 @@
+ }
+
+ msleep_interruptible(MB_POLL_DELAY);
+- if (signal_pending(current))
+- return 0;
+ }
++ return 0;
+ }
+
+ static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_device_id *match)
+@@ -699,7 +693,7 @@
+
+ /* Startup kernel thread */
+ if (i == 0)
+- kernel_thread(media_bay_task, NULL, CLONE_KERNEL);
++ kthread_run(media_bay_task, NULL, "media-bay");
+
+ return 0;
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/therm_adt746x.c powerpc.git/drivers/macintosh/therm_adt746x.c
+--- linux-2.6.24/drivers/macintosh/therm_adt746x.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/therm_adt746x.c 2008-01-28 20:26:08.000000000 +0100
+@@ -553,6 +553,7 @@
+ struct device_node* np;
+ const u32 *prop;
+ int i = 0, offset = 0;
++ int err;
+
+ np = of_find_node_by_name(NULL, "fan");
+ if (!np)
+@@ -612,17 +613,20 @@
+ return -ENODEV;
+ }
+
+- device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
+- device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
+- device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
+- device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
+- device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
+- device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
+- device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
++ err = device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
++ err |= device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
++ err |= device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
+ if(therm_type == ADT7460)
+- device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
++ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
++ if (err)
++ printk(KERN_WARNING
++ "Failed to create tempertaure attribute file(s).\n");
+
+ #ifndef CONFIG_I2C_POWERMAC
+ request_module("i2c-powermac");
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/therm_pm72.c powerpc.git/drivers/macintosh/therm_pm72.c
+--- linux-2.6.24/drivers/macintosh/therm_pm72.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/therm_pm72.c 2008-01-28 20:26:08.000000000 +0100
+@@ -121,6 +121,7 @@
+ #include <linux/reboot.h>
+ #include <linux/kmod.h>
+ #include <linux/i2c.h>
++#include <linux/kthread.h>
+ #include <asm/prom.h>
+ #include <asm/machdep.h>
+ #include <asm/io.h>
+@@ -161,7 +162,7 @@
+ static int state;
+ static int cpu_count;
+ static int cpu_pid_type;
+-static pid_t ctrl_task;
++static struct task_struct *ctrl_task;
+ static struct completion ctrl_complete;
+ static int critical_state;
+ static int rackmac;
+@@ -1156,6 +1157,8 @@
+ */
+ static int init_cpu_state(struct cpu_pid_state *state, int index)
+ {
++ int err;
++
+ state->index = index;
+ state->first = 1;
+ state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000;
+@@ -1181,18 +1184,21 @@
+ DBG("CPU %d Using %d power history entries\n", index, state->count_power);
+
+ if (index == 0) {
+- device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
+- device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
+- device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
+- device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
++ err = device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
+ } else {
+- device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
+- device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
+- device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
+- device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
+- }
++ err = device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
++ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
++ }
++ if (err)
++ printk(KERN_WARNING "Failed to create some of the atribute"
++ "files for CPU %d\n", index);
+
+ return 0;
+ fail:
+@@ -1328,6 +1334,7 @@
+ {
+ struct device_node *u3;
+ int u3h = 1; /* conservative by default */
++ int err;
+
+ /*
+ * There are different PID params for machines with U3 and machines
+@@ -1379,8 +1386,11 @@
+ if (state->monitor == NULL)
+ return -ENODEV;
+
+- device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
++ err = device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
++ if (err)
++ printk(KERN_WARNING "Failed to create attribute file(s)"
++ " for backside fan\n");
+
+ return 0;
+ }
+@@ -1491,6 +1501,8 @@
+ */
+ static int init_drives_state(struct drives_pid_state *state)
+ {
++ int err;
++
+ state->ticks = 1;
+ state->first = 1;
+ state->rpm = 1000;
+@@ -1499,8 +1511,11 @@
+ if (state->monitor == NULL)
+ return -ENODEV;
+
+- device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
++ err = device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
++ if (err)
++ printk(KERN_WARNING "Failed to create attribute file(s)"
++ " for drives bay fan\n");
+
+ return 0;
+ }
+@@ -1621,7 +1636,9 @@
+ if (state->monitor == NULL)
+ return -ENODEV;
+
+- device_create_file(&of_dev->dev, &dev_attr_dimms_temperature);
++ if (device_create_file(&of_dev->dev, &dev_attr_dimms_temperature))
++ printk(KERN_WARNING "Failed to create attribute file"
++ " for DIMM temperature\n");
+
+ return 0;
+ }
+@@ -1731,6 +1748,8 @@
+ */
+ static int init_slots_state(struct slots_pid_state *state)
+ {
++ int err;
++
+ state->ticks = 1;
+ state->first = 1;
+ state->pwm = 50;
+@@ -1739,8 +1758,11 @@
+ if (state->monitor == NULL)
+ return -ENODEV;
+
+- device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
+- device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
++ err = device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
++ err |= device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
++ if (err)
++ printk(KERN_WARNING "Failed to create attribute file(s)"
++ " for slots bay fan\n");
+
+ return 0;
+ }
+@@ -1779,8 +1801,6 @@
+ */
+ static int main_control_loop(void *x)
+ {
+- daemonize("kfand");
+-
+ DBG("main_control_loop started\n");
+
+ down(&driver_lock);
+@@ -1956,7 +1976,7 @@
+ {
+ init_completion(&ctrl_complete);
+
+- ctrl_task = kernel_thread(main_control_loop, NULL, SIGCHLD | CLONE_KERNEL);
++ ctrl_task = kthread_run(main_control_loop, NULL, "kfand");
+ }
+
+ /*
+@@ -1964,7 +1984,7 @@
+ */
+ static void stop_control_loops(void)
+ {
+- if (ctrl_task != 0)
++ if (ctrl_task)
+ wait_for_completion(&ctrl_complete);
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/therm_windtunnel.c powerpc.git/drivers/macintosh/therm_windtunnel.c
+--- linux-2.6.24/drivers/macintosh/therm_windtunnel.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/therm_windtunnel.c 2008-01-28 20:26:08.000000000 +0100
+@@ -36,6 +36,7 @@
+ #include <linux/i2c.h>
+ #include <linux/slab.h>
+ #include <linux/init.h>
++#include <linux/kthread.h>
+
+ #include <asm/prom.h>
+ #include <asm/machdep.h>
+@@ -61,8 +62,7 @@
+
+ static struct {
+ volatile int running;
+- struct completion completion;
+- pid_t poll_task;
++ struct task_struct *poll_task;
+
+ struct semaphore lock;
+ struct of_device *of_dev;
+@@ -223,6 +223,7 @@
+ setup_hardware( void )
+ {
+ int val;
++ int err;
+
+ /* save registers (if we unload the module) */
+ x.r0 = read_reg( x.fan, 0x00, 1 );
+@@ -265,8 +266,11 @@
+ x.upind = -1;
+ /* tune_fan( fan_up_table[x.upind].fan_setting ); */
+
+- device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
+- device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
++ err = device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
++ err |= device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
++ if (err)
++ printk(KERN_WARNING
++ "Failed to create temperature attribute file(s).\n");
+ }
+
+ static void
+@@ -282,27 +286,27 @@
+ write_reg( x.fan, 0x00, x.r0, 1 );
+ }
+
+-static int
+-control_loop( void *dummy )
++static int control_loop(void *dummy)
+ {
+- daemonize("g4fand");
+-
+- down( &x.lock );
++ down(&x.lock);
+ setup_hardware();
++ up(&x.lock);
+
+- while( x.running ) {
+- up( &x.lock );
+-
++ for (;;) {
+ msleep_interruptible(8000);
+-
+- down( &x.lock );
++ if (kthread_should_stop())
++ break;
++
++ down(&x.lock);
+ poll_temp();
++ up(&x.lock);
+ }
+
++ down(&x.lock);
+ restore_regs();
+- up( &x.lock );
++ up(&x.lock);
+
+- complete_and_exit( &x.completion, 0 );
++ return 0;
+ }
+
+
+@@ -322,8 +326,7 @@
+ ret = i2c_probe( adapter, &addr_data, &do_probe );
+ if( x.thermostat && x.fan ) {
+ x.running = 1;
+- init_completion( &x.completion );
+- x.poll_task = kernel_thread( control_loop, NULL, SIGCHLD | CLONE_KERNEL );
++ x.poll_task = kthread_run(control_loop, NULL, "g4fand");
+ }
+ }
+ return ret;
+@@ -339,7 +342,8 @@
+ else {
+ if( x.running ) {
+ x.running = 0;
+- wait_for_completion( &x.completion );
++ kthread_stop(x.poll_task);
++ x.poll_task = NULL;
+ }
+ if( client == x.thermostat )
+ x.thermostat = NULL;
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/via-pmu-backlight.c powerpc.git/drivers/macintosh/via-pmu-backlight.c
+--- linux-2.6.24/drivers/macintosh/via-pmu-backlight.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/via-pmu-backlight.c 2008-01-28 20:26:08.000000000 +0100
+@@ -22,7 +22,7 @@
+
+ static void pmu_backlight_init_curve(u8 off, u8 min, u8 max)
+ {
+- unsigned int i, flat, count, range = (max - min);
++ int i, flat, count, range = (max - min);
+
+ bl_curve[0] = off;
+
+@@ -68,17 +68,11 @@
+ return pmulevel;
+ }
+
+-static int pmu_backlight_update_status(struct backlight_device *bd)
++static int __pmu_backlight_update_status(struct backlight_device *bd)
+ {
+ struct adb_request req;
+- unsigned long flags;
+ int level = bd->props.brightness;
+
+- spin_lock_irqsave(&pmu_backlight_lock, flags);
+-
+- /* Don't update brightness when sleeping */
+- if (sleeping)
+- goto out;
+
+ if (bd->props.power != FB_BLANK_UNBLANK ||
+ bd->props.fb_blank != FB_BLANK_UNBLANK)
+@@ -99,12 +93,23 @@
+ pmu_wait_complete(&req);
+ }
+
+-out:
+- spin_unlock_irqrestore(&pmu_backlight_lock, flags);
+-
+ return 0;
+ }
+
++static int pmu_backlight_update_status(struct backlight_device *bd)
++{
++ unsigned long flags;
++ int rc = 0;
++
++ spin_lock_irqsave(&pmu_backlight_lock, flags);
++ /* Don't update brightness when sleeping */
++ if (!sleeping)
++ rc = __pmu_backlight_update_status(bd);
++ spin_unlock_irqrestore(&pmu_backlight_lock, flags);
++ return rc;
++}
++
++
+ static int pmu_backlight_get_brightness(struct backlight_device *bd)
+ {
+ return bd->props.brightness;
+@@ -123,6 +128,16 @@
+
+ spin_lock_irqsave(&pmu_backlight_lock, flags);
+ sleeping = sleep;
++ if (pmac_backlight) {
++ if (sleep) {
++ struct adb_request req;
++
++ pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
++ PMU_POW_BACKLIGHT | PMU_POW_OFF);
++ pmu_wait_complete(&req);
++ } else
++ __pmu_backlight_update_status(pmac_backlight);
++ }
+ spin_unlock_irqrestore(&pmu_backlight_lock, flags);
+ }
+ #endif /* CONFIG_PM */
+@@ -148,8 +163,8 @@
+
+ bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data);
+ if (IS_ERR(bd)) {
+- printk("pmubl: Backlight registration failed\n");
+- goto error;
++ printk(KERN_ERR "PMU Backlight registration failed\n");
++ return;
+ }
+ bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
+ pmu_backlight_init_curve(0x7F, 0x46, 0x0E);
+@@ -171,10 +186,5 @@
+ bd->props.power = FB_BLANK_UNBLANK;
+ backlight_update_status(bd);
+
+- printk("pmubl: Backlight initialized (%s)\n", name);
+-
+- return;
+-
+-error:
+- return;
++ printk(KERN_INFO "PMU Backlight initialized (%s)\n", name);
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/macintosh/via-pmu.c powerpc.git/drivers/macintosh/via-pmu.c
+--- linux-2.6.24/drivers/macintosh/via-pmu.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/macintosh/via-pmu.c 2008-01-28 20:26:08.000000000 +0100
+@@ -10,13 +10,11 @@
+ *
+ * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
+ * Copyright (C) 2001-2002 Benjamin Herrenschmidt
++ * Copyright (C) 2006-2007 Johannes Berg
+ *
+ * THIS DRIVER IS BECOMING A TOTAL MESS !
+ * - Cleanup atomically disabling reply to PMU events after
+ * a sleep or a freq. switch
+- * - Move sleep code out of here to pmac_pm, merge into new
+- * common PM infrastructure
+- * - Save/Restore PCI space properly
+ *
+ */
+ #include <stdarg.h>
+@@ -33,7 +31,6 @@
+ #include <linux/adb.h>
+ #include <linux/pmu.h>
+ #include <linux/cuda.h>
+-#include <linux/smp_lock.h>
+ #include <linux/module.h>
+ #include <linux/spinlock.h>
+ #include <linux/pm.h>
+@@ -65,9 +62,7 @@
+ #include "via-pmu-event.h"
+
+ /* Some compile options */
+-#undef SUSPEND_USES_PMU
+-#define DEBUG_SLEEP
+-#undef HACKED_PCI_SAVE
++#undef DEBUG_SLEEP
+
+ /* Misc minor number allocated for /dev/pmu */
+ #define PMU_MINOR 154
+@@ -152,12 +147,9 @@
+ static u8 pmu_intr_mask;
+ static int pmu_version;
+ static int drop_interrupts;
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ static int option_lid_wakeup = 1;
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
+-#if (defined(CONFIG_PM_SLEEP)&&defined(CONFIG_PPC32))||defined(CONFIG_PMAC_BACKLIGHT_LEGACY)
+-static int sleep_in_progress;
+-#endif
++#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
+ static unsigned long async_req_locks;
+ static unsigned int pmu_irq_stats[11];
+
+@@ -177,7 +169,6 @@
+
+ int __fake_sleep;
+ int asleep;
+-BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
+
+ #ifdef CONFIG_ADB
+ static int adb_dev_map;
+@@ -224,7 +215,7 @@
+
+ #ifdef DEBUG_SLEEP
+ int pmu_polled_request(struct adb_request *req);
+-int pmu_wink(struct adb_request *req);
++void pmu_blink(int n);
+ #endif
+
+ /*
+@@ -875,7 +866,7 @@
+ {
+ char *p = page;
+
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ if (pmu_kind == PMU_KEYLARGO_BASED &&
+ pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
+ p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup);
+@@ -916,7 +907,7 @@
+ *(val++) = 0;
+ while(*val == ' ')
+ val++;
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ if (pmu_kind == PMU_KEYLARGO_BASED &&
+ pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
+ if (!strcmp(label, "lid_wakeup"))
+@@ -1256,9 +1247,7 @@
+ pmu_suspend(void)
+ {
+ unsigned long flags;
+-#ifdef SUSPEND_USES_PMU
+- struct adb_request *req;
+-#endif
++
+ if (!via)
+ return;
+
+@@ -1276,17 +1265,10 @@
+ via_pmu_interrupt(0, NULL);
+ spin_lock_irqsave(&pmu_lock, flags);
+ if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
+-#ifdef SUSPEND_USES_PMU
+- pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
+- spin_unlock_irqrestore(&pmu_lock, flags);
+- while(!req.complete)
+- pmu_poll();
+-#else /* SUSPEND_USES_PMU */
+ if (gpio_irq >= 0)
+ disable_irq_nosync(gpio_irq);
+ out_8(&via[IER], CB1_INT | IER_CLR);
+ spin_unlock_irqrestore(&pmu_lock, flags);
+-#endif /* SUSPEND_USES_PMU */
+ break;
+ }
+ } while (1);
+@@ -1307,18 +1289,11 @@
+ return;
+ }
+ adb_int_pending = 1;
+-#ifdef SUSPEND_USES_PMU
+- pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
+- spin_unlock_irqrestore(&pmu_lock, flags);
+- while(!req.complete)
+- pmu_poll();
+-#else /* SUSPEND_USES_PMU */
+ if (gpio_irq >= 0)
+ enable_irq(gpio_irq);
+ out_8(&via[IER], CB1_INT | IER_SET);
+ spin_unlock_irqrestore(&pmu_lock, flags);
+ pmu_poll();
+-#endif /* SUSPEND_USES_PMU */
+ }
+
+ /* Interrupt data could be the result data from an ADB cmd */
+@@ -1738,228 +1713,7 @@
+ return via != 0;
+ }
+
+-#ifdef CONFIG_PM_SLEEP
+-
+-static LIST_HEAD(sleep_notifiers);
+-
+-int
+-pmu_register_sleep_notifier(struct pmu_sleep_notifier *n)
+-{
+- struct list_head *list;
+- struct pmu_sleep_notifier *notifier;
+-
+- for (list = sleep_notifiers.next; list != &sleep_notifiers;
+- list = list->next) {
+- notifier = list_entry(list, struct pmu_sleep_notifier, list);
+- if (n->priority > notifier->priority)
+- break;
+- }
+- __list_add(&n->list, list->prev, list);
+- return 0;
+-}
+-EXPORT_SYMBOL(pmu_register_sleep_notifier);
+-
+-int
+-pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* n)
+-{
+- if (n->list.next == 0)
+- return -ENOENT;
+- list_del(&n->list);
+- n->list.next = NULL;
+- return 0;
+-}
+-EXPORT_SYMBOL(pmu_unregister_sleep_notifier);
+-#endif /* CONFIG_PM_SLEEP */
+-
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
+-
+-/* Sleep is broadcast last-to-first */
+-static void broadcast_sleep(int when)
+-{
+- struct list_head *list;
+- struct pmu_sleep_notifier *notifier;
+-
+- for (list = sleep_notifiers.prev; list != &sleep_notifiers;
+- list = list->prev) {
+- notifier = list_entry(list, struct pmu_sleep_notifier, list);
+- notifier->notifier_call(notifier, when);
+- }
+-}
+-
+-/* Wake is broadcast first-to-last */
+-static void broadcast_wake(void)
+-{
+- struct list_head *list;
+- struct pmu_sleep_notifier *notifier;
+-
+- for (list = sleep_notifiers.next; list != &sleep_notifiers;
+- list = list->next) {
+- notifier = list_entry(list, struct pmu_sleep_notifier, list);
+- notifier->notifier_call(notifier, PBOOK_WAKE);
+- }
+-}
+-
+-/*
+- * This struct is used to store config register values for
+- * PCI devices which may get powered off when we sleep.
+- */
+-static struct pci_save {
+-#ifndef HACKED_PCI_SAVE
+- u16 command;
+- u16 cache_lat;
+- u16 intr;
+- u32 rom_address;
+-#else
+- u32 config[16];
+-#endif
+-} *pbook_pci_saves;
+-static int pbook_npci_saves;
+-
+-static void
+-pbook_alloc_pci_save(void)
+-{
+- int npci;
+- struct pci_dev *pd = NULL;
+-
+- npci = 0;
+- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
+- ++npci;
+- }
+- if (npci == 0)
+- return;
+- pbook_pci_saves = (struct pci_save *)
+- kmalloc(npci * sizeof(struct pci_save), GFP_KERNEL);
+- pbook_npci_saves = npci;
+-}
+-
+-static void
+-pbook_free_pci_save(void)
+-{
+- if (pbook_pci_saves == NULL)
+- return;
+- kfree(pbook_pci_saves);
+- pbook_pci_saves = NULL;
+- pbook_npci_saves = 0;
+-}
+-
+-static void
+-pbook_pci_save(void)
+-{
+- struct pci_save *ps = pbook_pci_saves;
+- struct pci_dev *pd = NULL;
+- int npci = pbook_npci_saves;
+-
+- if (ps == NULL)
+- return;
+-
+- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
+- if (npci-- == 0) {
+- pci_dev_put(pd);
+- return;
+- }
+-#ifndef HACKED_PCI_SAVE
+- pci_read_config_word(pd, PCI_COMMAND, &ps->command);
+- pci_read_config_word(pd, PCI_CACHE_LINE_SIZE, &ps->cache_lat);
+- pci_read_config_word(pd, PCI_INTERRUPT_LINE, &ps->intr);
+- pci_read_config_dword(pd, PCI_ROM_ADDRESS, &ps->rom_address);
+-#else
+- int i;
+- for (i=1;i<16;i++)
+- pci_read_config_dword(pd, i<<4, &ps->config[i]);
+-#endif
+- ++ps;
+- }
+-}
+-
+-/* For this to work, we must take care of a few things: If gmac was enabled
+- * during boot, it will be in the pci dev list. If it's disabled at this point
+- * (and it will probably be), then you can't access it's config space.
+- */
+-static void
+-pbook_pci_restore(void)
+-{
+- u16 cmd;
+- struct pci_save *ps = pbook_pci_saves - 1;
+- struct pci_dev *pd = NULL;
+- int npci = pbook_npci_saves;
+- int j;
+-
+- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
+-#ifdef HACKED_PCI_SAVE
+- int i;
+- if (npci-- == 0) {
+- pci_dev_put(pd);
+- return;
+- }
+- ps++;
+- for (i=2;i<16;i++)
+- pci_write_config_dword(pd, i<<4, ps->config[i]);
+- pci_write_config_dword(pd, 4, ps->config[1]);
+-#else
+- if (npci-- == 0)
+- return;
+- ps++;
+- if (ps->command == 0)
+- continue;
+- pci_read_config_word(pd, PCI_COMMAND, &cmd);
+- if ((ps->command & ~cmd) == 0)
+- continue;
+- switch (pd->hdr_type) {
+- case PCI_HEADER_TYPE_NORMAL:
+- for (j = 0; j < 6; ++j)
+- pci_write_config_dword(pd,
+- PCI_BASE_ADDRESS_0 + j*4,
+- pd->resource[j].start);
+- pci_write_config_dword(pd, PCI_ROM_ADDRESS,
+- ps->rom_address);
+- pci_write_config_word(pd, PCI_CACHE_LINE_SIZE,
+- ps->cache_lat);
+- pci_write_config_word(pd, PCI_INTERRUPT_LINE,
+- ps->intr);
+- pci_write_config_word(pd, PCI_COMMAND, ps->command);
+- break;
+- }
+-#endif
+- }
+-}
+-
+-#ifdef DEBUG_SLEEP
+-/* N.B. This doesn't work on the 3400 */
+-void
+-pmu_blink(int n)
+-{
+- struct adb_request req;
+-
+- memset(&req, 0, sizeof(req));
+-
+- for (; n > 0; --n) {
+- req.nbytes = 4;
+- req.done = NULL;
+- req.data[0] = 0xee;
+- req.data[1] = 4;
+- req.data[2] = 0;
+- req.data[3] = 1;
+- req.reply[0] = ADB_RET_OK;
+- req.reply_len = 1;
+- req.reply_expected = 0;
+- pmu_polled_request(&req);
+- mdelay(50);
+- req.nbytes = 4;
+- req.done = NULL;
+- req.data[0] = 0xee;
+- req.data[1] = 4;
+- req.data[2] = 0;
+- req.data[3] = 0;
+- req.reply[0] = ADB_RET_OK;
+- req.reply_len = 1;
+- req.reply_expected = 0;
+- pmu_polled_request(&req);
+- mdelay(50);
+- }
+- mdelay(50);
+-}
+-#endif
+-
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ /*
+ * Put the powerbook to sleep.
+ */
+@@ -1994,134 +1748,6 @@
+ out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
+ }
+
+-extern void pmu_backlight_set_sleep(int sleep);
+-
+-static int
+-pmac_suspend_devices(void)
+-{
+- int ret;
+-
+- pm_prepare_console();
+-
+- /* Notify old-style device drivers */
+- broadcast_sleep(PBOOK_SLEEP_REQUEST);
+-
+- /* Sync the disks. */
+- /* XXX It would be nice to have some way to ensure that
+- * nobody is dirtying any new buffers while we wait. That
+- * could be achieved using the refrigerator for processes
+- * that swsusp uses
+- */
+- sys_sync();
+-
+- broadcast_sleep(PBOOK_SLEEP_NOW);
+-
+- /* Send suspend call to devices, hold the device core's dpm_sem */
+- ret = device_suspend(PMSG_SUSPEND);
+- if (ret) {
+- broadcast_wake();
+- printk(KERN_ERR "Driver sleep failed\n");
+- return -EBUSY;
+- }
+-
+-#ifdef CONFIG_PMAC_BACKLIGHT
+- /* Tell backlight code not to muck around with the chip anymore */
+- pmu_backlight_set_sleep(1);
+-#endif
+-
+- /* Call platform functions marked "on sleep" */
+- pmac_pfunc_i2c_suspend();
+- pmac_pfunc_base_suspend();
+-
+- /* Stop preemption */
+- preempt_disable();
+-
+- /* Make sure the decrementer won't interrupt us */
+- asm volatile("mtdec %0" : : "r" (0x7fffffff));
+- /* Make sure any pending DEC interrupt occurring while we did
+- * the above didn't re-enable the DEC */
+- mb();
+- asm volatile("mtdec %0" : : "r" (0x7fffffff));
+-
+- /* We can now disable MSR_EE. This code of course works properly only
+- * on UP machines... For SMP, if we ever implement sleep, we'll have to
+- * stop the "other" CPUs way before we do all that stuff.
+- */
+- local_irq_disable();
+-
+- /* Broadcast power down irq
+- * This isn't that useful in most cases (only directly wired devices can
+- * use this but still... This will take care of sysdev's as well, so
+- * we exit from here with local irqs disabled and PIC off.
+- */
+- ret = device_power_down(PMSG_SUSPEND);
+- if (ret) {
+- wakeup_decrementer();
+- local_irq_enable();
+- preempt_enable();
+- device_resume();
+- broadcast_wake();
+- printk(KERN_ERR "Driver powerdown failed\n");
+- return -EBUSY;
+- }
+-
+- /* Wait for completion of async requests */
+- while (!batt_req.complete)
+- pmu_poll();
+-
+- /* Giveup the lazy FPU & vec so we don't have to back them
+- * up from the low level code
+- */
+- enable_kernel_fp();
+-
+-#ifdef CONFIG_ALTIVEC
+- if (cpu_has_feature(CPU_FTR_ALTIVEC))
+- enable_kernel_altivec();
+-#endif /* CONFIG_ALTIVEC */
+-
+- return 0;
+-}
+-
+-static int
+-pmac_wakeup_devices(void)
+-{
+- mdelay(100);
+-
+-#ifdef CONFIG_PMAC_BACKLIGHT
+- /* Tell backlight code it can use the chip again */
+- pmu_backlight_set_sleep(0);
+-#endif
+-
+- /* Power back up system devices (including the PIC) */
+- device_power_up();
+-
+- /* Force a poll of ADB interrupts */
+- adb_int_pending = 1;
+- via_pmu_interrupt(0, NULL);
+-
+- /* Restart jiffies & scheduling */
+- wakeup_decrementer();
+-
+- /* Re-enable local CPU interrupts */
+- local_irq_enable();
+- mdelay(10);
+- preempt_enable();
+-
+- /* Call platform functions marked "on wake" */
+- pmac_pfunc_base_resume();
+- pmac_pfunc_i2c_resume();
+-
+- /* Resume devices */
+- device_resume();
+-
+- /* Notify old style drivers */
+- broadcast_wake();
+-
+- pm_restore_console();
+-
+- return 0;
+-}
+-
+ #define GRACKLE_PM (1<<7)
+ #define GRACKLE_DOZE (1<<5)
+ #define GRACKLE_NAP (1<<4)
+@@ -2132,19 +1758,12 @@
+ unsigned long save_l2cr;
+ unsigned short pmcr1;
+ struct adb_request req;
+- int ret;
+ struct pci_dev *grackle;
+
+ grackle = pci_get_bus_and_slot(0, 0);
+ if (!grackle)
+ return -ENODEV;
+
+- ret = pmac_suspend_devices();
+- if (ret) {
+- printk(KERN_ERR "Sleep rejected by devices\n");
+- return ret;
+- }
+-
+ /* Turn off various things. Darwin does some retry tests here... */
+ pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
+ pmu_wait_complete(&req);
+@@ -2207,8 +1826,6 @@
+ PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
+ pmu_wait_complete(&req);
+
+- pmac_wakeup_devices();
+-
+ return 0;
+ }
+
+@@ -2218,7 +1835,6 @@
+ unsigned long save_l2cr;
+ unsigned long save_l3cr;
+ struct adb_request req;
+- int ret;
+
+ if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
+ printk(KERN_ERR "Sleep mode not supported on this machine\n");
+@@ -2228,12 +1844,6 @@
+ if (num_online_cpus() > 1 || cpu_is_offline(0))
+ return -EAGAIN;
+
+- ret = pmac_suspend_devices();
+- if (ret) {
+- printk(KERN_ERR "Sleep rejected by devices\n");
+- return ret;
+- }
+-
+ /* Stop environment and ADB interrupts */
+ pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
+ pmu_wait_complete(&req);
+@@ -2304,45 +1914,33 @@
+ /* Restore LPJ, cpufreq will adjust the cpu frequency */
+ loops_per_jiffy /= 2;
+
+- pmac_wakeup_devices();
+-
+ return 0;
+ }
+
+ #define PB3400_MEM_CTRL 0xf8000000
+ #define PB3400_MEM_CTRL_SLEEP 0x70
+
+-static int
+-powerbook_sleep_3400(void)
++static void __iomem *pb3400_mem_ctrl;
++
++static void powerbook_sleep_init_3400(void)
+ {
+- int ret, i, x;
++ /* map in the memory controller registers */
++ pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
++ if (pb3400_mem_ctrl == NULL)
++ printk(KERN_WARNING "ioremap failed: sleep won't be possible");
++}
++
++static int powerbook_sleep_3400(void)
++{
++ int i, x;
+ unsigned int hid0;
+- unsigned long p;
++ unsigned long msr;
+ struct adb_request sleep_req;
+- void __iomem *mem_ctrl;
+ unsigned int __iomem *mem_ctrl_sleep;
+
+- /* first map in the memory controller registers */
+- mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
+- if (mem_ctrl == NULL) {
+- printk("powerbook_sleep_3400: ioremap failed\n");
++ if (pb3400_mem_ctrl == NULL)
+ return -ENOMEM;
+- }
+- mem_ctrl_sleep = mem_ctrl + PB3400_MEM_CTRL_SLEEP;
+-
+- /* Allocate room for PCI save */
+- pbook_alloc_pci_save();
+-
+- ret = pmac_suspend_devices();
+- if (ret) {
+- pbook_free_pci_save();
+- iounmap(mem_ctrl);
+- printk(KERN_ERR "Sleep rejected by devices\n");
+- return ret;
+- }
+-
+- /* Save the state of PCI config space for some slots */
+- pbook_pci_save();
++ mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
+
+ /* Set the memory controller to keep the memory refreshed
+ while we're asleep */
+@@ -2357,41 +1955,34 @@
+
+ /* Ask the PMU to put us to sleep */
+ pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
+- while (!sleep_req.complete)
+- mb();
++ pmu_wait_complete(&sleep_req);
++ pmu_unlock();
+
+- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
++ pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
+
+- /* displacement-flush the L2 cache - necessary? */
+- for (p = KERNELBASE; p < KERNELBASE + 0x100000; p += 0x1000)
+- i = *(volatile int *)p;
+ asleep = 1;
+
+ /* Put the CPU into sleep mode */
+ hid0 = mfspr(SPRN_HID0);
+ hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
+ mtspr(SPRN_HID0, hid0);
+- mtmsr(mfmsr() | MSR_POW | MSR_EE);
+- udelay(10);
++ local_irq_enable();
++ msr = mfmsr() | MSR_POW;
++ while (asleep) {
++ mb();
++ mtmsr(msr);
++ isync();
++ }
++ local_irq_disable();
+
+ /* OK, we're awake again, start restoring things */
+ out_be32(mem_ctrl_sleep, 0x3f);
+- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
+- pbook_pci_restore();
+- pmu_unlock();
+-
+- /* wait for the PMU interrupt sequence to complete */
+- while (asleep)
+- mb();
+-
+- pmac_wakeup_devices();
+- pbook_free_pci_save();
+- iounmap(mem_ctrl);
++ pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
+
+ return 0;
+ }
+
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
++#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
+
+ /*
+ * Support for /dev/pmu device
+@@ -2548,7 +2139,6 @@
+ struct pmu_private *pp = file->private_data;
+ unsigned long flags;
+
+- lock_kernel();
+ if (pp != 0) {
+ file->private_data = NULL;
+ spin_lock_irqsave(&all_pvt_lock, flags);
+@@ -2562,10 +2152,96 @@
+
+ kfree(pp);
+ }
+- unlock_kernel();
+ return 0;
+ }
+
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
++static void pmac_suspend_disable_irqs(void)
++{
++ /* Call platform functions marked "on sleep" */
++ pmac_pfunc_i2c_suspend();
++ pmac_pfunc_base_suspend();
++}
++
++static int powerbook_sleep(suspend_state_t state)
++{
++ int error = 0;
++
++ /* Wait for completion of async requests */
++ while (!batt_req.complete)
++ pmu_poll();
++
++ /* Giveup the lazy FPU & vec so we don't have to back them
++ * up from the low level code
++ */
++ enable_kernel_fp();
++
++#ifdef CONFIG_ALTIVEC
++ if (cpu_has_feature(CPU_FTR_ALTIVEC))
++ enable_kernel_altivec();
++#endif /* CONFIG_ALTIVEC */
++
++ switch (pmu_kind) {
++ case PMU_OHARE_BASED:
++ error = powerbook_sleep_3400();
++ break;
++ case PMU_HEATHROW_BASED:
++ case PMU_PADDINGTON_BASED:
++ error = powerbook_sleep_grackle();
++ break;
++ case PMU_KEYLARGO_BASED:
++ error = powerbook_sleep_Core99();
++ break;
++ default:
++ return -ENOSYS;
++ }
++
++ if (error)
++ return error;
++
++ mdelay(100);
++
++ return 0;
++}
++
++static void pmac_suspend_enable_irqs(void)
++{
++ /* Force a poll of ADB interrupts */
++ adb_int_pending = 1;
++ via_pmu_interrupt(0, NULL);
++
++ mdelay(10);
++
++ /* Call platform functions marked "on wake" */
++ pmac_pfunc_base_resume();
++ pmac_pfunc_i2c_resume();
++}
++
++static int pmu_sleep_valid(suspend_state_t state)
++{
++ return state == PM_SUSPEND_MEM
++ && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
++}
++
++static struct platform_suspend_ops pmu_pm_ops = {
++ .enter = powerbook_sleep,
++ .valid = pmu_sleep_valid,
++};
++
++static int register_pmu_pm_ops(void)
++{
++ if (pmu_kind == PMU_OHARE_BASED)
++ powerbook_sleep_init_3400();
++ ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
++ ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
++ suspend_set_ops(&pmu_pm_ops);
++
++ return 0;
++}
++
++device_initcall(register_pmu_pm_ops);
++#endif
++
+ static int
+ pmu_ioctl(struct inode * inode, struct file *filp,
+ u_int cmd, u_long arg)
+@@ -2574,35 +2250,15 @@
+ int error = -EINVAL;
+
+ switch (cmd) {
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
+ case PMU_IOC_SLEEP:
+ if (!capable(CAP_SYS_ADMIN))
+ return -EACCES;
+- if (sleep_in_progress)
+- return -EBUSY;
+- sleep_in_progress = 1;
+- switch (pmu_kind) {
+- case PMU_OHARE_BASED:
+- error = powerbook_sleep_3400();
+- break;
+- case PMU_HEATHROW_BASED:
+- case PMU_PADDINGTON_BASED:
+- error = powerbook_sleep_grackle();
+- break;
+- case PMU_KEYLARGO_BASED:
+- error = powerbook_sleep_Core99();
+- break;
+- default:
+- error = -ENOSYS;
+- }
+- sleep_in_progress = 0;
+- break;
++ return pm_suspend(PM_SUSPEND_MEM);
+ case PMU_IOC_CAN_SLEEP:
+- if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0)
++ if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
+ return put_user(0, argp);
+ else
+ return put_user(1, argp);
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
+
+ #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
+ /* Compatibility ioctl's for backlight */
+@@ -2610,9 +2266,6 @@
+ {
+ int brightness;
+
+- if (sleep_in_progress)
+- return -EBUSY;
+-
+ brightness = pmac_backlight_get_legacy_brightness();
+ if (brightness < 0)
+ return brightness;
+@@ -2624,9 +2277,6 @@
+ {
+ int brightness;
+
+- if (sleep_in_progress)
+- return -EBUSY;
+-
+ error = get_user(brightness, argp);
+ if (error)
+ return error;
+@@ -2751,15 +2401,43 @@
+ local_irq_restore(flags);
+ return 0;
+ }
+-#endif /* DEBUG_SLEEP */
+
++/* N.B. This doesn't work on the 3400 */
++void pmu_blink(int n)
++{
++ struct adb_request req;
+
+-/* FIXME: This is a temporary set of callbacks to enable us
+- * to do suspend-to-disk.
+- */
++ memset(&req, 0, sizeof(req));
+
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++ for (; n > 0; --n) {
++ req.nbytes = 4;
++ req.done = NULL;
++ req.data[0] = 0xee;
++ req.data[1] = 4;
++ req.data[2] = 0;
++ req.data[3] = 1;
++ req.reply[0] = ADB_RET_OK;
++ req.reply_len = 1;
++ req.reply_expected = 0;
++ pmu_polled_request(&req);
++ mdelay(50);
++ req.nbytes = 4;
++ req.done = NULL;
++ req.data[0] = 0xee;
++ req.data[1] = 4;
++ req.data[2] = 0;
++ req.data[3] = 0;
++ req.reply[0] = ADB_RET_OK;
++ req.reply_len = 1;
++ req.reply_expected = 0;
++ pmu_polled_request(&req);
++ mdelay(50);
++ }
++ mdelay(50);
++}
++#endif /* DEBUG_SLEEP */
+
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ int pmu_sys_suspended;
+
+ static int pmu_sys_suspend(struct sys_device *sysdev, pm_message_t state)
+@@ -2767,10 +2445,15 @@
+ if (state.event != PM_EVENT_SUSPEND || pmu_sys_suspended)
+ return 0;
+
+- /* Suspend PMU event interrupts */
++ /* Suspend PMU event interrupts */\
+ pmu_suspend();
+-
+ pmu_sys_suspended = 1;
++
++#ifdef CONFIG_PMAC_BACKLIGHT
++ /* Tell backlight code not to muck around with the chip anymore */
++ pmu_backlight_set_sleep(1);
++#endif
++
+ return 0;
+ }
+
+@@ -2785,15 +2468,18 @@
+ pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
+ pmu_wait_complete(&req);
+
++#ifdef CONFIG_PMAC_BACKLIGHT
++ /* Tell backlight code it can use the chip again */
++ pmu_backlight_set_sleep(0);
++#endif
+ /* Resume PMU event interrupts */
+ pmu_resume();
+-
+ pmu_sys_suspended = 0;
+
+ return 0;
+ }
+
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
++#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
+
+ static struct sysdev_class pmu_sysclass = {
+ set_kset_name("pmu"),
+@@ -2804,10 +2490,10 @@
+ };
+
+ static struct sysdev_driver driver_pmu = {
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ .suspend = &pmu_sys_suspend,
+ .resume = &pmu_sys_resume,
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
++#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
+ };
+
+ static int __init init_pmu_sysfs(void)
+@@ -2842,10 +2528,10 @@
+ EXPORT_SYMBOL(pmu_suspend);
+ EXPORT_SYMBOL(pmu_resume);
+ EXPORT_SYMBOL(pmu_unlock);
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
+ EXPORT_SYMBOL(pmu_enable_irled);
+ EXPORT_SYMBOL(pmu_battery_count);
+ EXPORT_SYMBOL(pmu_batteries);
+ EXPORT_SYMBOL(pmu_power_flags);
+-#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
++#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/fs_enet/fs_enet-main.c powerpc.git/drivers/net/fs_enet/fs_enet-main.c
+--- linux-2.6.24/drivers/net/fs_enet/fs_enet-main.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/fs_enet/fs_enet-main.c 2008-01-28 20:26:12.000000000 +0100
+@@ -1178,8 +1178,15 @@
+ struct device_node *phynode, *mdionode;
+ struct resource res;
+ int ret = 0, len;
++ const u32 *data;
++
++ data = of_get_property(np, "fixed-link", NULL);
++ if (data) {
++ snprintf(fpi->bus_id, 16, PHY_ID_FMT, 0, *data);
++ return 0;
++ }
+
+- const u32 *data = of_get_property(np, "phy-handle", &len);
++ data = of_get_property(np, "phy-handle", &len);
+ if (!data || len != 4)
+ return -EINVAL;
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/fs_enet/mac-fcc.c powerpc.git/drivers/net/fs_enet/mac-fcc.c
+--- linux-2.6.24/drivers/net/fs_enet/mac-fcc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/fs_enet/mac-fcc.c 2008-01-28 20:26:12.000000000 +0100
+@@ -81,16 +81,8 @@
+ static inline int fcc_cr_cmd(struct fs_enet_private *fep, u32 op)
+ {
+ const struct fs_platform_info *fpi = fep->fpi;
+- int i;
+
+- W32(cpmp, cp_cpcr, fpi->cp_command | op | CPM_CR_FLG);
+- for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
+- if ((R32(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
+- return 0;
+-
+- printk(KERN_ERR "%s(): Not able to issue CPM command\n",
+- __FUNCTION__);
+- return 1;
++ return cpm_command(fpi->cp_command, op);
+ }
+
+ static int do_pd_setup(struct fs_enet_private *fep)
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/fs_enet/mac-scc.c powerpc.git/drivers/net/fs_enet/mac-scc.c
+--- linux-2.6.24/drivers/net/fs_enet/mac-scc.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/fs_enet/mac-scc.c 2008-01-28 20:26:12.000000000 +0100
+@@ -89,21 +89,12 @@
+ * Delay to wait for SCC reset command to complete (in us)
+ */
+ #define SCC_RESET_DELAY 50
+-#define MAX_CR_CMD_LOOPS 10000
+
+ static inline int scc_cr_cmd(struct fs_enet_private *fep, u32 op)
+ {
+ const struct fs_platform_info *fpi = fep->fpi;
+- int i;
+
+- W16(cpmp, cp_cpcr, fpi->cp_command | CPM_CR_FLG | (op << 8));
+- for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
+- if ((R16(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
+- return 0;
+-
+- printk(KERN_ERR "%s(): Not able to issue CPM command\n",
+- __FUNCTION__);
+- return 1;
++ return cpm_command(fpi->cp_command, op);
+ }
+
+ static int do_pd_setup(struct fs_enet_private *fep)
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/ibm_newemac/core.c powerpc.git/drivers/net/ibm_newemac/core.c
+--- linux-2.6.24/drivers/net/ibm_newemac/core.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/ibm_newemac/core.c 2008-01-28 20:26:12.000000000 +0100
+@@ -37,6 +37,7 @@
+ #include <linux/mii.h>
+ #include <linux/bitops.h>
+ #include <linux/workqueue.h>
++#include <linux/of.h>
+
+ #include <asm/processor.h>
+ #include <asm/io.h>
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/phy/Kconfig powerpc.git/drivers/net/phy/Kconfig
+--- linux-2.6.24/drivers/net/phy/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/phy/Kconfig 2008-01-28 20:26:14.000000000 +0100
+@@ -61,34 +61,12 @@
+ Currently supports the IP175C PHY.
+
+ config FIXED_PHY
+- tristate "Drivers for PHY emulation on fixed speed/link"
++ bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
+ ---help---
+- Adds the driver to PHY layer to cover the boards that do not have any PHY bound,
+- but with the ability to manipulate the speed/link in software. The relevant MII
+- speed/duplex parameters could be effectively handled in a user-specified function.
+- Currently tested with mpc866ads.
++ Adds the platform "fixed" MDIO Bus to cover the boards that use
++ PHYs that are not connected to the real MDIO bus.
+
+-config FIXED_MII_10_FDX
+- bool "Emulation for 10M Fdx fixed PHY behavior"
+- depends on FIXED_PHY
+-
+-config FIXED_MII_100_FDX
+- bool "Emulation for 100M Fdx fixed PHY behavior"
+- depends on FIXED_PHY
+-
+-config FIXED_MII_1000_FDX
+- bool "Emulation for 1000M Fdx fixed PHY behavior"
+- depends on FIXED_PHY
+-
+-config FIXED_MII_AMNT
+- int "Number of emulated PHYs to allocate "
+- depends on FIXED_PHY
+- default "1"
+- ---help---
+- Sometimes it is required to have several independent emulated
+- PHYs on the bus (in case of multi-eth but phy-less HW for instance).
+- This control will have specified number allocated for each fixed
+- PHY type enabled.
++ Currently tested with mpc866ads and mpc8349e-mitx.
+
+ config MDIO_BITBANG
+ tristate "Support for bitbanged MDIO buses"
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/phy/fixed.c powerpc.git/drivers/net/phy/fixed.c
+--- linux-2.6.24/drivers/net/phy/fixed.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/phy/fixed.c 2008-01-28 20:26:14.000000000 +0100
+@@ -1,362 +1,253 @@
+ /*
+- * drivers/net/phy/fixed.c
++ * Fixed MDIO bus (MDIO bus emulation with fixed PHYs)
+ *
+- * Driver for fixed PHYs, when transceiver is able to operate in one fixed mode.
++ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
++ * Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+- * Author: Vitaly Bordug
+- *
+- * Copyright (c) 2006 MontaVista Software, Inc.
++ * Copyright (c) 2006-2007 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+- *
+ */
++
+ #include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/errno.h>
+-#include <linux/unistd.h>
+-#include <linux/slab.h>
+-#include <linux/interrupt.h>
+-#include <linux/init.h>
+-#include <linux/delay.h>
+-#include <linux/netdevice.h>
+-#include <linux/etherdevice.h>
+-#include <linux/skbuff.h>
+-#include <linux/spinlock.h>
+-#include <linux/mm.h>
+ #include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/list.h>
+ #include <linux/mii.h>
+-#include <linux/ethtool.h>
+ #include <linux/phy.h>
+ #include <linux/phy_fixed.h>
+
+-#include <asm/io.h>
+-#include <asm/irq.h>
+-#include <asm/uaccess.h>
+-
+-/* we need to track the allocated pointers in order to free them on exit */
+-static struct fixed_info *fixed_phy_ptrs[CONFIG_FIXED_MII_AMNT*MAX_PHY_AMNT];
+-
+-/*-----------------------------------------------------------------------------
+- * If something weird is required to be done with link/speed,
+- * network driver is able to assign a function to implement this.
+- * May be useful for PHY's that need to be software-driven.
+- *-----------------------------------------------------------------------------*/
+-int fixed_mdio_set_link_update(struct phy_device *phydev,
+- int (*link_update) (struct net_device *,
+- struct fixed_phy_status *))
+-{
+- struct fixed_info *fixed;
+-
+- if (link_update == NULL)
+- return -EINVAL;
++#define MII_REGS_NUM 29
+
+- if (phydev) {
+- if (phydev->bus) {
+- fixed = phydev->bus->priv;
+- fixed->link_update = link_update;
+- return 0;
+- }
+- }
+- return -EINVAL;
+-}
+-
+-EXPORT_SYMBOL(fixed_mdio_set_link_update);
++struct fixed_mdio_bus {
++ int irqs[PHY_MAX_ADDR];
++ struct mii_bus mii_bus;
++ struct list_head phys;
++};
+
+-struct fixed_info *fixed_mdio_get_phydev (int phydev_ind)
+-{
+- if (phydev_ind >= MAX_PHY_AMNT)
+- return NULL;
+- return fixed_phy_ptrs[phydev_ind];
+-}
++struct fixed_phy {
++ int id;
++ u16 regs[MII_REGS_NUM];
++ struct phy_device *phydev;
++ struct fixed_phy_status status;
++ int (*link_update)(struct net_device *, struct fixed_phy_status *);
++ struct list_head node;
++};
+
+-EXPORT_SYMBOL(fixed_mdio_get_phydev);
++static struct platform_device *pdev;
++static struct fixed_mdio_bus platform_fmb = {
++ .phys = LIST_HEAD_INIT(platform_fmb.phys),
++};
+
+-/*-----------------------------------------------------------------------------
+- * This is used for updating internal mii regs from the status
+- *-----------------------------------------------------------------------------*/
+-#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
+-static int fixed_mdio_update_regs(struct fixed_info *fixed)
++static int fixed_phy_update_regs(struct fixed_phy *fp)
+ {
+- u16 *regs = fixed->regs;
+- u16 bmsr = 0;
++ u16 bmsr = BMSR_ANEGCAPABLE;
+ u16 bmcr = 0;
++ u16 lpagb = 0;
++ u16 lpa = 0;
+
+- if (!regs) {
+- printk(KERN_ERR "%s: regs not set up", __FUNCTION__);
+- return -EINVAL;
+- }
+-
+- if (fixed->phy_status.link)
+- bmsr |= BMSR_LSTATUS;
+-
+- if (fixed->phy_status.duplex) {
++ if (fp->status.duplex) {
+ bmcr |= BMCR_FULLDPLX;
+
+- switch (fixed->phy_status.speed) {
++ switch (fp->status.speed) {
++ case 1000:
++ bmsr |= BMSR_ESTATEN;
++ bmcr |= BMCR_SPEED1000;
++ lpagb |= LPA_1000FULL;
++ break;
+ case 100:
+ bmsr |= BMSR_100FULL;
+ bmcr |= BMCR_SPEED100;
++ lpa |= LPA_100FULL;
+ break;
+-
+ case 10:
+ bmsr |= BMSR_10FULL;
++ lpa |= LPA_10FULL;
+ break;
++ default:
++ printk(KERN_WARNING "fixed phy: unknown speed\n");
++ return -EINVAL;
+ }
+ } else {
+- switch (fixed->phy_status.speed) {
++ switch (fp->status.speed) {
++ case 1000:
++ bmsr |= BMSR_ESTATEN;
++ bmcr |= BMCR_SPEED1000;
++ lpagb |= LPA_1000HALF;
++ break;
+ case 100:
+ bmsr |= BMSR_100HALF;
+ bmcr |= BMCR_SPEED100;
++ lpa |= LPA_100HALF;
+ break;
+-
+ case 10:
+- bmsr |= BMSR_100HALF;
++ bmsr |= BMSR_10HALF;
++ lpa |= LPA_10HALF;
+ break;
++ default:
++ printk(KERN_WARNING "fixed phy: unknown speed\n");
++ return -EINVAL;
+ }
+ }
+
+- regs[MII_BMCR] = bmcr;
+- regs[MII_BMSR] = bmsr | 0x800; /*we are always capable of 10 hdx */
++ if (fp->status.link)
++ bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
++
++ if (fp->status.pause)
++ lpa |= LPA_PAUSE_CAP;
++
++ if (fp->status.asym_pause)
++ lpa |= LPA_PAUSE_ASYM;
++
++ fp->regs[MII_PHYSID1] = fp->id >> 16;
++ fp->regs[MII_PHYSID2] = fp->id;
++
++ fp->regs[MII_BMSR] = bmsr;
++ fp->regs[MII_BMCR] = bmcr;
++ fp->regs[MII_LPA] = lpa;
++ fp->regs[MII_STAT1000] = lpagb;
+
+ return 0;
+ }
+
+-static int fixed_mii_read(struct mii_bus *bus, int phy_id, int location)
++static int fixed_mdio_read(struct mii_bus *bus, int phy_id, int reg_num)
+ {
+- struct fixed_info *fixed = bus->priv;
++ struct fixed_mdio_bus *fmb = container_of(bus, struct fixed_mdio_bus,
++ mii_bus);
++ struct fixed_phy *fp;
+
+- /* if user has registered link update callback, use it */
+- if (fixed->phydev)
+- if (fixed->phydev->attached_dev) {
+- if (fixed->link_update) {
+- fixed->link_update(fixed->phydev->attached_dev,
+- &fixed->phy_status);
+- fixed_mdio_update_regs(fixed);
++ if (reg_num >= MII_REGS_NUM)
++ return -1;
++
++ list_for_each_entry(fp, &fmb->phys, node) {
++ if (fp->id == phy_id) {
++ /* Issue callback if user registered it. */
++ if (fp->link_update) {
++ fp->link_update(fp->phydev->attached_dev,
++ &fp->status);
++ fixed_phy_update_regs(fp);
+ }
++ return fp->regs[reg_num];
+ }
++ }
+
+- if ((unsigned int)location >= fixed->regs_num)
+- return -1;
+- return fixed->regs[location];
++ return 0xFFFF;
+ }
+
+-static int fixed_mii_write(struct mii_bus *bus, int phy_id, int location,
+- u16 val)
++static int fixed_mdio_write(struct mii_bus *bus, int phy_id, int reg_num,
++ u16 val)
+ {
+- /* do nothing for now */
+ return 0;
+ }
+
+-static int fixed_mii_reset(struct mii_bus *bus)
++/*
++ * If something weird is required to be done with link/speed,
++ * network driver is able to assign a function to implement this.
++ * May be useful for PHY's that need to be software-driven.
++ */
++int fixed_phy_set_link_update(struct phy_device *phydev,
++ int (*link_update)(struct net_device *,
++ struct fixed_phy_status *))
+ {
+- /*nothing here - no way/need to reset it */
+- return 0;
+-}
+-#endif
++ struct fixed_mdio_bus *fmb = &platform_fmb;
++ struct fixed_phy *fp;
+
+-static int fixed_config_aneg(struct phy_device *phydev)
+-{
+- /* :TODO:03/13/2006 09:45:37 PM::
+- The full autoneg funcionality can be emulated,
+- but no need to have anything here for now
+- */
+- return 0;
+-}
++ if (!link_update || !phydev || !phydev->bus)
++ return -EINVAL;
+
+-/*-----------------------------------------------------------------------------
+- * the manual bind will do the magic - with phy_id_mask == 0
+- * match will never return true...
+- *-----------------------------------------------------------------------------*/
+-static struct phy_driver fixed_mdio_driver = {
+- .name = "Fixed PHY",
+-#ifdef CONFIG_FIXED_MII_1000_FDX
+- .features = PHY_GBIT_FEATURES,
+-#else
+- .features = PHY_BASIC_FEATURES,
+-#endif
+- .config_aneg = fixed_config_aneg,
+- .read_status = genphy_read_status,
+- .driver = { .owner = THIS_MODULE, },
+-};
++ list_for_each_entry(fp, &fmb->phys, node) {
++ if (fp->id == phydev->phy_id) {
++ fp->link_update = link_update;
++ fp->phydev = phydev;
++ return 0;
++ }
++ }
+
+-static void fixed_mdio_release(struct device *dev)
+-{
+- struct phy_device *phydev = container_of(dev, struct phy_device, dev);
+- struct mii_bus *bus = phydev->bus;
+- struct fixed_info *fixed = bus->priv;
+-
+- kfree(phydev);
+- kfree(bus->dev);
+- kfree(bus);
+- kfree(fixed->regs);
+- kfree(fixed);
++ return -ENOENT;
+ }
++EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
+
+-/*-----------------------------------------------------------------------------
+- * This func is used to create all the necessary stuff, bind
+- * the fixed phy driver and register all it on the mdio_bus_type.
+- * speed is either 10 or 100 or 1000, duplex is boolean.
+- * number is used to create multiple fixed PHYs, so that several devices can
+- * utilize them simultaneously.
+- *
+- * The device on mdio bus will look like [bus_id]:[phy_id],
+- * bus_id = number
+- * phy_id = speed+duplex.
+- *-----------------------------------------------------------------------------*/
+-#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
+-struct fixed_info *fixed_mdio_register_device(
+- int bus_id, int speed, int duplex, u8 phy_id)
++int fixed_phy_add(unsigned int irq, int phy_id,
++ struct fixed_phy_status *status)
+ {
+- struct mii_bus *new_bus;
+- struct fixed_info *fixed;
+- struct phy_device *phydev;
+- int err;
++ int ret;
++ struct fixed_mdio_bus *fmb = &platform_fmb;
++ struct fixed_phy *fp;
+
+- struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
++ fp = kzalloc(sizeof(*fp), GFP_KERNEL);
++ if (!fp)
++ return -ENOMEM;
+
+- if (dev == NULL)
+- goto err_dev_alloc;
++ memset(fp->regs, 0xFF, sizeof(fp->regs[0]) * MII_REGS_NUM);
+
+- new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
++ fmb->irqs[phy_id] = irq;
+
+- if (new_bus == NULL)
+- goto err_bus_alloc;
+-
+- fixed = kzalloc(sizeof(struct fixed_info), GFP_KERNEL);
+-
+- if (fixed == NULL)
+- goto err_fixed_alloc;
+-
+- fixed->regs = kzalloc(MII_REGS_NUM * sizeof(int), GFP_KERNEL);
+- if (NULL == fixed->regs)
+- goto err_fixed_regs_alloc;
+-
+- fixed->regs_num = MII_REGS_NUM;
+- fixed->phy_status.speed = speed;
+- fixed->phy_status.duplex = duplex;
+- fixed->phy_status.link = 1;
+-
+- new_bus->name = "Fixed MII Bus";
+- new_bus->read = &fixed_mii_read;
+- new_bus->write = &fixed_mii_write;
+- new_bus->reset = &fixed_mii_reset;
+- /*set up workspace */
+- fixed_mdio_update_regs(fixed);
+- new_bus->priv = fixed;
+-
+- new_bus->dev = dev;
+- dev_set_drvdata(dev, new_bus);
+-
+- /* create phy_device and register it on the mdio bus */
+- phydev = phy_device_create(new_bus, 0, 0);
+- if (phydev == NULL)
+- goto err_phy_dev_create;
+-
+- /*
+- * Put the phydev pointer into the fixed pack so that bus read/write
+- * code could be able to access for instance attached netdev. Well it
+- * doesn't have to do so, only in case of utilizing user-specified
+- * link-update...
+- */
+-
+- fixed->phydev = phydev;
+- phydev->speed = speed;
+- phydev->duplex = duplex;
+-
+- phydev->irq = PHY_IGNORE_INTERRUPT;
+- phydev->dev.bus = &mdio_bus_type;
+-
+- snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
+- PHY_ID_FMT, bus_id, phy_id);
+-
+- phydev->bus = new_bus;
+-
+- phydev->dev.driver = &fixed_mdio_driver.driver;
+- phydev->dev.release = fixed_mdio_release;
+- err = phydev->dev.driver->probe(&phydev->dev);
+- if (err < 0) {
+- printk(KERN_ERR "Phy %s: problems with fixed driver\n",
+- phydev->dev.bus_id);
+- goto err_out;
+- }
+- err = device_register(&phydev->dev);
+- if (err) {
+- printk(KERN_ERR "Phy %s failed to register\n",
+- phydev->dev.bus_id);
+- goto err_out;
+- }
+- //phydev->state = PHY_RUNNING; /* make phy go up quick, but in 10Mbit/HDX
+- return fixed;
++ fp->id = phy_id;
++ fp->status = *status;
+
+-err_out:
+- kfree(phydev);
+-err_phy_dev_create:
+- kfree(fixed->regs);
+-err_fixed_regs_alloc:
+- kfree(fixed);
+-err_fixed_alloc:
+- kfree(new_bus);
+-err_bus_alloc:
+- kfree(dev);
+-err_dev_alloc:
++ ret = fixed_phy_update_regs(fp);
++ if (ret)
++ goto err_regs;
+
+- return NULL;
++ list_add_tail(&fp->node, &fmb->phys);
+
+-}
+-#endif
++ return 0;
+
+-MODULE_DESCRIPTION("Fixed PHY device & driver for PAL");
+-MODULE_AUTHOR("Vitaly Bordug");
+-MODULE_LICENSE("GPL");
++err_regs:
++ kfree(fp);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(fixed_phy_add);
+
+-static int __init fixed_init(void)
++static int __init fixed_mdio_bus_init(void)
+ {
+- int cnt = 0;
+- int i;
+-/* register on the bus... Not expected to be matched
+- * with anything there...
+- *
+- */
+- phy_driver_register(&fixed_mdio_driver);
++ struct fixed_mdio_bus *fmb = &platform_fmb;
++ int ret;
+
+-/* We will create several mdio devices here, and will bound the upper
+- * driver to them.
+- *
+- * Then the external software can lookup the phy bus by searching
+- * for 0:101, to be connected to the virtual 100M Fdx phy.
+- *
+- * In case several virtual PHYs required, the bus_id will be in form
+- * [num]:[duplex]+[speed], which make it able even to define
+- * driver-specific link control callback, if for instance PHY is
+- * completely SW-driven.
+- */
+- for (i=1; i <= CONFIG_FIXED_MII_AMNT; i++) {
+-#ifdef CONFIG_FIXED_MII_1000_FDX
+- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(0, 1000, 1, i);
+-#endif
+-#ifdef CONFIG_FIXED_MII_100_FDX
+- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(1, 100, 1, i);
+-#endif
+-#ifdef CONFIG_FIXED_MII_10_FDX
+- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(2, 10, 1, i);
+-#endif
++ pdev = platform_device_register_simple("Fixed MDIO bus", 0, NULL, 0);
++ if (!pdev) {
++ ret = -ENOMEM;
++ goto err_pdev;
+ }
+
++ fmb->mii_bus.id = 0;
++ fmb->mii_bus.name = "Fixed MDIO Bus";
++ fmb->mii_bus.dev = &pdev->dev;
++ fmb->mii_bus.read = &fixed_mdio_read;
++ fmb->mii_bus.write = &fixed_mdio_write;
++ fmb->mii_bus.irq = fmb->irqs;
++
++ ret = mdiobus_register(&fmb->mii_bus);
++ if (ret)
++ goto err_mdiobus_reg;
++
+ return 0;
++
++err_mdiobus_reg:
++ platform_device_unregister(pdev);
++err_pdev:
++ return ret;
+ }
++module_init(fixed_mdio_bus_init);
+
+-static void __exit fixed_exit(void)
++static void __exit fixed_mdio_bus_exit(void)
+ {
+- int i;
++ struct fixed_mdio_bus *fmb = &platform_fmb;
++ struct fixed_phy *fp;
+
+- phy_driver_unregister(&fixed_mdio_driver);
+- for (i=0; i < MAX_PHY_AMNT; i++)
+- if ( fixed_phy_ptrs[i] )
+- device_unregister(&fixed_phy_ptrs[i]->phydev->dev);
++ mdiobus_unregister(&fmb->mii_bus);
++ platform_device_unregister(pdev);
++
++ list_for_each_entry(fp, &fmb->phys, node) {
++ list_del(&fp->node);
++ kfree(fp);
++ }
+ }
++module_exit(fixed_mdio_bus_exit);
+
+-module_init(fixed_init);
+-module_exit(fixed_exit);
++MODULE_DESCRIPTION("Fixed MDIO bus (MDIO bus emulation with fixed PHYs)");
++MODULE_AUTHOR("Vitaly Bordug");
++MODULE_LICENSE("GPL");
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/ps3_gelic_net.c powerpc.git/drivers/net/ps3_gelic_net.c
+--- linux-2.6.24/drivers/net/ps3_gelic_net.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/ps3_gelic_net.c 2008-01-28 20:26:14.000000000 +0100
+@@ -58,11 +58,11 @@
+ {
+ return &card->dev->core;
+ }
+-static inline unsigned int bus_id(struct gelic_net_card *card)
++static inline u64 bus_id(struct gelic_net_card *card)
+ {
+ return card->dev->bus_id;
+ }
+-static inline unsigned int dev_id(struct gelic_net_card *card)
++static inline u64 dev_id(struct gelic_net_card *card)
+ {
+ return card->dev->dev_id;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/net/ucc_geth.c powerpc.git/drivers/net/ucc_geth.c
+--- linux-2.6.24/drivers/net/ucc_geth.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/net/ucc_geth.c 2008-01-28 20:26:14.000000000 +0100
+@@ -3822,6 +3822,7 @@
+ int err, ucc_num, max_speed = 0;
+ const phandle *ph;
+ const unsigned int *prop;
++ const char *sprop;
+ const void *mac_addr;
+ phy_interface_t phy_interface;
+ static const int enet_to_speed[] = {
+@@ -3854,10 +3855,56 @@
+
+ ug_info->uf_info.ucc_num = ucc_num;
+
+- prop = of_get_property(np, "rx-clock", NULL);
+- ug_info->uf_info.rx_clock = *prop;
+- prop = of_get_property(np, "tx-clock", NULL);
+- ug_info->uf_info.tx_clock = *prop;
++ sprop = of_get_property(np, "rx-clock-name", NULL);
++ if (sprop) {
++ ug_info->uf_info.rx_clock = qe_clock_source(sprop);
++ if ((ug_info->uf_info.rx_clock < QE_CLK_NONE) ||
++ (ug_info->uf_info.rx_clock > QE_CLK24)) {
++ printk(KERN_ERR
++ "ucc_geth: invalid rx-clock-name property\n");
++ return -EINVAL;
++ }
++ } else {
++ prop = of_get_property(np, "rx-clock", NULL);
++ if (!prop) {
++ /* If both rx-clock-name and rx-clock are missing,
++ we want to tell people to use rx-clock-name. */
++ printk(KERN_ERR
++ "ucc_geth: missing rx-clock-name property\n");
++ return -EINVAL;
++ }
++ if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
++ printk(KERN_ERR
++ "ucc_geth: invalid rx-clock propperty\n");
++ return -EINVAL;
++ }
++ ug_info->uf_info.rx_clock = *prop;
++ }
++
++ sprop = of_get_property(np, "tx-clock-name", NULL);
++ if (sprop) {
++ ug_info->uf_info.tx_clock = qe_clock_source(sprop);
++ if ((ug_info->uf_info.tx_clock < QE_CLK_NONE) ||
++ (ug_info->uf_info.tx_clock > QE_CLK24)) {
++ printk(KERN_ERR
++ "ucc_geth: invalid tx-clock-name property\n");
++ return -EINVAL;
++ }
++ } else {
++ prop = of_get_property(np, "rx-clock", NULL);
++ if (!prop) {
++ printk(KERN_ERR
++ "ucc_geth: mising tx-clock-name property\n");
++ return -EINVAL;
++ }
++ if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
++ printk(KERN_ERR
++ "ucc_geth: invalid tx-clock property\n");
++ return -EINVAL;
++ }
++ ug_info->uf_info.tx_clock = *prop;
++ }
++
+ err = of_address_to_resource(np, 0, &res);
+ if (err)
+ return -EINVAL;
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/of/base.c powerpc.git/drivers/of/base.c
+--- linux-2.6.24/drivers/of/base.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/of/base.c 2008-01-28 20:26:17.000000000 +0100
+@@ -273,3 +273,61 @@
+ return np;
+ }
+ EXPORT_SYMBOL(of_find_compatible_node);
++
++/**
++ * of_match_node - Tell if an device_node has a matching of_match structure
++ * @matches: array of of device match structures to search in
++ * @node: the of device structure to match against
++ *
++ * Low level utility function used by device matching.
++ */
++const struct of_device_id *of_match_node(const struct of_device_id *matches,
++ const struct device_node *node)
++{
++ while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
++ int match = 1;
++ if (matches->name[0])
++ match &= node->name
++ && !strcmp(matches->name, node->name);
++ if (matches->type[0])
++ match &= node->type
++ && !strcmp(matches->type, node->type);
++ if (matches->compatible[0])
++ match &= of_device_is_compatible(node,
++ matches->compatible);
++ if (match)
++ return matches;
++ matches++;
++ }
++ return NULL;
++}
++EXPORT_SYMBOL(of_match_node);
++
++/**
++ * of_find_matching_node - Find a node based on an of_device_id match
++ * table.
++ * @from: The node to start searching from or NULL, the node
++ * you pass will not be searched, only the next one
++ * will; typically, you pass what the previous call
++ * returned. of_node_put() will be called on it
++ * @matches: array of of device match structures to search in
++ *
++ * Returns a node pointer with refcount incremented, use
++ * of_node_put() on it when done.
++ */
++struct device_node *of_find_matching_node(struct device_node *from,
++ const struct of_device_id *matches)
++{
++ struct device_node *np;
++
++ read_lock(&devtree_lock);
++ np = from ? from->allnext : allnodes;
++ for (; np; np = np->allnext) {
++ if (of_match_node(matches, np) && of_node_get(np))
++ break;
++ }
++ of_node_put(from);
++ read_unlock(&devtree_lock);
++ return np;
++}
++EXPORT_SYMBOL(of_find_matching_node);
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/of/device.c powerpc.git/drivers/of/device.c
+--- linux-2.6.24/drivers/of/device.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/of/device.c 2008-01-28 20:26:17.000000000 +0100
+@@ -10,35 +10,6 @@
+ #include <asm/errno.h>
+
+ /**
+- * of_match_node - Tell if an device_node has a matching of_match structure
+- * @ids: array of of device match structures to search in
+- * @node: the of device structure to match against
+- *
+- * Low level utility function used by device matching.
+- */
+-const struct of_device_id *of_match_node(const struct of_device_id *matches,
+- const struct device_node *node)
+-{
+- while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
+- int match = 1;
+- if (matches->name[0])
+- match &= node->name
+- && !strcmp(matches->name, node->name);
+- if (matches->type[0])
+- match &= node->type
+- && !strcmp(matches->type, node->type);
+- if (matches->compatible[0])
+- match &= of_device_is_compatible(node,
+- matches->compatible);
+- if (match)
+- return matches;
+- matches++;
+- }
+- return NULL;
+-}
+-EXPORT_SYMBOL(of_match_node);
+-
+-/**
+ * of_match_device - Tell if an of_device structure has a matching
+ * of_match structure
+ * @ids: array of of device match structures to search in
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ps3/Makefile powerpc.git/drivers/ps3/Makefile
+--- linux-2.6.24/drivers/ps3/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ps3/Makefile 2008-01-28 20:26:18.000000000 +0100
+@@ -4,3 +4,4 @@
+ obj-$(CONFIG_PPC_PS3) += sys-manager-core.o
+ obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o
+ obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o
++obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ps3/ps3-lpm.c powerpc.git/drivers/ps3/ps3-lpm.c
+--- linux-2.6.24/drivers/ps3/ps3-lpm.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/drivers/ps3/ps3-lpm.c 2008-01-28 20:26:18.000000000 +0100
+@@ -0,0 +1,1248 @@
++/*
++ * PS3 Logical Performance Monitor.
++ *
++ * Copyright (C) 2007 Sony Computer Entertainment Inc.
++ * Copyright 2007 Sony Corp.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; version 2 of the License.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/uaccess.h>
++#include <asm/ps3.h>
++#include <asm/lv1call.h>
++#include <asm/cell-pmu.h>
++
++
++/* BOOKMARK tag macros */
++#define PS3_PM_BOOKMARK_START 0x8000000000000000ULL
++#define PS3_PM_BOOKMARK_STOP 0x4000000000000000ULL
++#define PS3_PM_BOOKMARK_TAG_KERNEL 0x1000000000000000ULL
++#define PS3_PM_BOOKMARK_TAG_USER 0x3000000000000000ULL
++#define PS3_PM_BOOKMARK_TAG_MASK_HI 0xF000000000000000ULL
++#define PS3_PM_BOOKMARK_TAG_MASK_LO 0x0F00000000000000ULL
++
++/* CBE PM CONTROL register macros */
++#define PS3_PM_CONTROL_PPU_TH0_BOOKMARK 0x00001000
++#define PS3_PM_CONTROL_PPU_TH1_BOOKMARK 0x00000800
++#define PS3_PM_CONTROL_PPU_COUNT_MODE_MASK 0x000C0000
++#define PS3_PM_CONTROL_PPU_COUNT_MODE_PROBLEM 0x00080000
++#define PS3_WRITE_PM_MASK 0xFFFFFFFFFFFFFFFFULL
++
++/* CBE PM START STOP register macros */
++#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START 0x02000000
++#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START 0x01000000
++#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP 0x00020000
++#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP 0x00010000
++#define PS3_PM_START_STOP_START_MASK 0xFF000000
++#define PS3_PM_START_STOP_STOP_MASK 0x00FF0000
++
++/* CBE PM COUNTER register macres */
++#define PS3_PM_COUNTER_MASK_HI 0xFFFFFFFF00000000ULL
++#define PS3_PM_COUNTER_MASK_LO 0x00000000FFFFFFFFULL
++
++/* BASE SIGNAL GROUP NUMBER macros */
++#define PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER 0
++#define PM_ISLAND2_SIGNAL_GROUP_NUMBER1 6
++#define PM_ISLAND2_SIGNAL_GROUP_NUMBER2 7
++#define PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER 7
++#define PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER 15
++#define PM_SPU_TRIGGER_SIGNAL_GROUP_NUMBER 17
++#define PM_SPU_EVENT_SIGNAL_GROUP_NUMBER 18
++#define PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER 18
++#define PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER 24
++#define PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER 49
++#define PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER 52
++#define PM_SIG_GROUP_SPU 41
++#define PM_SIG_GROUP_SPU_TRIGGER 42
++#define PM_SIG_GROUP_SPU_EVENT 43
++#define PM_SIG_GROUP_MFC_MAX 60
++
++/**
++ * struct ps3_lpm_shadow_regs - Performance monitor shadow registers.
++ *
++ * @pm_control: Shadow of the processor's pm_control register.
++ * @pm_start_stop: Shadow of the processor's pm_start_stop register.
++ * @pm_interval: Shadow of the processor's pm_interval register.
++ * @group_control: Shadow of the processor's group_control register.
++ * @debug_bus_control: Shadow of the processor's debug_bus_control register.
++ *
++ * The logical performance monitor provides a write-only interface to
++ * these processor registers. These shadow variables cache the processor
++ * register values for reading.
++ *
++ * The initial value of the shadow registers at lpm creation is
++ * PS3_LPM_SHADOW_REG_INIT.
++ */
++
++struct ps3_lpm_shadow_regs {
++ u64 pm_control;
++ u64 pm_start_stop;
++ u64 pm_interval;
++ u64 group_control;
++ u64 debug_bus_control;
++};
++
++#define PS3_LPM_SHADOW_REG_INIT 0xFFFFFFFF00000000ULL
++
++/**
++ * struct ps3_lpm_priv - Private lpm device data.
++ *
++ * @open: An atomic variable indicating the lpm driver has been opened.
++ * @rights: The lpm rigths granted by the system policy module. A logical
++ * OR of enum ps3_lpm_rights.
++ * @node_id: The node id of a BE prosessor whose performance monitor this
++ * lpar has the right to use.
++ * @pu_id: The lv1 id of the logical PU.
++ * @lpm_id: The lv1 id of this lpm instance.
++ * @outlet_id: The outlet created by lv1 for this lpm instance.
++ * @tb_count: The number of bytes of data held in the lv1 trace buffer.
++ * @tb_cache: Kernel buffer to receive the data from the lv1 trace buffer.
++ * Must be 128 byte aligned.
++ * @tb_cache_size: Size of the kernel @tb_cache buffer. Must be 128 byte
++ * aligned.
++ * @tb_cache_internal: An unaligned buffer allocated by this driver to be
++ * used for the trace buffer cache when ps3_lpm_open() is called with a
++ * NULL tb_cache argument. Otherwise unused.
++ * @shadow: Processor register shadow of type struct ps3_lpm_shadow_regs.
++ * @sbd: The struct ps3_system_bus_device attached to this driver.
++ *
++ * The trace buffer is a buffer allocated and used internally to the lv1
++ * hypervisor to collect trace data. The trace buffer cache is a guest
++ * buffer that accepts the trace data from the trace buffer.
++ */
++
++struct ps3_lpm_priv {
++ atomic_t open;
++ u64 rights;
++ u64 node_id;
++ u64 pu_id;
++ u64 lpm_id;
++ u64 outlet_id;
++ u64 tb_count;
++ void *tb_cache;
++ u64 tb_cache_size;
++ void *tb_cache_internal;
++ struct ps3_lpm_shadow_regs shadow;
++ struct ps3_system_bus_device *sbd;
++};
++
++enum {
++ PS3_LPM_DEFAULT_TB_CACHE_SIZE = 0x4000,
++};
++
++/**
++ * lpm_priv - Static instance of the lpm data.
++ *
++ * Since the exported routines don't support the notion of a device
++ * instance we need to hold the instance in this static variable
++ * and then only allow at most one instance at a time to be created.
++ */
++
++static struct ps3_lpm_priv *lpm_priv;
++
++static struct device *sbd_core(void)
++{
++ BUG_ON(!lpm_priv || !lpm_priv->sbd);
++ return &lpm_priv->sbd->core;
++}
++
++/**
++ * use_start_stop_bookmark - Enable the PPU bookmark trace.
++ *
++ * And it enables PPU bookmark triggers ONLY if the other triggers are not set.
++ * The start/stop bookmarks are inserted at ps3_enable_pm() and ps3_disable_pm()
++ * to start/stop LPM.
++ *
++ * Used to get good quality of the performance counter.
++ */
++
++enum {use_start_stop_bookmark = 1,};
++
++void ps3_set_bookmark(u64 bookmark)
++{
++ /*
++ * As per the PPE book IV, to avoid bookmark loss there must
++ * not be a traced branch within 10 cycles of setting the
++ * SPRN_BKMK register. The actual text is unclear if 'within'
++ * includes cycles before the call.
++ */
++
++ asm volatile("or 29, 29, 29;"); /* db10cyc */
++ mtspr(SPRN_BKMK, bookmark);
++ asm volatile("or 29, 29, 29;"); /* db10cyc */
++}
++EXPORT_SYMBOL_GPL(ps3_set_bookmark);
++
++void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id)
++{
++ u64 bookmark;
++
++ bookmark = (get_tb() & 0x00000000FFFFFFFFULL) |
++ PS3_PM_BOOKMARK_TAG_KERNEL;
++ bookmark = ((tag << 56) & PS3_PM_BOOKMARK_TAG_MASK_LO) |
++ (incident << 48) | (th_id << 32) | bookmark;
++ ps3_set_bookmark(bookmark);
++}
++EXPORT_SYMBOL_GPL(ps3_set_pm_bookmark);
++
++/**
++ * ps3_read_phys_ctr - Read physical counter registers.
++ *
++ * Each physical counter can act as one 32 bit counter or as two 16 bit
++ * counters.
++ */
++
++u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr)
++{
++ int result;
++ u64 counter0415;
++ u64 counter2637;
++
++ if (phys_ctr >= NR_PHYS_CTRS) {
++ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
++ __LINE__, phys_ctr);
++ return 0;
++ }
++
++ result = lv1_set_lpm_counter(lpm_priv->lpm_id, 0, 0, 0, 0, &counter0415,
++ &counter2637);
++ if (result) {
++ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
++ "phys_ctr %u, %s\n", __func__, __LINE__, phys_ctr,
++ ps3_result(result));
++ return 0;
++ }
++
++ switch (phys_ctr) {
++ case 0:
++ return counter0415 >> 32;
++ case 1:
++ return counter0415 & PS3_PM_COUNTER_MASK_LO;
++ case 2:
++ return counter2637 >> 32;
++ case 3:
++ return counter2637 & PS3_PM_COUNTER_MASK_LO;
++ default:
++ BUG();
++ }
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_read_phys_ctr);
++
++/**
++ * ps3_write_phys_ctr - Write physical counter registers.
++ *
++ * Each physical counter can act as one 32 bit counter or as two 16 bit
++ * counters.
++ */
++
++void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val)
++{
++ u64 counter0415;
++ u64 counter0415_mask;
++ u64 counter2637;
++ u64 counter2637_mask;
++ int result;
++
++ if (phys_ctr >= NR_PHYS_CTRS) {
++ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
++ __LINE__, phys_ctr);
++ return;
++ }
++
++ switch (phys_ctr) {
++ case 0:
++ counter0415 = (u64)val << 32;
++ counter0415_mask = PS3_PM_COUNTER_MASK_HI;
++ counter2637 = 0x0;
++ counter2637_mask = 0x0;
++ break;
++ case 1:
++ counter0415 = (u64)val;
++ counter0415_mask = PS3_PM_COUNTER_MASK_LO;
++ counter2637 = 0x0;
++ counter2637_mask = 0x0;
++ break;
++ case 2:
++ counter0415 = 0x0;
++ counter0415_mask = 0x0;
++ counter2637 = (u64)val << 32;
++ counter2637_mask = PS3_PM_COUNTER_MASK_HI;
++ break;
++ case 3:
++ counter0415 = 0x0;
++ counter0415_mask = 0x0;
++ counter2637 = (u64)val;
++ counter2637_mask = PS3_PM_COUNTER_MASK_LO;
++ break;
++ default:
++ BUG();
++ }
++
++ result = lv1_set_lpm_counter(lpm_priv->lpm_id,
++ counter0415, counter0415_mask,
++ counter2637, counter2637_mask,
++ &counter0415, &counter2637);
++ if (result)
++ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
++ "phys_ctr %u, val %u, %s\n", __func__, __LINE__,
++ phys_ctr, val, ps3_result(result));
++}
++EXPORT_SYMBOL_GPL(ps3_write_phys_ctr);
++
++/**
++ * ps3_read_ctr - Read counter.
++ *
++ * Read 16 or 32 bits depending on the current size of the counter.
++ * Counters 4, 5, 6 & 7 are always 16 bit.
++ */
++
++u32 ps3_read_ctr(u32 cpu, u32 ctr)
++{
++ u32 val;
++ u32 phys_ctr = ctr & (NR_PHYS_CTRS - 1);
++
++ val = ps3_read_phys_ctr(cpu, phys_ctr);
++
++ if (ps3_get_ctr_size(cpu, phys_ctr) == 16)
++ val = (ctr < NR_PHYS_CTRS) ? (val >> 16) : (val & 0xffff);
++
++ return val;
++}
++EXPORT_SYMBOL_GPL(ps3_read_ctr);
++
++/**
++ * ps3_write_ctr - Write counter.
++ *
++ * Write 16 or 32 bits depending on the current size of the counter.
++ * Counters 4, 5, 6 & 7 are always 16 bit.
++ */
++
++void ps3_write_ctr(u32 cpu, u32 ctr, u32 val)
++{
++ u32 phys_ctr;
++ u32 phys_val;
++
++ phys_ctr = ctr & (NR_PHYS_CTRS - 1);
++
++ if (ps3_get_ctr_size(cpu, phys_ctr) == 16) {
++ phys_val = ps3_read_phys_ctr(cpu, phys_ctr);
++
++ if (ctr < NR_PHYS_CTRS)
++ val = (val << 16) | (phys_val & 0xffff);
++ else
++ val = (val & 0xffff) | (phys_val & 0xffff0000);
++ }
++
++ ps3_write_phys_ctr(cpu, phys_ctr, val);
++}
++EXPORT_SYMBOL_GPL(ps3_write_ctr);
++
++/**
++ * ps3_read_pm07_control - Read counter control registers.
++ *
++ * Each logical counter has a corresponding control register.
++ */
++
++u32 ps3_read_pm07_control(u32 cpu, u32 ctr)
++{
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_read_pm07_control);
++
++/**
++ * ps3_write_pm07_control - Write counter control registers.
++ *
++ * Each logical counter has a corresponding control register.
++ */
++
++void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val)
++{
++ int result;
++ static const u64 mask = 0xFFFFFFFFFFFFFFFFULL;
++ u64 old_value;
++
++ if (ctr >= NR_CTRS) {
++ dev_dbg(sbd_core(), "%s:%u: ctr too big: %u\n", __func__,
++ __LINE__, ctr);
++ return;
++ }
++
++ result = lv1_set_lpm_counter_control(lpm_priv->lpm_id, ctr, val, mask,
++ &old_value);
++ if (result)
++ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter_control "
++ "failed: ctr %u, %s\n", __func__, __LINE__, ctr,
++ ps3_result(result));
++}
++EXPORT_SYMBOL_GPL(ps3_write_pm07_control);
++
++/**
++ * ps3_read_pm - Read Other LPM control registers.
++ */
++
++u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg)
++{
++ int result = 0;
++ u64 val = 0;
++
++ switch (reg) {
++ case pm_control:
++ return lpm_priv->shadow.pm_control;
++ case trace_address:
++ return CBE_PM_TRACE_BUF_EMPTY;
++ case pm_start_stop:
++ return lpm_priv->shadow.pm_start_stop;
++ case pm_interval:
++ return lpm_priv->shadow.pm_interval;
++ case group_control:
++ return lpm_priv->shadow.group_control;
++ case debug_bus_control:
++ return lpm_priv->shadow.debug_bus_control;
++ case pm_status:
++ result = lv1_get_lpm_interrupt_status(lpm_priv->lpm_id,
++ &val);
++ if (result) {
++ val = 0;
++ dev_dbg(sbd_core(), "%s:%u: lv1 get_lpm_status failed: "
++ "reg %u, %s\n", __func__, __LINE__, reg,
++ ps3_result(result));
++ }
++ return (u32)val;
++ case ext_tr_timer:
++ return 0;
++ default:
++ dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
++ __LINE__, reg);
++ BUG();
++ break;
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_read_pm);
++
++/**
++ * ps3_write_pm - Write Other LPM control registers.
++ */
++
++void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val)
++{
++ int result = 0;
++ u64 dummy;
++
++ switch (reg) {
++ case group_control:
++ if (val != lpm_priv->shadow.group_control)
++ result = lv1_set_lpm_group_control(lpm_priv->lpm_id,
++ val,
++ PS3_WRITE_PM_MASK,
++ &dummy);
++ lpm_priv->shadow.group_control = val;
++ break;
++ case debug_bus_control:
++ if (val != lpm_priv->shadow.debug_bus_control)
++ result = lv1_set_lpm_debug_bus_control(lpm_priv->lpm_id,
++ val,
++ PS3_WRITE_PM_MASK,
++ &dummy);
++ lpm_priv->shadow.debug_bus_control = val;
++ break;
++ case pm_control:
++ if (use_start_stop_bookmark)
++ val |= (PS3_PM_CONTROL_PPU_TH0_BOOKMARK |
++ PS3_PM_CONTROL_PPU_TH1_BOOKMARK);
++ if (val != lpm_priv->shadow.pm_control)
++ result = lv1_set_lpm_general_control(lpm_priv->lpm_id,
++ val,
++ PS3_WRITE_PM_MASK,
++ 0, 0, &dummy,
++ &dummy);
++ lpm_priv->shadow.pm_control = val;
++ break;
++ case pm_interval:
++ if (val != lpm_priv->shadow.pm_interval)
++ result = lv1_set_lpm_interval(lpm_priv->lpm_id, val,
++ PS3_WRITE_PM_MASK, &dummy);
++ lpm_priv->shadow.pm_interval = val;
++ break;
++ case pm_start_stop:
++ if (val != lpm_priv->shadow.pm_start_stop)
++ result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
++ val,
++ PS3_WRITE_PM_MASK,
++ &dummy);
++ lpm_priv->shadow.pm_start_stop = val;
++ break;
++ case trace_address:
++ case ext_tr_timer:
++ case pm_status:
++ break;
++ default:
++ dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
++ __LINE__, reg);
++ BUG();
++ break;
++ }
++
++ if (result)
++ dev_err(sbd_core(), "%s:%u: lv1 set_control failed: "
++ "reg %u, %s\n", __func__, __LINE__, reg,
++ ps3_result(result));
++}
++EXPORT_SYMBOL_GPL(ps3_write_pm);
++
++/**
++ * ps3_get_ctr_size - Get the size of a physical counter.
++ *
++ * Returns either 16 or 32.
++ */
++
++u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr)
++{
++ u32 pm_ctrl;
++
++ if (phys_ctr >= NR_PHYS_CTRS) {
++ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
++ __LINE__, phys_ctr);
++ return 0;
++ }
++
++ pm_ctrl = ps3_read_pm(cpu, pm_control);
++ return (pm_ctrl & CBE_PM_16BIT_CTR(phys_ctr)) ? 16 : 32;
++}
++EXPORT_SYMBOL_GPL(ps3_get_ctr_size);
++
++/**
++ * ps3_set_ctr_size - Set the size of a physical counter to 16 or 32 bits.
++ */
++
++void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size)
++{
++ u32 pm_ctrl;
++
++ if (phys_ctr >= NR_PHYS_CTRS) {
++ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
++ __LINE__, phys_ctr);
++ return;
++ }
++
++ pm_ctrl = ps3_read_pm(cpu, pm_control);
++
++ switch (ctr_size) {
++ case 16:
++ pm_ctrl |= CBE_PM_16BIT_CTR(phys_ctr);
++ ps3_write_pm(cpu, pm_control, pm_ctrl);
++ break;
++
++ case 32:
++ pm_ctrl &= ~CBE_PM_16BIT_CTR(phys_ctr);
++ ps3_write_pm(cpu, pm_control, pm_ctrl);
++ break;
++ default:
++ BUG();
++ }
++}
++EXPORT_SYMBOL_GPL(ps3_set_ctr_size);
++
++static u64 pm_translate_signal_group_number_on_island2(u64 subgroup)
++{
++
++ if (subgroup == 2)
++ subgroup = 3;
++
++ if (subgroup <= 6)
++ return PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++ else if (subgroup == 7)
++ return PM_ISLAND2_SIGNAL_GROUP_NUMBER1;
++ else
++ return PM_ISLAND2_SIGNAL_GROUP_NUMBER2;
++}
++
++static u64 pm_translate_signal_group_number_on_island3(u64 subgroup)
++{
++
++ switch (subgroup) {
++ case 2:
++ case 3:
++ case 4:
++ subgroup += 2;
++ break;
++ case 5:
++ subgroup = 8;
++ break;
++ default:
++ break;
++ }
++ return PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++}
++
++static u64 pm_translate_signal_group_number_on_island4(u64 subgroup)
++{
++ return PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++}
++
++static u64 pm_translate_signal_group_number_on_island5(u64 subgroup)
++{
++
++ switch (subgroup) {
++ case 3:
++ subgroup = 4;
++ break;
++ case 4:
++ subgroup = 6;
++ break;
++ default:
++ break;
++ }
++ return PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++}
++
++static u64 pm_translate_signal_group_number_on_island6(u64 subgroup,
++ u64 subsubgroup)
++{
++ switch (subgroup) {
++ case 3:
++ case 4:
++ case 5:
++ subgroup += 1;
++ break;
++ default:
++ break;
++ }
++
++ switch (subsubgroup) {
++ case 4:
++ case 5:
++ case 6:
++ subsubgroup += 2;
++ break;
++ case 7:
++ case 8:
++ case 9:
++ case 10:
++ subsubgroup += 4;
++ break;
++ case 11:
++ case 12:
++ case 13:
++ subsubgroup += 5;
++ break;
++ default:
++ break;
++ }
++
++ if (subgroup <= 5)
++ return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup);
++ else
++ return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup
++ + subsubgroup - 1);
++}
++
++static u64 pm_translate_signal_group_number_on_island7(u64 subgroup)
++{
++ return PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++}
++
++static u64 pm_translate_signal_group_number_on_island8(u64 subgroup)
++{
++ return PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER + subgroup;
++}
++
++static u64 pm_signal_group_to_ps3_lv1_signal_group(u64 group)
++{
++ u64 island;
++ u64 subgroup;
++ u64 subsubgroup;
++
++ subgroup = 0;
++ subsubgroup = 0;
++ island = 0;
++ if (group < 1000) {
++ if (group < 100) {
++ if (20 <= group && group < 30) {
++ island = 2;
++ subgroup = group - 20;
++ } else if (30 <= group && group < 40) {
++ island = 3;
++ subgroup = group - 30;
++ } else if (40 <= group && group < 50) {
++ island = 4;
++ subgroup = group - 40;
++ } else if (50 <= group && group < 60) {
++ island = 5;
++ subgroup = group - 50;
++ } else if (60 <= group && group < 70) {
++ island = 6;
++ subgroup = group - 60;
++ } else if (70 <= group && group < 80) {
++ island = 7;
++ subgroup = group - 70;
++ } else if (80 <= group && group < 90) {
++ island = 8;
++ subgroup = group - 80;
++ }
++ } else if (200 <= group && group < 300) {
++ island = 2;
++ subgroup = group - 200;
++ } else if (600 <= group && group < 700) {
++ island = 6;
++ subgroup = 5;
++ subsubgroup = group - 650;
++ }
++ } else if (6000 <= group && group < 7000) {
++ island = 6;
++ subgroup = 5;
++ subsubgroup = group - 6500;
++ }
++
++ switch (island) {
++ case 2:
++ return pm_translate_signal_group_number_on_island2(subgroup);
++ case 3:
++ return pm_translate_signal_group_number_on_island3(subgroup);
++ case 4:
++ return pm_translate_signal_group_number_on_island4(subgroup);
++ case 5:
++ return pm_translate_signal_group_number_on_island5(subgroup);
++ case 6:
++ return pm_translate_signal_group_number_on_island6(subgroup,
++ subsubgroup);
++ case 7:
++ return pm_translate_signal_group_number_on_island7(subgroup);
++ case 8:
++ return pm_translate_signal_group_number_on_island8(subgroup);
++ default:
++ dev_dbg(sbd_core(), "%s:%u: island not found: %lu\n", __func__,
++ __LINE__, group);
++ BUG();
++ break;
++ }
++ return 0;
++}
++
++static u64 pm_bus_word_to_ps3_lv1_bus_word(u8 word)
++{
++
++ switch (word) {
++ case 1:
++ return 0xF000;
++ case 2:
++ return 0x0F00;
++ case 4:
++ return 0x00F0;
++ case 8:
++ default:
++ return 0x000F;
++ }
++}
++
++static int __ps3_set_signal(u64 lv1_signal_group, u64 bus_select,
++ u64 signal_select, u64 attr1, u64 attr2, u64 attr3)
++{
++ int ret;
++
++ ret = lv1_set_lpm_signal(lpm_priv->lpm_id, lv1_signal_group, bus_select,
++ signal_select, attr1, attr2, attr3);
++ if (ret)
++ dev_err(sbd_core(),
++ "%s:%u: error:%d 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
++ __func__, __LINE__, ret, lv1_signal_group, bus_select,
++ signal_select, attr1, attr2, attr3);
++
++ return ret;
++}
++
++int ps3_set_signal(u64 signal_group, u8 signal_bit, u16 sub_unit,
++ u8 bus_word)
++{
++ int ret;
++ u64 lv1_signal_group;
++ u64 bus_select;
++ u64 signal_select;
++ u64 attr1, attr2, attr3;
++
++ if (signal_group == 0)
++ return __ps3_set_signal(0, 0, 0, 0, 0, 0);
++
++ lv1_signal_group =
++ pm_signal_group_to_ps3_lv1_signal_group(signal_group);
++ bus_select = pm_bus_word_to_ps3_lv1_bus_word(bus_word);
++
++ switch (signal_group) {
++ case PM_SIG_GROUP_SPU_TRIGGER:
++ signal_select = 1;
++ signal_select = signal_select << (63 - signal_bit);
++ break;
++ case PM_SIG_GROUP_SPU_EVENT:
++ signal_select = 1;
++ signal_select = (signal_select << (63 - signal_bit)) | 0x3;
++ break;
++ default:
++ signal_select = 0;
++ break;
++ }
++
++ /*
++ * 0: physical object.
++ * 1: logical object.
++ * This parameter is only used for the PPE and SPE signals.
++ */
++ attr1 = 1;
++
++ /*
++ * This parameter is used to specify the target physical/logical
++ * PPE/SPE object.
++ */
++ if (PM_SIG_GROUP_SPU <= signal_group &&
++ signal_group < PM_SIG_GROUP_MFC_MAX)
++ attr2 = sub_unit;
++ else
++ attr2 = lpm_priv->pu_id;
++
++ /*
++ * This parameter is only used for setting the SPE signal.
++ */
++ attr3 = 0;
++
++ ret = __ps3_set_signal(lv1_signal_group, bus_select, signal_select,
++ attr1, attr2, attr3);
++ if (ret)
++ dev_err(sbd_core(), "%s:%u: __ps3_set_signal failed: %d\n",
++ __func__, __LINE__, ret);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(ps3_set_signal);
++
++u32 ps3_get_hw_thread_id(int cpu)
++{
++ return get_hard_smp_processor_id(cpu);
++}
++EXPORT_SYMBOL_GPL(ps3_get_hw_thread_id);
++
++/**
++ * ps3_enable_pm - Enable the entire performance monitoring unit.
++ *
++ * When we enable the LPM, all pending writes to counters get committed.
++ */
++
++void ps3_enable_pm(u32 cpu)
++{
++ int result;
++ u64 tmp;
++ int insert_bookmark = 0;
++
++ lpm_priv->tb_count = 0;
++
++ if (use_start_stop_bookmark) {
++ if (!(lpm_priv->shadow.pm_start_stop &
++ (PS3_PM_START_STOP_START_MASK
++ | PS3_PM_START_STOP_STOP_MASK))) {
++ result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
++ (PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START |
++ PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START |
++ PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP |
++ PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP),
++ 0xFFFFFFFFFFFFFFFFULL, &tmp);
++
++ if (result)
++ dev_err(sbd_core(), "%s:%u: "
++ "lv1_set_lpm_trigger_control failed: "
++ "%s\n", __func__, __LINE__,
++ ps3_result(result));
++
++ insert_bookmark = !result;
++ }
++ }
++
++ result = lv1_start_lpm(lpm_priv->lpm_id);
++
++ if (result)
++ dev_err(sbd_core(), "%s:%u: lv1_start_lpm failed: %s\n",
++ __func__, __LINE__, ps3_result(result));
++
++ if (use_start_stop_bookmark && !result && insert_bookmark)
++ ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_START);
++}
++EXPORT_SYMBOL_GPL(ps3_enable_pm);
++
++/**
++ * ps3_disable_pm - Disable the entire performance monitoring unit.
++ */
++
++void ps3_disable_pm(u32 cpu)
++{
++ int result;
++ u64 tmp;
++
++ ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_STOP);
++
++ result = lv1_stop_lpm(lpm_priv->lpm_id, &tmp);
++
++ if (result) {
++ if(result != LV1_WRONG_STATE)
++ dev_err(sbd_core(), "%s:%u: lv1_stop_lpm failed: %s\n",
++ __func__, __LINE__, ps3_result(result));
++ return;
++ }
++
++ lpm_priv->tb_count = tmp;
++
++ dev_dbg(sbd_core(), "%s:%u: tb_count %lu (%lxh)\n", __func__, __LINE__,
++ lpm_priv->tb_count, lpm_priv->tb_count);
++}
++EXPORT_SYMBOL_GPL(ps3_disable_pm);
++
++/**
++ * ps3_lpm_copy_tb - Copy data from the trace buffer to a kernel buffer.
++ * @offset: Offset in bytes from the start of the trace buffer.
++ * @buf: Copy destination.
++ * @count: Maximum count of bytes to copy.
++ * @bytes_copied: Pointer to a variable that will recieve the number of
++ * bytes copied to @buf.
++ *
++ * On error @buf will contain any successfully copied trace buffer data
++ * and bytes_copied will be set to the number of bytes successfully copied.
++ */
++
++int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
++ unsigned long *bytes_copied)
++{
++ int result;
++
++ *bytes_copied = 0;
++
++ if (!lpm_priv->tb_cache)
++ return -EPERM;
++
++ if (offset >= lpm_priv->tb_count)
++ return 0;
++
++ count = min(count, lpm_priv->tb_count - offset);
++
++ while (*bytes_copied < count) {
++ const unsigned long request = count - *bytes_copied;
++ u64 tmp;
++
++ result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
++ request, &tmp);
++ if (result) {
++ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
++ __func__, __LINE__, request, offset);
++
++ dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
++ "failed: %s\n", __func__, __LINE__,
++ ps3_result(result));
++ return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
++ }
++
++ memcpy(buf, lpm_priv->tb_cache, tmp);
++ buf += tmp;
++ *bytes_copied += tmp;
++ offset += tmp;
++ }
++ dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
++ *bytes_copied);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb);
++
++/**
++ * ps3_lpm_copy_tb_to_user - Copy data from the trace buffer to a user buffer.
++ * @offset: Offset in bytes from the start of the trace buffer.
++ * @buf: A __user copy destination.
++ * @count: Maximum count of bytes to copy.
++ * @bytes_copied: Pointer to a variable that will recieve the number of
++ * bytes copied to @buf.
++ *
++ * On error @buf will contain any successfully copied trace buffer data
++ * and bytes_copied will be set to the number of bytes successfully copied.
++ */
++
++int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
++ unsigned long count, unsigned long *bytes_copied)
++{
++ int result;
++
++ *bytes_copied = 0;
++
++ if (!lpm_priv->tb_cache)
++ return -EPERM;
++
++ if (offset >= lpm_priv->tb_count)
++ return 0;
++
++ count = min(count, lpm_priv->tb_count - offset);
++
++ while (*bytes_copied < count) {
++ const unsigned long request = count - *bytes_copied;
++ u64 tmp;
++
++ result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
++ request, &tmp);
++ if (result) {
++ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
++ __func__, __LINE__, request, offset);
++ dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
++ "failed: %s\n", __func__, __LINE__,
++ ps3_result(result));
++ return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
++ }
++
++ result = copy_to_user(buf, lpm_priv->tb_cache, tmp);
++
++ if (result) {
++ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%p\n",
++ __func__, __LINE__, tmp, buf);
++ dev_err(sbd_core(), "%s:%u: copy_to_user failed: %d\n",
++ __func__, __LINE__, result);
++ return -EFAULT;
++ }
++
++ buf += tmp;
++ *bytes_copied += tmp;
++ offset += tmp;
++ }
++ dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
++ *bytes_copied);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb_to_user);
++
++/**
++ * ps3_get_and_clear_pm_interrupts -
++ *
++ * Clearing interrupts for the entire performance monitoring unit.
++ * Reading pm_status clears the interrupt bits.
++ */
++
++u32 ps3_get_and_clear_pm_interrupts(u32 cpu)
++{
++ return ps3_read_pm(cpu, pm_status);
++}
++EXPORT_SYMBOL_GPL(ps3_get_and_clear_pm_interrupts);
++
++/**
++ * ps3_enable_pm_interrupts -
++ *
++ * Enabling interrupts for the entire performance monitoring unit.
++ * Enables the interrupt bits in the pm_status register.
++ */
++
++void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
++{
++ if (mask)
++ ps3_write_pm(cpu, pm_status, mask);
++}
++EXPORT_SYMBOL_GPL(ps3_enable_pm_interrupts);
++
++/**
++ * ps3_enable_pm_interrupts -
++ *
++ * Disabling interrupts for the entire performance monitoring unit.
++ */
++
++void ps3_disable_pm_interrupts(u32 cpu)
++{
++ ps3_get_and_clear_pm_interrupts(cpu);
++ ps3_write_pm(cpu, pm_status, 0);
++}
++EXPORT_SYMBOL_GPL(ps3_disable_pm_interrupts);
++
++/**
++ * ps3_lpm_open - Open the logical performance monitor device.
++ * @tb_type: Specifies the type of trace buffer lv1 sould use for this lpm
++ * instance, specified by one of enum ps3_lpm_tb_type.
++ * @tb_cache: Optional user supplied buffer to use as the trace buffer cache.
++ * If NULL, the driver will allocate and manage an internal buffer.
++ * Unused when when @tb_type is PS3_LPM_TB_TYPE_NONE.
++ * @tb_cache_size: The size in bytes of the user supplied @tb_cache buffer.
++ * Unused when @tb_cache is NULL or @tb_type is PS3_LPM_TB_TYPE_NONE.
++ */
++
++int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
++ u64 tb_cache_size)
++{
++ int result;
++ u64 tb_size;
++
++ BUG_ON(!lpm_priv);
++ BUG_ON(tb_type != PS3_LPM_TB_TYPE_NONE
++ && tb_type != PS3_LPM_TB_TYPE_INTERNAL);
++
++ if (tb_type == PS3_LPM_TB_TYPE_NONE && tb_cache)
++ dev_dbg(sbd_core(), "%s:%u: bad in vals\n", __func__, __LINE__);
++
++ if (!atomic_add_unless(&lpm_priv->open, 1, 1)) {
++ dev_dbg(sbd_core(), "%s:%u: busy\n", __func__, __LINE__);
++ return -EBUSY;
++ }
++
++ /* Note tb_cache needs 128 byte alignment. */
++
++ if (tb_type == PS3_LPM_TB_TYPE_NONE) {
++ lpm_priv->tb_cache_size = 0;
++ lpm_priv->tb_cache_internal = NULL;
++ lpm_priv->tb_cache = NULL;
++ } else if (tb_cache) {
++ if (tb_cache != (void *)_ALIGN_UP((unsigned long)tb_cache, 128)
++ || tb_cache_size != _ALIGN_UP(tb_cache_size, 128)) {
++ dev_err(sbd_core(), "%s:%u: unaligned tb_cache\n",
++ __func__, __LINE__);
++ result = -EINVAL;
++ goto fail_align;
++ }
++ lpm_priv->tb_cache_size = tb_cache_size;
++ lpm_priv->tb_cache_internal = NULL;
++ lpm_priv->tb_cache = tb_cache;
++ } else {
++ lpm_priv->tb_cache_size = PS3_LPM_DEFAULT_TB_CACHE_SIZE;
++ lpm_priv->tb_cache_internal = kzalloc(
++ lpm_priv->tb_cache_size + 127, GFP_KERNEL);
++ if (!lpm_priv->tb_cache_internal) {
++ dev_err(sbd_core(), "%s:%u: alloc internal tb_cache "
++ "failed\n", __func__, __LINE__);
++ result = -ENOMEM;
++ goto fail_malloc;
++ }
++ lpm_priv->tb_cache = (void *)_ALIGN_UP(
++ (unsigned long)lpm_priv->tb_cache_internal, 128);
++ }
++
++ result = lv1_construct_lpm(lpm_priv->node_id, tb_type, 0, 0,
++ ps3_mm_phys_to_lpar(__pa(lpm_priv->tb_cache)),
++ lpm_priv->tb_cache_size, &lpm_priv->lpm_id,
++ &lpm_priv->outlet_id, &tb_size);
++
++ if (result) {
++ dev_err(sbd_core(), "%s:%u: lv1_construct_lpm failed: %s\n",
++ __func__, __LINE__, ps3_result(result));
++ result = -EINVAL;
++ goto fail_construct;
++ }
++
++ lpm_priv->shadow.pm_control = PS3_LPM_SHADOW_REG_INIT;
++ lpm_priv->shadow.pm_start_stop = PS3_LPM_SHADOW_REG_INIT;
++ lpm_priv->shadow.pm_interval = PS3_LPM_SHADOW_REG_INIT;
++ lpm_priv->shadow.group_control = PS3_LPM_SHADOW_REG_INIT;
++ lpm_priv->shadow.debug_bus_control = PS3_LPM_SHADOW_REG_INIT;
++
++ dev_dbg(sbd_core(), "%s:%u: lpm_id 0x%lx, outlet_id 0x%lx, "
++ "tb_size 0x%lx\n", __func__, __LINE__, lpm_priv->lpm_id,
++ lpm_priv->outlet_id, tb_size);
++
++ return 0;
++
++fail_construct:
++ kfree(lpm_priv->tb_cache_internal);
++ lpm_priv->tb_cache_internal = NULL;
++fail_malloc:
++fail_align:
++ atomic_dec(&lpm_priv->open);
++ return result;
++}
++EXPORT_SYMBOL_GPL(ps3_lpm_open);
++
++/**
++ * ps3_lpm_close - Close the lpm device.
++ *
++ */
++
++int ps3_lpm_close(void)
++{
++ dev_dbg(sbd_core(), "%s:%u\n", __func__, __LINE__);
++
++ lv1_destruct_lpm(lpm_priv->lpm_id);
++ lpm_priv->lpm_id = 0;
++
++ kfree(lpm_priv->tb_cache_internal);
++ lpm_priv->tb_cache_internal = NULL;
++
++ atomic_dec(&lpm_priv->open);
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ps3_lpm_close);
++
++static int __devinit ps3_lpm_probe(struct ps3_system_bus_device *dev)
++{
++ dev_dbg(&dev->core, " -> %s:%u\n", __func__, __LINE__);
++
++ if (lpm_priv) {
++ dev_info(&dev->core, "%s:%u: called twice\n",
++ __func__, __LINE__);
++ return -EBUSY;
++ }
++
++ lpm_priv = kzalloc(sizeof(*lpm_priv), GFP_KERNEL);
++
++ if (!lpm_priv)
++ return -ENOMEM;
++
++ lpm_priv->sbd = dev;
++ lpm_priv->node_id = dev->lpm.node_id;
++ lpm_priv->pu_id = dev->lpm.pu_id;
++ lpm_priv->rights = dev->lpm.rights;
++
++ dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
++
++ return 0;
++}
++
++static int ps3_lpm_remove(struct ps3_system_bus_device *dev)
++{
++ dev_dbg(&dev->core, " -> %s:%u:\n", __func__, __LINE__);
++
++ ps3_lpm_close();
++
++ kfree(lpm_priv);
++ lpm_priv = NULL;
++
++ dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
++ return 0;
++}
++
++static struct ps3_system_bus_driver ps3_lpm_driver = {
++ .match_id = PS3_MATCH_ID_LPM,
++ .core.name = "ps3-lpm",
++ .core.owner = THIS_MODULE,
++ .probe = ps3_lpm_probe,
++ .remove = ps3_lpm_remove,
++ .shutdown = ps3_lpm_remove,
++};
++
++static int __init ps3_lpm_init(void)
++{
++ pr_debug("%s:%d:\n", __func__, __LINE__);
++ return ps3_system_bus_driver_register(&ps3_lpm_driver);
++}
++
++static void __exit ps3_lpm_exit(void)
++{
++ pr_debug("%s:%d:\n", __func__, __LINE__);
++ ps3_system_bus_driver_unregister(&ps3_lpm_driver);
++}
++
++module_init(ps3_lpm_init);
++module_exit(ps3_lpm_exit);
++
++MODULE_LICENSE("GPL v2");
++MODULE_DESCRIPTION("PS3 Logical Performance Monitor Driver");
++MODULE_AUTHOR("Sony Corporation");
++MODULE_ALIAS(PS3_MODULE_ALIAS_LPM);
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ps3/ps3-sys-manager.c powerpc.git/drivers/ps3/ps3-sys-manager.c
+--- linux-2.6.24/drivers/ps3/ps3-sys-manager.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ps3/ps3-sys-manager.c 2008-01-28 20:26:18.000000000 +0100
+@@ -452,7 +452,7 @@
+ case PS3_SM_EVENT_THERMAL_ALERT:
+ dev_dbg(&dev->core, "%s:%d: THERMAL_ALERT (zone %u)\n",
+ __func__, __LINE__, event.value);
+- printk(KERN_INFO "PS3 Thermal Alert Zone %u\n", event.value);
++ pr_info("PS3 Thermal Alert Zone %u\n", event.value);
+ break;
+ case PS3_SM_EVENT_THERMAL_CLEARED:
+ dev_dbg(&dev->core, "%s:%d: THERMAL_CLEARED (zone %u)\n",
+@@ -488,7 +488,7 @@
+ result = ps3_vuart_read(dev, &cmd, sizeof(cmd));
+ BUG_ON(result && "need to retry here");
+
+- if(result)
++ if (result)
+ return result;
+
+ if (cmd.version != 1) {
+@@ -521,7 +521,7 @@
+ result = ps3_vuart_read(dev, &header,
+ sizeof(struct ps3_sys_manager_header));
+
+- if(result)
++ if (result)
+ return result;
+
+ if (header.version != 1) {
+@@ -589,9 +589,9 @@
+ PS3_SM_WAKE_DEFAULT);
+ ps3_sys_manager_send_request_shutdown(dev);
+
+- printk(KERN_EMERG "System Halted, OK to turn off power\n");
++ pr_emerg("System Halted, OK to turn off power\n");
+
+- while(1)
++ while (1)
+ ps3_sys_manager_handle_msg(dev);
+ }
+
+@@ -626,9 +626,9 @@
+ PS3_SM_WAKE_DEFAULT);
+ ps3_sys_manager_send_request_shutdown(dev);
+
+- printk(KERN_EMERG "System Halted, OK to turn off power\n");
++ pr_emerg("System Halted, OK to turn off power\n");
+
+- while(1)
++ while (1)
+ ps3_sys_manager_handle_msg(dev);
+ }
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/ps3/ps3-vuart.c powerpc.git/drivers/ps3/ps3-vuart.c
+--- linux-2.6.24/drivers/ps3/ps3-vuart.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/ps3/ps3-vuart.c 2008-01-28 20:26:18.000000000 +0100
+@@ -108,18 +108,18 @@
+ struct ports_bmp {
+ u64 status;
+ u64 unused[3];
+-} __attribute__ ((aligned (32)));
++} __attribute__((aligned(32)));
+
+ #define dump_ports_bmp(_b) _dump_ports_bmp(_b, __func__, __LINE__)
+ static void __maybe_unused _dump_ports_bmp(
+- const struct ports_bmp* bmp, const char* func, int line)
++ const struct ports_bmp *bmp, const char *func, int line)
+ {
+ pr_debug("%s:%d: ports_bmp: %016lxh\n", func, line, bmp->status);
+ }
+
+ #define dump_port_params(_b) _dump_port_params(_b, __func__, __LINE__)
+ static void __maybe_unused _dump_port_params(unsigned int port_number,
+- const char* func, int line)
++ const char *func, int line)
+ {
+ #if defined(DEBUG)
+ static const char *strings[] = {
+@@ -363,7 +363,7 @@
+ */
+
+ static int ps3_vuart_raw_write(struct ps3_system_bus_device *dev,
+- const void* buf, unsigned int bytes, unsigned long *bytes_written)
++ const void *buf, unsigned int bytes, unsigned long *bytes_written)
+ {
+ int result;
+ struct ps3_vuart_port_priv *priv = to_port_priv(dev);
+@@ -431,7 +431,7 @@
+ int result;
+ struct ps3_vuart_port_priv *priv = to_port_priv(dev);
+ u64 bytes_waiting;
+- void* tmp;
++ void *tmp;
+
+ result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes_waiting);
+
+@@ -526,9 +526,8 @@
+
+ lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_KERNEL);
+
+- if (!lb) {
++ if (!lb)
+ return -ENOMEM;
+- }
+
+ memcpy(lb->data, buf, bytes);
+ lb->head = lb->data;
+@@ -878,7 +877,7 @@
+ struct vuart_bus_priv {
+ struct ports_bmp *bmp;
+ unsigned int virq;
+- struct semaphore probe_mutex;
++ struct mutex probe_mutex;
+ int use_count;
+ struct ps3_system_bus_device *devices[PORT_COUNT];
+ } static vuart_bus_priv;
+@@ -926,9 +925,8 @@
+
+ BUG_ON(vuart_bus_priv.use_count > 2);
+
+- if (vuart_bus_priv.use_count != 1) {
++ if (vuart_bus_priv.use_count != 1)
+ return 0;
+- }
+
+ BUG_ON(vuart_bus_priv.bmp);
+
+@@ -1017,7 +1015,7 @@
+ return -EINVAL;
+ }
+
+- down(&vuart_bus_priv.probe_mutex);
++ mutex_lock(&vuart_bus_priv.probe_mutex);
+
+ result = ps3_vuart_bus_interrupt_get();
+
+@@ -1077,7 +1075,7 @@
+ goto fail_probe;
+ }
+
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+
+ return result;
+
+@@ -1090,7 +1088,7 @@
+ fail_busy:
+ ps3_vuart_bus_interrupt_put();
+ fail_setup_interrupt:
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+ dev_dbg(&dev->core, "%s:%d: failed\n", __func__, __LINE__);
+ return result;
+ }
+@@ -1129,7 +1127,7 @@
+
+ BUG_ON(!dev);
+
+- down(&vuart_bus_priv.probe_mutex);
++ mutex_lock(&vuart_bus_priv.probe_mutex);
+
+ dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
+ dev->match_id);
+@@ -1137,7 +1135,7 @@
+ if (!dev->core.driver) {
+ dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
+ __LINE__);
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+ return 0;
+ }
+
+@@ -1160,7 +1158,7 @@
+ priv = NULL;
+
+ dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+ return 0;
+ }
+
+@@ -1180,7 +1178,7 @@
+
+ BUG_ON(!dev);
+
+- down(&vuart_bus_priv.probe_mutex);
++ mutex_lock(&vuart_bus_priv.probe_mutex);
+
+ dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
+ dev->match_id);
+@@ -1188,7 +1186,7 @@
+ if (!dev->core.driver) {
+ dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
+ __LINE__);
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+ return 0;
+ }
+
+@@ -1212,7 +1210,7 @@
+
+ dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
+
+- up(&vuart_bus_priv.probe_mutex);
++ mutex_unlock(&vuart_bus_priv.probe_mutex);
+ return 0;
+ }
+
+@@ -1223,7 +1221,7 @@
+ if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
+ return -ENODEV;
+
+- init_MUTEX(&vuart_bus_priv.probe_mutex);
++ mutex_init(&vuart_bus_priv.probe_mutex);
+
+ return 0;
+ }
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/Kconfig powerpc.git/drivers/serial/Kconfig
+--- linux-2.6.24/drivers/serial/Kconfig 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/Kconfig 2008-01-28 20:26:19.000000000 +0100
+@@ -1284,4 +1284,14 @@
+ Currently, only 8250 compatible ports are supported, but
+ others can easily be added.
+
++config SERIAL_QE
++ tristate "Freescale QUICC Engine serial port support"
++ depends on QUICC_ENGINE
++ select SERIAL_CORE
++ select FW_LOADER
++ default n
++ help
++ This driver supports the QE serial ports on Freescale embedded
++ PowerPC that contain a QUICC Engine.
++
+ endmenu
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/Makefile powerpc.git/drivers/serial/Makefile
+--- linux-2.6.24/drivers/serial/Makefile 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/Makefile 2008-01-28 20:26:19.000000000 +0100
+@@ -64,3 +64,4 @@
+ obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
+ obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
+ obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
++obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/cpm_uart/cpm_uart_cpm1.c powerpc.git/drivers/serial/cpm_uart/cpm_uart_cpm1.c
+--- linux-2.6.24/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2008-01-28 20:26:19.000000000 +0100
+@@ -52,11 +52,7 @@
+ #ifdef CONFIG_PPC_CPM_NEW_BINDING
+ void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+ {
+- u16 __iomem *cpcr = &cpmp->cp_cpcr;
+-
+- out_be16(cpcr, port->command | (cmd << 8) | CPM_CR_FLG);
+- while (in_be16(cpcr) & CPM_CR_FLG)
+- ;
++ cpm_command(port->command, cmd);
+ }
+ #else
+ void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/cpm_uart/cpm_uart_cpm2.c powerpc.git/drivers/serial/cpm_uart/cpm_uart_cpm2.c
+--- linux-2.6.24/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2008-01-28 20:26:19.000000000 +0100
+@@ -52,13 +52,7 @@
+ #ifdef CONFIG_PPC_CPM_NEW_BINDING
+ void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+ {
+- cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm);
+-
+- out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG);
+- while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG)
+- ;
+-
+- cpm2_unmap(cp);
++ cpm_command(port->command, cmd);
+ }
+ #else
+ void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+@@ -171,9 +165,9 @@
+ * really has to get out of the driver so boards can
+ * be supported in a sane fashion.
+ */
++ volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
+ #ifndef CONFIG_STX_GP3
+ volatile iop_cpm2_t *io = cpm2_map(im_ioport);
+- volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
+
+ io->iop_pparb |= 0x008b0000;
+ io->iop_pdirb |= 0x00880000;
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/mpc52xx_uart.c powerpc.git/drivers/serial/mpc52xx_uart.c
+--- linux-2.6.24/drivers/serial/mpc52xx_uart.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/mpc52xx_uart.c 2008-01-28 20:26:19.000000000 +0100
+@@ -36,7 +36,7 @@
+ * DCD. However, the pin multiplexing aren't changed and should be set either
+ * by the bootloader or in the platform init code.
+ *
+- * The idx field must be equal to the PSC index ( e.g. 0 for PSC1, 1 for PSC2,
++ * The idx field must be equal to the PSC index (e.g. 0 for PSC1, 1 for PSC2,
+ * and so on). So the PSC1 is mapped to /dev/ttyPSC0, PSC2 to /dev/ttyPSC1 and
+ * so on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly
+ * fpr the console code : without this 1:1 mapping, at early boot time, when we
+@@ -68,11 +68,12 @@
+ #include <linux/sysrq.h>
+ #include <linux/console.h>
+
+-#include <asm/delay.h>
+-#include <asm/io.h>
++#include <linux/delay.h>
++#include <linux/io.h>
+
+ #if defined(CONFIG_PPC_MERGE)
+-#include <asm/of_platform.h>
++#include <linux/of.h>
++#include <linux/of_platform.h>
+ #else
+ #include <linux/platform_device.h>
+ #endif
+@@ -111,16 +112,18 @@
+ #endif
+
+ #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase))
++#define FIFO(port) ((struct mpc52xx_psc_fifo __iomem *)(PSC(port)+1))
+
+
+ /* Forward declaration of the interruption handling routine */
+-static irqreturn_t mpc52xx_uart_int(int irq,void *dev_id);
++static irqreturn_t mpc52xx_uart_int(int irq, void *dev_id);
+
+
+ /* Simple macro to test if a port is console or not. This one is taken
+ * for serial_core.c and maybe should be moved to serial_core.h ? */
+ #ifdef CONFIG_SERIAL_CORE_CONSOLE
+-#define uart_console(port) ((port)->cons && (port)->cons->index == (port)->line)
++#define uart_console(port) \
++ ((port)->cons && (port)->cons->index == (port)->line)
+ #else
+ #define uart_console(port) (0)
+ #endif
+@@ -162,7 +165,7 @@
+ {
+ /* port->lock taken by caller */
+ port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY;
+- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
+ }
+
+ static void
+@@ -170,7 +173,7 @@
+ {
+ /* port->lock taken by caller */
+ port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
+- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
+ }
+
+ static void
+@@ -184,7 +187,7 @@
+ /* Make sure tx interrupts are on */
+ /* Truly necessary ??? They should be anyway */
+ port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
+- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
+ }
+
+ spin_unlock_irqrestore(&port->lock, flags);
+@@ -195,7 +198,7 @@
+ {
+ /* port->lock taken by caller */
+ port->read_status_mask &= ~MPC52xx_PSC_IMR_RXRDY;
+- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
+ }
+
+ static void
+@@ -210,10 +213,10 @@
+ unsigned long flags;
+ spin_lock_irqsave(&port->lock, flags);
+
+- if ( ctl == -1 )
+- out_8(&PSC(port)->command,MPC52xx_PSC_START_BRK);
++ if (ctl == -1)
++ out_8(&PSC(port)->command, MPC52xx_PSC_START_BRK);
+ else
+- out_8(&PSC(port)->command,MPC52xx_PSC_STOP_BRK);
++ out_8(&PSC(port)->command, MPC52xx_PSC_STOP_BRK);
+
+ spin_unlock_irqrestore(&port->lock, flags);
+ }
+@@ -222,6 +225,7 @@
+ mpc52xx_uart_startup(struct uart_port *port)
+ {
+ struct mpc52xx_psc __iomem *psc = PSC(port);
++ struct mpc52xx_psc_fifo __iomem *fifo = FIFO(port);
+ int ret;
+
+ /* Request IRQ */
+@@ -231,23 +235,23 @@
+ return ret;
+
+ /* Reset/activate the port, clear and enable interrupts */
+- out_8(&psc->command,MPC52xx_PSC_RST_RX);
+- out_8(&psc->command,MPC52xx_PSC_RST_TX);
++ out_8(&psc->command, MPC52xx_PSC_RST_RX);
++ out_8(&psc->command, MPC52xx_PSC_RST_TX);
+
+- out_be32(&psc->sicr,0); /* UART mode DCD ignored */
++ out_be32(&psc->sicr, 0); /* UART mode DCD ignored */
+
+ out_be16(&psc->mpc52xx_psc_clock_select, 0xdd00); /* /16 prescaler on */
+
+- out_8(&psc->rfcntl, 0x00);
+- out_be16(&psc->rfalarm, 0x1ff);
+- out_8(&psc->tfcntl, 0x07);
+- out_be16(&psc->tfalarm, 0x80);
++ out_8(&fifo->rfcntl, 0x00);
++ out_be16(&fifo->rfalarm, 0x1ff);
++ out_8(&fifo->tfcntl, 0x07);
++ out_be16(&fifo->tfalarm, 0x80);
+
+ port->read_status_mask |= MPC52xx_PSC_IMR_RXRDY | MPC52xx_PSC_IMR_TXRDY;
+- out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
+
+- out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
+- out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
++ out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
++ out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
+
+ return 0;
+ }
+@@ -258,12 +262,12 @@
+ struct mpc52xx_psc __iomem *psc = PSC(port);
+
+ /* Shut down the port. Leave TX active if on a console port */
+- out_8(&psc->command,MPC52xx_PSC_RST_RX);
++ out_8(&psc->command, MPC52xx_PSC_RST_RX);
+ if (!uart_console(port))
+- out_8(&psc->command,MPC52xx_PSC_RST_TX);
++ out_8(&psc->command, MPC52xx_PSC_RST_TX);
+
+ port->read_status_mask = 0;
+- out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
++ out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
+
+ /* Release interrupt */
+ free_irq(port->irq, port);
+@@ -271,7 +275,7 @@
+
+ static void
+ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
+- struct ktermios *old)
++ struct ktermios *old)
+ {
+ struct mpc52xx_psc __iomem *psc = PSC(port);
+ unsigned long flags;
+@@ -283,14 +287,14 @@
+ mr1 = 0;
+
+ switch (new->c_cflag & CSIZE) {
+- case CS5: mr1 |= MPC52xx_PSC_MODE_5_BITS;
+- break;
+- case CS6: mr1 |= MPC52xx_PSC_MODE_6_BITS;
+- break;
+- case CS7: mr1 |= MPC52xx_PSC_MODE_7_BITS;
+- break;
+- case CS8:
+- default: mr1 |= MPC52xx_PSC_MODE_8_BITS;
++ case CS5: mr1 |= MPC52xx_PSC_MODE_5_BITS;
++ break;
++ case CS6: mr1 |= MPC52xx_PSC_MODE_6_BITS;
++ break;
++ case CS7: mr1 |= MPC52xx_PSC_MODE_7_BITS;
++ break;
++ case CS8:
++ default: mr1 |= MPC52xx_PSC_MODE_8_BITS;
+ }
+
+ if (new->c_cflag & PARENB) {
+@@ -332,24 +336,24 @@
+ udelay(1);
+
+ if (!j)
+- printk( KERN_ERR "mpc52xx_uart.c: "
++ printk(KERN_ERR "mpc52xx_uart.c: "
+ "Unable to flush RX & TX fifos in-time in set_termios."
+- "Some chars may have been lost.\n" );
++ "Some chars may have been lost.\n");
+
+ /* Reset the TX & RX */
+- out_8(&psc->command,MPC52xx_PSC_RST_RX);
+- out_8(&psc->command,MPC52xx_PSC_RST_TX);
++ out_8(&psc->command, MPC52xx_PSC_RST_RX);
++ out_8(&psc->command, MPC52xx_PSC_RST_TX);
+
+ /* Send new mode settings */
+- out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
+- out_8(&psc->mode,mr1);
+- out_8(&psc->mode,mr2);
+- out_8(&psc->ctur,ctr >> 8);
+- out_8(&psc->ctlr,ctr & 0xff);
++ out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
++ out_8(&psc->mode, mr1);
++ out_8(&psc->mode, mr2);
++ out_8(&psc->ctur, ctr >> 8);
++ out_8(&psc->ctlr, ctr & 0xff);
+
+ /* Reenable TX & RX */
+- out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
+- out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
++ out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
++ out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
+
+ /* We're all set, release the lock */
+ spin_unlock_irqrestore(&port->lock, flags);
+@@ -364,7 +368,8 @@
+ static void
+ mpc52xx_uart_release_port(struct uart_port *port)
+ {
+- if (port->flags & UPF_IOREMAP) { /* remapped by us ? */
++ /* remapped by us ? */
++ if (port->flags & UPF_IOREMAP) {
+ iounmap(port->membase);
+ port->membase = NULL;
+ }
+@@ -379,7 +384,7 @@
+
+ if (port->flags & UPF_IOREMAP) /* Need to remap ? */
+ port->membase = ioremap(port->mapbase,
+- sizeof(struct mpc52xx_psc));
++ sizeof(struct mpc52xx_psc));
+
+ if (!port->membase)
+ return -EINVAL;
+@@ -398,22 +403,22 @@
+ static void
+ mpc52xx_uart_config_port(struct uart_port *port, int flags)
+ {
+- if ( (flags & UART_CONFIG_TYPE) &&
+- (mpc52xx_uart_request_port(port) == 0) )
+- port->type = PORT_MPC52xx;
++ if ((flags & UART_CONFIG_TYPE)
++ && (mpc52xx_uart_request_port(port) == 0))
++ port->type = PORT_MPC52xx;
+ }
+
+ static int
+ mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
+ {
+- if ( ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx )
++ if (ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx)
+ return -EINVAL;
+
+- if ( (ser->irq != port->irq) ||
+- (ser->io_type != SERIAL_IO_MEM) ||
+- (ser->baud_base != port->uartclk) ||
+- (ser->iomem_base != (void*)port->mapbase) ||
+- (ser->hub6 != 0 ) )
++ if ((ser->irq != port->irq) ||
++ (ser->io_type != SERIAL_IO_MEM) ||
++ (ser->baud_base != port->uartclk) ||
++ (ser->iomem_base != (void *)port->mapbase) ||
++ (ser->hub6 != 0))
+ return -EINVAL;
+
+ return 0;
+@@ -455,8 +460,8 @@
+ unsigned short status;
+
+ /* While we can read, do so ! */
+- while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
+- MPC52xx_PSC_SR_RXRDY) {
++ while ((status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
++ MPC52xx_PSC_SR_RXRDY) {
+
+ /* Get the char */
+ ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8);
+@@ -474,9 +479,9 @@
+ flag = TTY_NORMAL;
+ port->icount.rx++;
+
+- if ( status & (MPC52xx_PSC_SR_PE |
+- MPC52xx_PSC_SR_FE |
+- MPC52xx_PSC_SR_RB) ) {
++ if (status & (MPC52xx_PSC_SR_PE |
++ MPC52xx_PSC_SR_FE |
++ MPC52xx_PSC_SR_RB)) {
+
+ if (status & MPC52xx_PSC_SR_RB) {
+ flag = TTY_BREAK;
+@@ -487,7 +492,7 @@
+ flag = TTY_FRAME;
+
+ /* Clear error condition */
+- out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT);
++ out_8(&PSC(port)->command, MPC52xx_PSC_RST_ERR_STAT);
+
+ }
+ tty_insert_flip_char(tty, ch, flag);
+@@ -568,16 +573,16 @@
+
+ /* Do we need to receive chars ? */
+ /* For this RX interrupts must be on and some chars waiting */
+- if ( status & MPC52xx_PSC_IMR_RXRDY )
++ if (status & MPC52xx_PSC_IMR_RXRDY)
+ keepgoing |= mpc52xx_uart_int_rx_chars(port);
+
+ /* Do we need to send chars ? */
+ /* For this, TX must be ready and TX interrupt enabled */
+- if ( status & MPC52xx_PSC_IMR_TXRDY )
++ if (status & MPC52xx_PSC_IMR_TXRDY)
+ keepgoing |= mpc52xx_uart_int_tx_chars(port);
+
+ /* Limit number of iteration */
+- if ( !(--pass) )
++ if (!(--pass))
+ keepgoing = 0;
+
+ } while (keepgoing);
+@@ -596,7 +601,7 @@
+
+ static void __init
+ mpc52xx_console_get_options(struct uart_port *port,
+- int *baud, int *parity, int *bits, int *flow)
++ int *baud, int *parity, int *bits, int *flow)
+ {
+ struct mpc52xx_psc __iomem *psc = PSC(port);
+ unsigned char mr1;
+@@ -604,7 +609,7 @@
+ pr_debug("mpc52xx_console_get_options(port=%p)\n", port);
+
+ /* Read the mode registers */
+- out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
++ out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
+ mr1 = in_8(&psc->mode);
+
+ /* CT{U,L}R are write-only ! */
+@@ -616,11 +621,18 @@
+
+ /* Parse them */
+ switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) {
+- case MPC52xx_PSC_MODE_5_BITS: *bits = 5; break;
+- case MPC52xx_PSC_MODE_6_BITS: *bits = 6; break;
+- case MPC52xx_PSC_MODE_7_BITS: *bits = 7; break;
+- case MPC52xx_PSC_MODE_8_BITS:
+- default: *bits = 8;
++ case MPC52xx_PSC_MODE_5_BITS:
++ *bits = 5;
++ break;
++ case MPC52xx_PSC_MODE_6_BITS:
++ *bits = 6;
++ break;
++ case MPC52xx_PSC_MODE_7_BITS:
++ *bits = 7;
++ break;
++ case MPC52xx_PSC_MODE_8_BITS:
++ default:
++ *bits = 8;
+ }
+
+ if (mr1 & MPC52xx_PSC_MODE_PARNONE)
+@@ -657,7 +669,7 @@
+ /* Wait the TX buffer to be empty */
+ j = 20000; /* Maximum wait */
+ while (!(in_be16(&psc->mpc52xx_psc_status) &
+- MPC52xx_PSC_SR_TXEMP) && --j)
++ MPC52xx_PSC_SR_TXEMP) && --j)
+ udelay(1);
+ }
+
+@@ -730,16 +742,18 @@
+ }
+
+ pr_debug("Console on ttyPSC%x is %s\n",
+- co->index, mpc52xx_uart_nodes[co->index]->full_name);
++ co->index, mpc52xx_uart_nodes[co->index]->full_name);
+
+ /* Fetch register locations */
+- if ((ret = of_address_to_resource(np, 0, &res)) != 0) {
++ ret = of_address_to_resource(np, 0, &res);
++ if (ret) {
+ pr_debug("Could not get resources for PSC%x\n", co->index);
+ return ret;
+ }
+
+ /* Search for bus-frequency property in this node or a parent */
+- if ((ipb_freq = mpc52xx_find_ipb_freq(np)) == 0) {
++ ipb_freq = mpc52xx_find_ipb_freq(np);
++ if (ipb_freq == 0) {
+ pr_debug("Could not find IPB bus frequency!\n");
+ return -EINVAL;
+ }
+@@ -757,7 +771,8 @@
+ return -EINVAL;
+
+ pr_debug("mpc52xx-psc uart at %p, mapped to %p, irq=%x, freq=%i\n",
+- (void*)port->mapbase, port->membase, port->irq, port->uartclk);
++ (void *)port->mapbase, port->membase,
++ port->irq, port->uartclk);
+
+ /* Setup the port parameters accoding to options */
+ if (options)
+@@ -766,7 +781,7 @@
+ mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow);
+
+ pr_debug("Setting console parameters: %i %i%c1 flow=%c\n",
+- baud, bits, parity, flow);
++ baud, bits, parity, flow);
+
+ return uart_set_options(port, co, baud, parity, bits, flow);
+ }
+@@ -781,7 +796,7 @@
+ .device = uart_console_device,
+ .setup = mpc52xx_console_setup,
+ .flags = CON_PRINTBUFFER,
+- .index = -1, /* Specified on the cmdline (e.g. console=ttyPSC0 ) */
++ .index = -1, /* Specified on the cmdline (e.g. console=ttyPSC0) */
+ .data = &mpc52xx_uart_driver,
+ };
+
+@@ -809,7 +824,6 @@
+ /* ======================================================================== */
+
+ static struct uart_driver mpc52xx_uart_driver = {
+- .owner = THIS_MODULE,
+ .driver_name = "mpc52xx_psc_uart",
+ .dev_name = "ttyPSC",
+ .major = SERIAL_PSC_MAJOR,
+@@ -837,7 +851,7 @@
+ if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
+ return -EINVAL;
+
+- if (!mpc52xx_match_psc_function(idx,"uart"))
++ if (!mpc52xx_match_psc_function(idx, "uart"))
+ return -ENODEV;
+
+ /* Init the port structure */
+@@ -848,13 +862,13 @@
+ port->fifosize = 512;
+ port->iotype = UPIO_MEM;
+ port->flags = UPF_BOOT_AUTOCONF |
+- ( uart_console(port) ? 0 : UPF_IOREMAP );
++ (uart_console(port) ? 0 : UPF_IOREMAP);
+ port->line = idx;
+ port->ops = &mpc52xx_uart_ops;
+ port->dev = &dev->dev;
+
+ /* Search for IRQ and mapbase */
+- for (i=0 ; i<dev->num_resources ; i++, res++) {
++ for (i = 0 ; i < dev->num_resources ; i++, res++) {
+ if (res->flags & IORESOURCE_MEM)
+ port->mapbase = res->start;
+ else if (res->flags & IORESOURCE_IRQ)
+@@ -866,7 +880,7 @@
+ /* Add the port to the uart sub-system */
+ ret = uart_add_one_port(&mpc52xx_uart_driver, port);
+ if (!ret)
+- platform_set_drvdata(dev, (void*)port);
++ platform_set_drvdata(dev, (void *)port);
+
+ return ret;
+ }
+@@ -917,6 +931,7 @@
+ .resume = mpc52xx_uart_resume,
+ #endif
+ .driver = {
++ .owner = THIS_MODULE,
+ .name = "mpc52xx-psc",
+ },
+ };
+@@ -946,10 +961,11 @@
+ if (idx >= MPC52xx_PSC_MAXNUM)
+ return -EINVAL;
+ pr_debug("Found %s assigned to ttyPSC%x\n",
+- mpc52xx_uart_nodes[idx]->full_name, idx);
++ mpc52xx_uart_nodes[idx]->full_name, idx);
+
+ /* Search for bus-frequency property in this node or a parent */
+- if ((ipb_freq = mpc52xx_find_ipb_freq(op->node)) == 0) {
++ ipb_freq = mpc52xx_find_ipb_freq(op->node);
++ if (ipb_freq == 0) {
+ dev_dbg(&op->dev, "Could not find IPB bus frequency!\n");
+ return -EINVAL;
+ }
+@@ -962,22 +978,23 @@
+ port->fifosize = 512;
+ port->iotype = UPIO_MEM;
+ port->flags = UPF_BOOT_AUTOCONF |
+- ( uart_console(port) ? 0 : UPF_IOREMAP );
++ (uart_console(port) ? 0 : UPF_IOREMAP);
+ port->line = idx;
+ port->ops = &mpc52xx_uart_ops;
+ port->dev = &op->dev;
+
+ /* Search for IRQ and mapbase */
+- if ((ret = of_address_to_resource(op->node, 0, &res)) != 0)
++ ret = of_address_to_resource(op->node, 0, &res);
++ if (ret)
+ return ret;
+
+ port->mapbase = res.start;
+ port->irq = irq_of_parse_and_map(op->node, 0);
+
+ dev_dbg(&op->dev, "mpc52xx-psc uart at %p, irq=%x, freq=%i\n",
+- (void*)port->mapbase, port->irq, port->uartclk);
++ (void *)port->mapbase, port->irq, port->uartclk);
+
+- if ((port->irq==NO_IRQ) || !port->mapbase) {
++ if ((port->irq == NO_IRQ) || !port->mapbase) {
+ printk(KERN_ERR "Could not allocate resources for PSC\n");
+ return -EINVAL;
+ }
+@@ -985,7 +1002,7 @@
+ /* Add the port to the uart sub-system */
+ ret = uart_add_one_port(&mpc52xx_uart_driver, port);
+ if (!ret)
+- dev_set_drvdata(&op->dev, (void*)port);
++ dev_set_drvdata(&op->dev, (void *)port);
+
+ return ret;
+ }
+@@ -1048,6 +1065,7 @@
+ if (idx < 0)
+ return; /* No free slot; abort */
+
++ of_node_get(np);
+ /* If the slot is already occupied, then swap slots */
+ if (mpc52xx_uart_nodes[idx] && (free_idx != -1))
+ mpc52xx_uart_nodes[free_idx] = mpc52xx_uart_nodes[idx];
+@@ -1057,7 +1075,7 @@
+ static void
+ mpc52xx_uart_of_enumerate(void)
+ {
+- static int enum_done = 0;
++ static int enum_done;
+ struct device_node *np;
+ const unsigned int *devno;
+ int i;
+@@ -1071,7 +1089,7 @@
+
+ /* Is a particular device number requested? */
+ devno = of_get_property(np, "port-number", NULL);
+- mpc52xx_uart_of_assign(of_node_get(np), devno ? *devno : -1);
++ mpc52xx_uart_of_assign(np, devno ? *devno : -1);
+ }
+
+ enum_done = 1;
+@@ -1079,15 +1097,13 @@
+ for (i = 0; i < MPC52xx_PSC_MAXNUM; i++) {
+ if (mpc52xx_uart_nodes[i])
+ pr_debug("%s assigned to ttyPSC%x\n",
+- mpc52xx_uart_nodes[i]->full_name, i);
++ mpc52xx_uart_nodes[i]->full_name, i);
+ }
+ }
+
+ MODULE_DEVICE_TABLE(of, mpc52xx_uart_of_match);
+
+ static struct of_platform_driver mpc52xx_uart_of_driver = {
+- .owner = THIS_MODULE,
+- .name = "mpc52xx-psc-uart",
+ .match_table = mpc52xx_uart_of_match,
+ .probe = mpc52xx_uart_of_probe,
+ .remove = mpc52xx_uart_of_remove,
+@@ -1113,7 +1129,8 @@
+
+ printk(KERN_INFO "Serial: MPC52xx PSC UART driver\n");
+
+- if ((ret = uart_register_driver(&mpc52xx_uart_driver)) != 0) {
++ ret = uart_register_driver(&mpc52xx_uart_driver);
++ if (ret) {
+ printk(KERN_ERR "%s: uart_register_driver failed (%i)\n",
+ __FILE__, ret);
+ return ret;
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/uartlite.c powerpc.git/drivers/serial/uartlite.c
+--- linux-2.6.24/drivers/serial/uartlite.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/serial/uartlite.c 2008-01-28 20:26:19.000000000 +0100
+@@ -539,7 +539,7 @@
+ *
+ * @dev: pointer to device structure
+ */
+-static int __devinit ulite_release(struct device *dev)
++static int __devexit ulite_release(struct device *dev)
+ {
+ struct uart_port *port = dev_get_drvdata(dev);
+ int rc = 0;
+@@ -572,14 +572,14 @@
+ return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
+ }
+
+-static int ulite_remove(struct platform_device *pdev)
++static int __devexit ulite_remove(struct platform_device *pdev)
+ {
+ return ulite_release(&pdev->dev);
+ }
+
+ static struct platform_driver ulite_platform_driver = {
+ .probe = ulite_probe,
+- .remove = ulite_remove,
++ .remove = __devexit_p(ulite_remove),
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "uartlite",
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/serial/ucc_uart.c powerpc.git/drivers/serial/ucc_uart.c
+--- linux-2.6.24/drivers/serial/ucc_uart.c 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/drivers/serial/ucc_uart.c 2008-01-28 20:26:20.000000000 +0100
+@@ -0,0 +1,1514 @@
++/*
++ * Freescale QUICC Engine UART device driver
++ *
++ * Author: Timur Tabi <timur@freescale.com>
++ *
++ * Copyright 2007 Freescale Semiconductor, Inc. This file is licensed under
++ * the terms of the GNU General Public License version 2. This program
++ * is licensed "as is" without any warranty of any kind, whether express
++ * or implied.
++ *
++ * This driver adds support for UART devices via Freescale's QUICC Engine
++ * found on some Freescale SOCs.
++ *
++ * If Soft-UART support is needed but not already present, then this driver
++ * will request and upload the "Soft-UART" microcode upon probe. The
++ * filename of the microcode should be fsl_qe_ucode_uart_X_YZ.bin, where "X"
++ * is the name of the SOC (e.g. 8323), and YZ is the revision of the SOC,
++ * (e.g. "11" for 1.1).
++ */
++
++#include <linux/module.h>
++#include <linux/serial.h>
++#include <linux/serial_core.h>
++#include <linux/io.h>
++#include <linux/of_platform.h>
++#include <linux/dma-mapping.h>
++
++#include <linux/fs_uart_pd.h>
++#include <asm/ucc_slow.h>
++
++#include <linux/firmware.h>
++#include <asm/reg.h>
++
++/*
++ * The GUMR flag for Soft UART. This would normally be defined in qe.h,
++ * but Soft-UART is a hack and we want to keep everything related to it in
++ * this file.
++ */
++#define UCC_SLOW_GUMR_H_SUART 0x00004000 /* Soft-UART */
++
++/*
++ * soft_uart is 1 if we need to use Soft-UART mode
++ */
++static int soft_uart;
++/*
++ * firmware_loaded is 1 if the firmware has been loaded, 0 otherwise.
++ */
++static int firmware_loaded;
++
++/* Enable this macro to configure all serial ports in internal loopback
++ mode */
++/* #define LOOPBACK */
++
++/* The major and minor device numbers are defined in
++ * http://www.lanana.org/docs/device-list/devices-2.6+.txt. For the QE
++ * UART, we have major number 204 and minor numbers 46 - 49, which are the
++ * same as for the CPM2. This decision was made because no Freescale part
++ * has both a CPM and a QE.
++ */
++#define SERIAL_QE_MAJOR 204
++#define SERIAL_QE_MINOR 46
++
++/* Since we only have minor numbers 46 - 49, there is a hard limit of 4 ports */
++#define UCC_MAX_UART 4
++
++/* The number of buffer descriptors for receiving characters. */
++#define RX_NUM_FIFO 4
++
++/* The number of buffer descriptors for transmitting characters. */
++#define TX_NUM_FIFO 4
++
++/* The maximum size of the character buffer for a single RX BD. */
++#define RX_BUF_SIZE 32
++
++/* The maximum size of the character buffer for a single TX BD. */
++#define TX_BUF_SIZE 32
++
++/*
++ * The number of jiffies to wait after receiving a close command before the
++ * device is actually closed. This allows the last few characters to be
++ * sent over the wire.
++ */
++#define UCC_WAIT_CLOSING 100
++
++struct ucc_uart_pram {
++ struct ucc_slow_pram common;
++ u8 res1[8]; /* reserved */
++ __be16 maxidl; /* Maximum idle chars */
++ __be16 idlc; /* temp idle counter */
++ __be16 brkcr; /* Break count register */
++ __be16 parec; /* receive parity error counter */
++ __be16 frmec; /* receive framing error counter */
++ __be16 nosec; /* receive noise counter */
++ __be16 brkec; /* receive break condition counter */
++ __be16 brkln; /* last received break length */
++ __be16 uaddr[2]; /* UART address character 1 & 2 */
++ __be16 rtemp; /* Temp storage */
++ __be16 toseq; /* Transmit out of sequence char */
++ __be16 cchars[8]; /* control characters 1-8 */
++ __be16 rccm; /* receive control character mask */
++ __be16 rccr; /* receive control character register */
++ __be16 rlbc; /* receive last break character */
++ __be16 res2; /* reserved */
++ __be32 res3; /* reserved, should be cleared */
++ u8 res4; /* reserved, should be cleared */
++ u8 res5[3]; /* reserved, should be cleared */
++ __be32 res6; /* reserved, should be cleared */
++ __be32 res7; /* reserved, should be cleared */
++ __be32 res8; /* reserved, should be cleared */
++ __be32 res9; /* reserved, should be cleared */
++ __be32 res10; /* reserved, should be cleared */
++ __be32 res11; /* reserved, should be cleared */
++ __be32 res12; /* reserved, should be cleared */
++ __be32 res13; /* reserved, should be cleared */
++/* The rest is for Soft-UART only */
++ __be16 supsmr; /* 0x90, Shadow UPSMR */
++ __be16 res92; /* 0x92, reserved, initialize to 0 */
++ __be32 rx_state; /* 0x94, RX state, initialize to 0 */
++ __be32 rx_cnt; /* 0x98, RX count, initialize to 0 */
++ u8 rx_length; /* 0x9C, Char length, set to 1+CL+PEN+1+SL */
++ u8 rx_bitmark; /* 0x9D, reserved, initialize to 0 */
++ u8 rx_temp_dlst_qe; /* 0x9E, reserved, initialize to 0 */
++ u8 res14[0xBC - 0x9F]; /* reserved */
++ __be32 dump_ptr; /* 0xBC, Dump pointer */
++ __be32 rx_frame_rem; /* 0xC0, reserved, initialize to 0 */
++ u8 rx_frame_rem_size; /* 0xC4, reserved, initialize to 0 */
++ u8 tx_mode; /* 0xC5, mode, 0=AHDLC, 1=UART */
++ __be16 tx_state; /* 0xC6, TX state */
++ u8 res15[0xD0 - 0xC8]; /* reserved */
++ __be32 resD0; /* 0xD0, reserved, initialize to 0 */
++ u8 resD4; /* 0xD4, reserved, initialize to 0 */
++ __be16 resD5; /* 0xD5, reserved, initialize to 0 */
++} __attribute__ ((packed));
++
++/* SUPSMR definitions, for Soft-UART only */
++#define UCC_UART_SUPSMR_SL 0x8000
++#define UCC_UART_SUPSMR_RPM_MASK 0x6000
++#define UCC_UART_SUPSMR_RPM_ODD 0x0000
++#define UCC_UART_SUPSMR_RPM_LOW 0x2000
++#define UCC_UART_SUPSMR_RPM_EVEN 0x4000
++#define UCC_UART_SUPSMR_RPM_HIGH 0x6000
++#define UCC_UART_SUPSMR_PEN 0x1000
++#define UCC_UART_SUPSMR_TPM_MASK 0x0C00
++#define UCC_UART_SUPSMR_TPM_ODD 0x0000
++#define UCC_UART_SUPSMR_TPM_LOW 0x0400
++#define UCC_UART_SUPSMR_TPM_EVEN 0x0800
++#define UCC_UART_SUPSMR_TPM_HIGH 0x0C00
++#define UCC_UART_SUPSMR_FRZ 0x0100
++#define UCC_UART_SUPSMR_UM_MASK 0x00c0
++#define UCC_UART_SUPSMR_UM_NORMAL 0x0000
++#define UCC_UART_SUPSMR_UM_MAN_MULTI 0x0040
++#define UCC_UART_SUPSMR_UM_AUTO_MULTI 0x00c0
++#define UCC_UART_SUPSMR_CL_MASK 0x0030
++#define UCC_UART_SUPSMR_CL_8 0x0030
++#define UCC_UART_SUPSMR_CL_7 0x0020
++#define UCC_UART_SUPSMR_CL_6 0x0010
++#define UCC_UART_SUPSMR_CL_5 0x0000
++
++#define UCC_UART_TX_STATE_AHDLC 0x00
++#define UCC_UART_TX_STATE_UART 0x01
++#define UCC_UART_TX_STATE_X1 0x00
++#define UCC_UART_TX_STATE_X16 0x80
++
++#define UCC_UART_PRAM_ALIGNMENT 0x100
++
++#define UCC_UART_SIZE_OF_BD UCC_SLOW_SIZE_OF_BD
++#define NUM_CONTROL_CHARS 8
++
++/* Private per-port data structure */
++struct uart_qe_port {
++ struct uart_port port;
++ struct ucc_slow __iomem *uccp;
++ struct ucc_uart_pram __iomem *uccup;
++ struct ucc_slow_info us_info;
++ struct ucc_slow_private *us_private;
++ struct device_node *np;
++ unsigned int ucc_num; /* First ucc is 0, not 1 */
++
++ u16 rx_nrfifos;
++ u16 rx_fifosize;
++ u16 tx_nrfifos;
++ u16 tx_fifosize;
++ int wait_closing;
++ u32 flags;
++ struct qe_bd *rx_bd_base;
++ struct qe_bd *rx_cur;
++ struct qe_bd *tx_bd_base;
++ struct qe_bd *tx_cur;
++ unsigned char *tx_buf;
++ unsigned char *rx_buf;
++ void *bd_virt; /* virtual address of the BD buffers */
++ dma_addr_t bd_dma_addr; /* bus address of the BD buffers */
++ unsigned int bd_size; /* size of BD buffer space */
++};
++
++static struct uart_driver ucc_uart_driver = {
++ .owner = THIS_MODULE,
++ .driver_name = "serial",
++ .dev_name = "ttyQE",
++ .major = SERIAL_QE_MAJOR,
++ .minor = SERIAL_QE_MINOR,
++ .nr = UCC_MAX_UART,
++};
++
++/*
++ * Virtual to physical address translation.
++ *
++ * Given the virtual address for a character buffer, this function returns
++ * the physical (DMA) equivalent.
++ */
++static inline dma_addr_t cpu2qe_addr(void *addr, struct uart_qe_port *qe_port)
++{
++ if (likely((addr >= qe_port->bd_virt)) &&
++ (addr < (qe_port->bd_virt + qe_port->bd_size)))
++ return qe_port->bd_dma_addr + (addr - qe_port->bd_virt);
++
++ /* something nasty happened */
++ printk(KERN_ERR "%s: addr=%p\n", __FUNCTION__, addr);
++ BUG();
++ return 0;
++}
++
++/*
++ * Physical to virtual address translation.
++ *
++ * Given the physical (DMA) address for a character buffer, this function
++ * returns the virtual equivalent.
++ */
++static inline void *qe2cpu_addr(dma_addr_t addr, struct uart_qe_port *qe_port)
++{
++ /* sanity check */
++ if (likely((addr >= qe_port->bd_dma_addr) &&
++ (addr < (qe_port->bd_dma_addr + qe_port->bd_size))))
++ return qe_port->bd_virt + (addr - qe_port->bd_dma_addr);
++
++ /* something nasty happened */
++ printk(KERN_ERR "%s: addr=%x\n", __FUNCTION__, addr);
++ BUG();
++ return NULL;
++}
++
++/*
++ * Return 1 if the QE is done transmitting all buffers for this port
++ *
++ * This function scans each BD in sequence. If we find a BD that is not
++ * ready (READY=1), then we return 0 indicating that the QE is still sending
++ * data. If we reach the last BD (WRAP=1), then we know we've scanned
++ * the entire list, and all BDs are done.
++ */
++static unsigned int qe_uart_tx_empty(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ struct qe_bd *bdp = qe_port->tx_bd_base;
++
++ while (1) {
++ if (in_be16(&bdp->status) & BD_SC_READY)
++ /* This BD is not done, so return "not done" */
++ return 0;
++
++ if (in_be16(&bdp->status) & BD_SC_WRAP)
++ /*
++ * This BD is done and it's the last one, so return
++ * "done"
++ */
++ return 1;
++
++ bdp++;
++ };
++}
++
++/*
++ * Set the modem control lines
++ *
++ * Although the QE can control the modem control lines (e.g. CTS), we
++ * don't need that support. This function must exist, however, otherwise
++ * the kernel will panic.
++ */
++void qe_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
++{
++}
++
++/*
++ * Get the current modem control line status
++ *
++ * Although the QE can control the modem control lines (e.g. CTS), this
++ * driver currently doesn't support that, so we always return Carrier
++ * Detect, Data Set Ready, and Clear To Send.
++ */
++static unsigned int qe_uart_get_mctrl(struct uart_port *port)
++{
++ return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
++}
++
++/*
++ * Disable the transmit interrupt.
++ *
++ * Although this function is called "stop_tx", it does not actually stop
++ * transmission of data. Instead, it tells the QE to not generate an
++ * interrupt when the UCC is finished sending characters.
++ */
++static void qe_uart_stop_tx(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++
++ clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
++}
++
++/*
++ * Transmit as many characters to the HW as possible.
++ *
++ * This function will attempt to stuff of all the characters from the
++ * kernel's transmit buffer into TX BDs.
++ *
++ * A return value of non-zero indicates that it sucessfully stuffed all
++ * characters from the kernel buffer.
++ *
++ * A return value of zero indicates that there are still characters in the
++ * kernel's buffer that have not been transmitted, but there are no more BDs
++ * available. This function should be called again after a BD has been made
++ * available.
++ */
++static int qe_uart_tx_pump(struct uart_qe_port *qe_port)
++{
++ struct qe_bd *bdp;
++ unsigned char *p;
++ unsigned int count;
++ struct uart_port *port = &qe_port->port;
++ struct circ_buf *xmit = &port->info->xmit;
++
++ bdp = qe_port->rx_cur;
++
++ /* Handle xon/xoff */
++ if (port->x_char) {
++ /* Pick next descriptor and fill from buffer */
++ bdp = qe_port->tx_cur;
++
++ p = qe2cpu_addr(bdp->buf, qe_port);
++
++ *p++ = port->x_char;
++ out_be16(&bdp->length, 1);
++ setbits16(&bdp->status, BD_SC_READY);
++ /* Get next BD. */
++ if (in_be16(&bdp->status) & BD_SC_WRAP)
++ bdp = qe_port->tx_bd_base;
++ else
++ bdp++;
++ qe_port->tx_cur = bdp;
++
++ port->icount.tx++;
++ port->x_char = 0;
++ return 1;
++ }
++
++ if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
++ qe_uart_stop_tx(port);
++ return 0;
++ }
++
++ /* Pick next descriptor and fill from buffer */
++ bdp = qe_port->tx_cur;
++
++ while (!(in_be16(&bdp->status) & BD_SC_READY) &&
++ (xmit->tail != xmit->head)) {
++ count = 0;
++ p = qe2cpu_addr(bdp->buf, qe_port);
++ while (count < qe_port->tx_fifosize) {
++ *p++ = xmit->buf[xmit->tail];
++ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
++ port->icount.tx++;
++ count++;
++ if (xmit->head == xmit->tail)
++ break;
++ }
++
++ out_be16(&bdp->length, count);
++ setbits16(&bdp->status, BD_SC_READY);
++
++ /* Get next BD. */
++ if (in_be16(&bdp->status) & BD_SC_WRAP)
++ bdp = qe_port->tx_bd_base;
++ else
++ bdp++;
++ }
++ qe_port->tx_cur = bdp;
++
++ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
++ uart_write_wakeup(port);
++
++ if (uart_circ_empty(xmit)) {
++ /* The kernel buffer is empty, so turn off TX interrupts. We
++ don't need to be told when the QE is finished transmitting
++ the data. */
++ qe_uart_stop_tx(port);
++ return 0;
++ }
++
++ return 1;
++}
++
++/*
++ * Start transmitting data
++ *
++ * This function will start transmitting any available data, if the port
++ * isn't already transmitting data.
++ */
++static void qe_uart_start_tx(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++
++ /* If we currently are transmitting, then just return */
++ if (in_be16(&qe_port->uccp->uccm) & UCC_UART_UCCE_TX)
++ return;
++
++ /* Otherwise, pump the port and start transmission */
++ if (qe_uart_tx_pump(qe_port))
++ setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
++}
++
++/*
++ * Stop transmitting data
++ */
++static void qe_uart_stop_rx(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++
++ clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
++}
++
++/*
++ * Enable status change interrupts
++ *
++ * We don't support status change interrupts, but we need to define this
++ * function otherwise the kernel will panic.
++ */
++static void qe_uart_enable_ms(struct uart_port *port)
++{
++}
++
++/* Start or stop sending break signal
++ *
++ * This function controls the sending of a break signal. If break_state=1,
++ * then we start sending a break signal. If break_state=0, then we stop
++ * sending the break signal.
++ */
++static void qe_uart_break_ctl(struct uart_port *port, int break_state)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++
++ if (break_state)
++ ucc_slow_stop_tx(qe_port->us_private);
++ else
++ ucc_slow_restart_tx(qe_port->us_private);
++}
++
++/* ISR helper function for receiving character.
++ *
++ * This function is called by the ISR to handling receiving characters
++ */
++static void qe_uart_int_rx(struct uart_qe_port *qe_port)
++{
++ int i;
++ unsigned char ch, *cp;
++ struct uart_port *port = &qe_port->port;
++ struct tty_struct *tty = port->info->tty;
++ struct qe_bd *bdp;
++ u16 status;
++ unsigned int flg;
++
++ /* Just loop through the closed BDs and copy the characters into
++ * the buffer.
++ */
++ bdp = qe_port->rx_cur;
++ while (1) {
++ status = in_be16(&bdp->status);
++
++ /* If this one is empty, then we assume we've read them all */
++ if (status & BD_SC_EMPTY)
++ break;
++
++ /* get number of characters, and check space in RX buffer */
++ i = in_be16(&bdp->length);
++
++ /* If we don't have enough room in RX buffer for the entire BD,
++ * then we try later, which will be the next RX interrupt.
++ */
++ if (tty_buffer_request_room(tty, i) < i) {
++ dev_dbg(port->dev, "ucc-uart: no room in RX buffer\n");
++ return;
++ }
++
++ /* get pointer */
++ cp = qe2cpu_addr(bdp->buf, qe_port);
++
++ /* loop through the buffer */
++ while (i-- > 0) {
++ ch = *cp++;
++ port->icount.rx++;
++ flg = TTY_NORMAL;
++
++ if (!i && status &
++ (BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV))
++ goto handle_error;
++ if (uart_handle_sysrq_char(port, ch))
++ continue;
++
++error_return:
++ tty_insert_flip_char(tty, ch, flg);
++
++ }
++
++ /* This BD is ready to be used again. Clear status. get next */
++ clrsetbits_be16(&bdp->status, BD_SC_BR | BD_SC_FR | BD_SC_PR |
++ BD_SC_OV | BD_SC_ID, BD_SC_EMPTY);
++ if (in_be16(&bdp->status) & BD_SC_WRAP)
++ bdp = qe_port->rx_bd_base;
++ else
++ bdp++;
++
++ }
++
++ /* Write back buffer pointer */
++ qe_port->rx_cur = bdp;
++
++ /* Activate BH processing */
++ tty_flip_buffer_push(tty);
++
++ return;
++
++ /* Error processing */
++
++handle_error:
++ /* Statistics */
++ if (status & BD_SC_BR)
++ port->icount.brk++;
++ if (status & BD_SC_PR)
++ port->icount.parity++;
++ if (status & BD_SC_FR)
++ port->icount.frame++;
++ if (status & BD_SC_OV)
++ port->icount.overrun++;
++
++ /* Mask out ignored conditions */
++ status &= port->read_status_mask;
++
++ /* Handle the remaining ones */
++ if (status & BD_SC_BR)
++ flg = TTY_BREAK;
++ else if (status & BD_SC_PR)
++ flg = TTY_PARITY;
++ else if (status & BD_SC_FR)
++ flg = TTY_FRAME;
++
++ /* Overrun does not affect the current character ! */
++ if (status & BD_SC_OV)
++ tty_insert_flip_char(tty, 0, TTY_OVERRUN);
++#ifdef SUPPORT_SYSRQ
++ port->sysrq = 0;
++#endif
++ goto error_return;
++}
++
++/* Interrupt handler
++ *
++ * This interrupt handler is called after a BD is processed.
++ */
++static irqreturn_t qe_uart_int(int irq, void *data)
++{
++ struct uart_qe_port *qe_port = (struct uart_qe_port *) data;
++ struct ucc_slow __iomem *uccp = qe_port->uccp;
++ u16 events;
++
++ /* Clear the interrupts */
++ events = in_be16(&uccp->ucce);
++ out_be16(&uccp->ucce, events);
++
++ if (events & UCC_UART_UCCE_BRKE)
++ uart_handle_break(&qe_port->port);
++
++ if (events & UCC_UART_UCCE_RX)
++ qe_uart_int_rx(qe_port);
++
++ if (events & UCC_UART_UCCE_TX)
++ qe_uart_tx_pump(qe_port);
++
++ return events ? IRQ_HANDLED : IRQ_NONE;
++}
++
++/* Initialize buffer descriptors
++ *
++ * This function initializes all of the RX and TX buffer descriptors.
++ */
++static void qe_uart_initbd(struct uart_qe_port *qe_port)
++{
++ int i;
++ void *bd_virt;
++ struct qe_bd *bdp;
++
++ /* Set the physical address of the host memory buffers in the buffer
++ * descriptors, and the virtual address for us to work with.
++ */
++ bd_virt = qe_port->bd_virt;
++ bdp = qe_port->rx_bd_base;
++ qe_port->rx_cur = qe_port->rx_bd_base;
++ for (i = 0; i < (qe_port->rx_nrfifos - 1); i++) {
++ out_be16(&bdp->status, BD_SC_EMPTY | BD_SC_INTRPT);
++ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
++ out_be16(&bdp->length, 0);
++ bd_virt += qe_port->rx_fifosize;
++ bdp++;
++ }
++
++ /* */
++ out_be16(&bdp->status, BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT);
++ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
++ out_be16(&bdp->length, 0);
++
++ /* Set the physical address of the host memory
++ * buffers in the buffer descriptors, and the
++ * virtual address for us to work with.
++ */
++ bd_virt = qe_port->bd_virt +
++ L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
++ qe_port->tx_cur = qe_port->tx_bd_base;
++ bdp = qe_port->tx_bd_base;
++ for (i = 0; i < (qe_port->tx_nrfifos - 1); i++) {
++ out_be16(&bdp->status, BD_SC_INTRPT);
++ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
++ out_be16(&bdp->length, 0);
++ bd_virt += qe_port->tx_fifosize;
++ bdp++;
++ }
++
++ /* Loopback requires the preamble bit to be set on the first TX BD */
++#ifdef LOOPBACK
++ setbits16(&qe_port->tx_cur->status, BD_SC_P);
++#endif
++
++ out_be16(&bdp->status, BD_SC_WRAP | BD_SC_INTRPT);
++ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
++ out_be16(&bdp->length, 0);
++}
++
++/*
++ * Initialize a UCC for UART.
++ *
++ * This function configures a given UCC to be used as a UART device. Basic
++ * UCC initialization is handled in qe_uart_request_port(). This function
++ * does all the UART-specific stuff.
++ */
++static void qe_uart_init_ucc(struct uart_qe_port *qe_port)
++{
++ u32 cecr_subblock;
++ struct ucc_slow __iomem *uccp = qe_port->uccp;
++ struct ucc_uart_pram *uccup = qe_port->uccup;
++
++ unsigned int i;
++
++ /* First, disable TX and RX in the UCC */
++ ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
++
++ /* Program the UCC UART parameter RAM */
++ out_8(&uccup->common.rbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
++ out_8(&uccup->common.tbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
++ out_be16(&uccup->common.mrblr, qe_port->rx_fifosize);
++ out_be16(&uccup->maxidl, 0x10);
++ out_be16(&uccup->brkcr, 1);
++ out_be16(&uccup->parec, 0);
++ out_be16(&uccup->frmec, 0);
++ out_be16(&uccup->nosec, 0);
++ out_be16(&uccup->brkec, 0);
++ out_be16(&uccup->uaddr[0], 0);
++ out_be16(&uccup->uaddr[1], 0);
++ out_be16(&uccup->toseq, 0);
++ for (i = 0; i < 8; i++)
++ out_be16(&uccup->cchars[i], 0xC000);
++ out_be16(&uccup->rccm, 0xc0ff);
++
++ /* Configure the GUMR registers for UART */
++ if (soft_uart)
++ /* Soft-UART requires a 1X multiplier for TX */
++ clrsetbits_be32(&uccp->gumr_l,
++ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
++ UCC_SLOW_GUMR_L_RDCR_MASK,
++ UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_1 |
++ UCC_SLOW_GUMR_L_RDCR_16);
++ else
++ clrsetbits_be32(&uccp->gumr_l,
++ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
++ UCC_SLOW_GUMR_L_RDCR_MASK,
++ UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_16 |
++ UCC_SLOW_GUMR_L_RDCR_16);
++
++ clrsetbits_be32(&uccp->gumr_h, UCC_SLOW_GUMR_H_RFW,
++ UCC_SLOW_GUMR_H_TRX | UCC_SLOW_GUMR_H_TTX);
++
++#ifdef LOOPBACK
++ clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
++ UCC_SLOW_GUMR_L_DIAG_LOOP);
++ clrsetbits_be32(&uccp->gumr_h,
++ UCC_SLOW_GUMR_H_CTSP | UCC_SLOW_GUMR_H_RSYN,
++ UCC_SLOW_GUMR_H_CDS);
++#endif
++
++ /* Enable rx interrupts and clear all pending events. */
++ out_be16(&uccp->uccm, 0);
++ out_be16(&uccp->ucce, 0xffff);
++ out_be16(&uccp->udsr, 0x7e7e);
++
++ /* Initialize UPSMR */
++ out_be16(&uccp->upsmr, 0);
++
++ if (soft_uart) {
++ out_be16(&uccup->supsmr, 0x30);
++ out_be16(&uccup->res92, 0);
++ out_be32(&uccup->rx_state, 0);
++ out_be32(&uccup->rx_cnt, 0);
++ out_8(&uccup->rx_bitmark, 0);
++ out_8(&uccup->rx_length, 10);
++ out_be32(&uccup->dump_ptr, 0x4000);
++ out_8(&uccup->rx_temp_dlst_qe, 0);
++ out_be32(&uccup->rx_frame_rem, 0);
++ out_8(&uccup->rx_frame_rem_size, 0);
++ /* Soft-UART requires TX to be 1X */
++ out_8(&uccup->tx_mode,
++ UCC_UART_TX_STATE_UART | UCC_UART_TX_STATE_X1);
++ out_be16(&uccup->tx_state, 0);
++ out_8(&uccup->resD4, 0);
++ out_be16(&uccup->resD5, 0);
++
++ /* Set UART mode.
++ * Enable receive and transmit.
++ */
++
++ /* From the microcode errata:
++ * 1.GUMR_L register, set mode=0010 (QMC).
++ * 2.Set GUMR_H[17] bit. (UART/AHDLC mode).
++ * 3.Set GUMR_H[19:20] (Transparent mode)
++ * 4.Clear GUMR_H[26] (RFW)
++ * ...
++ * 6.Receiver must use 16x over sampling
++ */
++ clrsetbits_be32(&uccp->gumr_l,
++ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
++ UCC_SLOW_GUMR_L_RDCR_MASK,
++ UCC_SLOW_GUMR_L_MODE_QMC | UCC_SLOW_GUMR_L_TDCR_16 |
++ UCC_SLOW_GUMR_L_RDCR_16);
++
++ clrsetbits_be32(&uccp->gumr_h,
++ UCC_SLOW_GUMR_H_RFW | UCC_SLOW_GUMR_H_RSYN,
++ UCC_SLOW_GUMR_H_SUART | UCC_SLOW_GUMR_H_TRX |
++ UCC_SLOW_GUMR_H_TTX | UCC_SLOW_GUMR_H_TFL);
++
++#ifdef LOOPBACK
++ clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
++ UCC_SLOW_GUMR_L_DIAG_LOOP);
++ clrbits32(&uccp->gumr_h, UCC_SLOW_GUMR_H_CTSP |
++ UCC_SLOW_GUMR_H_CDS);
++#endif
++
++ cecr_subblock = ucc_slow_get_qe_cr_subblock(qe_port->ucc_num);
++ qe_issue_cmd(QE_INIT_TX_RX, cecr_subblock,
++ QE_CR_PROTOCOL_UNSPECIFIED, 0);
++ }
++}
++
++/*
++ * Initialize the port.
++ */
++static int qe_uart_startup(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ int ret;
++
++ /*
++ * If we're using Soft-UART mode, then we need to make sure the
++ * firmware has been uploaded first.
++ */
++ if (soft_uart && !firmware_loaded) {
++ dev_err(port->dev, "Soft-UART firmware not uploaded\n");
++ return -ENODEV;
++ }
++
++ qe_uart_initbd(qe_port);
++ qe_uart_init_ucc(qe_port);
++
++ /* Install interrupt handler. */
++ ret = request_irq(port->irq, qe_uart_int, IRQF_SHARED, "ucc-uart",
++ qe_port);
++ if (ret) {
++ dev_err(port->dev, "could not claim IRQ %u\n", port->irq);
++ return ret;
++ }
++
++ /* Startup rx-int */
++ setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
++ ucc_slow_enable(qe_port->us_private, COMM_DIR_RX_AND_TX);
++
++ return 0;
++}
++
++/*
++ * Shutdown the port.
++ */
++static void qe_uart_shutdown(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ struct ucc_slow __iomem *uccp = qe_port->uccp;
++ unsigned int timeout = 20;
++
++ /* Disable RX and TX */
++
++ /* Wait for all the BDs marked sent */
++ while (!qe_uart_tx_empty(port)) {
++ if (!--timeout) {
++ dev_warn(port->dev, "shutdown timeout\n");
++ break;
++ }
++ set_current_state(TASK_UNINTERRUPTIBLE);
++ schedule_timeout(2);
++ }
++
++ if (qe_port->wait_closing) {
++ /* Wait a bit longer */
++ set_current_state(TASK_UNINTERRUPTIBLE);
++ schedule_timeout(qe_port->wait_closing);
++ }
++
++ /* Stop uarts */
++ ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
++ clrbits16(&uccp->uccm, UCC_UART_UCCE_TX | UCC_UART_UCCE_RX);
++
++ /* Shut them really down and reinit buffer descriptors */
++ ucc_slow_graceful_stop_tx(qe_port->us_private);
++ qe_uart_initbd(qe_port);
++
++ free_irq(port->irq, qe_port);
++}
++
++/*
++ * Set the serial port parameters.
++ */
++static void qe_uart_set_termios(struct uart_port *port,
++ struct ktermios *termios, struct ktermios *old)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ struct ucc_slow __iomem *uccp = qe_port->uccp;
++ unsigned int baud;
++ unsigned long flags;
++ u16 upsmr = in_be16(&uccp->upsmr);
++ struct ucc_uart_pram __iomem *uccup = qe_port->uccup;
++ u16 supsmr = in_be16(&uccup->supsmr);
++ u8 char_length = 2; /* 1 + CL + PEN + 1 + SL */
++
++ /* Character length programmed into the mode register is the
++ * sum of: 1 start bit, number of data bits, 0 or 1 parity bit,
++ * 1 or 2 stop bits, minus 1.
++ * The value 'bits' counts this for us.
++ */
++
++ /* byte size */
++ upsmr &= UCC_UART_UPSMR_CL_MASK;
++ supsmr &= UCC_UART_SUPSMR_CL_MASK;
++
++ switch (termios->c_cflag & CSIZE) {
++ case CS5:
++ upsmr |= UCC_UART_UPSMR_CL_5;
++ supsmr |= UCC_UART_SUPSMR_CL_5;
++ char_length += 5;
++ break;
++ case CS6:
++ upsmr |= UCC_UART_UPSMR_CL_6;
++ supsmr |= UCC_UART_SUPSMR_CL_6;
++ char_length += 6;
++ break;
++ case CS7:
++ upsmr |= UCC_UART_UPSMR_CL_7;
++ supsmr |= UCC_UART_SUPSMR_CL_7;
++ char_length += 7;
++ break;
++ default: /* case CS8 */
++ upsmr |= UCC_UART_UPSMR_CL_8;
++ supsmr |= UCC_UART_SUPSMR_CL_8;
++ char_length += 8;
++ break;
++ }
++
++ /* If CSTOPB is set, we want two stop bits */
++ if (termios->c_cflag & CSTOPB) {
++ upsmr |= UCC_UART_UPSMR_SL;
++ supsmr |= UCC_UART_SUPSMR_SL;
++ char_length++; /* + SL */
++ }
++
++ if (termios->c_cflag & PARENB) {
++ upsmr |= UCC_UART_UPSMR_PEN;
++ supsmr |= UCC_UART_SUPSMR_PEN;
++ char_length++; /* + PEN */
++
++ if (!(termios->c_cflag & PARODD)) {
++ upsmr &= ~(UCC_UART_UPSMR_RPM_MASK |
++ UCC_UART_UPSMR_TPM_MASK);
++ upsmr |= UCC_UART_UPSMR_RPM_EVEN |
++ UCC_UART_UPSMR_TPM_EVEN;
++ supsmr &= ~(UCC_UART_SUPSMR_RPM_MASK |
++ UCC_UART_SUPSMR_TPM_MASK);
++ supsmr |= UCC_UART_SUPSMR_RPM_EVEN |
++ UCC_UART_SUPSMR_TPM_EVEN;
++ }
++ }
++
++ /*
++ * Set up parity check flag
++ */
++ port->read_status_mask = BD_SC_EMPTY | BD_SC_OV;
++ if (termios->c_iflag & INPCK)
++ port->read_status_mask |= BD_SC_FR | BD_SC_PR;
++ if (termios->c_iflag & (BRKINT | PARMRK))
++ port->read_status_mask |= BD_SC_BR;
++
++ /*
++ * Characters to ignore
++ */
++ port->ignore_status_mask = 0;
++ if (termios->c_iflag & IGNPAR)
++ port->ignore_status_mask |= BD_SC_PR | BD_SC_FR;
++ if (termios->c_iflag & IGNBRK) {
++ port->ignore_status_mask |= BD_SC_BR;
++ /*
++ * If we're ignore parity and break indicators, ignore
++ * overruns too. (For real raw support).
++ */
++ if (termios->c_iflag & IGNPAR)
++ port->ignore_status_mask |= BD_SC_OV;
++ }
++ /*
++ * !!! ignore all characters if CREAD is not set
++ */
++ if ((termios->c_cflag & CREAD) == 0)
++ port->read_status_mask &= ~BD_SC_EMPTY;
++
++ baud = uart_get_baud_rate(port, termios, old, 0, 115200);
++
++ /* Do we really need a spinlock here? */
++ spin_lock_irqsave(&port->lock, flags);
++
++ out_be16(&uccp->upsmr, upsmr);
++ if (soft_uart) {
++ out_be16(&uccup->supsmr, supsmr);
++ out_8(&uccup->rx_length, char_length);
++
++ /* Soft-UART requires a 1X multiplier for TX */
++ qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
++ qe_setbrg(qe_port->us_info.tx_clock, baud, 1);
++ } else {
++ qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
++ qe_setbrg(qe_port->us_info.tx_clock, baud, 16);
++ }
++
++ spin_unlock_irqrestore(&port->lock, flags);
++}
++
++/*
++ * Return a pointer to a string that describes what kind of port this is.
++ */
++static const char *qe_uart_type(struct uart_port *port)
++{
++ return "QE";
++}
++
++/*
++ * Allocate any memory and I/O resources required by the port.
++ */
++static int qe_uart_request_port(struct uart_port *port)
++{
++ int ret;
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ struct ucc_slow_info *us_info = &qe_port->us_info;
++ struct ucc_slow_private *uccs;
++ unsigned int rx_size, tx_size;
++ void *bd_virt;
++ dma_addr_t bd_dma_addr = 0;
++
++ ret = ucc_slow_init(us_info, &uccs);
++ if (ret) {
++ dev_err(port->dev, "could not initialize UCC%u\n",
++ qe_port->ucc_num);
++ return ret;
++ }
++
++ qe_port->us_private = uccs;
++ qe_port->uccp = uccs->us_regs;
++ qe_port->uccup = (struct ucc_uart_pram *) uccs->us_pram;
++ qe_port->rx_bd_base = uccs->rx_bd;
++ qe_port->tx_bd_base = uccs->tx_bd;
++
++ /*
++ * Allocate the transmit and receive data buffers.
++ */
++
++ rx_size = L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
++ tx_size = L1_CACHE_ALIGN(qe_port->tx_nrfifos * qe_port->tx_fifosize);
++
++ bd_virt = dma_alloc_coherent(NULL, rx_size + tx_size, &bd_dma_addr,
++ GFP_KERNEL);
++ if (!bd_virt) {
++ dev_err(port->dev, "could not allocate buffer descriptors\n");
++ return -ENOMEM;
++ }
++
++ qe_port->bd_virt = bd_virt;
++ qe_port->bd_dma_addr = bd_dma_addr;
++ qe_port->bd_size = rx_size + tx_size;
++
++ qe_port->rx_buf = bd_virt;
++ qe_port->tx_buf = qe_port->rx_buf + rx_size;
++
++ return 0;
++}
++
++/*
++ * Configure the port.
++ *
++ * We say we're a CPM-type port because that's mostly true. Once the device
++ * is configured, this driver operates almost identically to the CPM serial
++ * driver.
++ */
++static void qe_uart_config_port(struct uart_port *port, int flags)
++{
++ if (flags & UART_CONFIG_TYPE) {
++ port->type = PORT_CPM;
++ qe_uart_request_port(port);
++ }
++}
++
++/*
++ * Release any memory and I/O resources that were allocated in
++ * qe_uart_request_port().
++ */
++static void qe_uart_release_port(struct uart_port *port)
++{
++ struct uart_qe_port *qe_port =
++ container_of(port, struct uart_qe_port, port);
++ struct ucc_slow_private *uccs = qe_port->us_private;
++
++ dma_free_coherent(NULL, qe_port->bd_size, qe_port->bd_virt,
++ qe_port->bd_dma_addr);
++
++ ucc_slow_free(uccs);
++}
++
++/*
++ * Verify that the data in serial_struct is suitable for this device.
++ */
++static int qe_uart_verify_port(struct uart_port *port,
++ struct serial_struct *ser)
++{
++ if (ser->type != PORT_UNKNOWN && ser->type != PORT_CPM)
++ return -EINVAL;
++
++ if (ser->irq < 0 || ser->irq >= NR_IRQS)
++ return -EINVAL;
++
++ if (ser->baud_base < 9600)
++ return -EINVAL;
++
++ return 0;
++}
++/* UART operations
++ *
++ * Details on these functions can be found in Documentation/serial/driver
++ */
++static struct uart_ops qe_uart_pops = {
++ .tx_empty = qe_uart_tx_empty,
++ .set_mctrl = qe_uart_set_mctrl,
++ .get_mctrl = qe_uart_get_mctrl,
++ .stop_tx = qe_uart_stop_tx,
++ .start_tx = qe_uart_start_tx,
++ .stop_rx = qe_uart_stop_rx,
++ .enable_ms = qe_uart_enable_ms,
++ .break_ctl = qe_uart_break_ctl,
++ .startup = qe_uart_startup,
++ .shutdown = qe_uart_shutdown,
++ .set_termios = qe_uart_set_termios,
++ .type = qe_uart_type,
++ .release_port = qe_uart_release_port,
++ .request_port = qe_uart_request_port,
++ .config_port = qe_uart_config_port,
++ .verify_port = qe_uart_verify_port,
++};
++
++/*
++ * Obtain the SOC model number and revision level
++ *
++ * This function parses the device tree to obtain the SOC model. It then
++ * reads the SVR register to the revision.
++ *
++ * The device tree stores the SOC model two different ways.
++ *
++ * The new way is:
++ *
++ * cpu@0 {
++ * compatible = "PowerPC,8323";
++ * device_type = "cpu";
++ * ...
++ *
++ *
++ * The old way is:
++ * PowerPC,8323@0 {
++ * device_type = "cpu";
++ * ...
++ *
++ * This code first checks the new way, and then the old way.
++ */
++static unsigned int soc_info(unsigned int *rev_h, unsigned int *rev_l)
++{
++ struct device_node *np;
++ const char *soc_string;
++ unsigned int svr;
++ unsigned int soc;
++
++ /* Find the CPU node */
++ np = of_find_node_by_type(NULL, "cpu");
++ if (!np)
++ return 0;
++ /* Find the compatible property */
++ soc_string = of_get_property(np, "compatible", NULL);
++ if (!soc_string)
++ /* No compatible property, so try the name. */
++ soc_string = np->name;
++
++ /* Extract the SOC number from the "PowerPC," string */
++ if ((sscanf(soc_string, "PowerPC,%u", &soc) != 1) || !soc)
++ return 0;
++
++ /* Get the revision from the SVR */
++ svr = mfspr(SPRN_SVR);
++ *rev_h = (svr >> 4) & 0xf;
++ *rev_l = svr & 0xf;
++
++ return soc;
++}
++
++/*
++ * requst_firmware_nowait() callback function
++ *
++ * This function is called by the kernel when a firmware is made available,
++ * or if it times out waiting for the firmware.
++ */
++static void uart_firmware_cont(const struct firmware *fw, void *context)
++{
++ struct qe_firmware *firmware;
++ struct device *dev = context;
++ int ret;
++
++ if (!fw) {
++ dev_err(dev, "firmware not found\n");
++ return;
++ }
++
++ firmware = (struct qe_firmware *) fw->data;
++
++ if (firmware->header.length != fw->size) {
++ dev_err(dev, "invalid firmware\n");
++ return;
++ }
++
++ ret = qe_upload_firmware(firmware);
++ if (ret) {
++ dev_err(dev, "could not load firmware\n");
++ return;
++ }
++
++ firmware_loaded = 1;
++}
++
++static int ucc_uart_probe(struct of_device *ofdev,
++ const struct of_device_id *match)
++{
++ struct device_node *np = ofdev->node;
++ const unsigned int *iprop; /* Integer OF properties */
++ const char *sprop; /* String OF properties */
++ struct uart_qe_port *qe_port = NULL;
++ struct resource res;
++ int ret;
++
++ /*
++ * Determine if we need Soft-UART mode
++ */
++ if (of_find_property(np, "soft-uart", NULL)) {
++ dev_dbg(&ofdev->dev, "using Soft-UART mode\n");
++ soft_uart = 1;
++ }
++
++ /*
++ * If we are using Soft-UART, determine if we need to upload the
++ * firmware, too.
++ */
++ if (soft_uart) {
++ struct qe_firmware_info *qe_fw_info;
++
++ qe_fw_info = qe_get_firmware_info();
++
++ /* Check if the firmware has been uploaded. */
++ if (qe_fw_info && strstr(qe_fw_info->id, "Soft-UART")) {
++ firmware_loaded = 1;
++ } else {
++ char filename[32];
++ unsigned int soc;
++ unsigned int rev_h;
++ unsigned int rev_l;
++
++ soc = soc_info(&rev_h, &rev_l);
++ if (!soc) {
++ dev_err(&ofdev->dev, "unknown CPU model\n");
++ return -ENXIO;
++ }
++ sprintf(filename, "fsl_qe_ucode_uart_%u_%u%u.bin",
++ soc, rev_h, rev_l);
++
++ dev_info(&ofdev->dev, "waiting for firmware %s\n",
++ filename);
++
++ /*
++ * We call request_firmware_nowait instead of
++ * request_firmware so that the driver can load and
++ * initialize the ports without holding up the rest of
++ * the kernel. If hotplug support is enabled in the
++ * kernel, then we use it.
++ */
++ ret = request_firmware_nowait(THIS_MODULE,
++ FW_ACTION_HOTPLUG, filename, &ofdev->dev,
++ &ofdev->dev, uart_firmware_cont);
++ if (ret) {
++ dev_err(&ofdev->dev,
++ "could not load firmware %s\n",
++ filename);
++ return ret;
++ }
++ }
++ }
++
++ qe_port = kzalloc(sizeof(struct uart_qe_port), GFP_KERNEL);
++ if (!qe_port) {
++ dev_err(&ofdev->dev, "can't allocate QE port structure\n");
++ return -ENOMEM;
++ }
++
++ /* Search for IRQ and mapbase */
++ ret = of_address_to_resource(np, 0, &res);
++ if (ret) {
++ dev_err(&ofdev->dev, "missing 'reg' property in device tree\n");
++ kfree(qe_port);
++ return ret;
++ }
++ if (!res.start) {
++ dev_err(&ofdev->dev, "invalid 'reg' property in device tree\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++ qe_port->port.mapbase = res.start;
++
++ /* Get the UCC number (device ID) */
++ /* UCCs are numbered 1-7 */
++ iprop = of_get_property(np, "device-id", NULL);
++ if (!iprop || (*iprop < 1) || (*iprop > UCC_MAX_NUM)) {
++ dev_err(&ofdev->dev,
++ "missing or invalid UCC specified in device tree\n");
++ kfree(qe_port);
++ return -ENODEV;
++ }
++ qe_port->ucc_num = *iprop - 1;
++
++ /*
++ * In the future, we should not require the BRG to be specified in the
++ * device tree. If no clock-source is specified, then just pick a BRG
++ * to use. This requires a new QE library function that manages BRG
++ * assignments.
++ */
++
++ sprop = of_get_property(np, "rx-clock-name", NULL);
++ if (!sprop) {
++ dev_err(&ofdev->dev, "missing rx-clock-name in device tree\n");
++ kfree(qe_port);
++ return -ENODEV;
++ }
++
++ qe_port->us_info.rx_clock = qe_clock_source(sprop);
++ if ((qe_port->us_info.rx_clock < QE_BRG1) ||
++ (qe_port->us_info.rx_clock > QE_BRG16)) {
++ dev_err(&ofdev->dev, "rx-clock-name must be a BRG for UART\n");
++ kfree(qe_port);
++ return -ENODEV;
++ }
++
++#ifdef LOOPBACK
++ /* In internal loopback mode, TX and RX must use the same clock */
++ qe_port->us_info.tx_clock = qe_port->us_info.rx_clock;
++#else
++ sprop = of_get_property(np, "tx-clock-name", NULL);
++ if (!sprop) {
++ dev_err(&ofdev->dev, "missing tx-clock-name in device tree\n");
++ kfree(qe_port);
++ return -ENODEV;
++ }
++ qe_port->us_info.tx_clock = qe_clock_source(sprop);
++#endif
++ if ((qe_port->us_info.tx_clock < QE_BRG1) ||
++ (qe_port->us_info.tx_clock > QE_BRG16)) {
++ dev_err(&ofdev->dev, "tx-clock-name must be a BRG for UART\n");
++ kfree(qe_port);
++ return -ENODEV;
++ }
++
++ /* Get the port number, numbered 0-3 */
++ iprop = of_get_property(np, "port-number", NULL);
++ if (!iprop) {
++ dev_err(&ofdev->dev, "missing port-number in device tree\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++ qe_port->port.line = *iprop;
++ if (qe_port->port.line >= UCC_MAX_UART) {
++ dev_err(&ofdev->dev, "port-number must be 0-%u\n",
++ UCC_MAX_UART - 1);
++ kfree(qe_port);
++ return -EINVAL;
++ }
++
++ qe_port->port.irq = irq_of_parse_and_map(np, 0);
++ if (qe_port->port.irq == NO_IRQ) {
++ dev_err(&ofdev->dev, "could not map IRQ for UCC%u\n",
++ qe_port->ucc_num + 1);
++ kfree(qe_port);
++ return -EINVAL;
++ }
++
++ /*
++ * Newer device trees have an "fsl,qe" compatible property for the QE
++ * node, but we still need to support older device trees.
++ */
++ np = of_find_compatible_node(NULL, NULL, "fsl,qe");
++ if (!np) {
++ np = of_find_node_by_type(NULL, "qe");
++ if (!np) {
++ dev_err(&ofdev->dev, "could not find 'qe' node\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++ }
++
++ iprop = of_get_property(np, "brg-frequency", NULL);
++ if (!iprop) {
++ dev_err(&ofdev->dev,
++ "missing brg-frequency in device tree\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++
++ if (*iprop)
++ qe_port->port.uartclk = *iprop;
++ else {
++ /*
++ * Older versions of U-Boot do not initialize the brg-frequency
++ * property, so in this case we assume the BRG frequency is
++ * half the QE bus frequency.
++ */
++ iprop = of_get_property(np, "bus-frequency", NULL);
++ if (!iprop) {
++ dev_err(&ofdev->dev,
++ "missing QE bus-frequency in device tree\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++ if (*iprop)
++ qe_port->port.uartclk = *iprop / 2;
++ else {
++ dev_err(&ofdev->dev,
++ "invalid QE bus-frequency in device tree\n");
++ kfree(qe_port);
++ return -EINVAL;
++ }
++ }
++
++ spin_lock_init(&qe_port->port.lock);
++ qe_port->np = np;
++ qe_port->port.dev = &ofdev->dev;
++ qe_port->port.ops = &qe_uart_pops;
++ qe_port->port.iotype = UPIO_MEM;
++
++ qe_port->tx_nrfifos = TX_NUM_FIFO;
++ qe_port->tx_fifosize = TX_BUF_SIZE;
++ qe_port->rx_nrfifos = RX_NUM_FIFO;
++ qe_port->rx_fifosize = RX_BUF_SIZE;
++
++ qe_port->wait_closing = UCC_WAIT_CLOSING;
++ qe_port->port.fifosize = 512;
++ qe_port->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
++
++ qe_port->us_info.ucc_num = qe_port->ucc_num;
++ qe_port->us_info.regs = (phys_addr_t) res.start;
++ qe_port->us_info.irq = qe_port->port.irq;
++
++ qe_port->us_info.rx_bd_ring_len = qe_port->rx_nrfifos;
++ qe_port->us_info.tx_bd_ring_len = qe_port->tx_nrfifos;
++
++ /* Make sure ucc_slow_init() initializes both TX and RX */
++ qe_port->us_info.init_tx = 1;
++ qe_port->us_info.init_rx = 1;
++
++ /* Add the port to the uart sub-system. This will cause
++ * qe_uart_config_port() to be called, so the us_info structure must
++ * be initialized.
++ */
++ ret = uart_add_one_port(&ucc_uart_driver, &qe_port->port);
++ if (ret) {
++ dev_err(&ofdev->dev, "could not add /dev/ttyQE%u\n",
++ qe_port->port.line);
++ kfree(qe_port);
++ return ret;
++ }
++
++ dev_set_drvdata(&ofdev->dev, qe_port);
++
++ dev_info(&ofdev->dev, "UCC%u assigned to /dev/ttyQE%u\n",
++ qe_port->ucc_num + 1, qe_port->port.line);
++
++ /* Display the mknod command for this device */
++ dev_dbg(&ofdev->dev, "mknod command is 'mknod /dev/ttyQE%u c %u %u'\n",
++ qe_port->port.line, SERIAL_QE_MAJOR,
++ SERIAL_QE_MINOR + qe_port->port.line);
++
++ return 0;
++}
++
++static int ucc_uart_remove(struct of_device *ofdev)
++{
++ struct uart_qe_port *qe_port = dev_get_drvdata(&ofdev->dev);
++
++ dev_info(&ofdev->dev, "removing /dev/ttyQE%u\n", qe_port->port.line);
++
++ uart_remove_one_port(&ucc_uart_driver, &qe_port->port);
++
++ dev_set_drvdata(&ofdev->dev, NULL);
++ kfree(qe_port);
++
++ return 0;
++}
++
++static struct of_device_id ucc_uart_match[] = {
++ {
++ .type = "serial",
++ .compatible = "ucc_uart",
++ },
++ {},
++};
++MODULE_DEVICE_TABLE(of, ucc_uart_match);
++
++static struct of_platform_driver ucc_uart_of_driver = {
++ .owner = THIS_MODULE,
++ .name = "ucc_uart",
++ .match_table = ucc_uart_match,
++ .probe = ucc_uart_probe,
++ .remove = ucc_uart_remove,
++};
++
++static int __init ucc_uart_init(void)
++{
++ int ret;
++
++ printk(KERN_INFO "Freescale QUICC Engine UART device driver\n");
++#ifdef LOOPBACK
++ printk(KERN_INFO "ucc-uart: Using loopback mode\n");
++#endif
++
++ ret = uart_register_driver(&ucc_uart_driver);
++ if (ret) {
++ printk(KERN_ERR "ucc-uart: could not register UART driver\n");
++ return ret;
++ }
++
++ ret = of_register_platform_driver(&ucc_uart_of_driver);
++ if (ret)
++ printk(KERN_ERR
++ "ucc-uart: could not register platform driver\n");
++
++ return ret;
++}
++
++static void __exit ucc_uart_exit(void)
++{
++ printk(KERN_INFO
++ "Freescale QUICC Engine UART device driver unloading\n");
++
++ of_unregister_platform_driver(&ucc_uart_of_driver);
++ uart_unregister_driver(&ucc_uart_driver);
++}
++
++module_init(ucc_uart_init);
++module_exit(ucc_uart_exit);
++
++MODULE_DESCRIPTION("Freescale QUICC Engine (QE) UART");
++MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
++MODULE_LICENSE("GPL v2");
++MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_QE_MAJOR);
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/drivers/spi/mpc52xx_psc_spi.c powerpc.git/drivers/spi/mpc52xx_psc_spi.c
+--- linux-2.6.24/drivers/spi/mpc52xx_psc_spi.c 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/drivers/spi/mpc52xx_psc_spi.c 2008-01-28 20:26:20.000000000 +0100
+@@ -330,6 +330,7 @@
+
+ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
+ {
++ struct device_node *np;
+ struct mpc52xx_cdm __iomem *cdm;
+ struct mpc52xx_gpio __iomem *gpio;
+ struct mpc52xx_psc __iomem *psc = mps->psc;
+@@ -338,8 +339,12 @@
+ int ret = 0;
+
+ #if defined(CONFIG_PPC_MERGE)
+- cdm = mpc52xx_find_and_map("mpc5200-cdm");
+- gpio = mpc52xx_find_and_map("mpc5200-gpio");
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
++ cdm = of_iomap(np, 0);
++ of_node_put(np);
++ np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
++ gpio = of_iomap(np, 0);
++ of_node_put(np);
+ #else
+ cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);
+ gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
+diff -x .git -x .gitignore -Nur linux-2.6.24/fs/openpromfs/inode.c powerpc.git/fs/openpromfs/inode.c
+--- linux-2.6.24/fs/openpromfs/inode.c 2008-01-28 20:50:11.000000000 +0100
++++ powerpc.git/fs/openpromfs/inode.c 2008-01-28 20:26:31.000000000 +0100
+@@ -131,7 +131,7 @@
+ /* Nothing to do */
+ }
+
+-static const struct seq_operations property_op = {
++static struct seq_operations property_op = {
+ .start = property_start,
+ .next = property_next,
+ .stop = property_stop,
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/8xx_immap.h powerpc.git/include/asm-powerpc/8xx_immap.h
+--- linux-2.6.24/include/asm-powerpc/8xx_immap.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/8xx_immap.h 2008-01-28 20:26:42.000000000 +0100
+@@ -123,7 +123,7 @@
+ #define OR_G5LA 0x00000400 /* Output #GPL5 on #GPL_A5 */
+ #define OR_G5LS 0x00000200 /* Drive #GPL high on falling edge of...*/
+ #define OR_BI 0x00000100 /* Burst inhibit */
+-#define OR_SCY_MSK 0x000000f0 /* Cycle Lenght in Clocks */
++#define OR_SCY_MSK 0x000000f0 /* Cycle Length in Clocks */
+ #define OR_SCY_0_CLK 0x00000000 /* 0 clock cycles wait states */
+ #define OR_SCY_1_CLK 0x00000010 /* 1 clock cycles wait states */
+ #define OR_SCY_2_CLK 0x00000020 /* 2 clock cycles wait states */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/commproc.h powerpc.git/include/asm-powerpc/commproc.h
+--- linux-2.6.24/include/asm-powerpc/commproc.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/commproc.h 2008-01-28 20:26:42.000000000 +0100
+@@ -693,7 +693,7 @@
+ #define CICR_SCC_SCC3 ((uint)0x00200000) /* SCC3 @ SCCc */
+ #define CICR_SCB_SCC2 ((uint)0x00040000) /* SCC2 @ SCCb */
+ #define CICR_SCA_SCC1 ((uint)0x00000000) /* SCC1 @ SCCa */
+-#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrrupt */
++#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrupt */
+ #define CICR_HP_MASK ((uint)0x00001f00) /* Hi-pri int. */
+ #define CICR_IEN ((uint)0x00000080) /* Int. enable */
+ #define CICR_SPS ((uint)0x00000001) /* SCC Spread */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/cpm.h powerpc.git/include/asm-powerpc/cpm.h
+--- linux-2.6.24/include/asm-powerpc/cpm.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/cpm.h 2008-01-28 20:26:42.000000000 +0100
+@@ -10,5 +10,6 @@
+ unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
+ void __iomem *cpm_muram_addr(unsigned long offset);
+ dma_addr_t cpm_muram_dma(void __iomem *addr);
++int cpm_command(u32 command, u8 opcode);
+
+ #endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/cputable.h powerpc.git/include/asm-powerpc/cputable.h
+--- linux-2.6.24/include/asm-powerpc/cputable.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/cputable.h 2008-01-28 20:26:42.000000000 +0100
+@@ -57,6 +57,14 @@
+ PPC_PMC_PA6T = 2,
+ };
+
++struct pt_regs;
++
++extern int machine_check_generic(struct pt_regs *regs);
++extern int machine_check_4xx(struct pt_regs *regs);
++extern int machine_check_440A(struct pt_regs *regs);
++extern int machine_check_e500(struct pt_regs *regs);
++extern int machine_check_e200(struct pt_regs *regs);
++
+ /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
+ struct cpu_spec {
+ /* CPU is matched via (PVR & pvr_mask) == pvr_value */
+@@ -97,6 +105,11 @@
+
+ /* Name of processor class, for the ELF AT_PLATFORM entry */
+ char *platform;
++
++ /* Processor specific machine check handling. Return negative
++ * if the error is fatal, 1 if it was fully recovered and 0 to
++ * pass up (not CPU originated) */
++ int (*machine_check)(struct pt_regs *regs);
+ };
+
+ extern struct cpu_spec *cur_cpu_spec;
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/cputhreads.h powerpc.git/include/asm-powerpc/cputhreads.h
+--- linux-2.6.24/include/asm-powerpc/cputhreads.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/include/asm-powerpc/cputhreads.h 2008-01-28 20:26:42.000000000 +0100
+@@ -0,0 +1,71 @@
++#ifndef _ASM_POWERPC_CPUTHREADS_H
++#define _ASM_POWERPC_CPUTHREADS_H
++
++#include <linux/cpumask.h>
++
++/*
++ * Mapping of threads to cores
++ */
++
++#ifdef CONFIG_SMP
++extern int threads_per_core;
++extern int threads_shift;
++extern cpumask_t threads_core_mask;
++#else
++#define threads_per_core 1
++#define threads_shift 0
++#define threads_core_mask (CPU_MASK_CPU0)
++#endif
++
++/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
++ * hit by the argument
++ *
++ * @threads: a cpumask of threads
++ *
++ * This function returns a cpumask which will have one "cpu" (or thread)
++ * bit set for each core that has at least one thread set in the argument.
++ *
++ * This can typically be used for things like IPI for tlb invalidations
++ * since those need to be done only once per core/TLB
++ */
++static inline cpumask_t cpu_thread_mask_to_cores(cpumask_t threads)
++{
++ cpumask_t tmp, res;
++ int i;
++
++ res = CPU_MASK_NONE;
++ for (i = 0; i < NR_CPUS; i += threads_per_core) {
++ cpus_shift_right(tmp, threads_core_mask, i);
++ if (cpus_intersects(threads, tmp))
++ cpu_set(i, res);
++ }
++ return res;
++}
++
++static inline int cpu_nr_cores(void)
++{
++ return NR_CPUS >> threads_shift;
++}
++
++static inline cpumask_t cpu_online_cores_map(void)
++{
++ return cpu_thread_mask_to_cores(cpu_online_map);
++}
++
++static inline int cpu_thread_to_core(int cpu)
++{
++ return cpu >> threads_shift;
++}
++
++static inline int cpu_thread_in_core(int cpu)
++{
++ return cpu & (threads_per_core - 1);
++}
++
++static inline int cpu_first_thread_in_core(int cpu)
++{
++ return cpu & ~(threads_per_core - 1);
++}
++
++#endif /* _ASM_POWERPC_CPUTHREADS_H */
++
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/dcr-native.h powerpc.git/include/asm-powerpc/dcr-native.h
+--- linux-2.6.24/include/asm-powerpc/dcr-native.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/dcr-native.h 2008-01-28 20:26:42.000000000 +0100
+@@ -22,6 +22,8 @@
+ #ifdef __KERNEL__
+ #ifndef __ASSEMBLY__
+
++#include <linux/spinlock.h>
++
+ typedef struct {
+ unsigned int base;
+ } dcr_host_t;
+@@ -55,20 +57,28 @@
+ } while (0)
+
+ /* R/W of indirect DCRs make use of standard naming conventions for DCRs */
+-#define mfdcri(base, reg) \
+-({ \
+- mtdcr(base ## _CFGADDR, base ## _ ## reg); \
+- mfdcr(base ## _CFGDATA); \
++extern spinlock_t dcr_ind_lock;
++
++#define mfdcri(base, reg) \
++({ \
++ unsigned long flags; \
++ unsigned int val; \
++ spin_lock_irqsave(&dcr_ind_lock, flags); \
++ mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg); \
++ val = mfdcr(DCRN_ ## base ## _CONFIG_DATA); \
++ spin_unlock_irqrestore(&dcr_ind_lock, flags); \
++ val; \
+ })
+
+-#define mtdcri(base, reg, data) \
+-do { \
+- mtdcr(base ## _CFGADDR, base ## _ ## reg); \
+- mtdcr(base ## _CFGDATA, data); \
++#define mtdcri(base, reg, data) \
++do { \
++ unsigned long flags; \
++ spin_lock_irqsave(&dcr_ind_lock, flags); \
++ mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg); \
++ mtdcr(DCRN_ ## base ## _CONFIG_DATA, data); \
++ spin_unlock_irqrestore(&dcr_ind_lock, flags); \
+ } while (0)
+
+ #endif /* __ASSEMBLY__ */
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_DCR_NATIVE_H */
+-
+-
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/dcr-regs.h powerpc.git/include/asm-powerpc/dcr-regs.h
+--- linux-2.6.24/include/asm-powerpc/dcr-regs.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/include/asm-powerpc/dcr-regs.h 2008-01-28 20:26:42.000000000 +0100
+@@ -0,0 +1,71 @@
++/*
++ * Common DCR / SDR / CPR register definitions used on various IBM/AMCC
++ * 4xx processors
++ *
++ * Copyright 2007 Benjamin Herrenschmidt, IBM Corp
++ * <benh@kernel.crashing.org>
++ *
++ * Mostly lifted from asm-ppc/ibm4xx.h by
++ *
++ * Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
++ *
++ */
++
++#ifndef __DCR_REGS_H__
++#define __DCR_REGS_H__
++
++/*
++ * Most DCRs used for controlling devices such as the MAL, DMA engine,
++ * etc... are obtained for the device tree.
++ *
++ * The definitions in this files are fixed DCRs and indirect DCRs that
++ * are commonly used outside of specific drivers or refer to core
++ * common registers that may occasionally have to be tweaked outside
++ * of the driver main register set
++ */
++
++/* CPRs (440GX and 440SP/440SPe) */
++#define DCRN_CPR0_CONFIG_ADDR 0xc
++#define DCRN_CPR0_CONFIG_DATA 0xd
++
++/* SDRs (440GX and 440SP/440SPe) */
++#define DCRN_SDR0_CONFIG_ADDR 0xe
++#define DCRN_SDR0_CONFIG_DATA 0xf
++
++#define SDR0_PFC0 0x4100
++#define SDR0_PFC1 0x4101
++#define SDR0_PFC1_EPS 0x1c00000
++#define SDR0_PFC1_EPS_SHIFT 22
++#define SDR0_PFC1_RMII 0x02000000
++#define SDR0_MFR 0x4300
++#define SDR0_MFR_TAH0 0x80000000 /* TAHOE0 Enable */
++#define SDR0_MFR_TAH1 0x40000000 /* TAHOE1 Enable */
++#define SDR0_MFR_PCM 0x10000000 /* PPC440GP irq compat mode */
++#define SDR0_MFR_ECS 0x08000000 /* EMAC int clk */
++#define SDR0_MFR_T0TXFL 0x00080000
++#define SDR0_MFR_T0TXFH 0x00040000
++#define SDR0_MFR_T1TXFL 0x00020000
++#define SDR0_MFR_T1TXFH 0x00010000
++#define SDR0_MFR_E0TXFL 0x00008000
++#define SDR0_MFR_E0TXFH 0x00004000
++#define SDR0_MFR_E0RXFL 0x00002000
++#define SDR0_MFR_E0RXFH 0x00001000
++#define SDR0_MFR_E1TXFL 0x00000800
++#define SDR0_MFR_E1TXFH 0x00000400
++#define SDR0_MFR_E1RXFL 0x00000200
++#define SDR0_MFR_E1RXFH 0x00000100
++#define SDR0_MFR_E2TXFL 0x00000080
++#define SDR0_MFR_E2TXFH 0x00000040
++#define SDR0_MFR_E2RXFL 0x00000020
++#define SDR0_MFR_E2RXFH 0x00000010
++#define SDR0_MFR_E3TXFL 0x00000008
++#define SDR0_MFR_E3TXFH 0x00000004
++#define SDR0_MFR_E3RXFL 0x00000002
++#define SDR0_MFR_E3RXFH 0x00000001
++#define SDR0_UART0 0x0120
++#define SDR0_UART1 0x0121
++#define SDR0_UART2 0x0122
++#define SDR0_UART3 0x0123
++#define SDR0_CUST0 0x4000
++
++#endif /* __DCR_REGS_H__ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/dma-mapping.h powerpc.git/include/asm-powerpc/dma-mapping.h
+--- linux-2.6.24/include/asm-powerpc/dma-mapping.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/dma-mapping.h 2008-01-28 20:26:42.000000000 +0100
+@@ -87,6 +87,9 @@
+ return dma_ops->dma_supported(dev, mask);
+ }
+
++/* We have our own implementation of pci_set_dma_mask() */
++#define HAVE_ARCH_PCI_SET_DMA_MASK
++
+ static inline int dma_set_mask(struct device *dev, u64 dma_mask)
+ {
+ struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
+@@ -186,8 +189,6 @@
+ extern struct dma_mapping_ops dma_iommu_ops;
+ extern struct dma_mapping_ops dma_direct_ops;
+
+-extern unsigned long dma_direct_offset;
+-
+ #else /* CONFIG_PPC64 */
+
+ #define dma_supported(dev, mask) (1)
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/firmware.h powerpc.git/include/asm-powerpc/firmware.h
+--- linux-2.6.24/include/asm-powerpc/firmware.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/firmware.h 2008-01-28 20:26:42.000000000 +0100
+@@ -64,7 +64,7 @@
+ FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
+ FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
+ FW_FEATURE_CELLEB_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
+- FW_FEATURE_CELLEB_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
++ FW_FEATURE_CELLEB_ALWAYS = 0,
+ FW_FEATURE_NATIVE_POSSIBLE = 0,
+ FW_FEATURE_NATIVE_ALWAYS = 0,
+ FW_FEATURE_POSSIBLE =
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/immap_86xx.h powerpc.git/include/asm-powerpc/immap_86xx.h
+--- linux-2.6.24/include/asm-powerpc/immap_86xx.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/immap_86xx.h 2008-01-28 20:26:42.000000000 +0100
+@@ -89,14 +89,14 @@
+ * them.
+ *
+ * guts: Pointer to GUTS structure
+- * co: The DMA controller (1 or 2)
++ * co: The DMA controller (0 or 1)
+ * ch: The channel on the DMA controller (0, 1, 2, or 3)
+ * device: The device to set as the source (CCSR_GUTS_DMACR_DEV_xx)
+ */
+ static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
+ unsigned int co, unsigned int ch, unsigned int device)
+ {
+- unsigned int shift = 16 + (8 * (2 - co) + 2 * (3 - ch));
++ unsigned int shift = 16 + (8 * (1 - co) + 2 * (3 - ch));
+
+ clrsetbits_be32(&guts->dmacr, 3 << shift, device << shift);
+ }
+@@ -118,6 +118,27 @@
+ #define CCSR_GUTS_PMUXCR_DMA1_0 0x00000002
+ #define CCSR_GUTS_PMUXCR_DMA1_3 0x00000001
+
++/*
++ * Set the DMA external control bits in the GUTS
++ *
++ * The DMA external control bits in the PMUXCR are only meaningful for
++ * channels 0 and 3. Any other channels are ignored.
++ *
++ * guts: Pointer to GUTS structure
++ * co: The DMA controller (0 or 1)
++ * ch: The channel on the DMA controller (0, 1, 2, or 3)
++ * value: the new value for the bit (0 or 1)
++ */
++static inline void guts_set_pmuxcr_dma(struct ccsr_guts __iomem *guts,
++ unsigned int co, unsigned int ch, unsigned int value)
++{
++ if ((ch == 0) || (ch == 3)) {
++ unsigned int shift = 2 * (co + 1) - (ch & 1) - 1;
++
++ clrsetbits_be32(&guts->pmuxcr, 1 << shift, value << shift);
++ }
++}
++
+ #define CCSR_GUTS_CLKDVDR_PXCKEN 0x80000000
+ #define CCSR_GUTS_CLKDVDR_SSICKEN 0x20000000
+ #define CCSR_GUTS_CLKDVDR_PXCKINV 0x10000000
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/immap_qe.h powerpc.git/include/asm-powerpc/immap_qe.h
+--- linux-2.6.24/include/asm-powerpc/immap_qe.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/immap_qe.h 2008-01-28 20:26:42.000000000 +0100
+@@ -393,9 +393,39 @@
+ u8 res2[0x48];
+ } __attribute__ ((packed));
+
+-/* RISC Special Registers (Trap and Breakpoint) */
++/*
++ * RISC Special Registers (Trap and Breakpoint). These are described in
++ * the QE Developer's Handbook.
++ */
+ struct rsp {
+- u32 reg[0x40]; /* 64 32-bit registers */
++ __be32 tibcr[16]; /* Trap/instruction breakpoint control regs */
++ u8 res0[64];
++ __be32 ibcr0;
++ __be32 ibs0;
++ __be32 ibcnr0;
++ u8 res1[4];
++ __be32 ibcr1;
++ __be32 ibs1;
++ __be32 ibcnr1;
++ __be32 npcr;
++ __be32 dbcr;
++ __be32 dbar;
++ __be32 dbamr;
++ __be32 dbsr;
++ __be32 dbcnr;
++ u8 res2[12];
++ __be32 dbdr_h;
++ __be32 dbdr_l;
++ __be32 dbdmr_h;
++ __be32 dbdmr_l;
++ __be32 bsr;
++ __be32 bor;
++ __be32 bior;
++ u8 res3[4];
++ __be32 iatr[4];
++ __be32 eccr; /* Exception control configuration register */
++ __be32 eicr;
++ u8 res4[0x100-0xf8];
+ } __attribute__ ((packed));
+
+ struct qe_immap {
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/io.h powerpc.git/include/asm-powerpc/io.h
+--- linux-2.6.24/include/asm-powerpc/io.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/io.h 2008-01-28 20:26:42.000000000 +0100
+@@ -50,15 +50,16 @@
+ #define PCI_DRAM_OFFSET pci_dram_offset
+ #else
+ #define _IO_BASE pci_io_base
+-#define _ISA_MEM_BASE 0
++#define _ISA_MEM_BASE isa_mem_base
+ #define PCI_DRAM_OFFSET 0
+ #endif
+
+ extern unsigned long isa_io_base;
+-extern unsigned long isa_mem_base;
+ extern unsigned long pci_io_base;
+ extern unsigned long pci_dram_offset;
+
++extern resource_size_t isa_mem_base;
++
+ #if defined(CONFIG_PPC32) && defined(CONFIG_PPC_INDIRECT_IO)
+ #error CONFIG_PPC_INDIRECT_IO is not yet supported on 32 bits
+ #endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/iommu.h powerpc.git/include/asm-powerpc/iommu.h
+--- linux-2.6.24/include/asm-powerpc/iommu.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/iommu.h 2008-01-28 20:26:42.000000000 +0100
+@@ -69,10 +69,9 @@
+ };
+
+ struct scatterlist;
+-struct device_node;
+
+ /* Frees table for an individual device node */
+-extern void iommu_free_table(struct device_node *dn);
++extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
+
+ /* Initializes an iommu_table based in values set in the passed-in
+ * structure
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/ipic.h powerpc.git/include/asm-powerpc/ipic.h
+--- linux-2.6.24/include/asm-powerpc/ipic.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/ipic.h 2008-01-28 20:26:42.000000000 +0100
+@@ -20,11 +20,13 @@
+
+ /* Flags when we init the IPIC */
+ #define IPIC_SPREADMODE_GRP_A 0x00000001
+-#define IPIC_SPREADMODE_GRP_D 0x00000002
+-#define IPIC_SPREADMODE_MIX_A 0x00000004
+-#define IPIC_SPREADMODE_MIX_B 0x00000008
+-#define IPIC_DISABLE_MCP_OUT 0x00000010
+-#define IPIC_IRQ0_MCP 0x00000020
++#define IPIC_SPREADMODE_GRP_B 0x00000002
++#define IPIC_SPREADMODE_GRP_C 0x00000004
++#define IPIC_SPREADMODE_GRP_D 0x00000008
++#define IPIC_SPREADMODE_MIX_A 0x00000010
++#define IPIC_SPREADMODE_MIX_B 0x00000020
++#define IPIC_DISABLE_MCP_OUT 0x00000040
++#define IPIC_IRQ0_MCP 0x00000080
+
+ /* IPIC registers offsets */
+ #define IPIC_SICFR 0x00 /* System Global Interrupt Configuration Register */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/iseries/hv_lp_event.h powerpc.git/include/asm-powerpc/iseries/hv_lp_event.h
+--- linux-2.6.24/include/asm-powerpc/iseries/hv_lp_event.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/iseries/hv_lp_event.h 2008-01-28 20:26:42.000000000 +0100
+@@ -78,7 +78,7 @@
+
+ /*
+ * Close an Lp Event Path for a type and partition
+- * returns 0 on sucess
++ * returns 0 on success
+ */
+ extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/kexec.h powerpc.git/include/asm-powerpc/kexec.h
+--- linux-2.6.24/include/asm-powerpc/kexec.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/kexec.h 2008-01-28 20:26:42.000000000 +0100
+@@ -123,6 +123,9 @@
+ extern void default_machine_kexec(struct kimage *image);
+ extern int default_machine_kexec_prepare(struct kimage *image);
+ extern void default_machine_crash_shutdown(struct pt_regs *regs);
++typedef void (*crash_shutdown_t)(void);
++extern int crash_shutdown_register(crash_shutdown_t handler);
++extern int crash_shutdown_unregister(crash_shutdown_t handler);
+
+ extern void machine_kexec_simple(struct kimage *image);
+ extern void crash_kexec_secondary(struct pt_regs *regs);
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/lmb.h powerpc.git/include/asm-powerpc/lmb.h
+--- linux-2.6.24/include/asm-powerpc/lmb.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/lmb.h 2008-01-28 20:26:42.000000000 +0100
+@@ -51,6 +51,7 @@
+ extern unsigned long __init lmb_phys_mem_size(void);
+ extern unsigned long __init lmb_end_of_DRAM(void);
+ extern void __init lmb_enforce_memory_limit(unsigned long memory_limit);
++extern int __init lmb_is_reserved(unsigned long addr);
+
+ extern void lmb_dump_all(void);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/machdep.h powerpc.git/include/asm-powerpc/machdep.h
+--- linux-2.6.24/include/asm-powerpc/machdep.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/machdep.h 2008-01-28 20:26:42.000000000 +0100
+@@ -204,6 +204,13 @@
+ /*
+ * optional PCI "hooks"
+ */
++ /* Called in indirect_* to avoid touching devices */
++ int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
++
++ /* Called at then very end of pcibios_init() */
++ void (*pcibios_after_init)(void);
++
++#endif /* CONFIG_PPC32 */
+
+ /* Called after PPC generic resource fixup to perform
+ machine specific fixups */
+@@ -212,18 +219,9 @@
+ /* Called for each PCI bus in the system when it's probed */
+ void (*pcibios_fixup_bus)(struct pci_bus *);
+
+- /* Called when pci_enable_device() is called (initial=0) or
+- * when a device with no assigned resource is found (initial=1).
+- * Returns 0 to allow assignment/enabling of the device. */
+- int (*pcibios_enable_device_hook)(struct pci_dev *, int initial);
+-
+- /* Called in indirect_* to avoid touching devices */
+- int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
+-
+- /* Called at then very end of pcibios_init() */
+- void (*pcibios_after_init)(void);
+-
+-#endif /* CONFIG_PPC32 */
++ /* Called when pci_enable_device() is called. Returns 0 to
++ * allow assignment/enabling of the device. */
++ int (*pcibios_enable_device_hook)(struct pci_dev *);
+
+ /* Called to shutdown machine specific hardware not already controlled
+ * by other drivers.
+@@ -253,6 +251,16 @@
+ */
+ void (*machine_kexec)(struct kimage *image);
+ #endif /* CONFIG_KEXEC */
++
++#ifdef CONFIG_SUSPEND
++ /* These are called to disable and enable, respectively, IRQs when
++ * entering a suspend state. If NULL, then the generic versions
++ * will be called. The generic versions disable/enable the
++ * decrementer along with interrupts.
++ */
++ void (*suspend_disable_irqs)(void);
++ void (*suspend_enable_irqs)(void);
++#endif
+ };
+
+ extern void power4_idle(void);
+@@ -326,5 +334,31 @@
+ ppc_md.log_error(buf, err_type, fatal);
+ }
+
++#define __define_machine_initcall(mach,level,fn,id) \
++ static int __init __machine_initcall_##mach##_##fn(void) { \
++ if (machine_is(mach)) return fn(); \
++ return 0; \
++ } \
++ __define_initcall(level,__machine_initcall_##mach##_##fn,id);
++
++#define machine_core_initcall(mach,fn) __define_machine_initcall(mach,"1",fn,1)
++#define machine_core_initcall_sync(mach,fn) __define_machine_initcall(mach,"1s",fn,1s)
++#define machine_postcore_initcall(mach,fn) __define_machine_initcall(mach,"2",fn,2)
++#define machine_postcore_initcall_sync(mach,fn) __define_machine_initcall(mach,"2s",fn,2s)
++#define machine_arch_initcall(mach,fn) __define_machine_initcall(mach,"3",fn,3)
++#define machine_arch_initcall_sync(mach,fn) __define_machine_initcall(mach,"3s",fn,3s)
++#define machine_subsys_initcall(mach,fn) __define_machine_initcall(mach,"4",fn,4)
++#define machine_subsys_initcall_sync(mach,fn) __define_machine_initcall(mach,"4s",fn,4s)
++#define machine_fs_initcall(mach,fn) __define_machine_initcall(mach,"5",fn,5)
++#define machine_fs_initcall_sync(mach,fn) __define_machine_initcall(mach,"5s",fn,5s)
++#define machine_rootfs_initcall(mach,fn) __define_machine_initcall(mach,"rootfs",fn,rootfs)
++#define machine_device_initcall(mach,fn) __define_machine_initcall(mach,"6",fn,6)
++#define machine_device_initcall_sync(mach,fn) __define_machine_initcall(mach,"6s",fn,6s)
++#define machine_late_initcall(mach,fn) __define_machine_initcall(mach,"7",fn,7)
++#define machine_late_initcall_sync(mach,fn) __define_machine_initcall(mach,"7s",fn,7s)
++
++void generic_suspend_disable_irqs(void);
++void generic_suspend_enable_irqs(void);
++
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_MACHDEP_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/mmu-hash64.h powerpc.git/include/asm-powerpc/mmu-hash64.h
+--- linux-2.6.24/include/asm-powerpc/mmu-hash64.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/mmu-hash64.h 2008-01-28 21:37:04.000000000 +0100
+@@ -80,7 +80,7 @@
+ #define HPTE_V_AVPN_SHIFT 7
+ #define HPTE_V_AVPN ASM_CONST(0x3fffffffffffff80)
+ #define HPTE_V_AVPN_VAL(x) (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
+-#define HPTE_V_COMPARE(x,y) (!(((x) ^ (y)) & 0xffffffffffffff80))
++#define HPTE_V_COMPARE(x,y) (!(((x) ^ (y)) & 0xffffffffffffff80UL))
+ #define HPTE_V_BOLTED ASM_CONST(0x0000000000000010)
+ #define HPTE_V_LOCK ASM_CONST(0x0000000000000008)
+ #define HPTE_V_LARGE ASM_CONST(0x0000000000000004)
+@@ -180,6 +180,7 @@
+ extern int mmu_io_psize;
+ extern int mmu_kernel_ssize;
+ extern int mmu_highuser_ssize;
++extern u16 mmu_slb_size;
+
+ /*
+ * If the processor supports 64k normal pages but not 64k cache
+@@ -277,6 +278,7 @@
+ extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
+ unsigned long pstart, unsigned long mode,
+ int psize, int ssize);
++extern void set_huge_psize(int psize);
+
+ extern void htab_initialize(void);
+ extern void htab_initialize_secondary(void);
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/mpc52xx.h powerpc.git/include/asm-powerpc/mpc52xx.h
+--- linux-2.6.24/include/asm-powerpc/mpc52xx.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/mpc52xx.h 2008-01-28 20:26:42.000000000 +0100
+@@ -248,8 +248,6 @@
+
+ #ifndef __ASSEMBLY__
+
+-extern void __iomem * mpc52xx_find_and_map(const char *);
+-extern void __iomem * mpc52xx_find_and_map_path(const char *path);
+ extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
+ extern void mpc5200_setup_xlb_arbiter(void);
+ extern void mpc52xx_declare_of_platform_devices(void);
+@@ -257,7 +255,12 @@
+ extern void mpc52xx_init_irq(void);
+ extern unsigned int mpc52xx_get_irq(void);
+
++#ifdef CONFIG_PCI
+ extern int __init mpc52xx_add_bridge(struct device_node *node);
++extern void __init mpc52xx_setup_pci(void);
++#else
++static inline void mpc52xx_setup_pci(void) { }
++#endif
+
+ extern void __init mpc52xx_map_wdt(void);
+ extern void mpc52xx_restart(char *cmd);
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/mpc52xx_psc.h powerpc.git/include/asm-powerpc/mpc52xx_psc.h
+--- linux-2.6.24/include/asm-powerpc/mpc52xx_psc.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/mpc52xx_psc.h 2008-01-28 20:26:42.000000000 +0100
+@@ -153,6 +153,9 @@
+ u8 reserved16[3];
+ u8 irfdr; /* PSC + 0x54 */
+ u8 reserved17[3];
++};
++
++struct mpc52xx_psc_fifo {
+ u16 rfnum; /* PSC + 0x58 */
+ u16 reserved18;
+ u16 tfnum; /* PSC + 0x5c */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/mpc8260.h powerpc.git/include/asm-powerpc/mpc8260.h
+--- linux-2.6.24/include/asm-powerpc/mpc8260.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/mpc8260.h 2008-01-28 20:26:42.000000000 +0100
+@@ -8,6 +8,7 @@
+ #ifndef __ASM_POWERPC_MPC8260_H__
+ #define __ASM_POWERPC_MPC8260_H__
+
++#define MPC82XX_BCR_PLDP 0x00800000 /* Pipeline Maximum Depth */
+
+ #ifdef CONFIG_8260
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/mpic.h powerpc.git/include/asm-powerpc/mpic.h
+--- linux-2.6.24/include/asm-powerpc/mpic.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/mpic.h 2008-01-28 20:26:42.000000000 +0100
+@@ -22,7 +22,9 @@
+ #define MPIC_GREG_GLOBAL_CONF_0 0x00020
+ #define MPIC_GREG_GCONF_RESET 0x80000000
+ #define MPIC_GREG_GCONF_8259_PTHROU_DIS 0x20000000
++#define MPIC_GREG_GCONF_NO_BIAS 0x10000000
+ #define MPIC_GREG_GCONF_BASE_MASK 0x000fffff
++#define MPIC_GREG_GCONF_MCK 0x08000000
+ #define MPIC_GREG_GLOBAL_CONF_1 0x00030
+ #define MPIC_GREG_GLOBAL_CONF_1_SIE 0x08000000
+ #define MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK 0x70000000
+@@ -78,6 +80,7 @@
+ #define MPIC_CPU_WHOAMI_MASK 0x0000001f
+ #define MPIC_CPU_INTACK 0x000a0
+ #define MPIC_CPU_EOI 0x000b0
++#define MPIC_CPU_MCACK 0x000c0
+
+ /*
+ * Per-source registers
+@@ -141,6 +144,7 @@
+ #define TSI108_CPU_WHOAMI 0xffffffff
+ #define TSI108_CPU_INTACK 0x00004
+ #define TSI108_CPU_EOI 0x00008
++#define TSI108_CPU_MCACK 0x00004 /* Doesn't really exist here */
+
+ /*
+ * Per-source registers
+@@ -183,6 +187,7 @@
+ MPIC_IDX_CPU_WHOAMI,
+ MPIC_IDX_CPU_INTACK,
+ MPIC_IDX_CPU_EOI,
++ MPIC_IDX_CPU_MCACK,
+
+ MPIC_IDX_IRQ_BASE,
+ MPIC_IDX_IRQ_STRIDE,
+@@ -344,6 +349,10 @@
+ #define MPIC_USES_DCR 0x00000080
+ /* MPIC has 11-bit vector fields (or larger) */
+ #define MPIC_LARGE_VECTORS 0x00000100
++/* Enable delivery of prio 15 interrupts as MCK instead of EE */
++#define MPIC_ENABLE_MCK 0x00000200
++/* Disable bias among target selection, spread interrupts evenly */
++#define MPIC_NO_BIAS 0x00000400
+
+ /* MPIC HW modification ID */
+ #define MPIC_REGSET_MASK 0xf0000000
+@@ -447,10 +456,19 @@
+ /* Send a message (IPI) to a given target (cpu number or MSG_*) */
+ void smp_mpic_message_pass(int target, int msg);
+
++/* Unmask a specific virq */
++extern void mpic_unmask_irq(unsigned int irq);
++/* Mask a specific virq */
++extern void mpic_mask_irq(unsigned int irq);
++/* EOI a specific virq */
++extern void mpic_end_irq(unsigned int irq);
++
+ /* Fetch interrupt from a given mpic */
+ extern unsigned int mpic_get_one_irq(struct mpic *mpic);
+-/* This one gets to the primary mpic */
++/* This one gets from the primary mpic */
+ extern unsigned int mpic_get_irq(void);
++/* Fetch Machine Check interrupt from primary mpic */
++extern unsigned int mpic_get_mcirq(void);
+
+ /* Set the EPIC clock ratio */
+ void mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio);
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/nvram.h powerpc.git/include/asm-powerpc/nvram.h
+--- linux-2.6.24/include/asm-powerpc/nvram.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/nvram.h 2008-01-28 20:26:42.000000000 +0100
+@@ -10,6 +10,8 @@
+ #ifndef _ASM_POWERPC_NVRAM_H
+ #define _ASM_POWERPC_NVRAM_H
+
++#include <linux/errno.h>
++
+ #define NVRW_CNT 0x20
+ #define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
+ #define NVRAM_BLOCK_LEN 16
+@@ -71,7 +73,16 @@
+ extern struct nvram_partition *nvram_find_partition(int sig, const char *name);
+
+ extern int pSeries_nvram_init(void);
++
++#ifdef CONFIG_MMIO_NVRAM
+ extern int mmio_nvram_init(void);
++#else
++static inline int mmio_nvram_init(void)
++{
++ return -ENODEV;
++}
++#endif
++
+ #endif /* __KERNEL__ */
+
+ /* PowerMac specific nvram stuffs */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/of_platform.h powerpc.git/include/asm-powerpc/of_platform.h
+--- linux-2.6.24/include/asm-powerpc/of_platform.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/of_platform.h 2008-01-28 20:26:42.000000000 +0100
+@@ -15,8 +15,14 @@
+ #include <linux/of_platform.h>
+
+ /* Platform drivers register/unregister */
+-extern int of_register_platform_driver(struct of_platform_driver *drv);
+-extern void of_unregister_platform_driver(struct of_platform_driver *drv);
++static inline int of_register_platform_driver(struct of_platform_driver *drv)
++{
++ return of_register_driver(drv, &of_platform_bus_type);
++}
++static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
++{
++ of_unregister_driver(drv);
++}
+
+ /* Platform devices and busses creation */
+ extern struct of_device *of_platform_device_create(struct device_node *np,
+@@ -26,9 +32,11 @@
+ #define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
+
+ extern int of_platform_bus_probe(struct device_node *root,
+- struct of_device_id *matches,
++ const struct of_device_id *matches,
+ struct device *parent);
+
+ extern struct of_device *of_find_device_by_phandle(phandle ph);
+
++extern void of_instantiate_rtc(void);
++
+ #endif /* _ASM_POWERPC_OF_PLATFORM_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/pci-bridge.h powerpc.git/include/asm-powerpc/pci-bridge.h
+--- linux-2.6.24/include/asm-powerpc/pci-bridge.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/pci-bridge.h 2008-01-28 20:26:42.000000000 +0100
+@@ -1,15 +1,42 @@
+ #ifndef _ASM_POWERPC_PCI_BRIDGE_H
+ #define _ASM_POWERPC_PCI_BRIDGE_H
+ #ifdef __KERNEL__
+-
++/*
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ */
+ #include <linux/pci.h>
+ #include <linux/list.h>
+ #include <linux/ioport.h>
+
+-#ifndef CONFIG_PPC64
+-
+ struct device_node;
+-struct pci_controller;
++
++extern unsigned int ppc_pci_flags;
++enum {
++ /* Force re-assigning all resources (ignore firmware
++ * setup completely)
++ */
++ PPC_PCI_REASSIGN_ALL_RSRC = 0x00000001,
++
++ /* Re-assign all bus numbers */
++ PPC_PCI_REASSIGN_ALL_BUS = 0x00000002,
++
++ /* Do not try to assign, just use existing setup */
++ PPC_PCI_PROBE_ONLY = 0x00000004,
++
++ /* Don't bother with ISA alignment unless the bridge has
++ * ISA forwarding enabled
++ */
++ PPC_PCI_CAN_SKIP_ISA_ALIGN = 0x00000008,
++
++ /* Enable domain numbers in /proc */
++ PPC_PCI_ENABLE_PROC_DOMAINS = 0x00000010,
++ /* ... except for domain 0 */
++ PPC_PCI_COMPAT_DOMAIN_0 = 0x00000020,
++};
++
+
+ /*
+ * Structure of a PCI controller (host bridge)
+@@ -17,26 +44,41 @@
+ struct pci_controller {
+ struct pci_bus *bus;
+ char is_dynamic;
+- void *arch_data;
++#ifdef CONFIG_PPC64
++ int node;
++#endif
++ struct device_node *dn;
+ struct list_head list_node;
+ struct device *parent;
+
+ int first_busno;
+ int last_busno;
++#ifndef CONFIG_PPC64
+ int self_busno;
++#endif
+
+ void __iomem *io_base_virt;
++#ifdef CONFIG_PPC64
++ void *io_base_alloc;
++#endif
+ resource_size_t io_base_phys;
++#ifndef CONFIG_PPC64
++ resource_size_t pci_io_size;
++#endif
+
+ /* Some machines (PReP) have a non 1:1 mapping of
+ * the PCI memory space in the CPU bus space
+ */
+ resource_size_t pci_mem_offset;
++#ifdef CONFIG_PPC64
++ unsigned long pci_io_size;
++#endif
+
+ struct pci_ops *ops;
+- volatile unsigned int __iomem *cfg_addr;
+- volatile void __iomem *cfg_data;
++ unsigned int __iomem *cfg_addr;
++ void __iomem *cfg_data;
+
++#ifndef CONFIG_PPC64
+ /*
+ * Used for variants of PCI indirect handling and possible quirks:
+ * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
+@@ -51,21 +93,30 @@
+ * set.
+ * BIG_ENDIAN - cfg_addr is a big endian register
+ */
+-#define PPC_INDIRECT_TYPE_SET_CFG_TYPE (0x00000001)
+-#define PPC_INDIRECT_TYPE_EXT_REG (0x00000002)
+-#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004)
+-#define PPC_INDIRECT_TYPE_NO_PCIE_LINK (0x00000008)
+-#define PPC_INDIRECT_TYPE_BIG_ENDIAN (0x00000010)
++#define PPC_INDIRECT_TYPE_SET_CFG_TYPE 0x00000001
++#define PPC_INDIRECT_TYPE_EXT_REG 0x00000002
++#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS 0x00000004
++#define PPC_INDIRECT_TYPE_NO_PCIE_LINK 0x00000008
++#define PPC_INDIRECT_TYPE_BIG_ENDIAN 0x00000010
+ u32 indirect_type;
+-
++#endif /* !CONFIG_PPC64 */
+ /* Currently, we limit ourselves to 1 IO range and 3 mem
+ * ranges since the common pci_bus structure can't handle more
+ */
+ struct resource io_resource;
+ struct resource mem_resources[3];
+ int global_number; /* PCI domain number */
++#ifdef CONFIG_PPC64
++ unsigned long buid;
++ unsigned long dma_window_base_cur;
++ unsigned long dma_window_size;
++
++ void *private_data;
++#endif /* CONFIG_PPC64 */
+ };
+
++#ifndef CONFIG_PPC64
++
+ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
+ {
+ return bus->sysdata;
+@@ -81,18 +132,18 @@
+
+ /* These are used for config access before all the PCI probing
+ has been done. */
+-int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u8 *val);
+-int early_read_config_word(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u16 *val);
+-int early_read_config_dword(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u32 *val);
+-int early_write_config_byte(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u8 val);
+-int early_write_config_word(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u16 val);
+-int early_write_config_dword(struct pci_controller *hose, int bus, int dev_fn,
+- int where, u32 val);
++extern int early_read_config_byte(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u8 *val);
++extern int early_read_config_word(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u16 *val);
++extern int early_read_config_dword(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u32 *val);
++extern int early_write_config_byte(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u8 val);
++extern int early_write_config_word(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u16 val);
++extern int early_write_config_dword(struct pci_controller *hose, int bus,
++ int dev_fn, int where, u32 val);
+
+ extern int early_find_capability(struct pci_controller *hose, int bus,
+ int dev_fn, int cap);
+@@ -101,87 +152,33 @@
+ resource_size_t cfg_addr,
+ resource_size_t cfg_data, u32 flags);
+ extern void setup_grackle(struct pci_controller *hose);
+-extern void __init update_bridge_resource(struct pci_dev *dev,
+- struct resource *res);
+-
+-#else
+-
+-
+-/*
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License
+- * as published by the Free Software Foundation; either version
+- * 2 of the License, or (at your option) any later version.
+- */
+-
+-/*
+- * Structure of a PCI controller (host bridge)
+- */
+-struct pci_controller {
+- struct pci_bus *bus;
+- char is_dynamic;
+- int node;
+- void *arch_data;
+- struct list_head list_node;
+- struct device *parent;
+-
+- int first_busno;
+- int last_busno;
+-
+- void __iomem *io_base_virt;
+- void *io_base_alloc;
+- resource_size_t io_base_phys;
+-
+- /* Some machines have a non 1:1 mapping of
+- * the PCI memory space in the CPU bus space
+- */
+- resource_size_t pci_mem_offset;
+- unsigned long pci_io_size;
+-
+- struct pci_ops *ops;
+- volatile unsigned int __iomem *cfg_addr;
+- volatile void __iomem *cfg_data;
+-
+- /* Currently, we limit ourselves to 1 IO range and 3 mem
+- * ranges since the common pci_bus structure can't handle more
+- */
+- struct resource io_resource;
+- struct resource mem_resources[3];
+- int global_number;
+- unsigned long buid;
+- unsigned long dma_window_base_cur;
+- unsigned long dma_window_size;
+-
+- void *private_data;
+-};
++#else /* CONFIG_PPC64 */
+
+ /*
+ * PCI stuff, for nodes representing PCI devices, pointed to
+ * by device_node->data.
+ */
+-struct pci_controller;
+ struct iommu_table;
+
+ struct pci_dn {
+ int busno; /* pci bus number */
+- int bussubno; /* pci subordinate bus number */
+ int devfn; /* pci device and function number */
+- int class_code; /* pci device class */
+
+ struct pci_controller *phb; /* for pci devices */
+ struct iommu_table *iommu_table; /* for phb's or bridges */
+- struct pci_dev *pcidev; /* back-pointer to the pci device */
+ struct device_node *node; /* back-pointer to the device_node */
+
+ int pci_ext_config_space; /* for pci devices */
+
+ #ifdef CONFIG_EEH
++ struct pci_dev *pcidev; /* back-pointer to the pci device */
++ int class_code; /* pci device class */
+ int eeh_mode; /* See eeh.h for possible EEH_MODEs */
+ int eeh_config_addr;
+ int eeh_pe_config_addr; /* new-style partition endpoint address */
+- int eeh_check_count; /* # times driver ignored error */
+- int eeh_freeze_count; /* # times this device froze up. */
+- int eeh_false_positives; /* # times this device reported #ff's */
++ int eeh_check_count; /* # times driver ignored error */
++ int eeh_freeze_count; /* # times this device froze up. */
++ int eeh_false_positives; /* # times this device reported #ff's */
+ u32 config_space[16]; /* saved PCI config space */
+ #endif
+ };
+@@ -189,7 +186,7 @@
+ /* Get the pointer to a device_node's pci_dn */
+ #define PCI_DN(dn) ((struct pci_dn *) (dn)->data)
+
+-struct device_node *fetch_dev_dn(struct pci_dev *dev);
++extern struct device_node *fetch_dev_dn(struct pci_dev *dev);
+
+ /* Get a device_node from a pci_dev. This code must be fast except
+ * in the case where the sysdata is incorrect and needs to be fixed
+@@ -227,14 +224,14 @@
+ }
+
+ /** Find the bus corresponding to the indicated device node */
+-struct pci_bus * pcibios_find_pci_bus(struct device_node *dn);
++extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn);
+
+ /** Remove all of the PCI devices under this bus */
+-void pcibios_remove_pci_devices(struct pci_bus *bus);
++extern void pcibios_remove_pci_devices(struct pci_bus *bus);
+
+ /** Discover new pci devices under this bus, and add them */
+-void pcibios_add_pci_devices(struct pci_bus * bus);
+-void pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus);
++extern void pcibios_add_pci_devices(struct pci_bus *bus);
++extern void pcibios_fixup_new_pci_devices(struct pci_bus *bus);
+
+ extern int pcibios_remove_root_bus(struct pci_controller *phb);
+
+@@ -270,20 +267,18 @@
+ #define PHB_SET_NODE(PHB, NODE) ((PHB)->node = -1)
+ #endif
+
+-#endif /* CONFIG_PPC64 */
++#endif /* CONFIG_PPC64 */
+
+ /* Get the PCI host controller for an OF device */
+-extern struct pci_controller*
+-pci_find_hose_for_OF_device(struct device_node* node);
++extern struct pci_controller *pci_find_hose_for_OF_device(
++ struct device_node* node);
+
+ /* Fill up host controller resources from the OF node */
+-extern void
+-pci_process_bridge_OF_ranges(struct pci_controller *hose,
+- struct device_node *dev, int primary);
++extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
++ struct device_node *dev, int primary);
+
+ /* Allocate & free a PCI host bridge structure */
+-extern struct pci_controller *
+-pcibios_alloc_controller(struct device_node *dev);
++extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
+ extern void pcibios_free_controller(struct pci_controller *phb);
+
+ #ifdef CONFIG_PCI
+@@ -298,9 +293,7 @@
+ {
+ return 0;
+ }
+-#endif
+-
++#endif /* CONFIG_PCI */
+
+-
+-#endif /* __KERNEL__ */
+-#endif
++#endif /* __KERNEL__ */
++#endif /* _ASM_POWERPC_PCI_BRIDGE_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/pci.h powerpc.git/include/asm-powerpc/pci.h
+--- linux-2.6.24/include/asm-powerpc/pci.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/pci.h 2008-01-28 20:26:42.000000000 +0100
+@@ -36,11 +36,10 @@
+
+ /*
+ * Set this to 1 if you want the kernel to re-assign all PCI
+- * bus numbers
++ * bus numbers (don't do that on ppc64 yet !)
+ */
+-extern int pci_assign_all_buses;
+-#define pcibios_assign_all_busses() (pci_assign_all_buses)
+-
++#define pcibios_assign_all_busses() (ppc_pci_flags & \
++ PPC_PCI_REASSIGN_ALL_BUS)
+ #define pcibios_scan_all_fns(a, b) 0
+
+ static inline void pcibios_set_master(struct pci_dev *dev)
+@@ -95,9 +94,6 @@
+ #define get_pci_dma_ops() NULL
+ #endif
+
+-/* Decide whether to display the domain number in /proc */
+-extern int pci_proc_domain(struct pci_bus *bus);
+-
+ #else /* 32-bit */
+
+ #ifdef CONFIG_PCI
+@@ -109,17 +105,14 @@
+ *strategy_parameter = ~0UL;
+ }
+ #endif
+-
+-/* Set the name of the bus as it appears in /proc/bus/pci */
+-static inline int pci_proc_domain(struct pci_bus *bus)
+-{
+- return 0;
+-}
+-
+ #endif /* CONFIG_PPC64 */
+
+ extern int pci_domain_nr(struct pci_bus *bus);
+
++/* Decide whether to display the domain number in /proc */
++extern int pci_proc_domain(struct pci_bus *bus);
++
++
+ struct vm_area_struct;
+ /* Map a range of PCI memory or I/O space for a device into user space */
+ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
+@@ -199,13 +192,12 @@
+ return root;
+ }
+
+-extern void pcibios_fixup_device_resources(struct pci_dev *dev,
+- struct pci_bus *bus);
+-
+ extern void pcibios_setup_new_device(struct pci_dev *dev);
+
+ extern void pcibios_claim_one_bus(struct pci_bus *b);
+
++extern void pcibios_resource_survey(void);
++
+ extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
+
+ extern struct pci_dev *of_create_pci_dev(struct device_node *node,
+@@ -229,5 +221,8 @@
+ const struct resource *rsrc,
+ resource_size_t *start, resource_size_t *end);
+
++extern void pcibios_do_bus_setup(struct pci_bus *bus);
++extern void pcibios_fixup_of_probed_bus(struct pci_bus *bus);
++
+ #endif /* __KERNEL__ */
+ #endif /* __ASM_POWERPC_PCI_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/ppc-pci.h powerpc.git/include/asm-powerpc/ppc-pci.h
+--- linux-2.6.24/include/asm-powerpc/ppc-pci.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/ppc-pci.h 2008-01-28 20:26:42.000000000 +0100
+@@ -22,7 +22,6 @@
+
+
+ extern struct list_head hose_list;
+-extern int global_phb_number;
+
+ extern void find_and_init_phbs(void);
+
+@@ -47,9 +46,6 @@
+ extern unsigned long get_phb_buid (struct device_node *);
+ extern int rtas_setup_phb(struct pci_controller *phb);
+
+-/* From iSeries PCI */
+-extern void iSeries_pcibios_init(void);
+-
+ extern unsigned long pci_probe_only;
+
+ /* ---- EEH internal-use-only related routines ---- */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/prom.h powerpc.git/include/asm-powerpc/prom.h
+--- linux-2.6.24/include/asm-powerpc/prom.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/prom.h 2008-01-28 20:26:42.000000000 +0100
+@@ -202,6 +202,10 @@
+ */
+ extern u64 of_translate_address(struct device_node *np, const u32 *addr);
+
++/* Translate a DMA address from device space to CPU space */
++extern u64 of_translate_dma_address(struct device_node *dev,
++ const u32 *in_addr);
++
+ /* Extract an address from a device, returns the region size and
+ * the address space flags too. The PCI version uses a BAR number
+ * instead of an absolute index
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/ps3.h powerpc.git/include/asm-powerpc/ps3.h
+--- linux-2.6.24/include/asm-powerpc/ps3.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/ps3.h 2008-01-28 20:26:42.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/device.h>
++#include "cell-pmu.h"
+
+ union ps3_firmware_version {
+ u64 raw;
+@@ -317,6 +318,7 @@
+ PS3_MATCH_ID_STOR_FLASH = 8,
+ PS3_MATCH_ID_SOUND = 9,
+ PS3_MATCH_ID_GRAPHICS = 10,
++ PS3_MATCH_ID_LPM = 11,
+ };
+
+ #define PS3_MODULE_ALIAS_EHCI "ps3:1"
+@@ -329,11 +331,13 @@
+ #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"
+ #define PS3_MODULE_ALIAS_SOUND "ps3:9"
+ #define PS3_MODULE_ALIAS_GRAPHICS "ps3:10"
++#define PS3_MODULE_ALIAS_LPM "ps3:11"
+
+ enum ps3_system_bus_device_type {
+ PS3_DEVICE_TYPE_IOC0 = 1,
+ PS3_DEVICE_TYPE_SB,
+ PS3_DEVICE_TYPE_VUART,
++ PS3_DEVICE_TYPE_LPM,
+ };
+
+ /**
+@@ -344,12 +348,17 @@
+ enum ps3_match_id match_id;
+ enum ps3_system_bus_device_type dev_type;
+
+- unsigned int bus_id; /* SB */
+- unsigned int dev_id; /* SB */
++ u64 bus_id; /* SB */
++ u64 dev_id; /* SB */
+ unsigned int interrupt_id; /* SB */
+ struct ps3_dma_region *d_region; /* SB, IOC0 */
+ struct ps3_mmio_region *m_region; /* SB, IOC0*/
+ unsigned int port_number; /* VUART */
++ struct { /* LPM */
++ u64 node_id;
++ u64 pu_id;
++ u64 rights;
++ } lpm;
+
+ /* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */
+ struct device core;
+@@ -438,5 +447,66 @@
+ extern struct ps3_prealloc ps3fb_videomemory;
+ extern struct ps3_prealloc ps3flash_bounce_buffer;
+
++/* logical performance monitor */
++
++/**
++ * enum ps3_lpm_rights - Rigths granted by the system policy module.
++ *
++ * @PS3_LPM_RIGHTS_USE_LPM: The right to use the lpm.
++ * @PS3_LPM_RIGHTS_USE_TB: The right to use the internal trace buffer.
++ */
++
++enum ps3_lpm_rights {
++ PS3_LPM_RIGHTS_USE_LPM = 0x001,
++ PS3_LPM_RIGHTS_USE_TB = 0x100,
++};
++
++/**
++ * enum ps3_lpm_tb_type - Type of trace buffer lv1 should use.
++ *
++ * @PS3_LPM_TB_TYPE_NONE: Do not use a trace buffer.
++ * @PS3_LPM_RIGHTS_USE_TB: Use the lv1 internal trace buffer. Must have
++ * rights @PS3_LPM_RIGHTS_USE_TB.
++ */
++
++enum ps3_lpm_tb_type {
++ PS3_LPM_TB_TYPE_NONE = 0,
++ PS3_LPM_TB_TYPE_INTERNAL = 1,
++};
++
++int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
++ u64 tb_cache_size);
++int ps3_lpm_close(void);
++int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
++ unsigned long *bytes_copied);
++int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
++ unsigned long count, unsigned long *bytes_copied);
++void ps3_set_bookmark(u64 bookmark);
++void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id);
++int ps3_set_signal(u64 rtas_signal_group, u8 signal_bit, u16 sub_unit,
++ u8 bus_word);
++
++u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr);
++void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val);
++u32 ps3_read_ctr(u32 cpu, u32 ctr);
++void ps3_write_ctr(u32 cpu, u32 ctr, u32 val);
++
++u32 ps3_read_pm07_control(u32 cpu, u32 ctr);
++void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val);
++u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg);
++void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val);
++
++u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr);
++void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size);
++
++void ps3_enable_pm(u32 cpu);
++void ps3_disable_pm(u32 cpu);
++void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask);
++void ps3_disable_pm_interrupts(u32 cpu);
++
++u32 ps3_get_and_clear_pm_interrupts(u32 cpu);
++void ps3_sync_irq(int node);
++u32 ps3_get_hw_thread_id(int cpu);
++u64 ps3_get_spe_id(void *arg);
+
+ #endif
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/ptrace.h powerpc.git/include/asm-powerpc/ptrace.h
+--- linux-2.6.24/include/asm-powerpc/ptrace.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/ptrace.h 2008-01-28 20:26:42.000000000 +0100
+@@ -106,7 +106,8 @@
+ */
+ #define FULL_REGS(regs) (((regs)->trap & 1) == 0)
+ #ifndef __powerpc64__
+-#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) == 0)
++#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) != 0)
++#define IS_MCHECK_EXC(regs) (((regs)->trap & 4) != 0)
+ #endif /* ! __powerpc64__ */
+ #define TRAP(regs) ((regs)->trap & ~0xF)
+ #ifdef __powerpc64__
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/qe.h powerpc.git/include/asm-powerpc/qe.h
+--- linux-2.6.24/include/asm-powerpc/qe.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/qe.h 2008-01-28 20:26:42.000000000 +0100
+@@ -28,6 +28,52 @@
+ #define MEM_PART_SECONDARY 1
+ #define MEM_PART_MURAM 2
+
++/* Clocks and BRGs */
++enum qe_clock {
++ QE_CLK_NONE = 0,
++ QE_BRG1, /* Baud Rate Generator 1 */
++ QE_BRG2, /* Baud Rate Generator 2 */
++ QE_BRG3, /* Baud Rate Generator 3 */
++ QE_BRG4, /* Baud Rate Generator 4 */
++ QE_BRG5, /* Baud Rate Generator 5 */
++ QE_BRG6, /* Baud Rate Generator 6 */
++ QE_BRG7, /* Baud Rate Generator 7 */
++ QE_BRG8, /* Baud Rate Generator 8 */
++ QE_BRG9, /* Baud Rate Generator 9 */
++ QE_BRG10, /* Baud Rate Generator 10 */
++ QE_BRG11, /* Baud Rate Generator 11 */
++ QE_BRG12, /* Baud Rate Generator 12 */
++ QE_BRG13, /* Baud Rate Generator 13 */
++ QE_BRG14, /* Baud Rate Generator 14 */
++ QE_BRG15, /* Baud Rate Generator 15 */
++ QE_BRG16, /* Baud Rate Generator 16 */
++ QE_CLK1, /* Clock 1 */
++ QE_CLK2, /* Clock 2 */
++ QE_CLK3, /* Clock 3 */
++ QE_CLK4, /* Clock 4 */
++ QE_CLK5, /* Clock 5 */
++ QE_CLK6, /* Clock 6 */
++ QE_CLK7, /* Clock 7 */
++ QE_CLK8, /* Clock 8 */
++ QE_CLK9, /* Clock 9 */
++ QE_CLK10, /* Clock 10 */
++ QE_CLK11, /* Clock 11 */
++ QE_CLK12, /* Clock 12 */
++ QE_CLK13, /* Clock 13 */
++ QE_CLK14, /* Clock 14 */
++ QE_CLK15, /* Clock 15 */
++ QE_CLK16, /* Clock 16 */
++ QE_CLK17, /* Clock 17 */
++ QE_CLK18, /* Clock 18 */
++ QE_CLK19, /* Clock 19 */
++ QE_CLK20, /* Clock 20 */
++ QE_CLK21, /* Clock 21 */
++ QE_CLK22, /* Clock 22 */
++ QE_CLK23, /* Clock 23 */
++ QE_CLK24, /* Clock 24 */
++ QE_CLK_DUMMY
++};
++
+ /* Export QE common operations */
+ extern void qe_reset(void);
+ extern int par_io_init(struct device_node *np);
+@@ -38,7 +84,8 @@
+
+ /* QE internal API */
+ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
+-void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier);
++enum qe_clock qe_clock_source(const char *source);
++int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier);
+ int qe_get_snum(void);
+ void qe_put_snum(u8 snum);
+ unsigned long qe_muram_alloc(int size, int align);
+@@ -47,6 +94,58 @@
+ void qe_muram_dump(void);
+ void *qe_muram_addr(unsigned long offset);
+
++/* Structure that defines QE firmware binary files.
++ *
++ * See Documentation/powerpc/qe-firmware.txt for a description of these
++ * fields.
++ */
++struct qe_firmware {
++ struct qe_header {
++ __be32 length; /* Length of the entire structure, in bytes */
++ u8 magic[3]; /* Set to { 'Q', 'E', 'F' } */
++ u8 version; /* Version of this layout. First ver is '1' */
++ } header;
++ u8 id[62]; /* Null-terminated identifier string */
++ u8 split; /* 0 = shared I-RAM, 1 = split I-RAM */
++ u8 count; /* Number of microcode[] structures */
++ struct {
++ __be16 model; /* The SOC model */
++ u8 major; /* The SOC revision major */
++ u8 minor; /* The SOC revision minor */
++ } __attribute__ ((packed)) soc;
++ u8 padding[4]; /* Reserved, for alignment */
++ __be64 extended_modes; /* Extended modes */
++ __be32 vtraps[8]; /* Virtual trap addresses */
++ u8 reserved[4]; /* Reserved, for future expansion */
++ struct qe_microcode {
++ u8 id[32]; /* Null-terminated identifier */
++ __be32 traps[16]; /* Trap addresses, 0 == ignore */
++ __be32 eccr; /* The value for the ECCR register */
++ __be32 iram_offset; /* Offset into I-RAM for the code */
++ __be32 count; /* Number of 32-bit words of the code */
++ __be32 code_offset; /* Offset of the actual microcode */
++ u8 major; /* The microcode version major */
++ u8 minor; /* The microcode version minor */
++ u8 revision; /* The microcode version revision */
++ u8 padding; /* Reserved, for alignment */
++ u8 reserved[4]; /* Reserved, for future expansion */
++ } __attribute__ ((packed)) microcode[1];
++ /* All microcode binaries should be located here */
++ /* CRC32 should be located here, after the microcode binaries */
++} __attribute__ ((packed));
++
++struct qe_firmware_info {
++ char id[64]; /* Firmware name */
++ u32 vtraps[8]; /* Virtual trap addresses */
++ u64 extended_modes; /* Extended modes */
++};
++
++/* Upload a firmware to the QE */
++int qe_upload_firmware(const struct qe_firmware *firmware);
++
++/* Obtain information on the uploaded firmware */
++struct qe_firmware_info *qe_get_firmware_info(void);
++
+ /* Buffer descriptors */
+ struct qe_bd {
+ __be16 status;
+@@ -129,52 +228,6 @@
+ COMM_DIR_RX_AND_TX = 3
+ };
+
+-/* Clocks and BRGs */
+-enum qe_clock {
+- QE_CLK_NONE = 0,
+- QE_BRG1, /* Baud Rate Generator 1 */
+- QE_BRG2, /* Baud Rate Generator 2 */
+- QE_BRG3, /* Baud Rate Generator 3 */
+- QE_BRG4, /* Baud Rate Generator 4 */
+- QE_BRG5, /* Baud Rate Generator 5 */
+- QE_BRG6, /* Baud Rate Generator 6 */
+- QE_BRG7, /* Baud Rate Generator 7 */
+- QE_BRG8, /* Baud Rate Generator 8 */
+- QE_BRG9, /* Baud Rate Generator 9 */
+- QE_BRG10, /* Baud Rate Generator 10 */
+- QE_BRG11, /* Baud Rate Generator 11 */
+- QE_BRG12, /* Baud Rate Generator 12 */
+- QE_BRG13, /* Baud Rate Generator 13 */
+- QE_BRG14, /* Baud Rate Generator 14 */
+- QE_BRG15, /* Baud Rate Generator 15 */
+- QE_BRG16, /* Baud Rate Generator 16 */
+- QE_CLK1, /* Clock 1 */
+- QE_CLK2, /* Clock 2 */
+- QE_CLK3, /* Clock 3 */
+- QE_CLK4, /* Clock 4 */
+- QE_CLK5, /* Clock 5 */
+- QE_CLK6, /* Clock 6 */
+- QE_CLK7, /* Clock 7 */
+- QE_CLK8, /* Clock 8 */
+- QE_CLK9, /* Clock 9 */
+- QE_CLK10, /* Clock 10 */
+- QE_CLK11, /* Clock 11 */
+- QE_CLK12, /* Clock 12 */
+- QE_CLK13, /* Clock 13 */
+- QE_CLK14, /* Clock 14 */
+- QE_CLK15, /* Clock 15 */
+- QE_CLK16, /* Clock 16 */
+- QE_CLK17, /* Clock 17 */
+- QE_CLK18, /* Clock 18 */
+- QE_CLK19, /* Clock 19 */
+- QE_CLK20, /* Clock 20 */
+- QE_CLK21, /* Clock 21 */
+- QE_CLK22, /* Clock 22 */
+- QE_CLK23, /* Clock 23 */
+- QE_CLK24, /* Clock 24 */
+- QE_CLK_DUMMY,
+-};
+-
+ /* QE CMXUCR Registers.
+ * There are two UCCs represented in each of the four CMXUCR registers.
+ * These values are for the UCC in the LSBs
+@@ -328,6 +381,15 @@
+
+ #define QE_SDEBCR_BA_MASK 0x01FFFFFF
+
++/* Communication Processor */
++#define QE_CP_CERCR_MEE 0x8000 /* Multi-user RAM ECC enable */
++#define QE_CP_CERCR_IEE 0x4000 /* Instruction RAM ECC enable */
++#define QE_CP_CERCR_CIR 0x0800 /* Common instruction RAM */
++
++/* I-RAM */
++#define QE_IRAM_IADD_AIE 0x80000000 /* Auto Increment Enable */
++#define QE_IRAM_IADD_BADDR 0x00080000 /* Base Address */
++
+ /* UPC */
+ #define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */
+ #define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/reg.h powerpc.git/include/asm-powerpc/reg.h
+--- linux-2.6.24/include/asm-powerpc/reg.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/reg.h 2008-01-28 20:26:42.000000000 +0100
+@@ -553,6 +553,7 @@
+ #define SPRN_PA6T_BTCR 978 /* Breakpoint and Tagging Control Register */
+ #define SPRN_PA6T_IMAAT 979 /* Instruction Match Array Action Table */
+ #define SPRN_PA6T_PCCR 1019 /* Power Counter Control Register */
++#define SPRN_BKMK 1020 /* Cell Bookmark Register */
+ #define SPRN_PA6T_RPCCR 1021 /* Retire PC Trace Control Register */
+
+
+@@ -691,12 +692,6 @@
+ #define PV_BE 0x0070
+ #define PV_PA6T 0x0090
+
+-/*
+- * Number of entries in the SLB. If this ever changes we should handle
+- * it with a use a cpu feature fixup.
+- */
+-#define SLB_NUM_ENTRIES 64
+-
+ /* Macros for setting and retrieving special purpose registers */
+ #ifndef __ASSEMBLY__
+ #define mfmsr() ({unsigned long rval; \
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/reg_booke.h powerpc.git/include/asm-powerpc/reg_booke.h
+--- linux-2.6.24/include/asm-powerpc/reg_booke.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/reg_booke.h 2008-01-28 20:26:42.000000000 +0100
+@@ -123,16 +123,23 @@
+ #define SPRN_SPEFSCR 0x200 /* SPE & Embedded FP Status & Control */
+ #define SPRN_BBEAR 0x201 /* Branch Buffer Entry Address Register */
+ #define SPRN_BBTAR 0x202 /* Branch Buffer Target Address Register */
++#define SPRN_ATB 0x20E /* Alternate Time Base */
++#define SPRN_ATBL 0x20E /* Alternate Time Base Lower */
++#define SPRN_ATBU 0x20F /* Alternate Time Base Upper */
+ #define SPRN_IVOR32 0x210 /* Interrupt Vector Offset Register 32 */
+ #define SPRN_IVOR33 0x211 /* Interrupt Vector Offset Register 33 */
+ #define SPRN_IVOR34 0x212 /* Interrupt Vector Offset Register 34 */
+ #define SPRN_IVOR35 0x213 /* Interrupt Vector Offset Register 35 */
++#define SPRN_IVOR36 0x214 /* Interrupt Vector Offset Register 36 */
++#define SPRN_IVOR37 0x215 /* Interrupt Vector Offset Register 37 */
+ #define SPRN_MCSRR0 0x23A /* Machine Check Save and Restore Register 0 */
+ #define SPRN_MCSRR1 0x23B /* Machine Check Save and Restore Register 1 */
+ #define SPRN_MCSR 0x23C /* Machine Check Status Register */
+ #define SPRN_MCAR 0x23D /* Machine Check Address Register */
+ #define SPRN_DSRR0 0x23E /* Debug Save and Restore Register 0 */
+ #define SPRN_DSRR1 0x23F /* Debug Save and Restore Register 1 */
++#define SPRN_SPRG8 0x25C /* Special Purpose Register General 8 */
++#define SPRN_SPRG9 0x25D /* Special Purpose Register General 9 */
+ #define SPRN_MAS0 0x270 /* MMU Assist Register 0 */
+ #define SPRN_MAS1 0x271 /* MMU Assist Register 1 */
+ #define SPRN_MAS2 0x272 /* MMU Assist Register 2 */
+@@ -140,15 +147,18 @@
+ #define SPRN_MAS4 0x274 /* MMU Assist Register 4 */
+ #define SPRN_MAS5 0x275 /* MMU Assist Register 5 */
+ #define SPRN_MAS6 0x276 /* MMU Assist Register 6 */
+-#define SPRN_MAS7 0x3b0 /* MMU Assist Register 7 */
+ #define SPRN_PID1 0x279 /* Process ID Register 1 */
+ #define SPRN_PID2 0x27A /* Process ID Register 2 */
+ #define SPRN_TLB0CFG 0x2B0 /* TLB 0 Config Register */
+ #define SPRN_TLB1CFG 0x2B1 /* TLB 1 Config Register */
++#define SPRN_EPR 0x2BE /* External Proxy Register */
+ #define SPRN_CCR1 0x378 /* Core Configuration Register 1 */
+ #define SPRN_ZPR 0x3B0 /* Zone Protection Register (40x) */
++#define SPRN_MAS7 0x3B0 /* MMU Assist Register 7 */
+ #define SPRN_MMUCR 0x3B2 /* MMU Control Register */
+ #define SPRN_CCR0 0x3B3 /* Core Configuration Register 0 */
++#define SPRN_EPLC 0x3B3 /* External Process ID Load Context */
++#define SPRN_EPSC 0x3B4 /* External Process ID Store Context */
+ #define SPRN_SGR 0x3B9 /* Storage Guarded Register */
+ #define SPRN_DCWR 0x3BA /* Data Cache Write-thru Register */
+ #define SPRN_SLER 0x3BB /* Little-endian real mode */
+@@ -159,6 +169,7 @@
+ #define SPRN_L1CSR0 0x3F2 /* L1 Cache Control and Status Register 0 */
+ #define SPRN_L1CSR1 0x3F3 /* L1 Cache Control and Status Register 1 */
+ #define SPRN_PIT 0x3DB /* Programmable Interval Timer */
++#define SPRN_BUCSR 0x3F5 /* Branch Unit Control and Status */
+ #define SPRN_DCCR 0x3FA /* Data Cache Cacheability Register */
+ #define SPRN_ICCR 0x3FB /* Instruction Cache Cacheability Register */
+ #define SPRN_SVR 0x3FF /* System Version Register */
+@@ -207,7 +218,6 @@
+ #define CCR1_TCS 0x00000080 /* Timer Clock Select */
+
+ /* Bit definitions for the MCSR. */
+-#ifdef CONFIG_440A
+ #define MCSR_MCS 0x80000000 /* Machine Check Summary */
+ #define MCSR_IB 0x40000000 /* Instruction PLB Error */
+ #define MCSR_DRB 0x20000000 /* Data Read PLB Error */
+@@ -217,7 +227,7 @@
+ #define MCSR_DCSP 0x02000000 /* D-Cache Search Parity Error */
+ #define MCSR_DCFP 0x01000000 /* D-Cache Flush Parity Error */
+ #define MCSR_IMPE 0x00800000 /* Imprecise Machine Check Exception */
+-#endif
++
+ #ifdef CONFIG_E500
+ #define MCSR_MCP 0x80000000UL /* Machine Check Input Pin */
+ #define MCSR_ICPERR 0x40000000UL /* I-Cache Parity Error */
+@@ -293,7 +303,7 @@
+ #define ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */
+ #define ESR_IMCT 0x10000000 /* Instr. Machine Check - Timeout */
+ #define ESR_PIL 0x08000000 /* Program Exception - Illegal */
+-#define ESR_PPR 0x04000000 /* Program Exception - Priveleged */
++#define ESR_PPR 0x04000000 /* Program Exception - Privileged */
+ #define ESR_PTR 0x02000000 /* Program Exception - Trap */
+ #define ESR_FP 0x01000000 /* Floating Point Operation */
+ #define ESR_DST 0x00800000 /* Storage Exception - Data miss */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/setjmp.h powerpc.git/include/asm-powerpc/setjmp.h
+--- linux-2.6.24/include/asm-powerpc/setjmp.h 1970-01-01 01:00:00.000000000 +0100
++++ powerpc.git/include/asm-powerpc/setjmp.h 2008-01-28 20:26:42.000000000 +0100
+@@ -0,0 +1,18 @@
++/*
++ * Copyright © 2008 Michael Neuling IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ *
++ */
++#ifndef _ASM_POWERPC_SETJMP_H
++#define _ASM_POWERPC_SETJMP_H
++
++#define JMP_BUF_LEN 23
++
++extern long setjmp(long *);
++extern void longjmp(long *, long);
++
++#endif /* _ASM_POWERPC_SETJMP_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/smu.h powerpc.git/include/asm-powerpc/smu.h
+--- linux-2.6.24/include/asm-powerpc/smu.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/smu.h 2008-01-28 20:26:42.000000000 +0100
+@@ -22,7 +22,7 @@
+ * Partition info commands
+ *
+ * These commands are used to retrieve the sdb-partition-XX datas from
+- * the SMU. The lenght is always 2. First byte is the subcommand code
++ * the SMU. The length is always 2. First byte is the subcommand code
+ * and second byte is the partition ID.
+ *
+ * The reply is 6 bytes:
+@@ -173,12 +173,12 @@
+ * Power supply control
+ *
+ * The "sub" command is an ASCII string in the data, the
+- * data lenght is that of the string.
++ * data length is that of the string.
+ *
+ * The VSLEW command can be used to get or set the voltage slewing.
+- * - lenght 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
++ * - length 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
+ * reply at data offset 6, 7 and 8.
+- * - lenght 8 ("VSLEWxyz") has 3 additional bytes appended, and is
++ * - length 8 ("VSLEWxyz") has 3 additional bytes appended, and is
+ * used to set the voltage slewing point. The SMU replies with "DONE"
+ * I yet have to figure out their exact meaning of those 3 bytes in
+ * both cases. They seem to be:
+@@ -201,20 +201,90 @@
+ */
+ #define SMU_CMD_READ_ADC 0xd8
+
++
+ /* Misc commands
+ *
+ * This command seem to be a grab bag of various things
++ *
++ * Parameters:
++ * 1: subcommand
+ */
+ #define SMU_CMD_MISC_df_COMMAND 0xdf
+-#define SMU_CMD_MISC_df_SET_DISPLAY_LIT 0x02 /* i: 1 byte */
++
++/*
++ * Sets "system ready" status
++ *
++ * I did not yet understand how it exactly works or what it does.
++ *
++ * Guessing from OF code, 0x02 activates the display backlight. Apple uses/used
++ * the same codebase for all OF versions. On PowerBooks, this command would
++ * enable the backlight. For the G5s, it only activates the front LED. However,
++ * don't take this for granted.
++ *
++ * Parameters:
++ * 2: status [0x00, 0x01 or 0x02]
++ */
++#define SMU_CMD_MISC_df_SET_DISPLAY_LIT 0x02
++
++/*
++ * Sets mode of power switch.
++ *
++ * What this actually does is not yet known. Maybe it enables some interrupt.
++ *
++ * Parameters:
++ * 2: enable power switch? [0x00 or 0x01]
++ * 3 (optional): enable nmi? [0x00 or 0x01]
++ *
++ * Returns:
++ * If parameter 2 is 0x00 and parameter 3 is not specified, returns wether
++ * NMI is enabled. Otherwise unknown.
++ */
+ #define SMU_CMD_MISC_df_NMI_OPTION 0x04
+
++/* Sets LED dimm offset.
++ *
++ * The front LED dimms itself during sleep. Its brightness (or, well, the PWM
++ * frequency) depends on current time. Therefore, the SMU needs to know the
++ * timezone.
++ *
++ * Parameters:
++ * 2-8: unknown (BCD coding)
++ */
++#define SMU_CMD_MISC_df_DIMM_OFFSET 0x99
++
++
+ /*
+ * Version info commands
+ *
+- * I haven't quite tried to figure out how these work
++ * Parameters:
++ * 1 (optional): Specifies version part to retrieve
++ *
++ * Returns:
++ * Version value
+ */
+ #define SMU_CMD_VERSION_COMMAND 0xea
++#define SMU_VERSION_RUNNING 0x00
++#define SMU_VERSION_BASE 0x01
++#define SMU_VERSION_UPDATE 0x02
++
++
++/*
++ * Switches
++ *
++ * These are switches whose status seems to be known to the SMU.
++ *
++ * Parameters:
++ * none
++ *
++ * Result:
++ * Switch bits (ORed, see below)
++ */
++#define SMU_CMD_SWITCHES 0xdc
++
++/* Switches bits */
++#define SMU_SWITCH_CASE_CLOSED 0x01
++#define SMU_SWITCH_AC_POWER 0x04
++#define SMU_SWITCH_POWER_SWITCH 0x08
+
+
+ /*
+@@ -243,10 +313,64 @@
+ */
+ #define SMU_CMD_MISC_ee_COMMAND 0xee
+ #define SMU_CMD_MISC_ee_GET_DATABLOCK_REC 0x02
+-#define SMU_CMD_MISC_ee_LEDS_CTRL 0x04 /* i: 00 (00,01) [00] */
++
++/* Retrieves currently used watts.
++ *
++ * Parameters:
++ * 1: 0x03 (Meaning unknown)
++ */
++#define SMU_CMD_MISC_ee_GET_WATTS 0x03
++
++#define SMU_CMD_MISC_ee_LEDS_CTRL 0x04 /* i: 00 (00,01) [00] */
+ #define SMU_CMD_MISC_ee_GET_DATA 0x05 /* i: 00 , o: ?? */
+
+
++/*
++ * Power related commands
++ *
++ * Parameters:
++ * 1: subcommand
++ */
++#define SMU_CMD_POWER_EVENTS_COMMAND 0x8f
++
++/* SMU_POWER_EVENTS subcommands */
++enum {
++ SMU_PWR_GET_POWERUP_EVENTS = 0x00,
++ SMU_PWR_SET_POWERUP_EVENTS = 0x01,
++ SMU_PWR_CLR_POWERUP_EVENTS = 0x02,
++ SMU_PWR_GET_WAKEUP_EVENTS = 0x03,
++ SMU_PWR_SET_WAKEUP_EVENTS = 0x04,
++ SMU_PWR_CLR_WAKEUP_EVENTS = 0x05,
++
++ /*
++ * Get last shutdown cause
++ *
++ * Returns:
++ * 1 byte (signed char): Last shutdown cause. Exact meaning unknown.
++ */
++ SMU_PWR_LAST_SHUTDOWN_CAUSE = 0x07,
++
++ /*
++ * Sets or gets server ID. Meaning or use is unknown.
++ *
++ * Parameters:
++ * 2 (optional): Set server ID (1 byte)
++ *
++ * Returns:
++ * 1 byte (server ID?)
++ */
++ SMU_PWR_SERVER_ID = 0x08,
++};
++
++/* Power events wakeup bits */
++enum {
++ SMU_PWR_WAKEUP_KEY = 0x01, /* Wake on key press */
++ SMU_PWR_WAKEUP_AC_INSERT = 0x02, /* Wake on AC adapter plug */
++ SMU_PWR_WAKEUP_AC_CHANGE = 0x04,
++ SMU_PWR_WAKEUP_LID_OPEN = 0x08,
++ SMU_PWR_WAKEUP_RING = 0x10,
++};
++
+
+ /*
+ * - Kernel side interface -
+@@ -564,13 +688,13 @@
+
+ __u8 cmd; /* SMU command byte */
+ __u8 pad[3]; /* padding */
+- __u32 data_len; /* Lenght of data following */
++ __u32 data_len; /* Length of data following */
+ };
+
+ struct smu_user_reply_hdr
+ {
+ __u32 status; /* Command status */
+- __u32 reply_len; /* Lenght of data follwing */
++ __u32 reply_len; /* Length of data follwing */
+ };
+
+ #endif /* _SMU_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/sparsemem.h powerpc.git/include/asm-powerpc/sparsemem.h
+--- linux-2.6.24/include/asm-powerpc/sparsemem.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/sparsemem.h 2008-01-28 20:26:42.000000000 +0100
+@@ -10,13 +10,8 @@
+ */
+ #define SECTION_SIZE_BITS 24
+
+-#if defined(CONFIG_PS3_USE_LPAR_ADDR)
+-#define MAX_PHYSADDR_BITS 47
+-#define MAX_PHYSMEM_BITS 47
+-#else
+ #define MAX_PHYSADDR_BITS 44
+ #define MAX_PHYSMEM_BITS 44
+-#endif
+
+ #ifdef CONFIG_MEMORY_HOTPLUG
+ extern void create_section_mapping(unsigned long start, unsigned long end);
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/spu.h powerpc.git/include/asm-powerpc/spu.h
+--- linux-2.6.24/include/asm-powerpc/spu.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/spu.h 2008-01-28 20:26:42.000000000 +0100
+@@ -104,6 +104,7 @@
+
+ struct spu_context;
+ struct spu_runqueue;
++struct spu_lscsa;
+ struct device_node;
+
+ enum spu_utilization_state {
+@@ -145,7 +146,6 @@
+ void (* ibox_callback)(struct spu *spu);
+ void (* stop_callback)(struct spu *spu);
+ void (* mfc_callback)(struct spu *spu);
+- void (* dma_callback)(struct spu *spu, int type);
+
+ char irq_c0[8];
+ char irq_c1[8];
+@@ -196,10 +196,11 @@
+ extern struct cbe_spu_info cbe_spu_info[];
+
+ void spu_init_channels(struct spu *spu);
+-int spu_irq_class_0_bottom(struct spu *spu);
+-int spu_irq_class_1_bottom(struct spu *spu);
+ void spu_irq_setaffinity(struct spu *spu, int cpu);
+
++void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
++ void *code, int code_size);
++
+ #ifdef CONFIG_KEXEC
+ void crash_register_spus(struct list_head *list);
+ #else
+@@ -210,6 +211,7 @@
+
+ extern void spu_invalidate_slbs(struct spu *spu);
+ extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm);
++int spu_64k_pages_available(void);
+
+ /* Calls from the memory management to the SPU */
+ struct mm_struct;
+@@ -279,6 +281,8 @@
+ int spu_add_sysdev_attr_group(struct attribute_group *attrs);
+ void spu_remove_sysdev_attr_group(struct attribute_group *attrs);
+
++int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
++ unsigned long dsisr, unsigned *flt);
+
+ /*
+ * Notifier blocks:
+@@ -303,7 +307,7 @@
+ extern void do_notify_spus_active(void);
+
+ /*
+- * This defines the Local Store, Problem Area and Privlege Area of an SPU.
++ * This defines the Local Store, Problem Area and Privilege Area of an SPU.
+ */
+
+ union mfc_tag_size_class_cmd {
+@@ -524,8 +528,24 @@
+ #define CLASS2_ENABLE_SPU_STOP_INTR 0x2L
+ #define CLASS2_ENABLE_SPU_HALT_INTR 0x4L
+ #define CLASS2_ENABLE_SPU_DMA_TAG_GROUP_COMPLETE_INTR 0x8L
++#define CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR 0x10L
+ u8 pad_0x118_0x140[0x28]; /* 0x118 */
+ u64 int_stat_RW[3]; /* 0x140 */
++#define CLASS0_DMA_ALIGNMENT_INTR 0x1L
++#define CLASS0_INVALID_DMA_COMMAND_INTR 0x2L
++#define CLASS0_SPU_ERROR_INTR 0x4L
++#define CLASS0_INTR_MASK 0x7L
++#define CLASS1_SEGMENT_FAULT_INTR 0x1L
++#define CLASS1_STORAGE_FAULT_INTR 0x2L
++#define CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR 0x4L
++#define CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR 0x8L
++#define CLASS1_INTR_MASK 0xfL
++#define CLASS2_MAILBOX_INTR 0x1L
++#define CLASS2_SPU_STOP_INTR 0x2L
++#define CLASS2_SPU_HALT_INTR 0x4L
++#define CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR 0x8L
++#define CLASS2_MAILBOX_THRESHOLD_INTR 0x10L
++#define CLASS2_INTR_MASK 0x1fL
+ u8 pad_0x158_0x180[0x28]; /* 0x158 */
+ u64 int_route_RW; /* 0x180 */
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/spu_csa.h powerpc.git/include/asm-powerpc/spu_csa.h
+--- linux-2.6.24/include/asm-powerpc/spu_csa.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/spu_csa.h 2008-01-28 20:26:42.000000000 +0100
+@@ -194,7 +194,7 @@
+ };
+
+ /*
+- * struct spu_priv2_collapsed - condensed priviliged 2 area, w/o pads.
++ * struct spu_priv2_collapsed - condensed privileged 2 area, w/o pads.
+ */
+ struct spu_priv2_collapsed {
+ u64 slb_index_W;
+@@ -254,20 +254,11 @@
+ u64 spu_chnldata_RW[32];
+ u32 spu_mailbox_data[4];
+ u32 pu_mailbox_data[1];
+- u64 dar, dsisr;
++ u64 dar, dsisr, class_0_pending;
+ unsigned long suspend_time;
+ spinlock_t register_lock;
+ };
+
+-extern int spu_init_csa(struct spu_state *csa);
+-extern void spu_fini_csa(struct spu_state *csa);
+-extern int spu_save(struct spu_state *prev, struct spu *spu);
+-extern int spu_restore(struct spu_state *new, struct spu *spu);
+-extern int spu_switch(struct spu_state *prev, struct spu_state *new,
+- struct spu *spu);
+-extern int spu_alloc_lscsa(struct spu_state *csa);
+-extern void spu_free_lscsa(struct spu_state *csa);
+-
+ #endif /* !__SPU__ */
+ #endif /* __KERNEL__ */
+ #endif /* !__ASSEMBLY__ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/spu_priv1.h powerpc.git/include/asm-powerpc/spu_priv1.h
+--- linux-2.6.24/include/asm-powerpc/spu_priv1.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/spu_priv1.h 2008-01-28 20:26:42.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <linux/types.h>
+
+ struct spu;
++struct spu_context;
+
+ /* access to priv1 registers */
+
+@@ -178,6 +179,8 @@
+ int (*enumerate_spus)(int (*fn)(void *data));
+ int (*create_spu)(struct spu *spu, void *data);
+ int (*destroy_spu)(struct spu *spu);
++ void (*enable_spu)(struct spu_context *ctx);
++ void (*disable_spu)(struct spu_context *ctx);
+ int (*init_affinity)(void);
+ };
+
+@@ -207,6 +210,18 @@
+ return spu_management_ops->init_affinity();
+ }
+
++static inline void
++spu_enable_spu (struct spu_context *ctx)
++{
++ spu_management_ops->enable_spu(ctx);
++}
++
++static inline void
++spu_disable_spu (struct spu_context *ctx)
++{
++ spu_management_ops->disable_spu(ctx);
++}
++
+ /*
+ * The declarations folowing are put here for convenience
+ * and only intended to be used by the platform setup code.
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/system.h powerpc.git/include/asm-powerpc/system.h
+--- linux-2.6.24/include/asm-powerpc/system.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/system.h 2008-01-28 20:26:42.000000000 +0100
+@@ -169,6 +169,8 @@
+ extern void bad_page_fault(struct pt_regs *, unsigned long, int);
+ extern int die(const char *, struct pt_regs *, long);
+ extern void _exception(int, struct pt_regs *, int, unsigned long);
++extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
++
+ #ifdef CONFIG_BOOKE_WDT
+ extern u32 booke_wdt_enabled;
+ extern u32 booke_wdt_period;
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-powerpc/udbg.h powerpc.git/include/asm-powerpc/udbg.h
+--- linux-2.6.24/include/asm-powerpc/udbg.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-powerpc/udbg.h 2008-01-28 20:26:42.000000000 +0100
+@@ -48,6 +48,7 @@
+ 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_40x_realmode(void);
+ extern void __init udbg_init_cpm(void);
+
+ #endif /* __KERNEL__ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-ppc/8xx_immap.h powerpc.git/include/asm-ppc/8xx_immap.h
+--- linux-2.6.24/include/asm-ppc/8xx_immap.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-ppc/8xx_immap.h 2008-01-28 20:26:42.000000000 +0100
+@@ -123,7 +123,7 @@
+ #define OR_G5LA 0x00000400 /* Output #GPL5 on #GPL_A5 */
+ #define OR_G5LS 0x00000200 /* Drive #GPL high on falling edge of...*/
+ #define OR_BI 0x00000100 /* Burst inhibit */
+-#define OR_SCY_MSK 0x000000f0 /* Cycle Lenght in Clocks */
++#define OR_SCY_MSK 0x000000f0 /* Cycle Length in Clocks */
+ #define OR_SCY_0_CLK 0x00000000 /* 0 clock cycles wait states */
+ #define OR_SCY_1_CLK 0x00000010 /* 1 clock cycles wait states */
+ #define OR_SCY_2_CLK 0x00000020 /* 2 clock cycles wait states */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-ppc/commproc.h powerpc.git/include/asm-ppc/commproc.h
+--- linux-2.6.24/include/asm-ppc/commproc.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-ppc/commproc.h 2008-01-28 20:26:42.000000000 +0100
+@@ -681,7 +681,7 @@
+ #define CICR_SCC_SCC3 ((uint)0x00200000) /* SCC3 @ SCCc */
+ #define CICR_SCB_SCC2 ((uint)0x00040000) /* SCC2 @ SCCb */
+ #define CICR_SCA_SCC1 ((uint)0x00000000) /* SCC1 @ SCCa */
+-#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrrupt */
++#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrupt */
+ #define CICR_HP_MASK ((uint)0x00001f00) /* Hi-pri int. */
+ #define CICR_IEN ((uint)0x00000080) /* Int. enable */
+ #define CICR_SPS ((uint)0x00000001) /* SCC Spread */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-ppc/mmu.h powerpc.git/include/asm-ppc/mmu.h
+--- linux-2.6.24/include/asm-ppc/mmu.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-ppc/mmu.h 2008-01-28 20:26:43.000000000 +0100
+@@ -383,6 +383,12 @@
+ #define BOOKE_PAGESZ_256GB 14
+ #define BOOKE_PAGESZ_1TB 15
+
++#ifndef CONFIG_SERIAL_TEXT_DEBUG
++#define PPC44x_EARLY_TLBS 1
++#else
++#define PPC44x_EARLY_TLBS 2
++#endif
++
+ /*
+ * Freescale Book-E MMU support
+ */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-ppc/mpc52xx_psc.h powerpc.git/include/asm-ppc/mpc52xx_psc.h
+--- linux-2.6.24/include/asm-ppc/mpc52xx_psc.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-ppc/mpc52xx_psc.h 2008-01-28 20:26:43.000000000 +0100
+@@ -159,6 +159,9 @@
+ u8 reserved16[3];
+ u8 irfdr; /* PSC + 0x54 */
+ u8 reserved17[3];
++};
++
++struct mpc52xx_psc_fifo {
+ u16 rfnum; /* PSC + 0x58 */
+ u16 reserved18;
+ u16 tfnum; /* PSC + 0x5c */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/asm-ppc/reg_booke.h powerpc.git/include/asm-ppc/reg_booke.h
+--- linux-2.6.24/include/asm-ppc/reg_booke.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/asm-ppc/reg_booke.h 2008-01-28 20:26:43.000000000 +0100
+@@ -207,7 +207,7 @@
+ #define CCR1_TCS 0x00000080 /* Timer Clock Select */
+
+ /* Bit definitions for the MCSR. */
+-#ifdef CONFIG_440A
++#ifdef CONFIG_4xx
+ #define MCSR_MCS 0x80000000 /* Machine Check Summary */
+ #define MCSR_IB 0x40000000 /* Instruction PLB Error */
+ #define MCSR_DRB 0x20000000 /* Data Read PLB Error */
+@@ -283,7 +283,7 @@
+ #define ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */
+ #define ESR_IMCT 0x10000000 /* Instr. Machine Check - Timeout */
+ #define ESR_PIL 0x08000000 /* Program Exception - Illegal */
+-#define ESR_PPR 0x04000000 /* Program Exception - Priveleged */
++#define ESR_PPR 0x04000000 /* Program Exception - Privileged */
+ #define ESR_PTR 0x02000000 /* Program Exception - Trap */
+ #define ESR_FP 0x01000000 /* Floating Point Operation */
+ #define ESR_DST 0x00800000 /* Storage Exception - Data miss */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/linux/of.h powerpc.git/include/linux/of.h
+--- linux-2.6.24/include/linux/of.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/linux/of.h 2008-01-28 20:26:44.000000000 +0100
+@@ -17,6 +17,7 @@
+ */
+ #include <linux/types.h>
+ #include <linux/bitops.h>
++#include <linux/mod_devicetable.h>
+
+ #include <asm/prom.h>
+
+@@ -41,11 +42,20 @@
+ #define for_each_compatible_node(dn, type, compatible) \
+ for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+ dn = of_find_compatible_node(dn, type, compatible))
++extern struct device_node *of_find_matching_node(struct device_node *from,
++ const struct of_device_id *matches);
++#define for_each_matching_node(dn, matches) \
++ for (dn = of_find_matching_node(NULL, matches); dn; \
++ dn = of_find_matching_node(dn, matches))
+ extern struct device_node *of_find_node_by_path(const char *path);
+ extern struct device_node *of_find_node_by_phandle(phandle handle);
+ extern struct device_node *of_get_parent(const struct device_node *node);
+ extern struct device_node *of_get_next_child(const struct device_node *node,
+ struct device_node *prev);
++#define for_each_child_of_node(parent, child) \
++ for (child = of_get_next_child(parent, NULL); child != NULL; \
++ child = of_get_next_child(parent, child))
++
+ extern struct property *of_find_property(const struct device_node *np,
+ const char *name,
+ int *lenp);
+@@ -56,5 +66,7 @@
+ int *lenp);
+ extern int of_n_addr_cells(struct device_node *np);
+ extern int of_n_size_cells(struct device_node *np);
++extern const struct of_device_id *of_match_node(
++ const struct of_device_id *matches, const struct device_node *node);
+
+ #endif /* _LINUX_OF_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/linux/of_device.h powerpc.git/include/linux/of_device.h
+--- linux-2.6.24/include/linux/of_device.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/linux/of_device.h 2008-01-28 20:26:44.000000000 +0100
+@@ -10,8 +10,6 @@
+
+ #define to_of_device(d) container_of(d, struct of_device, dev)
+
+-extern const struct of_device_id *of_match_node(
+- const struct of_device_id *matches, const struct device_node *node);
+ extern const struct of_device_id *of_match_device(
+ const struct of_device_id *matches, const struct of_device *dev);
+
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/linux/pata_platform.h powerpc.git/include/linux/pata_platform.h
+--- linux-2.6.24/include/linux/pata_platform.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/linux/pata_platform.h 2008-01-28 20:26:44.000000000 +0100
+@@ -15,4 +15,13 @@
+ unsigned int irq_flags;
+ };
+
++extern int __devinit __pata_platform_probe(struct device *dev,
++ struct resource *io_res,
++ struct resource *ctl_res,
++ struct resource *irq_res,
++ unsigned int ioport_shift,
++ int __pio_mask);
++
++extern int __devexit __pata_platform_remove(struct device *dev);
++
+ #endif /* __LINUX_PATA_PLATFORM_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/linux/phy_fixed.h powerpc.git/include/linux/phy_fixed.h
+--- linux-2.6.24/include/linux/phy_fixed.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/linux/phy_fixed.h 2008-01-28 20:26:44.000000000 +0100
+@@ -1,38 +1,31 @@
+ #ifndef __PHY_FIXED_H
+ #define __PHY_FIXED_H
+
+-#define MII_REGS_NUM 29
+-
+-/* max number of virtual phy stuff */
+-#define MAX_PHY_AMNT 10
+-/*
+- The idea is to emulate normal phy behavior by responding with
+- pre-defined values to mii BMCR read, so that read_status hook could
+- take all the needed info.
+-*/
+-
+ struct fixed_phy_status {
+- u8 link;
+- u16 speed;
+- u8 duplex;
++ int link;
++ int speed;
++ int duplex;
++ int pause;
++ int asym_pause;
+ };
+
+-/*-----------------------------------------------------------------------------
+- * Private information hoder for mii_bus
+- *-----------------------------------------------------------------------------*/
+-struct fixed_info {
+- u16 *regs;
+- u8 regs_num;
+- struct fixed_phy_status phy_status;
+- struct phy_device *phydev; /* pointer to the container */
+- /* link & speed cb */
+- int (*link_update) (struct net_device *, struct fixed_phy_status *);
++#ifdef CONFIG_FIXED_PHY
++extern int fixed_phy_add(unsigned int irq, int phy_id,
++ struct fixed_phy_status *status);
++#else
++static inline int fixed_phy_add(unsigned int irq, int phy_id,
++ struct fixed_phy_status *status)
++{
++ return -ENODEV;
++}
++#endif /* CONFIG_FIXED_PHY */
+
+-};
+-
+-
+-int fixed_mdio_set_link_update(struct phy_device *,
+- int (*link_update) (struct net_device *, struct fixed_phy_status *));
+-struct fixed_info *fixed_mdio_get_phydev (int phydev_ind);
++/*
++ * This function issued only by fixed_phy-aware drivers, no need
++ * protect it with #ifdef
++ */
++extern int fixed_phy_set_link_update(struct phy_device *phydev,
++ int (*link_update)(struct net_device *,
++ struct fixed_phy_status *));
+
+ #endif /* __PHY_FIXED_H */
+diff -x .git -x .gitignore -Nur linux-2.6.24/include/linux/pmu.h powerpc.git/include/linux/pmu.h
+--- linux-2.6.24/include/linux/pmu.h 2008-01-24 23:58:37.000000000 +0100
++++ powerpc.git/include/linux/pmu.h 2008-01-28 20:26:44.000000000 +0100
+@@ -159,41 +159,7 @@
+ extern int pmu_present(void);
+ extern int pmu_get_model(void);
+
+-#ifdef CONFIG_PM
+-/*
+- * Stuff for putting the powerbook to sleep and waking it again.
+- *
+- */
+-#include <linux/list.h>
+-
+-struct pmu_sleep_notifier
+-{
+- void (*notifier_call)(struct pmu_sleep_notifier *self, int when);
+- int priority;
+- struct list_head list;
+-};
+-
+-/* Code values for calling sleep/wakeup handlers
+- */
+-#define PBOOK_SLEEP_REQUEST 1
+-#define PBOOK_SLEEP_NOW 2
+-#define PBOOK_WAKE 3
+-
+-/* priority levels in notifiers */
+-#define SLEEP_LEVEL_VIDEO 100 /* Video driver (first wake) */
+-#define SLEEP_LEVEL_MEDIABAY 90 /* Media bay driver */
+-#define SLEEP_LEVEL_BLOCK 80 /* IDE, SCSI */
+-#define SLEEP_LEVEL_NET 70 /* bmac, gmac */
+-#define SLEEP_LEVEL_MISC 60 /* Anything else */
+-#define SLEEP_LEVEL_USERLAND 55 /* Reserved for apm_emu */
+-#define SLEEP_LEVEL_ADB 50 /* ADB (async) */
+-#define SLEEP_LEVEL_SOUND 40 /* Sound driver (blocking) */
+-
+-/* special register notifier functions */
+-int pmu_register_sleep_notifier(struct pmu_sleep_notifier* notifier);
+-int pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* notifier);
+-
+-#endif /* CONFIG_PM */
++extern void pmu_backlight_set_sleep(int sleep);
+
+ #define PMU_MAX_BATTERIES 2
+