diff options
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.24')
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.24/700-powerpc_git.patch | 71515 |
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, ®_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 = ð0; ++ ethernet1 = ð1; ++ }; ++ ++ 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 = ð0; ++ ethernet1 = ð1; ++ }; ++ ++ 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 = ð0; ++ ethernet1 = ð1; ++ 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, ®); ++ 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, ®); +- 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", ®len); + 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(¤t->mm->mmap_sem); ++ spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE); ++ down_read(¤t->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 = ¯isc_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 = ∁ ++ 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(¤t->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 + |