Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 8 Feb 2007 18:04:20 +0000 (10:04 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Thu, 8 Feb 2007 18:04:20 +0000 (10:04 -0800)
* master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc: (116 commits)
  [POWERPC] Add export of vgacon_remap_base
  [POWERPC] Remove bogus comment about page_is_ram
  [POWERPC] windfarm: don't die on suspend thread signal
  [POWERPC] Fix comment in kernel/irq.c
  [POWERPC] ppc: Fix booke watchdog initialization
  [POWERPC] PPC: Use ARRAY_SIZE macro when appropriate
  [POWERPC] Use ARRAY_SIZE macro when appropriate
  [POWERPC] Fix ppc64's writing to struct file_operations
  [POWERPC] ppc: use syslog macro for the printk log level
  [POWERPC] ppc: cs4218_tdm remove extra brace
  [POWERPC] Add mpc52xx/lite5200 PCI support
  [POWERPC] Only use H_BULK_REMOVE if the firmware supports it
  [POWERPC] Fixup error handling when emulating a floating point instruction
  [POWERPC] Enable interrupts if we are doing fp math emulation
  [POWERPC] Added kprobes support to ppc32
  [POWERPC] Make pSeries use the H_BULK_REMOVE hypervisor call
  [POWERPC] Clear RI bit in MSR before restoring r13 when returning to userspace
  [POWERPC] Fix performance monitor exception
  [POWERPC] Compile fixes for arch/powerpc dcr code
  [POWERPC] Maple: use mmio nvram
  ...

211 files changed:
arch/powerpc/Kconfig
arch/powerpc/Kconfig.debug
arch/powerpc/boot/Makefile
arch/powerpc/boot/dts/mpc8272ads.dts
arch/powerpc/boot/dts/mpc8323emds.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc8560ads.dts
arch/powerpc/boot/dts/mpc866ads.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc885ads.dts [new file with mode: 0644]
arch/powerpc/configs/celleb_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc8272_ads_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc832xemds_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc834x_itx_defconfig
arch/powerpc/configs/mpc834x_mds_defconfig
arch/powerpc/configs/mpc8360emds_defconfig
arch/powerpc/configs/mpc866_ads_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc885_ads_defconfig [new file with mode: 0644]
arch/powerpc/configs/pasemi_defconfig [new file with mode: 0644]
arch/powerpc/configs/ps3_defconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/cpu_setup_pa6t.S [new file with mode: 0644]
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/iomap.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/kprobes.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/module_32.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pmc.c
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/ptrace.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/udbg.c
arch/powerpc/kernel/udbg_16550.c
arch/powerpc/kernel/vio.c
arch/powerpc/lib/Makefile
arch/powerpc/lib/dma-noncoherent.c [new file with mode: 0644]
arch/powerpc/lib/rheap.c
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/pgtable_32.c
arch/powerpc/oprofile/common.c
arch/powerpc/oprofile/op_model_7450.c
arch/powerpc/oprofile/op_model_fsl_booke.c
arch/powerpc/oprofile/op_model_power4.c
arch/powerpc/oprofile/op_model_rs64.c
arch/powerpc/platforms/52xx/Makefile
arch/powerpc/platforms/52xx/lite5200.c
arch/powerpc/platforms/52xx/mpc52xx_pci.c [new file with mode: 0644]
arch/powerpc/platforms/82xx/mpc82xx.c
arch/powerpc/platforms/82xx/mpc82xx_ads.c
arch/powerpc/platforms/82xx/pq2ads.h
arch/powerpc/platforms/83xx/misc.c
arch/powerpc/platforms/83xx/mpc832x_mds.c
arch/powerpc/platforms/83xx/mpc834x_itx.c
arch/powerpc/platforms/83xx/mpc834x_sys.c
arch/powerpc/platforms/83xx/mpc8360e_pb.c
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/86xx/mpc86xx_smp.c
arch/powerpc/platforms/8xx/Kconfig
arch/powerpc/platforms/8xx/Makefile [new file with mode: 0644]
arch/powerpc/platforms/8xx/m8xx_setup.c [new file with mode: 0644]
arch/powerpc/platforms/8xx/mpc86xads.h [new file with mode: 0644]
arch/powerpc/platforms/8xx/mpc86xads_setup.c [new file with mode: 0644]
arch/powerpc/platforms/8xx/mpc885ads.h [new file with mode: 0644]
arch/powerpc/platforms/8xx/mpc885ads_setup.c [new file with mode: 0644]
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/cell/Makefile
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/cell/spu_manage.c [new file with mode: 0644]
arch/powerpc/platforms/cell/spu_priv1_mmio.c
arch/powerpc/platforms/celleb/Makefile [new file with mode: 0644]
arch/powerpc/platforms/celleb/beat.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/beat.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/beat_syscall.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/beat_wrapper.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/htab.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/hvCall.S [new file with mode: 0644]
arch/powerpc/platforms/celleb/interrupt.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/interrupt.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/iommu.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/pci.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/pci.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/scc.h [new file with mode: 0644]
arch/powerpc/platforms/celleb/scc_epci.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/scc_sio.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/scc_uhc.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/setup.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/smp.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/spu_priv1.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/udbg_beat.c [new file with mode: 0644]
arch/powerpc/platforms/embedded6xx/Kconfig
arch/powerpc/platforms/maple/pci.c
arch/powerpc/platforms/maple/setup.c
arch/powerpc/platforms/pasemi/Kconfig [new file with mode: 0644]
arch/powerpc/platforms/pasemi/Makefile
arch/powerpc/platforms/pasemi/idle.c [new file with mode: 0644]
arch/powerpc/platforms/pasemi/iommu.c [new file with mode: 0644]
arch/powerpc/platforms/pasemi/pasemi.h
arch/powerpc/platforms/pasemi/pci.c
arch/powerpc/platforms/pasemi/powersave.S [new file with mode: 0644]
arch/powerpc/platforms/pasemi/setup.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/platforms/ps3/Makefile
arch/powerpc/platforms/ps3/htab.c
arch/powerpc/platforms/ps3/interrupt.c
arch/powerpc/platforms/ps3/mm.c
arch/powerpc/platforms/ps3/os-area.c
arch/powerpc/platforms/ps3/platform.h
arch/powerpc/platforms/ps3/repository.c
arch/powerpc/platforms/ps3/setup.c
arch/powerpc/platforms/ps3/smp.c
arch/powerpc/platforms/ps3/spu.c
arch/powerpc/platforms/ps3/system-bus.c [new file with mode: 0644]
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/eeh_driver.c
arch/powerpc/platforms/pseries/firmware.c
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/pci.c
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/commproc.c [new file with mode: 0644]
arch/powerpc/sysdev/cpm2_pic.c
arch/powerpc/sysdev/cpm2_pic.h
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/grackle.c
arch/powerpc/sysdev/ipic.c
arch/powerpc/sysdev/micropatch.c [new file with mode: 0644]
arch/powerpc/sysdev/mpc8xx_pic.c [new file with mode: 0644]
arch/powerpc/sysdev/mpc8xx_pic.h [new file with mode: 0644]
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/qe_lib/qe_ic.c
arch/powerpc/xmon/ppc-opc.c
arch/powerpc/xmon/spu-opc.c
arch/ppc/8xx_io/cs4218_tdm.c
arch/ppc/Kconfig
arch/ppc/boot/simple/Makefile
arch/ppc/boot/simple/misc.c
arch/ppc/configs/gemini_defconfig [deleted file]
arch/ppc/kernel/Makefile
arch/ppc/kernel/dma-mapping.c [deleted file]
arch/ppc/kernel/head.S
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/lib/rheap.c
arch/ppc/mm/pgtable.c
arch/ppc/platforms/Makefile
arch/ppc/platforms/gemini.h [deleted file]
arch/ppc/platforms/gemini_pci.c [deleted file]
arch/ppc/platforms/gemini_prom.S [deleted file]
arch/ppc/platforms/gemini_serial.h [deleted file]
arch/ppc/platforms/gemini_setup.c [deleted file]
arch/ppc/platforms/mpc866ads_setup.c
arch/ppc/syslib/Makefile
arch/ppc/syslib/m8260_pci_erratum9.c
arch/ppc/syslib/m8xx_setup.c
arch/ppc/syslib/ppc85xx_rio.c
arch/ppc/xmon/ppc-opc.c
arch/ppc/xmon/start.c
drivers/char/Kconfig
drivers/char/Makefile
drivers/char/hvc_beat.c [new file with mode: 0644]
drivers/char/watchdog/booke_wdt.c
drivers/macintosh/windfarm_core.c
drivers/net/fs_enet/fs_enet.h
drivers/net/gianfar_ethtool.c
drivers/ps3/Makefile
drivers/ps3/system-bus.c [deleted file]
drivers/ps3/vuart.c
drivers/ps3/vuart.h
drivers/serial/cpm_uart/cpm_uart_cpm1.c
drivers/serial/cpm_uart/cpm_uart_cpm1.h
drivers/serial/cpm_uart/cpm_uart_cpm2.h
include/asm-powerpc/cputable.h
include/asm-powerpc/dcr.h
include/asm-powerpc/elf.h
include/asm-powerpc/firmware.h
include/asm-powerpc/fs_pd.h
include/asm-powerpc/hvcall.h
include/asm-powerpc/io.h
include/asm-powerpc/iommu.h
include/asm-powerpc/ipic.h
include/asm-powerpc/irq.h
include/asm-powerpc/kprobes.h
include/asm-powerpc/mmu.h
include/asm-powerpc/mpc52xx.h
include/asm-powerpc/mpc8260.h [new file with mode: 0644]
include/asm-powerpc/mpc8xx.h [new file with mode: 0644]
include/asm-powerpc/mpic.h
include/asm-powerpc/oprofile_impl.h
include/asm-powerpc/pci-bridge.h
include/asm-powerpc/ps3.h
include/asm-powerpc/reg.h
include/asm-powerpc/smp.h
include/asm-powerpc/spu.h
include/asm-powerpc/spu_priv1.h
include/asm-powerpc/sstep.h
include/asm-powerpc/time.h
include/asm-powerpc/udbg.h
include/asm-ppc/commproc.h
include/asm-ppc/ibm4xx.h
include/asm-ppc/m48t35.h [deleted file]
include/asm-ppc/reg_booke.h
include/asm-ppc/serial.h
include/linux/log2.h
include/linux/sysdev.h

index c1e01b22addc8182193a12dca7a1fd3700ec0888..f08e80a0bf0addaf3a33d95f30238a6064f4a53e 100644 (file)
@@ -173,6 +173,11 @@ config PPC_86xx
        help
          The Freescale E600 SoCs have 74xx cores.
 
+config PPC_8xx
+       bool "Freescale 8xx"
+       select FSL_SOC
+       select 8xx
+
 config 40x
        bool "AMCC 40x"
        select PPC_DCR_NATIVE
@@ -181,8 +186,6 @@ config 44x
        bool "AMCC 44x"
        select PPC_DCR_NATIVE
 
-config 8xx
-       bool "Freescale 8xx"
 
 config E200
        bool "Freescale e200"
@@ -210,6 +213,10 @@ config POWER4
 config 6xx
        bool
 
+# this is temp to handle compat with arch=ppc
+config 8xx
+       bool
+
 # this is temp to handle compat with arch=ppc
 config 83xx
        bool
@@ -429,6 +436,21 @@ config PPC_MPC52xx
        bool
        default n
 
+config PPC_MPC5200
+       bool
+       select PPC_MPC52xx
+       default n
+
+config PPC_MPC5200_BUGFIX
+       bool "MPC5200 (L25R) bugfix support"
+       depends on PPC_MPC5200
+       default n
+       help
+         Enable workarounds for original MPC5200 errata.  This is not required
+         for MPC5200B based boards.
+
+         It is safe to say 'Y' here
+
 config PPC_EFIKA
        bool "bPlan Efika 5k2. MPC5200B based computer"
        depends on PPC_MULTIPLATFORM && PPC32
@@ -441,7 +463,7 @@ config PPC_EFIKA
 config PPC_LITE5200
        bool "Freescale Lite5200 Eval Board"
        depends on PPC_MULTIPLATFORM && PPC32
-       select PPC_MPC52xx
+       select PPC_MPC5200
        default n
 
 config PPC_PMAC
@@ -484,6 +506,7 @@ config PPC_MAPLE
        select PPC_970_NAP
        select PPC_NATIVE
        select PPC_RTAS
+       select MMIO_NVRAM
        select ATA_NONSTANDARD if ATA
        default n
        help
@@ -541,6 +564,16 @@ config PPC_PS3
          enabling this will not result in a bootable kernel on a
          PS3 system.
 
+config PPC_CELLEB
+       bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
+       depends on PPC_MULTIPLATFORM && PPC64
+       select PPC_CELL
+       select PPC_OF_PLATFORM_PCI
+       select HAS_TXX9_SERIAL
+       select PPC_UDBG_BEAT
+       select USB_OHCI_BIG_ENDIAN_MMIO
+       select USB_EHCI_BIG_ENDIAN_MMIO
+
 config PPC_NATIVE
        bool
        depends on PPC_MULTIPLATFORM
@@ -554,6 +587,11 @@ config UDBG_RTAS_CONSOLE
        depends on PPC_RTAS
        default n
 
+config PPC_UDBG_BEAT
+       bool "BEAT based debug console"
+       depends on PPC_CELLEB
+       default n
+
 config XICS
        depends on PPC_PSERIES
        bool
@@ -707,6 +745,7 @@ source arch/powerpc/platforms/86xx/Kconfig
 source arch/powerpc/platforms/8xx/Kconfig
 source arch/powerpc/platforms/cell/Kconfig
 source arch/powerpc/platforms/ps3/Kconfig
+source arch/powerpc/platforms/pasemi/Kconfig
 
 menu "Kernel options"
 
@@ -729,7 +768,7 @@ config FORCE_MAX_ZONEORDER
 
 config MATH_EMULATION
        bool "Math emulation"
-       depends on 4xx || 8xx || E200 || PPC_83xx || E500
+       depends on 4xx || 8xx || E200 || PPC_MPC832x || E500
        ---help---
          Some PowerPC chips designed for embedded applications do not have
          a floating-point unit and therefore do not implement the
@@ -1187,7 +1226,7 @@ source "arch/powerpc/oprofile/Kconfig"
 
 config KPROBES
        bool "Kprobes (EXPERIMENTAL)"
-       depends on PPC64 && KALLSYMS && EXPERIMENTAL && MODULES
+       depends on !BOOKE && !4xx && KALLSYMS && EXPERIMENTAL && MODULES
        help
          Kprobes allows you to trap at almost any kernel address and
          execute a callback function.  register_kprobe() establishes
index f0e51edde022454fc4581449275c5acf6687b86d..d39d13327e6d928aee8370797827c342698446e8 100644 (file)
@@ -4,14 +4,14 @@ source "lib/Kconfig.debug"
 
 config DEBUG_STACKOVERFLOW
        bool "Check for stack overflows"
-       depends on DEBUG_KERNEL && PPC64
+       depends on DEBUG_KERNEL
        help
          This option will cause messages to be printed if free stack space
          drops below a certain limit.
 
 config DEBUG_STACK_USAGE
        bool "Stack utilization instrumentation"
-       depends on DEBUG_KERNEL && PPC64
+       depends on DEBUG_KERNEL
        help
          Enables the display of the minimum amount of free stack which each
          task has ever had available in the sysrq-T and sysrq-P debug output.
@@ -185,6 +185,20 @@ config PPC_EARLY_DEBUG_ISERIES
          Select this to enable early debugging for legacy iSeries. You need
          to hit "Ctrl-x Ctrl-x" to see the messages on the console.
 
+config PPC_EARLY_DEBUG_PAS_REALMODE
+       bool "PA Semi real mode"
+       depends on PPC_PASEMI
+       help
+         Select this to enable early debugging for PA Semi.
+         Output will be on UART0.
+
+config PPC_EARLY_DEBUG_BEAT
+       bool "Beat HV Console"
+       depends on PPC_CELLEB
+       select PPC_UDBG_BEAT
+       help
+         Select this to enable early debugging for Celleb with Beat.
+
 endchoice
 
 endmenu
index 98392fb5f5815243b0ede4a76ef676f782de1bfb..dc779407de14ab4927676c0c2f9842b92caeb0cf 100644 (file)
@@ -162,6 +162,7 @@ image-$(CONFIG_PPC_PSERIES)         += zImage.pseries
 image-$(CONFIG_PPC_MAPLE)              += zImage.pseries
 image-$(CONFIG_PPC_IBM_CELL_BLADE)     += zImage.pseries
 image-$(CONFIG_PPC_PS3)                        += zImage.ps3
+image-$(CONFIG_PPC_CELLEB)             += zImage.pseries
 image-$(CONFIG_PPC_CHRP)               += zImage.chrp
 image-$(CONFIG_PPC_EFIKA)              += zImage.chrp
 image-$(CONFIG_PPC_PMAC)               += zImage.pmac
index 34efdd028c4f0766c0c5a8be3df9c79e4a999410..26b44f7513dcfe12cfc46f8f5574921f58a08d83 100644 (file)
                reg = <00000000 4000000 f4500000 00000020>;
        };
 
+       chosen {
+               name = "chosen";
+               linux,platform = <0>;
+               interrupt-controller = <10c00>;
+               linux,phandle = <400>;
+       };
+
        soc8272@f0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
                #interrupt-cells = <2>;
                device_type = "soc";
-               ranges = < 0 0 2 00000000 f0000000 00053000>;
-               reg = <f0000000 0>;
+               ranges = <00000000 f0000000 00053000>;
+               reg = <f0000000 10000>;
 
                mdio@0 {
                        device_type = "mdio";
@@ -71,7 +78,7 @@
                        ethernet-phy@0 {
                                linux,phandle = <2452000>;
                                interrupt-parent = <10c00>;
-                               interrupts = <19 1>;
+                               interrupts = <17 4>;
                                reg = <0>;
                                bitbang = [ 12 12 13 02 02 01 ];
                                device_type = "ethernet-phy";
@@ -79,7 +86,7 @@
                        ethernet-phy@1 {
                                linux,phandle = <2452001>;
                                interrupt-parent = <10c00>;
-                               interrupts = <19 1>;
+                               interrupts = <17 4>;
                                bitbang = [ 12 12 13 02 02 01 ];
                                reg = <3>;
                                device_type = "ethernet-phy";
@@ -90,7 +97,7 @@
                        #address-cells = <1>;
                        #size-cells = <0>;
                        device_type = "network";
-                       device-id = <2>;
+                       device-id = <1>;
                        compatible = "fs_enet";
                        model = "FCC";
                        reg = <11300 20 8400 100 11380 30>;
 
                ethernet@25000 {
                        device_type = "network";
-                       device-id = <3>;
+                       device-id = <2>;
                        compatible = "fs_enet";
                        model = "FCC";
                        reg = <11320 20 8500 100 113b0 30>;
                        #interrupt-cells = <2>;
                        device_type = "cpm";
                        model = "CPM2";
-                       ranges = <00000000 00000000 3ffff>;
-                       reg = <10d80 3280>;
+                       ranges = <00000000 00000000 20000>;
+                       reg = <0 20000>;
                        command-proc = <119c0>;
                        brg-frequency = <17D7840>;
                        cpm_clk = <BEBC200>;
                                device_type = "serial";
                                compatible = "cpm_uart";
                                model = "SCC";
-                               device-id = <2>;
+                               device-id = <1>;
                                reg = <11a00 20 8000 100>;
                                current-speed = <1c200>;
                                interrupts = <28 2>;
                                device_type = "serial";
                                compatible = "cpm_uart";
                                model = "SCC";
-                               device-id = <5>;
+                               device-id = <4>;
                                reg = <11a60 20 8300 100>;
                                current-speed = <1c200>;
                                interrupts = <2b 2>;
                        interrupt-map = <
 
                                        /* IDSEL 0x16 */
-                                        b000 0 0 1 f8200000 40 0
-                                        b000 0 0 2 f8200000 41 0
-                                        b000 0 0 3 f8200000 42 0
-                                        b000 0 0 4 f8200000 43 0
+                                        b000 0 0 1 f8200000 40 8
+                                        b000 0 0 2 f8200000 41 8
+                                        b000 0 0 3 f8200000 42 8
+                                        b000 0 0 4 f8200000 43 8
 
                                        /* IDSEL 0x17 */
-                                        b800 0 0 1 f8200000 43 0
-                                        b800 0 0 2 f8200000 40 0
-                                        b800 0 0 3 f8200000 41 0
-                                        b800 0 0 4 f8200000 42 0
+                                        b800 0 0 1 f8200000 43 8
+                                        b800 0 0 2 f8200000 40 8
+                                        b800 0 0 3 f8200000 41 8
+                                        b800 0 0 4 f8200000 42 8
 
                                        /* IDSEL 0x18 */
-                                        c000 0 0 1 f8200000 42 0
-                                        c000 0 0 2 f8200000 43 0
-                                        c000 0 0 3 f8200000 40 0
-                                        c000 0 0 4 f8200000 41 0>;
+                                        c000 0 0 1 f8200000 42 8
+                                        c000 0 0 2 f8200000 43 8
+                                        c000 0 0 3 f8200000 40 8
+                                        c000 0 0 4 f8200000 41 8>;
                        interrupt-parent = <10c00>;
-                       interrupts = <14 3>;
+                       interrupts = <14 8>;
                        bus-range = <0 0>;
                        ranges = <02000000 0 80000000 80000000 0 40000000
                                  01000000 0 00000000 f6000000 0 02000000>;
                        model = "SEC2";
                        compatible = "talitos";
                        reg = <30000 10000>;
-                       interrupts = <b 0>;
+                       interrupts = <b 2>;
                        interrupt-parent = <10c00>;
                        num-channels = <4>;
                        channel-fifo-len = <18>;
diff --git a/arch/powerpc/boot/dts/mpc8323emds.dts b/arch/powerpc/boot/dts/mpc8323emds.dts
new file mode 100644 (file)
index 0000000..fa7ef24
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * MPC8323E EMDS Device Tree Source
+ *
+ * Copyright 2006 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.
+ */
+
+/ {
+       model = "MPC8323EMDS";
+       compatible = "MPC83xx";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       linux,phandle = <100>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               linux,phandle = <200>;
+
+               PowerPC,8323@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <4000>;          // L1, 16K
+                       i-cache-size = <4000>;          // L1, 16K
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+                       32-bit;
+                       linux,phandle = <201>;
+                       linux,boot-cpu;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               linux,phandle = <300>;
+               reg = <00000000 08000000>;
+       };
+
+       bcsr@f8000000 {
+               device_type = "board-control";
+               reg = <f8000000 8000>;
+       };
+
+       soc8323@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 e0000000 00100000>;
+               reg = <e0000000 00000200>;
+               bus-frequency = <7DE2900>;
+
+               wdt@200 {
+                       device_type = "watchdog";
+                       compatible = "mpc83xx_wdt";
+                       reg = <200 100>;
+               };
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3000 100>;
+                       interrupts = <e 8>;
+                       interrupt-parent = <700>;
+                       dfsrr;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <9 8>;
+                       interrupt-parent = <700>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;
+                       interrupts = <a 8>;
+                       interrupt-parent = <700>;
+               };
+
+               crypto@30000 {
+                       device_type = "crypto";
+                       model = "SEC2";
+                       compatible = "talitos";
+                       reg = <30000 7000>;
+                       interrupts = <b 8>;
+                       interrupt-parent = <700>;
+                       /* Rev. 2.2 */
+                       num-channels = <1>;
+                       channel-fifo-len = <18>;
+                       exec-units-mask = <0000004c>;
+                       descriptor-types-mask = <0122003f>;
+               };
+
+               pci@8500 {
+                       linux,phandle = <8500>;
+                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map = <
+                                       /* IDSEL 0x11 AD17 */
+                                        8800 0 0 1 700 14 8
+                                        8800 0 0 2 700 15 8
+                                        8800 0 0 3 700 16 8
+                                        8800 0 0 4 700 17 8
+
+                                       /* IDSEL 0x12 AD18 */
+                                        9000 0 0 1 700 16 8
+                                        9000 0 0 2 700 17 8
+                                        9000 0 0 3 700 14 8
+                                        9000 0 0 4 700 15 8
+
+                                       /* IDSEL 0x13 AD19 */
+                                        9800 0 0 1 700 17 8
+                                        9800 0 0 2 700 14 8
+                                        9800 0 0 3 700 15 8
+                                        9800 0 0 4 700 16 8
+
+                                       /* IDSEL 0x15 AD21*/
+                                        a800 0 0 1 700 14 8
+                                        a800 0 0 2 700 15 8
+                                        a800 0 0 3 700 16 8
+                                        a800 0 0 4 700 17 8
+
+                                       /* IDSEL 0x16 AD22*/
+                                        b000 0 0 1 700 17 8
+                                        b000 0 0 2 700 14 8
+                                        b000 0 0 3 700 15 8
+                                        b000 0 0 4 700 16 8
+
+                                       /* IDSEL 0x17 AD23*/
+                                        b800 0 0 1 700 16 8
+                                        b800 0 0 2 700 17 8
+                                        b800 0 0 3 700 14 8
+                                        b800 0 0 4 700 15 8
+
+                                       /* IDSEL 0x18 AD24*/
+                                        c000 0 0 1 700 15 8
+                                        c000 0 0 2 700 16 8
+                                        c000 0 0 3 700 17 8
+                                        c000 0 0 4 700 14 8>;
+                       interrupt-parent = <700>;
+                       interrupts = <42 8>;
+                       bus-range = <0 0>;
+                       ranges = <02000000 0 a0000000 90000000 0 10000000
+                                 42000000 0 80000000 80000000 0 10000000
+                                 01000000 0 00000000 d0000000 0 00100000>;
+                       clock-frequency = <0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       reg = <8500 100>;
+                       compatible = "83xx";
+                       device_type = "pci";
+               };
+
+               pic@700 {
+                       linux,phandle = <700>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <700 100>;
+                       built-in;
+                       device_type = "ipic";
+               };
+               
+               par_io@1400 {
+                       reg = <1400 100>;
+                       device_type = "par_io";
+                       num-ports = <7>;
+
+                       ucc_pin@03 {
+                               linux,phandle = <140003>;
+                               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                                       3  4  3  0  2  0  /* MDIO */
+                                       3  5  1  0  2  0  /* MDC */
+                                       0  d  2  0  1  0        /* RX_CLK (CLK9) */
+                                       3 18  2  0  1  0        /* TX_CLK (CLK10) */
+                                       1  1  1  0  1  0        /* TxD1 */
+                                       1  0  1  0  1  0        /* TxD0 */
+                                       1  1  1  0  1  0        /* TxD1 */
+                                       1  2  1  0  1  0        /* TxD2 */
+                                       1  3  1  0  1  0        /* TxD3 */
+                                       1  4  2  0  1  0        /* RxD0 */
+                                       1  5  2  0  1  0        /* RxD1 */
+                                       1  6  2  0  1  0        /* RxD2 */
+                                       1  7  2  0  1  0        /* RxD3 */
+                                       1  8  2  0  1  0        /* RX_ER */
+                                       1  9  1  0  1  0        /* TX_ER */
+                                       1  a  2  0  1  0        /* RX_DV */
+                                       1  b  2  0  1  0        /* COL */
+                                       1  c  1  0  1  0        /* TX_EN */
+                                       1  d  2  0  1  0>;/* CRS */
+                       };
+                       ucc_pin@04 {
+                               linux,phandle = <140004>;
+                               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                                       3 1f  2  0  1  0        /* RX_CLK (CLK7) */
+                                       3  6  2  0  1  0        /* TX_CLK (CLK8) */
+                                       1 12  1  0  1  0        /* TxD0 */
+                                       1 13  1  0  1  0        /* TxD1 */
+                                       1 14  1  0  1  0        /* TxD2 */
+                                       1 15  1  0  1  0        /* TxD3 */
+                                       1 16  2  0  1  0        /* RxD0 */
+                                       1 17  2  0  1  0        /* RxD1 */
+                                       1 18  2  0  1  0        /* RxD2 */
+                                       1 19  2  0  1  0        /* RxD3 */
+                                       1 1a  2  0  1  0        /* RX_ER */
+                                       1 1b  1  0  1  0        /* TX_ER */
+                                       1 1c  2  0  1  0        /* RX_DV */
+                                       1 1d  2  0  1  0        /* COL */
+                                       1 1e  1  0  1  0        /* TX_EN */
+                                       1 1f  2  0  1  0>;/* CRS */
+                       };
+               };
+       };
+
+       qe@e0100000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "qe";
+               model = "QE";
+               ranges = <0 e0100000 00100000>;
+               reg = <e0100000 480>;
+               brg-frequency = <0>;
+               bus-frequency = <BCD3D80>;
+               
+               muram@10000 {
+                       device_type = "muram";
+                       ranges = <0 00010000 00004000>;
+       
+                       data-only@0 {
+                               reg = <0 4000>;
+                       };
+               };
+
+               spi@4c0 {
+                       device_type = "spi";
+                       compatible = "fsl_spi";
+                       reg = <4c0 40>;
+                       interrupts = <2>;
+                       interrupt-parent = <80>;
+                       mode = "cpu";
+               };
+
+               spi@500 {
+                       device_type = "spi";
+                       compatible = "fsl_spi";
+                       reg = <500 40>;
+                       interrupts = <1>;
+                       interrupt-parent = <80>;
+                       mode = "cpu";
+               };
+
+               usb@6c0 {
+                       device_type = "usb";
+                       compatible = "qe_udc";
+                       reg = <6c0 40 8B00 100>;
+                       interrupts = <b>;
+                       interrupt-parent = <80>;
+                       mode = "slave";
+               };
+
+               ucc@2200 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       model = "UCC";
+                       device-id = <3>;
+                       reg = <2200 200>;
+                       interrupts = <22>;
+                       interrupt-parent = <80>;
+                       mac-address = [ 00 04 9f 00 23 23 ];
+                       rx-clock = <19>;
+                       tx-clock = <1a>;
+                       phy-handle = <212003>;
+                       pio-handle = <140003>;
+               };
+
+               ucc@3200 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       model = "UCC";
+                       device-id = <4>;
+                       reg = <3000 200>;
+                       interrupts = <23>;
+                       interrupt-parent = <80>;
+                       mac-address = [ 00 11 22 33 44 55 ];
+                       rx-clock = <17>;
+                       tx-clock = <18>;
+                       phy-handle = <212004>;
+                       pio-handle = <140004>;
+               };
+
+               mdio@2320 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2320 18>;
+                       device_type = "mdio";
+                       compatible = "ucc_geth_phy";
+
+                       ethernet-phy@03 {
+                               linux,phandle = <212003>;
+                               interrupt-parent = <700>;
+                               interrupts = <11 2>;
+                               reg = <3>;
+                               device_type = "ethernet-phy";
+                               interface = <3>; //ENET_100_MII
+                       };
+                       ethernet-phy@04 {
+                               linux,phandle = <212004>;
+                               interrupt-parent = <700>;
+                               interrupts = <12 2>;
+                               reg = <4>;
+                               device_type = "ethernet-phy";
+                               interface = <3>;
+                       };
+               };
+
+               qeic@80 {
+                       linux,phandle = <80>;
+                       interrupt-controller;
+                       device_type = "qeic";
+                       #address-cells = <0>;
+                       #interrupt-cells = <1>;
+                       reg = <80 80>;
+                       built-in;
+                       big-endian;
+                       interrupts = <20 8 21 8>; //high:32 low:33
+                       interrupt-parent = <700>;
+               };
+       };
+};
index 2b168486aeba947f4288e90e543641bf023642e4..119bd5d3a834476d91be6f2e90d3fa8f2e7b68fb 100644 (file)
                                         a800 0 0 4 40000 31 1>;
 
                        interrupt-parent = <40000>;
-                       interrupts = <42 0>;
+                       interrupts = <8 0>;
                        bus-range = <0 0>;
                        ranges = <02000000 0 80000000 80000000 0 20000000
                                  01000000 0 00000000 e2000000 0 01000000>;
                                rx-clock = <1>;
                                tx-clock = <1>;
                                current-speed = <1c200>;
-                               interrupts = <64 1>;
+                               interrupts = <28 8>;
                                interrupt-parent = <90c00>;
                        };
 
                                rx-clock = <2>;
                                tx-clock = <2>;
                                current-speed = <1c200>;
-                               interrupts = <65 1>;
+                               interrupts = <29 8>;
                                interrupt-parent = <90c00>;
                        };
 
                                clock-setup = <ff00ffff 250000>;
                                rx-clock = <15>;
                                tx-clock = <16>;
-                               interrupts = <5d 1>;
+                               interrupts = <21 8>;
                                interrupt-parent = <90c00>;
                                phy-handle = <2452002>;
                        };
                                clock-setup = <ffff00ff 3700>;
                                rx-clock = <17>;
                                tx-clock = <18>;
-                               interrupts = <5e 1>;
+                               interrupts = <22 8>;
                                interrupt-parent = <90c00>;
                                phy-handle = <2452003>;
                        };
diff --git a/arch/powerpc/boot/dts/mpc866ads.dts b/arch/powerpc/boot/dts/mpc866ads.dts
new file mode 100644 (file)
index 0000000..5d40052
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * MPC866 ADS Device Tree Source
+ *
+ * Copyright 2006 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.
+ */
+
+
+/ {
+       model = "MPC866ADS";
+       compatible = "mpc8xx";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       linux,phandle = <100>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               linux,phandle = <200>;
+
+               PowerPC,866@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <2000>;          // L1, 8K
+                       i-cache-size = <4000>;          // L1, 16K
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+                       32-bit;
+                       interrupts = <f 2>;     // decrementer interrupt
+                       interrupt-parent = <ff000000>;
+                       linux,phandle = <201>;
+                       linux,boot-cpu;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               linux,phandle = <300>;
+               reg = <00000000 800000>;
+       };
+
+       soc866@ff000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 ff000000 00100000>;
+               reg = <ff000000 00000200>;
+               bus-frequency = <0>;
+               mdio@e80 {
+                       device_type = "mdio";
+                       compatible = "fs_enet";
+                       reg = <e80 8>;
+                       linux,phandle = <e80>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ethernet-phy@f {
+                               linux,phandle = <e800f>;
+                               reg = <f>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               fec@e00 {
+                       device_type = "network";
+                       compatible = "fs_enet";
+                       model = "FEC";
+                       device-id = <1>;
+                       reg = <e00 188>;
+                       mac-address = [ 00 00 0C 00 01 FD ];
+                       interrupts = <3 1>;
+                       interrupt-parent = <ff000000>;
+                       phy-handle = <e800f>;
+               };
+
+               pic@ff000000 {
+                       linux,phandle = <ff000000>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <0 24>;
+                       built-in;
+                       device_type = "mpc8xx-pic";
+                       compatible = "CPM";
+               };
+
+               cpm@ff000000 {
+                       linux,phandle = <ff000000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       #interrupt-cells = <2>;
+                       device_type = "cpm";
+                       model = "CPM";
+                       ranges = <0 0 4000>;
+                       reg = <860 f0>;
+                       command-proc = <9c0>;
+                       brg-frequency = <0>;
+                       interrupts = <0 2>;     // cpm error interrupt
+                       interrupt-parent = <930>;
+
+                       pic@930 {
+                               linux,phandle = <930>;
+                               interrupt-controller;
+                               #address-cells = <0>;
+                               #interrupt-cells = <2>;
+                               interrupts = <5 2 0 2>;
+                               interrupt-parent = <ff000000>;
+                               reg = <930 20>;
+                               built-in;
+                               device_type = "cpm-pic";
+                               compatible = "CPM";
+                       };
+
+                       smc@a80 {
+                               device_type = "serial";
+                               compatible = "cpm_uart";
+                               model = "SMC";
+                               device-id = <1>;
+                               reg = <a80 10 3e80 40>;
+                               clock-setup = <00ffffff 0>;
+                               rx-clock = <1>;
+                               tx-clock = <1>;
+                               current-speed = <0>;
+                               interrupts = <4 3>;
+                               interrupt-parent = <930>;
+                       };
+
+                       smc@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 = <930>;
+                       };
+
+                       scc@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 = <930>;
+                       };
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/mpc885ads.dts b/arch/powerpc/boot/dts/mpc885ads.dts
new file mode 100644 (file)
index 0000000..cf1a19f
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * MPC885 ADS Device Tree Source
+ *
+ * Copyright 2006 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.
+ */
+
+
+/ {
+       model = "MPC885ADS";
+       compatible = "mpc8xx";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       linux,phandle = <100>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               linux,phandle = <200>;
+
+               PowerPC,885@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <2000>;          // L1, 8K
+                       i-cache-size = <2000>;          // L1, 8K
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+                       32-bit;
+                       interrupts = <f 2>;     // decrementer interrupt
+                       interrupt-parent = <ff000000>;
+                       linux,phandle = <201>;
+                       linux,boot-cpu;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               linux,phandle = <300>;
+               reg = <00000000 800000>;
+       };
+
+       soc885@ff000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 ff000000 00100000>;
+               reg = <ff000000 00000200>;
+               bus-frequency = <0>;
+               mdio@e80 {
+                       device_type = "mdio";
+                       compatible = "fs_enet";
+                       reg = <e80 8>;
+                       linux,phandle = <e80>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ethernet-phy@0 {
+                               linux,phandle = <e8000>;
+                               reg = <0>;
+                               device_type = "ethernet-phy";
+                       };
+                       ethernet-phy@1 {
+                               linux,phandle = <e8001>;
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                       };
+                       ethernet-phy@2 {
+                               linux,phandle = <e8002>;
+                               reg = <2>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               fec@e00 {
+                       device_type = "network";
+                       compatible = "fs_enet";
+                       model = "FEC";
+                       device-id = <1>;
+                       reg = <e00 188>;
+                       mac-address = [ 00 00 0C 00 01 FD ];
+                       interrupts = <3 1>;
+                       interrupt-parent = <ff000000>;
+                       phy-handle = <e8000>;
+               };
+
+               fec@1e00 {
+                       device_type = "network";
+                       compatible = "fs_enet";
+                       model = "FEC";
+                       device-id = <2>;
+                       reg = <1e00 188>;
+                       mac-address = [ 00 00 0C 00 02 FD ];
+                       interrupts = <7 1>;
+                       interrupt-parent = <ff000000>;
+                       phy-handle = <e8001>;
+               };
+
+               pic@ff000000 {
+                       linux,phandle = <ff000000>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <0 24>;
+                       built-in;
+                       device_type = "mpc8xx-pic";
+                       compatible = "CPM";
+               };
+
+               cpm@ff000000 {
+                       linux,phandle = <ff000000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       #interrupt-cells = <2>;
+                       device_type = "cpm";
+                       model = "CPM";
+                       ranges = <0 0 4000>;
+                       reg = <860 f0>;
+                       command-proc = <9c0>;
+                       brg-frequency = <0>;
+                       interrupts = <0 2>;     // cpm error interrupt
+                       interrupt-parent = <930>;
+
+                       pic@930 {
+                               linux,phandle = <930>;
+                               interrupt-controller;
+                               #address-cells = <0>;
+                               #interrupt-cells = <2>;
+                               interrupts = <5 2 0 2>;
+                               interrupt-parent = <ff000000>;
+                               reg = <930 20>;
+                               built-in;
+                               device_type = "cpm-pic";
+                               compatible = "CPM";
+                       };
+
+                       smc@a80 {
+                               device_type = "serial";
+                               compatible = "cpm_uart";
+                               model = "SMC";
+                               device-id = <1>;
+                               reg = <a80 10 3e80 40>;
+                               clock-setup = <00ffffff 0>;
+                               rx-clock = <1>;
+                               tx-clock = <1>;
+                               current-speed = <0>;
+                               interrupts = <4 3>;
+                               interrupt-parent = <930>;
+                       };
+
+                       smc@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 = <930>;
+                       };
+
+                       scc@a40 {
+                               device_type = "network";
+                               compatible = "fs_enet";
+                               model = "SCC";
+                               device-id = <3>;
+                               reg = <a40 18 3e00 80>;
+                               mac-address = [ 00 00 0C 00 03 FD ];
+                               interrupts = <1c 3>;
+                               interrupt-parent = <930>;
+                               phy-handle = <e8002>;
+                       };
+               };
+       };
+};
diff --git a/arch/powerpc/configs/celleb_defconfig b/arch/powerpc/configs/celleb_defconfig
new file mode 100644 (file)
index 0000000..a1fe971
--- /dev/null
@@ -0,0 +1,1408 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-rc4
+# Thu Jan 11 20:55:33 2007
+#
+CONFIG_PPC64=y
+CONFIG_64BIT=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_ARCH_HAS_ILOG2_U64=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_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
+
+#
+# Processor support
+#
+# CONFIG_POWER4_ONLY is not set
+CONFIG_POWER3=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_OF_PLATFORM_PCI=y
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_VIRT_CPU_ACCOUNTING=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=4
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+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_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE 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_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
+# CONFIG_PPC_PSERIES is not set
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_PMAC is not set
+# CONFIG_PPC_MAPLE is not set
+# CONFIG_PPC_PASEMI is not set
+CONFIG_PPC_CELL=y
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PPC_IBM_CELL_BLADE is not set
+# CONFIG_PPC_PS3 is not set
+CONFIG_PPC_CELLEB=y
+CONFIG_PPC_UDBG_BEAT=y
+# CONFIG_U3_DART 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_WANT_EARLY_SERIAL is not set
+# CONFIG_MPIC is not set
+
+#
+# Cell Broadband Engine options
+#
+CONFIG_SPU_FS=y
+CONFIG_SPU_BASE=y
+# CONFIG_CBE_RAS is not set
+
+#
+# Kernel options
+#
+# 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_PREEMPT_BKL=y
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+CONFIG_FORCE_MAX_ZONEORDER=13
+# CONFIG_IOMMU_VMERGE is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_KEXEC=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_IRQ_ALL_CPUS is not set
+CONFIG_NUMA=y
+CONFIG_NODES_SHIFT=4
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_FLATMEM_MANUAL is not set
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_NEED_MULTIPLE_NODES=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTPLUG_SPARSE=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_MIGRATION=y
+CONFIG_RESOURCES_64BIT=y
+CONFIG_ARCH_MEMORY_PROBE=y
+CONFIG_NODES_SPAN_OTHER_NODES=y
+# CONFIG_PPC_64K_PAGES is not set
+# CONFIG_SCHED_SMT is not set
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_INDIRECT_PCI is not set
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+CONFIG_KERNEL_START=0xc000000000000000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=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
+
+#
+# IP: Virtual Server Configuration
+#
+# 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=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+# CONFIG_IPV6_MIP6 is not set
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_TUNNEL=m
+# CONFIG_IPV6_MULTIPLE_TABLES 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_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_QUEUE=m
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# 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_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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=131072
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+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=m
+# 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
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# 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_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 is not set
+CONFIG_BLK_DEV_IDE_CELLEB=y
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=m
+# 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=m
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# 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_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_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_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+# CONFIG_MD_RAID10 is not set
+# CONFIG_MD_RAID456 is not set
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_MD_FAULTY is not set
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_DEBUG is not set
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+# CONFIG_DM_MULTIPATH_EMC is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 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_TIGON3 is not set
+# CONFIG_BNX2 is not set
+CONFIG_SPIDER_NET=y
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# 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_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_COMPUTONE is not set
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_MOXA_SMARTIO_NEW is not set
+# CONFIG_ISI is not set
+# CONFIG_SYNCLINK is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_SYNCLINK_GT is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_TXX9=y
+CONFIG_HAS_TXX9_SERIAL=y
+CONFIG_SERIAL_TXX9_CONSOLE=y
+# CONFIG_SERIAL_TXX9_STDSERIAL is not set
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_HVC_DRIVER=y
+CONFIG_HVC_BEAT=y
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG 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
+# CONFIG_HW_RANDOM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# 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_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_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 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_MAX6875 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
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+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_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_MULTITHREAD_PROBE is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+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=m
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+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
+
+#
+# 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=m
+# 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 Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK 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_MII is not set
+# CONFIG_USB_USBNET 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_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_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Virtualization
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT2_FS_XIP=y
+CONFIG_FS_XIP=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+# 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=y
+# 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=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+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=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_NFS_ACL_SUPPORT=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# 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
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+CONFIG_EFI_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=m
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=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=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS 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=y
+# CONFIG_DEBUG_RWSEMS is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# 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_FORCED_INLINING is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+CONFIG_DEBUGGER=y
+CONFIG_XMON=y
+CONFIG_XMON_DEFAULT=y
+CONFIG_XMON_DISASSEMBLY=y
+CONFIG_IRQSTACKS=y
+# 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_BEAT=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_TGR192=m
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Hardware crypto devices
+#
diff --git a/arch/powerpc/configs/mpc8272_ads_defconfig b/arch/powerpc/configs/mpc8272_ads_defconfig
new file mode 100644 (file)
index 0000000..2af4502
--- /dev/null
@@ -0,0 +1,848 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.17-rc5
+# Fri Jul 14 20:36:35 2006
+#
+# CONFIG_PPC64 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_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+# CONFIG_DEFAULT_UIMAGE is not set
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_52xx is not set
+CONFIG_PPC_82xx=y
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_8xx is not set
+# CONFIG_E200 is not set
+CONFIG_6xx=y
+CONFIG_PPC_FPU=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_SMP is not set
+
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION="powerpc8272"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=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_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+# 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=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_PQ2ADS=y
+CONFIG_8260=y
+CONFIG_8272=y
+CONFIG_CPM2=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+CONFIG_EMBEDDEDBOOT=y
+
+#
+# Platform support
+#
+CONFIG_ADS8272=y
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# 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_PC_KEYBOARD is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+# CONFIG_SOFTWARE_SUSPEND is not set
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_PPC_I8259 is not set
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+
+#
+# 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=0x00400000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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=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 is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+
+#
+# IP: Virtual Server Configuration
+#
+# 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_IPV6_TUNNEL is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_QUEUE 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
+
+#
+# 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_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+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 is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_IDE_GENERIC is not set
+# CONFIG_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=y
+
+#
+# PHY device support
+#
+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_FIXED_PHY is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_FS_ENET=y
+# CONFIG_FS_ENET_HAS_SCC is not set
+CONFIG_FS_ENET_HAS_FCC=y
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=y
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# 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_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# 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_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK 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 is not set
+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_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
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_V4L2=y
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+
+#
+# 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_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=y
+CONFIG_XFS_FS=y
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=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_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_HFSPLUS_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
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SMB_FS=y
+# CONFIG_SMB_NLS_DEFAULT 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
+
+#
+# Native Language Support
+#
+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
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_UNWIND_INFO is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_KGDB_CONSOLE is not set
+CONFIG_BDI_SWITCH=y
+# 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
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=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_DES=y
+# 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_TEST is not set
+
+#
+# Hardware crypto devices
+#
diff --git a/arch/powerpc/configs/mpc832xemds_defconfig b/arch/powerpc/configs/mpc832xemds_defconfig
new file mode 100644 (file)
index 0000000..e1b36de
--- /dev/null
@@ -0,0 +1,1083 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-rc5
+# Tue Jan 30 14:27:25 2007
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_82xx is not set
+CONFIG_PPC_83xx=y
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_8xx is not set
+# CONFIG_E200 is not set
+CONFIG_6xx=y
+CONFIG_83xx=y
+CONFIG_PPC_FPU=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_SMP is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+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_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+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
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=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_QUICC_ENGINE=y
+CONFIG_PPC_GEN550=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Platform support
+#
+CONFIG_MPC832x_MDS=y
+# CONFIG_MPC834x_SYS is not set
+# CONFIG_MPC834x_ITX is not set
+# CONFIG_MPC8360E_PB is not set
+CONFIG_PPC_MPC832x=y
+# CONFIG_MPIC is not set
+
+#
+# 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_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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_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
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# 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_IEEE80211 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
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+# CONFIG_BLK_DEV_SD 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
+
+#
+# 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_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 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
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 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_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_GIANFAR is not set
+CONFIG_UCC_GETH=y
+# CONFIG_UGETH_NAPI is not set
+# CONFIG_UGETH_MAGIC_PACKET is not set
+# CONFIG_UGETH_FILTERING is not set
+# CONFIG_UGETH_TX_ON_DEMOND is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# 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_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_PCI=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_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_83xx_WDT=y
+
+#
+# PCI-based Watchdog Cards
+#
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_WDTPCI is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=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_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 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_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
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 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_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 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
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Virtualization
+#
+
+#
+# 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_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
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+# CONFIG_MSDOS_PARTITION 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
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# QE Options
+#
+CONFIG_UCC_SLOW=y
+CONFIG_UCC_FAST=y
+CONFIG_UCC=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING 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_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_BOOTX_TEXT is not set
+# CONFIG_SERIAL_TEXT_DEBUG is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+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_LRW is not set
+CONFIG_CRYPTO_DES=y
+# 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_TEST is not set
+
+#
+# Hardware crypto devices
+#
index 45757b61370216898fdc43f3da58d58d05e82eb8..7902806429f8a7979206049c7c71e7345c0a7ce6 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.20-rc5
-# Mon Jan 22 22:23:43 2007
+# Fri Jan 26 00:19:02 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -149,7 +149,6 @@ CONFIG_PREEMPT_NONE=y
 # 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
@@ -324,6 +323,7 @@ CONFIG_MTD=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
@@ -366,6 +366,7 @@ 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_PLATRAM is not set
 
 #
@@ -390,6 +391,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 # NAND Flash Device Drivers
 #
 # CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
 
 #
 # OneNAND Flash Device Drivers
@@ -1011,7 +1013,6 @@ CONFIG_USB=y
 CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_MULTITHREAD_PROBE is not set
 # CONFIG_USB_OTG is not set
 
 #
index c24db58be45773fb93aa2cc8ac60e5141a656cdd..9eaed3a369832cadfb7ba6a56e76eaf83063a798 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.20-rc5
-# Mon Jan 22 22:24:10 2007
+# Fri Jan 26 00:19:27 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -149,7 +149,6 @@ CONFIG_PREEMPT_NONE=y
 # 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
index 58e6795dbfe5bd0babf2e0f5e9301248c805181a..bbe38ccc3d86c90de70366846eaef08b7dda478b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.20-rc5
-# Mon Jan 22 22:24:40 2007
+# Fri Jan 26 00:19:45 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -150,7 +150,6 @@ CONFIG_PREEMPT_NONE=y
 # 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
diff --git a/arch/powerpc/configs/mpc866_ads_defconfig b/arch/powerpc/configs/mpc866_ads_defconfig
new file mode 100644 (file)
index 0000000..539d9e3
--- /dev/null
@@ -0,0 +1,829 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-rc6
+# Fri Nov 24 21:13:55 2006
+#
+# CONFIG_PPC64 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_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+# CONFIG_DEFAULT_UIMAGE is not set
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_52xx is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+CONFIG_PPC_8xx=y
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_8xx=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+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=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+# CONFIG_BUG is not set
+CONFIG_ELF_CORE=y
+# CONFIG_BASE_FULL is not set
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=1
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=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_WANT_EARLY_SERIAL is not set
+CONFIG_EMBEDDEDBOOT=y
+# CONFIG_MPIC is not set
+
+#
+# Platform support
+#
+CONFIG_CPM1=y
+# CONFIG_MPC8XXFADS is not set
+CONFIG_MPC86XADS=y
+# CONFIG_MPC885ADS is not set
+
+#
+# MPC8xx CPM Options
+#
+
+#
+# Generic MPC8xx Options
+#
+CONFIG_8xx_COPYBACK=y
+CONFIG_8xx_CPU6=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
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_250 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=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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+# CONFIG_PROC_DEVICETREE is not set
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+# CONFIG_SECCOMP is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_QSPAN is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+
+#
+# PCI Hotplug Support
+#
+
+#
+# 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=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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_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=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_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
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# 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_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# PHY device support
+#
+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_FIXED_PHY=y
+CONFIG_FIXED_MII_10_FDX=y
+CONFIG_FIXED_MII_100_FDX=y
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_FEC_8XX is not set
+CONFIG_FS_ENET=y
+CONFIG_FS_ENET_HAS_SCC=y
+CONFIG_FS_ENET_HAS_FEC=y
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# 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
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# 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_TSDEV 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_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK 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_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
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY 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 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_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=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
+
+#
+# Network File Systems
+#
+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_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
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING 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_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_FS is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK 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
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
diff --git a/arch/powerpc/configs/mpc885_ads_defconfig b/arch/powerpc/configs/mpc885_ads_defconfig
new file mode 100644 (file)
index 0000000..e2c17d8
--- /dev/null
@@ -0,0 +1,827 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-rc4
+# Fri Nov 10 21:30:40 2006
+#
+# CONFIG_PPC64 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_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+# CONFIG_DEFAULT_UIMAGE is not set
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_52xx is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+CONFIG_PPC_8xx=y
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_8xx=y
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+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=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+# CONFIG_BUG is not set
+CONFIG_ELF_CORE=y
+# CONFIG_BASE_FULL is not set
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=1
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=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_WANT_EARLY_SERIAL is not set
+CONFIG_EMBEDDEDBOOT=y
+# CONFIG_MPIC is not set
+
+#
+# Platform support
+#
+CONFIG_CPM1=y
+# CONFIG_MPC8XXFADS is not set
+# CONFIG_MPC86XADS is not set
+CONFIG_MPC885ADS=y
+
+#
+# MPC8xx CPM Options
+#
+
+#
+# Generic MPC8xx Options
+#
+CONFIG_8xx_COPYBACK=y
+# CONFIG_8xx_CPU6 is not set
+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
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_250 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=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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+# CONFIG_PROC_DEVICETREE is not set
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+# CONFIG_SECCOMP is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_QSPAN is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+
+#
+# PCI Hotplug Support
+#
+
+#
+# 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=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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_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=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_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
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# 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_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# PHY device support
+#
+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_FIXED_PHY=y
+CONFIG_FIXED_MII_10_FDX=y
+# CONFIG_FIXED_MII_100_FDX is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_FEC_8XX is not set
+CONFIG_FS_ENET=y
+CONFIG_FS_ENET_HAS_SCC=y
+CONFIG_FS_ENET_HAS_FEC=y
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# 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
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# 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_TSDEV 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_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK 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_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
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY 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 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_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=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
+
+#
+# Network File Systems
+#
+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_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
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING 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_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_FS is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK 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
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig
new file mode 100644 (file)
index 0000000..97a57e9
--- /dev/null
@@ -0,0 +1,1722 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-rc6
+# Thu Feb  1 22:54:15 2007
+#
+CONFIG_PPC64=y
+CONFIG_64BIT=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_ARCH_HAS_ILOG2_U64=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+CONFIG_GENERIC_TBSYNC=y
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+
+#
+# Processor support
+#
+CONFIG_POWER4_ONLY=y
+CONFIG_POWER4=y
+CONFIG_PPC_FPU=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+# CONFIG_PPC_OF_PLATFORM_PCI is not set
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+# CONFIG_VIRT_CPU_ACCOUNTING is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=2
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_CPUSETS is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+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_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+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_STOP_MACHINE=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+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_EMBEDDED6xx is not set
+# CONFIG_APUS is not set
+CONFIG_PPC_PSERIES=y
+# CONFIG_PPC_ISERIES is not set
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_PMAC is not set
+# CONFIG_PPC_MAPLE is not set
+CONFIG_PPC_PASEMI=y
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PPC_IBM_CELL_BLADE is not set
+# CONFIG_PPC_PS3 is not set
+CONFIG_PPC_NATIVE=y
+# CONFIG_UDBG_RTAS_CONSOLE is not set
+CONFIG_XICS=y
+# CONFIG_U3_DART is not set
+CONFIG_PPC_RTAS=y
+CONFIG_RTAS_ERROR_LOGGING=y
+CONFIG_RTAS_PROC=y
+# CONFIG_RTAS_FLASH is not set
+# CONFIG_MMIO_NVRAM is not set
+CONFIG_IBMVIO=y
+# CONFIG_IBMEBUS 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_WANT_EARLY_SERIAL is not set
+CONFIG_MPIC=y
+
+#
+# PA Semi PWRficient options
+#
+CONFIG_PPC_PASEMI_IOMMU=y
+
+#
+# Kernel options
+#
+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_PREEMPT_BKL=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_FORCE_MAX_ZONEORDER=13
+CONFIG_IOMMU_VMERGE=y
+# CONFIG_HOTPLUG_CPU is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_IRQ_ALL_CPUS is not set
+# CONFIG_PPC_SPLPAR is not set
+CONFIG_EEH=y
+# CONFIG_SCANLOG is not set
+# CONFIG_LPARCFG is not set
+# CONFIG_NUMA is not set
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=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=y
+# CONFIG_PPC_64K_PAGES is not set
+# CONFIG_SCHED_SMT is not set
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+# CONFIG_SECCOMP is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+CONFIG_PPC_I8259=y
+# CONFIG_PPC_INDIRECT_PCI is not set
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+# CONFIG_YENTA is not set
+# CONFIG_PD6729 is not set
+# CONFIG_I82092 is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+CONFIG_KERNEL_START=0xc000000000000000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+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_NET_KEY=y
+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=y
+CONFIG_NET_IPIP=y
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=y
+CONFIG_INET_ESP=y
+# 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_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
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# 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_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+# 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
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+CONFIG_MTD_SLRAM=y
+CONFIG_MTD_PHRAM=y
+# 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
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# 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=16384
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+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_IDECS is not set
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=y
+CONFIG_IDE_TASK_IOCTL=y
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_IDE_GENERIC is not set
+# CONFIG_BLK_DEV_IDEPCI is not set
+# CONFIG_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+CONFIG_CHR_DEV_OSST=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_CHR_DEV_SCH=y
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# 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_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+CONFIG_BLK_DEV_3W_XXXX_RAID=y
+CONFIG_SCSI_3W_9XXX=y
+# 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_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_IBMVSCSI 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_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_SATA_AHCI is not set
+CONFIG_SATA_SVW=y
+# CONFIG_ATA_PIIX is not set
+CONFIG_SATA_MV=y
+# 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=y
+CONFIG_SATA_SIL24=y
+# 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_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_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=y
+# 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_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# 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_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PCMCIA 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
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+CONFIG_IEEE1394=y
+
+#
+# Subsystem Options
+#
+# CONFIG_IEEE1394_VERBOSEDEBUG is not set
+# CONFIG_IEEE1394_OUI_DB is not set
+# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
+# CONFIG_IEEE1394_EXPORT_FULL_API is not set
+
+#
+# Device Drivers
+#
+CONFIG_IEEE1394_PCILYNX=y
+CONFIG_IEEE1394_OHCI1394=y
+
+#
+# Protocol Drivers
+#
+# CONFIG_IEEE1394_VIDEO1394 is not set
+CONFIG_IEEE1394_SBP2=y
+# CONFIG_IEEE1394_ETH1394 is not set
+# CONFIG_IEEE1394_DV1394 is not set
+CONFIG_IEEE1394_RAWIO=y
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+CONFIG_IBMVETH=y
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_DGRS is not set
+CONFIG_EEPRO100=y
+# CONFIG_E100 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_VIA_RHINE is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=y
+CONFIG_E1000_NAPI=y
+# CONFIG_E1000_DISABLE_PACKET_SPLIT 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=y
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# 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=y
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_ICOM is not set
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=4
+CONFIG_HVC_DRIVER=y
+CONFIG_HVC_CONSOLE=y
+CONFIG_HVC_RTAS=y
+# CONFIG_HVCS is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+CONFIG_GEN_RTC=y
+CONFIG_GEN_RTC_X=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=256
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_ALGOPCF=y
+CONFIG_I2C_ALGOPCA=y
+
+#
+# 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_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_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 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_MAX6875 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+CONFIG_I2C_DEBUG_BUS=y
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=y
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 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=y
+# CONFIG_SENSORS_LM87 is not set
+CONFIG_SENSORS_LM90=y
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 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
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+CONFIG_FB_DDC=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_MACMODES=y
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_TILEBLITTING=y
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_OF is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_VGA16=y
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_NVIDIA=y
+CONFIG_FB_NVIDIA_I2C=y
+CONFIG_FB_RIVA=y
+CONFIG_FB_RIVA_I2C=y
+# CONFIG_FB_RIVA_DEBUG is not set
+CONFIG_FB_MATROX=y
+CONFIG_FB_MATROX_MILLENIUM=y
+CONFIG_FB_MATROX_MYSTIQUE=y
+CONFIG_FB_MATROX_G=y
+CONFIG_FB_MATROX_I2C=y
+CONFIG_FB_MATROX_MAVEN=y
+CONFIG_FB_MATROX_MULTIHEAD=y
+CONFIG_FB_RADEON=y
+CONFIG_FB_RADEON_I2C=y
+# CONFIG_FB_RADEON_DEBUG is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_HWDEP=y
+CONFIG_SND_RAWMIDI=y
+CONFIG_SND_SEQUENCER=y
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+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_VIRMIDI 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_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
+#
+
+#
+# USB devices
+#
+CONFIG_SND_USB_AUDIO=y
+CONFIG_SND_USB_USX2Y=y
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+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_BANDWIDTH is not set
+# 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_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_SL811_HCD=y
+# CONFIG_USB_SL811_CS 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_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+CONFIG_USB_LIBUSUAL=y
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK 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_MII is not set
+# CONFIG_USB_USBNET 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_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_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_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
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_X1205 is not set
+CONFIG_RTC_DRV_DS1307=y
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Virtualization
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+# CONFIG_EXT2_FS_SECURITY 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=y
+# 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=y
+CONFIG_AUTOFS_FS=y
+CONFIG_AUTOFS4_FS=y
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+CONFIG_UDF_FS=y
+CONFIG_UDF_NLS=y
+
+#
+# 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_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=y
+
+#
+# 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 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 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_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
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+CONFIG_MAC_PARTITION=y
+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
+
+#
+# Native Language Support
+#
+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
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+
+#
+# Instrumentation Support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+# CONFIG_KPROBES is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+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_LOG_BUF_SHIFT=17
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS 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_RWSEMS 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_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+CONFIG_DEBUGGER=y
+CONFIG_XMON=y
+CONFIG_XMON_DEFAULT=y
+CONFIG_XMON_DISASSEMBLY=y
+# CONFIG_IRQSTACKS is not set
+CONFIG_BOOTX_TEXT=y
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# 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=y
+# 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_LRW is not set
+CONFIG_CRYPTO_DES=y
+# 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_TEST is not set
+
+#
+# Hardware crypto devices
+#
index 32560876c3dc0518d818696e5bc05edf9ddeda52..ec644b34a08245eac1cb5f8e4ef9397d5e2cbc0b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc5
-# Mon Jan 22 22:29:11 2007
+# Linux kernel version: 2.6.20-rc6
+# Thu Jan 25 13:35:34 2007
 #
 CONFIG_PPC64=y
 CONFIG_64BIT=y
@@ -70,10 +70,10 @@ CONFIG_SYSVIPC=y
 CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
-# CONFIG_SYSCTL_SYSCALL is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_SYSCTL_SYSCALL=y
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
 CONFIG_KALLSYMS_EXTRA_PASS=y
@@ -160,7 +160,7 @@ CONFIG_SPU_BASE=y
 # PS3 Platform Options
 #
 CONFIG_PS3_HTAB_SIZE=20
-CONFIG_PS3_DYNAMIC_DMA=y
+# CONFIG_PS3_DYNAMIC_DMA is not set
 CONFIG_PS3_USE_LPAR_ADDR=y
 CONFIG_PS3_VUART=y
 
@@ -207,7 +207,7 @@ CONFIG_PPC_64K_PAGES=y
 # CONFIG_SCHED_SMT is not set
 CONFIG_PROC_DEVICETREE=y
 CONFIG_CMDLINE_BOOL=y
-CONFIG_CMDLINE="root=/dev/nfs rw ip=dhcp"
+CONFIG_CMDLINE="root=/dev/sda1 ip=dhcp"
 # CONFIG_PM is not set
 # CONFIG_SECCOMP is not set
 CONFIG_ISA_DMA_API=y
@@ -240,7 +240,8 @@ CONFIG_NET=y
 # Networking options
 #
 # CONFIG_NETDEBUG is not set
-# CONFIG_PACKET is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -353,6 +354,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # 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 is not set
 # CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_CDROM_PKTCDVD is not set
@@ -380,10 +382,11 @@ CONFIG_SCSI_PROC_FS=y
 #
 # SCSI support type (disk, tape, CD-ROM)
 #
-# CONFIG_BLK_DEV_SD is not set
+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_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
 
@@ -456,6 +459,7 @@ CONFIG_NETDEVICES=y
 # Ethernet (10 or 100Mbit)
 #
 # CONFIG_NET_ETHERNET is not set
+CONFIG_MII=y
 
 #
 # Ethernet (1000 Mbit)
@@ -504,10 +508,13 @@ CONFIG_INPUT=y
 #
 # Userland interfaces
 #
-# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_JOYDEV is not set
 # CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVDEV is not set
 # CONFIG_INPUT_EVBUG is not set
 
 #
@@ -598,6 +605,7 @@ CONFIG_GEN_RTC=y
 # Digital Video Broadcasting Devices
 #
 # CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
 
 #
 # Graphics support
@@ -626,14 +634,141 @@ CONFIG_HID=y
 #
 # USB support
 #
-# 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=y
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# 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_EHCI_BIG_ENDIAN_MMIO=y
+# 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=y
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SL811_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_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 Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK 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_MII=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_CDCETHER=y
+# CONFIG_USB_NET_GL620A is not set
+# CONFIG_USB_NET_NET1080 is not set
+# CONFIG_USB_NET_PLUSB is not set
+CONFIG_USB_NET_MCS7830=y
+# CONFIG_USB_NET_RNDIS_HOST is not set
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_ZAURUS 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_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
+
+#
+# USB DSL modem support
+#
+
 #
 # USB Gadget Support
 #
@@ -691,8 +826,14 @@ CONFIG_HID=y
 # File systems
 #
 # CONFIG_EXT2_FS is not set
-# CONFIG_EXT3_FS 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
@@ -712,14 +853,20 @@ CONFIG_DNOTIFY=y
 #
 # CD-ROM/DVD Filesystems
 #
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+CONFIG_UDF_FS=y
+CONFIG_UDF_NLS=y
 
 #
 # DOS/FAT/NT Filesystems
 #
+CONFIG_FAT_FS=y
 # CONFIG_MSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 # CONFIG_NTFS_FS is not set
 
 #
@@ -785,7 +932,46 @@ CONFIG_MSDOS_PARTITION=y
 #
 # Native Language Support
 #
-# CONFIG_NLS 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 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
 
 #
 # Distributed Lock Manager
@@ -795,9 +981,10 @@ CONFIG_MSDOS_PARTITION=y
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
-# CONFIG_CRC32 is not set
+CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_PLIST=y
 CONFIG_IOMAP_COPY=y
@@ -821,22 +1008,23 @@ CONFIG_DEBUG_KERNEL=y
 CONFIG_LOG_BUF_SHIFT=17
 CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_SLAB=y
+# CONFIG_DEBUG_SLAB_LEAK is not set
 # CONFIG_DEBUG_RT_MUTEXES is not set
 # CONFIG_RT_MUTEX_TESTER is not set
 CONFIG_DEBUG_SPINLOCK=y
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
+CONFIG_DEBUG_MUTEXES=y
+CONFIG_DEBUG_RWSEMS=y
 CONFIG_DEBUG_SPINLOCK_SLEEP=y
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_INFO=y
 # CONFIG_DEBUG_VM is not set
 CONFIG_DEBUG_LIST=y
 CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
+CONFIG_DEBUG_STACKOVERFLOW=y
 # CONFIG_DEBUG_STACK_USAGE is not set
 # CONFIG_DEBUGGER is not set
 CONFIG_IRQSTACKS=y
index d2ded19e40643f4b7bafdaa28ba89ad0b443462d..8120d428ebfdf0e2cf51beb8d2106a6bd1ddaa0a 100644 (file)
@@ -17,6 +17,7 @@ obj-y                         += vdso32/
 obj-$(CONFIG_PPC64)            += setup_64.o binfmt_elf32.o sys_ppc32.o \
                                   signal_64.o ptrace32.o \
                                   paca.o cpu_setup_ppc970.o \
+                                  cpu_setup_pa6t.o \
                                   firmware.o sysfs.o nvram_64.o
 obj-$(CONFIG_PPC64)            += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o vector.o
diff --git a/arch/powerpc/kernel/cpu_setup_pa6t.S b/arch/powerpc/kernel/cpu_setup_pa6t.S
new file mode 100644 (file)
index 0000000..4047be2
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2006-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 <asm/processor.h>
+#include <asm/page.h>
+#include <asm/cputable.h>
+#include <asm/ppc_asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/cache.h>
+
+/* Right now, restore and setup are the same thing */
+_GLOBAL(__restore_cpu_pa6t)
+_GLOBAL(__setup_cpu_pa6t)
+       /* Do nothing if not running in HV mode */
+       mfmsr   r0
+       rldicl. r0,r0,4,63
+       beqlr
+
+       mfspr   r0,SPRN_HID5
+       ori     r0,r0,0x30
+       mtspr   SPRN_HID5,r0
+
+       mfspr   r0,SPRN_LPCR
+       ori     r0,r0,0x7000
+       mtspr   SPRN_LPCR,r0
+
+       blr
index b742013bb9da2f6fbc70b86d2fea909e707e6881..dd17dffbf05863fea22ab3c65133a0d1dd0a17ef 100644 (file)
@@ -43,6 +43,8 @@ extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
 #ifdef CONFIG_PPC64
 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
+extern void __restore_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
 extern void __restore_cpu_ppc970(void);
 #endif /* CONFIG_PPC64 */
 
@@ -86,6 +88,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power3",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "power3",
@@ -99,6 +102,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power3",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "power3",
@@ -112,6 +116,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/rs64",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "rs64",
@@ -125,6 +130,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/rs64",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "rs64",
@@ -138,6 +144,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/rs64",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "rs64",
@@ -151,6 +158,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/rs64",
                .oprofile_type          = PPC_OPROFILE_RS64,
                .platform               = "rs64",
@@ -164,6 +172,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power4",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .platform               = "power4",
@@ -177,6 +186,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power4",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .platform               = "power4",
@@ -191,6 +201,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .cpu_setup              = __setup_cpu_ppc970,
                .cpu_restore            = __restore_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
@@ -207,6 +218,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .cpu_setup              = __setup_cpu_ppc970,
                .cpu_restore            = __restore_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
@@ -239,6 +251,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
+               .pmc_type               = PPC_PMC_IBM,
                .cpu_setup              = __setup_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
                .oprofile_type          = PPC_OPROFILE_POWER4,
@@ -253,6 +266,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 6,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power5",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                /* SIHV / SIPR bits are implemented on POWER4+ (GQ)
@@ -271,6 +285,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 6,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power5+",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .oprofile_mmcra_sihv    = MMCRA_SIHV,
@@ -321,6 +336,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 6,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/power6",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .oprofile_mmcra_sihv    = POWER6_MMCRA_SIHV,
@@ -340,6 +356,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 4,
+               .pmc_type               = PPC_PMC_IBM,
                .oprofile_cpu_type      = "ppc64/cell-be",
                .oprofile_type          = PPC_OPROFILE_CELL,
                .platform               = "ppc-cell-be",
@@ -353,6 +370,9 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 64,
                .dcache_bsize           = 64,
                .num_pmcs               = 6,
+               .pmc_type               = PPC_PMC_PA6T,
+               .cpu_setup              = __setup_cpu_pa6t,
+               .cpu_restore            = __restore_cpu_pa6t,
                .platform               = "pa6t",
        },
        {       /* default match */
@@ -364,6 +384,7 @@ static struct cpu_spec cpu_specs[] = {
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
                .num_pmcs               = 6,
+               .pmc_type               = PPC_PMC_IBM,
                .platform               = "power4",
        }
 #endif /* CONFIG_PPC64 */
index 2551c0884afcd178d957ce02304ccef119e5870d..2b66d53dcc55fbf5f7d4d52d7ba0d3c1bbc8bc8d 100644 (file)
@@ -172,13 +172,18 @@ syscall_error_cont:
        stdcx.  r0,0,r1                 /* to clear the reservation */
        andi.   r6,r8,MSR_PR
        ld      r4,_LINK(r1)
+       /*
+        * Clear RI before restoring r13.  If we are returning to
+        * userspace and we take an exception after restoring r13,
+        * we end up corrupting the userspace r13 value.
+        */
+       li      r12,MSR_RI
+       andc    r11,r10,r12
+       mtmsrd  r11,1                   /* clear MSR.RI */
        beq-    1f
        ACCOUNT_CPU_USER_EXIT(r11, r12)
        ld      r13,GPR13(r1)   /* only restore r13 if returning to usermode */
 1:     ld      r2,GPR2(r1)
-       li      r12,MSR_RI
-       andc    r11,r10,r12
-       mtmsrd  r11,1                   /* clear MSR.RI */
        ld      r1,GPR1(r1)
        mtlr    r4
        mtcr    r5
@@ -488,42 +493,44 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
 #endif
        stb     r5,PACASOFTIRQEN(r13)
 
+       /* extract EE bit and use it to restore paca->hard_enabled */
        ld      r3,_MSR(r1)
+       rldicl  r4,r3,49,63             /* r0 = (r3 >> 15) & 1 */
+       stb     r4,PACAHARDIRQEN(r13)
+
+       ld      r4,_CTR(r1)
+       ld      r0,_LINK(r1)
+       mtctr   r4
+       mtlr    r0
+       ld      r4,_XER(r1)
+       mtspr   SPRN_XER,r4
+
+       REST_8GPRS(5, r1)
+
        andi.   r0,r3,MSR_RI
        beq-    unrecov_restore
 
-       /* extract EE bit and use it to restore paca->hard_enabled */
-       rldicl  r4,r3,49,63             /* r0 = (r3 >> 15) & 1 */
-       stb     r4,PACAHARDIRQEN(r13)
+       stdcx.  r0,0,r1         /* to clear the reservation */
 
-       andi.   r0,r3,MSR_PR
+       /*
+        * Clear RI before restoring r13.  If we are returning to
+        * userspace and we take an exception after restoring r13,
+        * we end up corrupting the userspace r13 value.
+        */
+       mfmsr   r4
+       andc    r4,r4,r0        /* r0 contains MSR_RI here */
+       mtmsrd  r4,1
 
        /*
         * r13 is our per cpu area, only restore it if we are returning to
         * userspace
         */
+       andi.   r0,r3,MSR_PR
        beq     1f
-       ACCOUNT_CPU_USER_EXIT(r3, r4)
+       ACCOUNT_CPU_USER_EXIT(r2, r4)
        REST_GPR(13, r1)
 1:
-       ld      r3,_CTR(r1)
-       ld      r0,_LINK(r1)
-       mtctr   r3
-       mtlr    r0
-       ld      r3,_XER(r1)
-       mtspr   SPRN_XER,r3
-
-       REST_8GPRS(5, r1)
-
-       stdcx.  r0,0,r1         /* to clear the reservation */
-
-       mfmsr   r0
-       li      r2, MSR_RI
-       andc    r0,r0,r2
-       mtmsrd  r0,1
-
-       ld      r0,_MSR(r1)
-       mtspr   SPRN_SRR1,r0
+       mtspr   SPRN_SRR1,r3
 
        ld      r2,_CCR(r1)
        mtcrf   0xFF,r2
index 9417cf5b4b7e7af4b361b0075a3b3c4d96dd2416..c897203198b1a1bd6a4cfc8f663f8267061eed34 100644 (file)
@@ -344,12 +344,7 @@ i##n:                                                              \
 /* System reset */
 /* core99 pmac starts the seconary here by changing the vector, and
    putting it back to what it was (unknown_exception) when done.  */
-#if defined(CONFIG_GEMINI) && defined(CONFIG_SMP)
-       . = 0x100
-       b       __secondary_start_gemini
-#else
        EXCEPTION(0x100, Reset, unknown_exception, EXC_XFER_STD)
-#endif
 
 /* Machine check */
 /*
index 71b1fe58e9e4d8a0a06fd9d3f6b3059f5e51c43f..97cedcd6c9b46e338bb28849b54fe72d03ff166f 100644 (file)
@@ -613,7 +613,7 @@ system_call_pSeries:
 /*** pSeries interrupt support ***/
 
        /* moved from 0xf00 */
-       MASKABLE_EXCEPTION_PSERIES(., performance_monitor)
+       STD_EXCEPTION_PSERIES(., performance_monitor)
 
 /*
  * An interrupt came in while soft-disabled; clear EE in SRR1,
index c68113371050780a2910d067109cabe6b0c30b25..601ef79a591618d75d1e0d2c919c993e6b4dc2fc 100644 (file)
  * Here comes the ppc64 implementation of the IOMAP 
  * interfaces.
  */
-unsigned int fastcall ioread8(void __iomem *addr)
+unsigned int ioread8(void __iomem *addr)
 {
        return readb(addr);
 }
-unsigned int fastcall ioread16(void __iomem *addr)
+unsigned int ioread16(void __iomem *addr)
 {
        return readw(addr);
 }
-unsigned int fastcall ioread16be(void __iomem *addr)
+unsigned int ioread16be(void __iomem *addr)
 {
        return in_be16(addr);
 }
-unsigned int fastcall ioread32(void __iomem *addr)
+unsigned int ioread32(void __iomem *addr)
 {
        return readl(addr);
 }
-unsigned int fastcall ioread32be(void __iomem *addr)
+unsigned int ioread32be(void __iomem *addr)
 {
        return in_be32(addr);
 }
@@ -38,23 +38,23 @@ EXPORT_SYMBOL(ioread16be);
 EXPORT_SYMBOL(ioread32);
 EXPORT_SYMBOL(ioread32be);
 
-void fastcall iowrite8(u8 val, void __iomem *addr)
+void iowrite8(u8 val, void __iomem *addr)
 {
        writeb(val, addr);
 }
-void fastcall iowrite16(u16 val, void __iomem *addr)
+void iowrite16(u16 val, void __iomem *addr)
 {
        writew(val, addr);
 }
-void fastcall iowrite16be(u16 val, void __iomem *addr)
+void iowrite16be(u16 val, void __iomem *addr)
 {
        out_be16(addr, val);
 }
-void fastcall iowrite32(u32 val, void __iomem *addr)
+void iowrite32(u32 val, void __iomem *addr)
 {
        writel(val, addr);
 }
-void fastcall iowrite32be(u32 val, void __iomem *addr)
+void iowrite32be(u32 val, void __iomem *addr)
 {
        out_be32(addr, val);
 }
index 0bd8c7665834bf39b5a5b32485e6cc279856f9f5..919fbf5684950f3b46073b301e8ec5b47814076c 100644 (file)
@@ -281,10 +281,10 @@ void do_IRQ(struct pt_regs *regs)
 
        /*
         * Every platform is required to implement ppc_md.get_irq.
-        * This function will either return an irq number or -1 to
+        * This function will either return an irq number or NO_IRQ to
         * indicate there are no more pending.
-        * The value -2 is for buggy hardware and means that this IRQ
-        * has already been handled. -- Tom
+        * The value NO_IRQ_IGNORE is for buggy hardware and means that this
+        * IRQ has already been handled. -- Tom
         */
        irq = ppc_md.get_irq();
 
@@ -604,6 +604,8 @@ unsigned int irq_create_mapping(struct irq_host *host,
         */
        virq = irq_find_mapping(host, hwirq);
        if (virq != IRQ_NONE) {
+               if (host->ops->remap)
+                       host->ops->remap(host, virq, hwirq);
                pr_debug("irq: -> existing mapping on virq %d\n", virq);
                return virq;
        }
index 4657563f88139ea60d4f4e4775c0cd8a33b15d42..dd2886f97e983848ad8dfc1403e5740b87a1961d 100644 (file)
@@ -46,8 +46,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
        if ((unsigned long)p->addr & 0x03) {
                printk("Attempt to register kprobe at an unaligned address\n");
                ret = -EINVAL;
-       } else if (IS_MTMSRD(insn) || IS_RFID(insn)) {
-               printk("Cannot register a kprobe on rfid or mtmsrd\n");
+       } else if (IS_MTMSRD(insn) || IS_RFID(insn) || IS_RFI(insn)) {
+               printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
                ret = -EINVAL;
        }
 
@@ -483,8 +483,12 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
        memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
 
        /* setup return addr to the jprobe handler routine */
+#ifdef CONFIG_PPC64
        regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
        regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
+#else
+       regs->nip = (unsigned long)jp->entry;
+#endif
 
        return 1;
 }
index 41c05dcd68f40974c53d695dbadced320b0fefe6..0de5a08cf9b007b78426d323a6cff245593a5c96 100644 (file)
@@ -439,6 +439,10 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
 
        ssize_t retval = -ENOMEM;
 
+       if (!firmware_has_feature(FW_FEATURE_SPLPAR) ||
+                       firmware_has_feature(FW_FEATURE_ISERIES))
+               return -EINVAL;
+
        kbuf = kmalloc(count, GFP_KERNEL);
        if (!kbuf)
                goto out;
@@ -517,7 +521,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
 static ssize_t lparcfg_write(struct file *file, const char __user * buf,
                             size_t count, loff_t * off)
 {
-       return count;
+       return -EINVAL;
 }
 
 #endif                         /* CONFIG_PPC_PSERIES */
@@ -570,6 +574,7 @@ static int lparcfg_open(struct inode *inode, struct file *file)
 struct file_operations lparcfg_fops = {
        .owner          = THIS_MODULE,
        .read           = seq_read,
+       .write          = lparcfg_write,
        .open           = lparcfg_open,
        .release        = single_release,
 };
@@ -581,10 +586,8 @@ int __init lparcfg_init(void)
 
        /* Allow writing if we have FW_FEATURE_SPLPAR */
        if (firmware_has_feature(FW_FEATURE_SPLPAR) &&
-                       !firmware_has_feature(FW_FEATURE_ISERIES)) {
-               lparcfg_fops.write = lparcfg_write;
+                       !firmware_has_feature(FW_FEATURE_ISERIES))
                mode |= S_IWUSR;
-       }
 
        ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
        if (ent) {
index 21fd2c662a9913cc9ef8f3d0efe421c4907b8929..519861da04235c2fc3a3ba13c9326f02a5af629f 100644 (file)
@@ -311,6 +311,46 @@ _GLOBAL(real_writeb)
        blr
 #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
 
+#ifdef CONFIG_PPC_PASEMI
+
+/* No support in all binutils for these yet, so use defines */
+#define LBZCIX(RT,RA,RB)  .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11))
+#define STBCIX(RS,RA,RB)  .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11))
+
+
+_GLOBAL(real_205_readb)
+       mfmsr   r7
+       ori     r0,r7,MSR_DR
+       xori    r0,r0,MSR_DR
+       sync
+       mtmsrd  r0
+       sync
+       isync
+       LBZCIX(r3,0,r3)
+       isync
+       mtmsrd  r7
+       sync
+       isync
+       blr
+
+_GLOBAL(real_205_writeb)
+       mfmsr   r7
+       ori     r0,r7,MSR_DR
+       xori    r0,r0,MSR_DR
+       sync
+       mtmsrd  r0
+       sync
+       isync
+       STBCIX(r3,0,r4)
+       isync
+       mtmsrd  r7
+       sync
+       isync
+       blr
+
+#endif /* CONFIG_PPC_PASEMI */
+
+
 #ifdef CONFIG_CPU_FREQ_PMAC64
 /*
  * SCOM access functions for 970 (FX only for now)
index 8339fd609de045c6c92777594009f9492391163d..07a89a3986394ebfd5eafabaaeb468358445beff 100644 (file)
@@ -224,7 +224,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
                        /* Low half of the symbol */
                        *(uint16_t *)location = value;
                        break;
-               
+
+               case R_PPC_ADDR16_HI:
+                       /* Higher half of the symbol */
+                       *(uint16_t *)location = (value >> 16);
+                       break;
+
                case R_PPC_ADDR16_HA:
                        /* Sign-adjusted lower 16 bits: PPC ELF ABI says:
                           (((x >> 16) + ((x & 0x8000) ? 1 : 0))) & 0xFFFF.
index c54f3639c5ade452a20af537b14e840647f24dfe..d8ef2e1005051c3408b5105a80b376c2f43d4d66 100644 (file)
@@ -1450,7 +1450,6 @@ int pci_read_irq_line(struct pci_dev *pci_dev)
                return -1;
        }
        pci_dev->irq = virq;
-       pci_write_config_byte(pci_dev, PCI_INTERRUPT_LINE, virq);
 
        return 0;
 }
index 2b52b087aaa8cd49dccc18146987029739bd24ff..7e97d71a5f8fa17f08d04e01b623bca7534c1044 100644 (file)
@@ -1323,7 +1323,6 @@ int pci_read_irq_line(struct pci_dev *pci_dev)
        DBG(" -> mapped to linux irq %d\n", virq);
 
        pci_dev->irq = virq;
-       pci_write_config_byte(pci_dev, PCI_INTERRUPT_LINE, virq);
 
        return 0;
 }
index 3d8f6f44641eb1e90aeea85a4246ca9c09e62045..24d7b7c99bb9fa8db645e752635027b00f3fb23a 100644 (file)
 #include <linux/module.h>
 
 #include <asm/processor.h>
+#include <asm/cputable.h>
 #include <asm/pmc.h>
 
-#if defined(CONFIG_FSL_BOOKE) && !defined(CONFIG_E200)
-static void dummy_perf(struct pt_regs *regs)
-{
-       unsigned int pmgc0 = mfpmr(PMRN_PMGC0);
-
-       pmgc0 &= ~PMGC0_PMIE;
-       mtpmr(PMRN_PMGC0, pmgc0);
-}
-#elif defined(CONFIG_PPC64) || defined(CONFIG_6xx)
-
-#ifndef MMCR0_PMAO
-#define MMCR0_PMAO     0
+#ifndef MMCR0_PMA0
+#define MMCR0_PMA0     0
 #endif
 
-/* Ensure exceptions are disabled */
 static void dummy_perf(struct pt_regs *regs)
 {
-       unsigned int mmcr0 = mfspr(SPRN_MMCR0);
-
-       mmcr0 &= ~(MMCR0_PMXE|MMCR0_PMAO);
-       mtspr(SPRN_MMCR0, mmcr0);
-}
+#if defined(CONFIG_FSL_BOOKE) && !defined(CONFIG_E200)
+       mtpmr(PMRN_PMGC0, mfpmr(PMRN_PMGC0) & ~PMGC0_PMIE);
+#elif defined(CONFIG_PPC64) || defined(CONFIG_6xx)
+       if (cur_cpu_spec->pmc_type == PPC_PMC_IBM)
+               mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~(MMCR0_PMXE|MMCR0_PMA0));
 #else
-/* Ensure exceptions are disabled */
-static void dummy_perf(struct pt_regs *regs)
-{
-       unsigned int mmcr0 = mfspr(SPRN_MMCR0);
-
-       mmcr0 &= ~(MMCR0_PMXE);
-       mtspr(SPRN_MMCR0, mmcr0);
-}
+       mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_PMXE);
 #endif
+}
+
 
 static DEFINE_SPINLOCK(pmc_owner_lock);
 static void *pmc_owner_caller; /* mostly for debugging */
index 95776b6af4e2892513a70d118a73e70b39d278f9..ecee596d28f6e73d222883564592517b5a94a16c 100644 (file)
@@ -44,6 +44,7 @@
 #include <asm/btext.h>
 #include <asm/div64.h>
 #include <asm/signal.h>
+#include <asm/dcr.h>
 
 #ifdef  CONFIG_8xx
 #include <asm/commproc.h>
index 1fc732a552db87ee7a7d0e9aedc4535fc51a8158..3be52d693eca8c68df1a0da72846f5053be70136 100644 (file)
@@ -1221,8 +1221,7 @@ struct device_node *of_find_node_by_name(struct device_node *from,
                if (np->name != NULL && strcasecmp(np->name, name) == 0
                    && of_node_get(np))
                        break;
-       if (from)
-               of_node_put(from);
+       of_node_put(from);
        read_unlock(&devtree_lock);
        return np;
 }
@@ -1250,8 +1249,7 @@ struct device_node *of_find_node_by_type(struct device_node *from,
                if (np->type != 0 && strcasecmp(np->type, type) == 0
                    && of_node_get(np))
                        break;
-       if (from)
-               of_node_put(from);
+       of_node_put(from);
        read_unlock(&devtree_lock);
        return np;
 }
@@ -1285,8 +1283,7 @@ struct device_node *of_find_compatible_node(struct device_node *from,
                if (device_is_compatible(np, compatible) && of_node_get(np))
                        break;
        }
-       if (from)
-               of_node_put(from);
+       of_node_put(from);
        read_unlock(&devtree_lock);
        return np;
 }
@@ -1329,8 +1326,7 @@ struct device_node *of_find_node_by_phandle(phandle handle)
        for (np = allnodes; np != 0; np = np->allnext)
                if (np->linux_phandle == handle)
                        break;
-       if (np)
-               of_node_get(np);
+       of_node_get(np);
        read_unlock(&devtree_lock);
        return np;
 }
@@ -1353,8 +1349,7 @@ struct device_node *of_find_all_nodes(struct device_node *prev)
        for (; np != 0; np = np->allnext)
                if (of_node_get(np))
                        break;
-       if (prev)
-               of_node_put(prev);
+       of_node_put(prev);
        read_unlock(&devtree_lock);
        return np;
 }
@@ -1399,8 +1394,7 @@ struct device_node *of_get_next_child(const struct device_node *node,
        for (; next != 0; next = next->sibling)
                if (of_node_get(next))
                        break;
-       if (prev)
-               of_node_put(prev);
+       of_node_put(prev);
        read_unlock(&devtree_lock);
        return next;
 }
index 975102a020d96e9d95bc5f747da348fa1fdc5ebd..cc44c7b975aaee2e15a1b33ea7574041e90600b9 100644 (file)
@@ -532,16 +532,22 @@ void do_syscall_trace_enter(struct pt_regs *regs)
            && (current->ptrace & PT_PTRACED))
                do_syscall_trace();
 
-       if (unlikely(current->audit_context))
-               audit_syscall_entry(
-#ifdef CONFIG_PPC32
-                                   AUDIT_ARCH_PPC,
-#else
-                                   test_thread_flag(TIF_32BIT)?AUDIT_ARCH_PPC:AUDIT_ARCH_PPC64,
+       if (unlikely(current->audit_context)) {
+#ifdef CONFIG_PPC64
+               if (!test_thread_flag(TIF_32BIT))
+                       audit_syscall_entry(AUDIT_ARCH_PPC64,
+                                           regs->gpr[0],
+                                           regs->gpr[3], regs->gpr[4],
+                                           regs->gpr[5], regs->gpr[6]);
+               else
 #endif
-                                   regs->gpr[0],
-                                   regs->gpr[3], regs->gpr[4],
-                                   regs->gpr[5], regs->gpr[6]);
+                       audit_syscall_entry(AUDIT_ARCH_PPC,
+                                           regs->gpr[0],
+                                           regs->gpr[3] & 0xffffffff,
+                                           regs->gpr[4] & 0xffffffff,
+                                           regs->gpr[5] & 0xffffffff,
+                                           regs->gpr[6] & 0xffffffff);
+       }
 }
 
 void do_syscall_trace_leave(struct pt_regs *regs)
index 61c65d19ef0618409feeedc778077765acc63b0f..6a19fa40dceea957e41c6558c55880aecb33ea4b 100644 (file)
@@ -65,6 +65,7 @@ int have_of = 1;
 
 #ifdef CONFIG_VGA_CONSOLE
 unsigned long vgacon_remap_base;
+EXPORT_SYMBOL(vgacon_remap_base);
 #endif
 
 /*
index 400ab2b946e760964bd164f282ec1f270579ac6a..d57818aea081b2a16e4b179d085cf53cdb39c033 100644 (file)
@@ -169,6 +169,11 @@ static ssize_t __attribute_used__ \
        return count; \
 }
 
+
+/* Let's define all possible registers, we'll only hook up the ones
+ * that are implemented on the current processor
+ */
+
 SYSFS_PMCSETUP(mmcr0, SPRN_MMCR0);
 SYSFS_PMCSETUP(mmcr1, SPRN_MMCR1);
 SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);
@@ -184,55 +189,87 @@ SYSFS_PMCSETUP(purr, SPRN_PURR);
 SYSFS_PMCSETUP(spurr, SPRN_SPURR);
 SYSFS_PMCSETUP(dscr, SPRN_DSCR);
 
-static SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0);
-static SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1);
+SYSFS_PMCSETUP(pa6t_pmc0, PA6T_SPRN_PMC0);
+SYSFS_PMCSETUP(pa6t_pmc1, PA6T_SPRN_PMC1);
+SYSFS_PMCSETUP(pa6t_pmc2, PA6T_SPRN_PMC2);
+SYSFS_PMCSETUP(pa6t_pmc3, PA6T_SPRN_PMC3);
+SYSFS_PMCSETUP(pa6t_pmc4, PA6T_SPRN_PMC4);
+SYSFS_PMCSETUP(pa6t_pmc5, PA6T_SPRN_PMC5);
+
+
 static SYSDEV_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
-static SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1);
-static SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2);
-static SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3);
-static SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4);
-static SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5);
-static SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6);
-static SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7);
-static SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8);
-static SYSDEV_ATTR(purr, 0600, show_purr, NULL);
 static SYSDEV_ATTR(spurr, 0600, show_spurr, NULL);
 static SYSDEV_ATTR(dscr, 0600, show_dscr, store_dscr);
+static SYSDEV_ATTR(purr, 0600, show_purr, store_purr);
+
+static struct sysdev_attribute ibm_common_attrs[] = {
+       _SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),
+       _SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),
+};
+
+static struct sysdev_attribute ibm_pmc_attrs[] = {
+       _SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1),
+       _SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2),
+       _SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3),
+       _SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4),
+       _SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5),
+       _SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6),
+       _SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7),
+       _SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8),
+};
+
+static struct sysdev_attribute pa6t_attrs[] = {
+       _SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),
+       _SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),
+       _SYSDEV_ATTR(pmc0, 0600, show_pa6t_pmc0, store_pa6t_pmc0),
+       _SYSDEV_ATTR(pmc1, 0600, show_pa6t_pmc1, store_pa6t_pmc1),
+       _SYSDEV_ATTR(pmc2, 0600, show_pa6t_pmc2, store_pa6t_pmc2),
+       _SYSDEV_ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3),
+       _SYSDEV_ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4),
+       _SYSDEV_ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5),
+};
+
 
 static void register_cpu_online(unsigned int cpu)
 {
        struct cpu *c = &per_cpu(cpu_devices, cpu);
        struct sys_device *s = &c->sysdev;
+       struct sysdev_attribute *attrs, *pmc_attrs;
+       int i, nattrs;
 
        if (!firmware_has_feature(FW_FEATURE_ISERIES) &&
                        cpu_has_feature(CPU_FTR_SMT))
                sysdev_create_file(s, &attr_smt_snooze_delay);
 
        /* PMC stuff */
+       switch (cur_cpu_spec->pmc_type) {
+       case PPC_PMC_IBM:
+               attrs = ibm_common_attrs;
+               nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = ibm_pmc_attrs;
+               break;
+       case PPC_PMC_PA6T:
+               /* PA Semi starts counting at PMC0 */
+               attrs = pa6t_attrs;
+               nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = NULL;
+               break;
+       default:
+               attrs = NULL;
+               nattrs = 0;
+               pmc_attrs = NULL;
+       }
+
+       for (i = 0; i < nattrs; i++)
+               sysdev_create_file(s, &attrs[i]);
 
-       sysdev_create_file(s, &attr_mmcr0);
-       sysdev_create_file(s, &attr_mmcr1);
+       if (pmc_attrs)
+               for (i = 0; i < cur_cpu_spec->num_pmcs; i++)
+                       sysdev_create_file(s, &pmc_attrs[i]);
 
        if (cpu_has_feature(CPU_FTR_MMCRA))
                sysdev_create_file(s, &attr_mmcra);
 
-       if (cur_cpu_spec->num_pmcs >= 1)
-               sysdev_create_file(s, &attr_pmc1);
-       if (cur_cpu_spec->num_pmcs >= 2)
-               sysdev_create_file(s, &attr_pmc2);
-       if (cur_cpu_spec->num_pmcs >= 3)
-               sysdev_create_file(s, &attr_pmc3);
-       if (cur_cpu_spec->num_pmcs >= 4)
-               sysdev_create_file(s, &attr_pmc4);
-       if (cur_cpu_spec->num_pmcs >= 5)
-               sysdev_create_file(s, &attr_pmc5);
-       if (cur_cpu_spec->num_pmcs >= 6)
-               sysdev_create_file(s, &attr_pmc6);
-       if (cur_cpu_spec->num_pmcs >= 7)
-               sysdev_create_file(s, &attr_pmc7);
-       if (cur_cpu_spec->num_pmcs >= 8)
-               sysdev_create_file(s, &attr_pmc8);
-
        if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_create_file(s, &attr_purr);
 
@@ -248,6 +285,8 @@ static void unregister_cpu_online(unsigned int cpu)
 {
        struct cpu *c = &per_cpu(cpu_devices, cpu);
        struct sys_device *s = &c->sysdev;
+       struct sysdev_attribute *attrs, *pmc_attrs;
+       int i, nattrs;
 
        BUG_ON(!c->hotpluggable);
 
@@ -256,30 +295,34 @@ static void unregister_cpu_online(unsigned int cpu)
                sysdev_remove_file(s, &attr_smt_snooze_delay);
 
        /* PMC stuff */
+       switch (cur_cpu_spec->pmc_type) {
+       case PPC_PMC_IBM:
+               attrs = ibm_common_attrs;
+               nattrs = sizeof(ibm_common_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = ibm_pmc_attrs;
+               break;
+       case PPC_PMC_PA6T:
+               /* PA Semi starts counting at PMC0 */
+               attrs = pa6t_attrs;
+               nattrs = sizeof(pa6t_attrs) / sizeof(struct sysdev_attribute);
+               pmc_attrs = NULL;
+               break;
+       default:
+               attrs = NULL;
+               nattrs = 0;
+               pmc_attrs = NULL;
+       }
 
-       sysdev_remove_file(s, &attr_mmcr0);
-       sysdev_remove_file(s, &attr_mmcr1);
+       for (i = 0; i < nattrs; i++)
+               sysdev_remove_file(s, &attrs[i]);
+
+       if (pmc_attrs)
+               for (i = 0; i < cur_cpu_spec->num_pmcs; i++)
+                       sysdev_remove_file(s, &pmc_attrs[i]);
 
        if (cpu_has_feature(CPU_FTR_MMCRA))
                sysdev_remove_file(s, &attr_mmcra);
 
-       if (cur_cpu_spec->num_pmcs >= 1)
-               sysdev_remove_file(s, &attr_pmc1);
-       if (cur_cpu_spec->num_pmcs >= 2)
-               sysdev_remove_file(s, &attr_pmc2);
-       if (cur_cpu_spec->num_pmcs >= 3)
-               sysdev_remove_file(s, &attr_pmc3);
-       if (cur_cpu_spec->num_pmcs >= 4)
-               sysdev_remove_file(s, &attr_pmc4);
-       if (cur_cpu_spec->num_pmcs >= 5)
-               sysdev_remove_file(s, &attr_pmc5);
-       if (cur_cpu_spec->num_pmcs >= 6)
-               sysdev_remove_file(s, &attr_pmc6);
-       if (cur_cpu_spec->num_pmcs >= 7)
-               sysdev_remove_file(s, &attr_pmc7);
-       if (cur_cpu_spec->num_pmcs >= 8)
-               sysdev_remove_file(s, &attr_pmc8);
-
        if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_remove_file(s, &attr_purr);
 
index 535f50665647eb490cdc32fd48223c780d55adfd..dcc6f159fd945070050ece10f77f64df90b70edb 100644 (file)
@@ -174,7 +174,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
         * generate the same exception over and over again and we get
         * nowhere.  Better to kill it and let the kernel panic.
         */
-       if (current->pid == 1) {
+       if (is_init(current)) {
                __sighandler_t handler;
 
                spin_lock_irq(&current->sighand->siglock);
@@ -535,34 +535,40 @@ static void emulate_single_step(struct pt_regs *regs)
        }
 }
 
-static void parse_fpe(struct pt_regs *regs)
+static inline int __parse_fpscr(unsigned long fpscr)
 {
-       int code = 0;
-       unsigned long fpscr;
-
-       flush_fp_to_thread(current);
-
-       fpscr = current->thread.fpscr.val;
+       int ret = 0;
 
        /* Invalid operation */
        if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX))
-               code = FPE_FLTINV;
+               ret = FPE_FLTINV;
 
        /* Overflow */
        else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX))
-               code = FPE_FLTOVF;
+               ret = FPE_FLTOVF;
 
        /* Underflow */
        else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX))
-               code = FPE_FLTUND;
+               ret = FPE_FLTUND;
 
        /* Divide by zero */
        else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX))
-               code = FPE_FLTDIV;
+               ret = FPE_FLTDIV;
 
        /* Inexact result */
        else if ((fpscr & FPSCR_XE) && (fpscr & FPSCR_XX))
-               code = FPE_FLTRES;
+               ret = FPE_FLTRES;
+
+       return ret;
+}
+
+static void parse_fpe(struct pt_regs *regs)
+{
+       int code = 0;
+
+       flush_fp_to_thread(current);
+
+       code = __parse_fpscr(current->thread.fpscr.val);
 
        _exception(SIGFPE, regs, code, regs->nip);
 }
@@ -739,20 +745,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
        extern int do_mathemu(struct pt_regs *regs);
 
        /* We can now get here via a FP Unavailable exception if the core
-        * has no FPU, in that case no reason flags will be set */
-#ifdef CONFIG_MATH_EMULATION
-       /* (reason & REASON_ILLEGAL) would be the obvious thing here,
-        * but there seems to be a hardware bug on the 405GP (RevD)
-        * that means ESR is sometimes set incorrectly - either to
-        * ESR_DST (!?) or 0.  In the process of chasing this with the
-        * hardware people - not sure if it can happen on any illegal
-        * instruction or only on FP instructions, whether there is a
-        * pattern to occurences etc. -dgibson 31/Mar/2003 */
-       if (!(reason & REASON_TRAP) && do_mathemu(regs) == 0) {
-               emulate_single_step(regs);
-               return;
-       }
-#endif /* CONFIG_MATH_EMULATION */
+        * has no FPU, in that case the reason flags will be 0 */
 
        if (reason & REASON_FP) {
                /* IEEE FP exception */
@@ -778,6 +771,31 @@ void __kprobes program_check_exception(struct pt_regs *regs)
 
        local_irq_enable();
 
+#ifdef CONFIG_MATH_EMULATION
+       /* (reason & REASON_ILLEGAL) would be the obvious thing here,
+        * but there seems to be a hardware bug on the 405GP (RevD)
+        * that means ESR is sometimes set incorrectly - either to
+        * ESR_DST (!?) or 0.  In the process of chasing this with the
+        * hardware people - not sure if it can happen on any illegal
+        * instruction or only on FP instructions, whether there is a
+        * pattern to occurences etc. -dgibson 31/Mar/2003 */
+       switch (do_mathemu(regs)) {
+       case 0:
+               emulate_single_step(regs);
+               return;
+       case 1: {
+                       int code = 0;
+                       code = __parse_fpscr(current->thread.fpscr.val);
+                       _exception(SIGFPE, regs, code, regs->nip);
+                       return;
+               }
+       case -EFAULT:
+               _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
+               return;
+       }
+       /* fall through on any other errors */
+#endif /* CONFIG_MATH_EMULATION */
+
        /* Try to emulate it if we should. */
        if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
                switch (emulate_instruction(regs)) {
@@ -891,18 +909,39 @@ void SoftwareEmulation(struct pt_regs *regs)
 
 #ifdef CONFIG_MATH_EMULATION
        errcode = do_mathemu(regs);
+
+       switch (errcode) {
+       case 0:
+               emulate_single_step(regs);
+               return;
+       case 1: {
+                       int code = 0;
+                       code = __parse_fpscr(current->thread.fpscr.val);
+                       _exception(SIGFPE, regs, code, regs->nip);
+                       return;
+               }
+       case -EFAULT:
+               _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
+               return;
+       default:
+               _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
+               return;
+       }
+
 #else
        errcode = Soft_emulate_8xx(regs);
-#endif
-       if (errcode) {
-               if (errcode > 0)
-                       _exception(SIGFPE, regs, 0, 0);
-               else if (errcode == -EFAULT)
-                       _exception(SIGSEGV, regs, 0, 0);
-               else
-                       _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
-       } else
+       switch (errcode) {
+       case 0:
                emulate_single_step(regs);
+               return;
+       case 1:
+               _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
+               return;
+       case -EFAULT:
+               _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
+               return;
+       }
+#endif
 }
 #endif /* CONFIG_8xx */
 
index 5730906b23d53e8e8ab4857e84760f8777bd2240..8f5afdbad0d5cd5b70232a36236816e1b7b0a432 100644 (file)
@@ -45,6 +45,10 @@ void __init udbg_early_init(void)
 #elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES)
        /* For iSeries - hit Ctrl-x Ctrl-x to see the output */
        udbg_init_iseries();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT)
+       udbg_init_debug_beat();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
+       udbg_init_pas_realmode();
 #endif
 }
 
index 2d17f2b8eda73323444208ed4744c0f04104e6e8..e738f93b42fe34e7e7ce745ba3365bb92424520e 100644 (file)
@@ -14,6 +14,8 @@
 
 extern u8 real_readb(volatile u8 __iomem  *addr);
 extern void real_writeb(u8 data, volatile u8 __iomem *addr);
+extern u8 real_205_readb(volatile u8 __iomem  *addr);
+extern void real_205_writeb(u8 data, volatile u8 __iomem *addr);
 
 struct NS16550 {
        /* this struct must be packed */
@@ -167,3 +169,25 @@ void __init udbg_init_maple_realmode(void)
        udbg_getc_poll = NULL;
 }
 #endif /* CONFIG_PPC_MAPLE */
+
+#ifdef CONFIG_PPC_PASEMI
+void udbg_pas_real_putc(char c)
+{
+       if (udbg_comport) {
+               while ((real_205_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
+                       /* wait for idle */;
+               real_205_writeb(c, &udbg_comport->thr); eieio();
+               if (c == '\n')
+                       udbg_pas_real_putc('\r');
+       }
+}
+
+void udbg_init_pas_realmode(void)
+{
+       udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8;
+
+       udbg_putc = udbg_pas_real_putc;
+       udbg_getc = NULL;
+       udbg_getc_poll = NULL;
+}
+#endif /* CONFIG_PPC_MAPLE */
index a80f8f1d2e5d9e1062562614dd87b6fe7e5614f7..2968ffeafdb68c06f6d1d7ff96dfa8e4bab4578d 100644 (file)
@@ -199,10 +199,8 @@ EXPORT_SYMBOL(vio_unregister_driver);
 /* vio_dev refcount hit 0 */
 static void __devinit vio_dev_release(struct device *dev)
 {
-       if (dev->archdata.of_node) {
-               /* XXX should free TCE table */
-               of_node_put(dev->archdata.of_node);
-       }
+       /* XXX should free TCE table */
+       of_node_put(dev->archdata.of_node);
        kfree(to_vio_dev(dev));
 }
 
index a0360ae10d0ccd5db00a1a0ff77b6bde74bd1629..4b1ba49fbd9e03cf56464a9071a6ee11fc8ab569 100644 (file)
@@ -16,13 +16,15 @@ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
                           strcase.o
 obj-$(CONFIG_QUICC_ENGINE) += rheap.o
 obj-$(CONFIG_XMON)     += sstep.o
+obj-$(CONFIG_KPROBES)  += sstep.o
+obj-$(CONFIG_NOT_COHERENT_CACHE)       += dma-noncoherent.o
 
 ifeq ($(CONFIG_PPC64),y)
 obj-$(CONFIG_SMP)      += locks.o
-obj-$(CONFIG_DEBUG_KERNEL) += sstep.o
 endif
 
 # Temporary hack until we have migrated to asm-powerpc
 ifeq ($(CONFIG_PPC_MERGE),y)
+obj-$(CONFIG_8xx)      += rheap.o
 obj-$(CONFIG_CPM2)     += rheap.o
 endif
diff --git a/arch/powerpc/lib/dma-noncoherent.c b/arch/powerpc/lib/dma-noncoherent.c
new file mode 100644 (file)
index 0000000..48f3d13
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ *  PowerPC version derived from arch/arm/mm/consistent.c
+ *    Copyright (C) 2001 Dan Malek (dmalek@jlc.net)
+ *
+ *  Copyright (C) 2000 Russell King
+ *
+ * Consistent memory allocators.  Used for DMA devices that want to
+ * share uncached memory with the processor core.  The function return
+ * is the virtual address and 'dma_handle' is the physical address.
+ * Mostly stolen from the ARM port, with some changes for PowerPC.
+ *                                             -- Dan
+ *
+ * Reorganized to get rid of the arch-specific consistent_* functions
+ * and provide non-coherent implementations for the DMA API. -Matt
+ *
+ * Added in_interrupt() safe dma_alloc_coherent()/dma_free_coherent()
+ * implementation. This is pulled straight from ARM and barely
+ * modified. -Matt
+ *
+ * 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/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/highmem.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/tlbflush.h>
+
+/*
+ * This address range defaults to a value that is safe for all
+ * platforms which currently set CONFIG_NOT_COHERENT_CACHE. It
+ * can be further configured for specific applications under
+ * the "Advanced Setup" menu. -Matt
+ */
+#define CONSISTENT_BASE        (CONFIG_CONSISTENT_START)
+#define CONSISTENT_END (CONFIG_CONSISTENT_START + CONFIG_CONSISTENT_SIZE)
+#define CONSISTENT_OFFSET(x)   (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
+
+/*
+ * This is the page table (2MB) covering uncached, DMA consistent allocations
+ */
+static pte_t *consistent_pte;
+static DEFINE_SPINLOCK(consistent_lock);
+
+/*
+ * VM region handling support.
+ *
+ * This should become something generic, handling VM region allocations for
+ * vmalloc and similar (ioremap, module space, etc).
+ *
+ * I envisage vmalloc()'s supporting vm_struct becoming:
+ *
+ *  struct vm_struct {
+ *    struct vm_region region;
+ *    unsigned long    flags;
+ *    struct page      **pages;
+ *    unsigned int     nr_pages;
+ *    unsigned long    phys_addr;
+ *  };
+ *
+ * get_vm_area() would then call vm_region_alloc with an appropriate
+ * struct vm_region head (eg):
+ *
+ *  struct vm_region vmalloc_head = {
+ *     .vm_list        = LIST_HEAD_INIT(vmalloc_head.vm_list),
+ *     .vm_start       = VMALLOC_START,
+ *     .vm_end         = VMALLOC_END,
+ *  };
+ *
+ * However, vmalloc_head.vm_start is variable (typically, it is dependent on
+ * the amount of RAM found at boot time.)  I would imagine that get_vm_area()
+ * would have to initialise this each time prior to calling vm_region_alloc().
+ */
+struct vm_region {
+       struct list_head        vm_list;
+       unsigned long           vm_start;
+       unsigned long           vm_end;
+};
+
+static struct vm_region consistent_head = {
+       .vm_list        = LIST_HEAD_INIT(consistent_head.vm_list),
+       .vm_start       = CONSISTENT_BASE,
+       .vm_end         = CONSISTENT_END,
+};
+
+static struct vm_region *
+vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
+{
+       unsigned long addr = head->vm_start, end = head->vm_end - size;
+       unsigned long flags;
+       struct vm_region *c, *new;
+
+       new = kmalloc(sizeof(struct vm_region), gfp);
+       if (!new)
+               goto out;
+
+       spin_lock_irqsave(&consistent_lock, flags);
+
+       list_for_each_entry(c, &head->vm_list, vm_list) {
+               if ((addr + size) < addr)
+                       goto nospc;
+               if ((addr + size) <= c->vm_start)
+                       goto found;
+               addr = c->vm_end;
+               if (addr > end)
+                       goto nospc;
+       }
+
+ found:
+       /*
+        * Insert this entry _before_ the one we found.
+        */
+       list_add_tail(&new->vm_list, &c->vm_list);
+       new->vm_start = addr;
+       new->vm_end = addr + size;
+
+       spin_unlock_irqrestore(&consistent_lock, flags);
+       return new;
+
+ nospc:
+       spin_unlock_irqrestore(&consistent_lock, flags);
+       kfree(new);
+ out:
+       return NULL;
+}
+
+static struct vm_region *vm_region_find(struct vm_region *head, unsigned long addr)
+{
+       struct vm_region *c;
+
+       list_for_each_entry(c, &head->vm_list, vm_list) {
+               if (c->vm_start == addr)
+                       goto out;
+       }
+       c = NULL;
+ out:
+       return c;
+}
+
+/*
+ * Allocate DMA-coherent memory space and return both the kernel remapped
+ * virtual and bus address for that space.
+ */
+void *
+__dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
+{
+       struct page *page;
+       struct vm_region *c;
+       unsigned long order;
+       u64 mask = 0x00ffffff, limit; /* ISA default */
+
+       if (!consistent_pte) {
+               printk(KERN_ERR "%s: not initialised\n", __func__);
+               dump_stack();
+               return NULL;
+       }
+
+       size = PAGE_ALIGN(size);
+       limit = (mask + 1) & ~mask;
+       if ((limit && size >= limit) || size >= (CONSISTENT_END - CONSISTENT_BASE)) {
+               printk(KERN_WARNING "coherent allocation too big (requested %#x mask %#Lx)\n",
+                      size, mask);
+               return NULL;
+       }
+
+       order = get_order(size);
+
+       if (mask != 0xffffffff)
+               gfp |= GFP_DMA;
+
+       page = alloc_pages(gfp, order);
+       if (!page)
+               goto no_page;
+
+       /*
+        * Invalidate any data that might be lurking in the
+        * kernel direct-mapped region for device DMA.
+        */
+       {
+               unsigned long kaddr = (unsigned long)page_address(page);
+               memset(page_address(page), 0, size);
+               flush_dcache_range(kaddr, kaddr + size);
+       }
+
+       /*
+        * Allocate a virtual address in the consistent mapping region.
+        */
+       c = vm_region_alloc(&consistent_head, size,
+                           gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
+       if (c) {
+               unsigned long vaddr = c->vm_start;
+               pte_t *pte = consistent_pte + CONSISTENT_OFFSET(vaddr);
+               struct page *end = page + (1 << order);
+
+               split_page(page, order);
+
+               /*
+                * Set the "dma handle"
+                */
+               *handle = page_to_bus(page);
+
+               do {
+                       BUG_ON(!pte_none(*pte));
+
+                       SetPageReserved(page);
+                       set_pte_at(&init_mm, vaddr,
+                                  pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
+                       page++;
+                       pte++;
+                       vaddr += PAGE_SIZE;
+               } while (size -= PAGE_SIZE);
+
+               /*
+                * Free the otherwise unused pages.
+                */
+               while (page < end) {
+                       __free_page(page);
+                       page++;
+               }
+
+               return (void *)c->vm_start;
+       }
+
+       if (page)
+               __free_pages(page, order);
+ no_page:
+       return NULL;
+}
+EXPORT_SYMBOL(__dma_alloc_coherent);
+
+/*
+ * free a page as defined by the above mapping.
+ */
+void __dma_free_coherent(size_t size, void *vaddr)
+{
+       struct vm_region *c;
+       unsigned long flags, addr;
+       pte_t *ptep;
+
+       size = PAGE_ALIGN(size);
+
+       spin_lock_irqsave(&consistent_lock, flags);
+
+       c = vm_region_find(&consistent_head, (unsigned long)vaddr);
+       if (!c)
+               goto no_area;
+
+       if ((c->vm_end - c->vm_start) != size) {
+               printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n",
+                      __func__, c->vm_end - c->vm_start, size);
+               dump_stack();
+               size = c->vm_end - c->vm_start;
+       }
+
+       ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
+       addr = c->vm_start;
+       do {
+               pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
+               unsigned long pfn;
+
+               ptep++;
+               addr += PAGE_SIZE;
+
+               if (!pte_none(pte) && pte_present(pte)) {
+                       pfn = pte_pfn(pte);
+
+                       if (pfn_valid(pfn)) {
+                               struct page *page = pfn_to_page(pfn);
+                               ClearPageReserved(page);
+
+                               __free_page(page);
+                               continue;
+                       }
+               }
+
+               printk(KERN_CRIT "%s: bad page in kernel page table\n",
+                      __func__);
+       } while (size -= PAGE_SIZE);
+
+       flush_tlb_kernel_range(c->vm_start, c->vm_end);
+
+       list_del(&c->vm_list);
+
+       spin_unlock_irqrestore(&consistent_lock, flags);
+
+       kfree(c);
+       return;
+
+ no_area:
+       spin_unlock_irqrestore(&consistent_lock, flags);
+       printk(KERN_ERR "%s: trying to free invalid coherent area: %p\n",
+              __func__, vaddr);
+       dump_stack();
+}
+EXPORT_SYMBOL(__dma_free_coherent);
+
+/*
+ * Initialise the consistent memory allocation.
+ */
+static int __init dma_alloc_init(void)
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte;
+       int ret = 0;
+
+       do {
+               pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
+               pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE);
+               if (!pmd) {
+                       printk(KERN_ERR "%s: no pmd tables\n", __func__);
+                       ret = -ENOMEM;
+                       break;
+               }
+               WARN_ON(!pmd_none(*pmd));
+
+               pte = pte_alloc_kernel(pmd, CONSISTENT_BASE);
+               if (!pte) {
+                       printk(KERN_ERR "%s: no pte tables\n", __func__);
+                       ret = -ENOMEM;
+                       break;
+               }
+
+               consistent_pte = pte;
+       } while (0);
+
+       return ret;
+}
+
+core_initcall(dma_alloc_init);
+
+/*
+ * make an area consistent.
+ */
+void __dma_sync(void *vaddr, size_t size, int direction)
+{
+       unsigned long start = (unsigned long)vaddr;
+       unsigned long end   = start + size;
+
+       switch (direction) {
+       case DMA_NONE:
+               BUG();
+       case DMA_FROM_DEVICE:   /* invalidate only */
+               invalidate_dcache_range(start, end);
+               break;
+       case DMA_TO_DEVICE:             /* writeback only */
+               clean_dcache_range(start, end);
+               break;
+       case DMA_BIDIRECTIONAL: /* writeback and invalidate */
+               flush_dcache_range(start, end);
+               break;
+       }
+}
+EXPORT_SYMBOL(__dma_sync);
+
+#ifdef CONFIG_HIGHMEM
+/*
+ * __dma_sync_page() implementation for systems using highmem.
+ * In this case, each page of a buffer must be kmapped/kunmapped
+ * in order to have a virtual address for __dma_sync(). This must
+ * not sleep so kmap_atomic()/kunmap_atomic() are used.
+ *
+ * Note: yes, it is possible and correct to have a buffer extend
+ * beyond the first page.
+ */
+static inline void __dma_sync_page_highmem(struct page *page,
+               unsigned long offset, size_t size, int direction)
+{
+       size_t seg_size = min((size_t)(PAGE_SIZE - offset), size);
+       size_t cur_size = seg_size;
+       unsigned long flags, start, seg_offset = offset;
+       int nr_segs = 1 + ((size - seg_size) + PAGE_SIZE - 1)/PAGE_SIZE;
+       int seg_nr = 0;
+
+       local_irq_save(flags);
+
+       do {
+               start = (unsigned long)kmap_atomic(page + seg_nr,
+                               KM_PPC_SYNC_PAGE) + seg_offset;
+
+               /* Sync this buffer segment */
+               __dma_sync((void *)start, seg_size, direction);
+               kunmap_atomic((void *)start, KM_PPC_SYNC_PAGE);
+               seg_nr++;
+
+               /* Calculate next buffer segment size */
+               seg_size = min((size_t)PAGE_SIZE, size - cur_size);
+
+               /* Add the segment size to our running total */
+               cur_size += seg_size;
+               seg_offset = 0;
+       } while (seg_nr < nr_segs);
+
+       local_irq_restore(flags);
+}
+#endif /* CONFIG_HIGHMEM */
+
+/*
+ * __dma_sync_page makes memory consistent. identical to __dma_sync, but
+ * takes a struct page instead of a virtual address
+ */
+void __dma_sync_page(struct page *page, unsigned long offset,
+       size_t size, int direction)
+{
+#ifdef CONFIG_HIGHMEM
+       __dma_sync_page_highmem(page, offset, size, direction);
+#else
+       unsigned long start = (unsigned long)page_address(page) + offset;
+       __dma_sync((void *)start, size, direction);
+#endif
+}
+EXPORT_SYMBOL(__dma_sync_page);
index 57bf991ccd6e11751cf4b37c5f4548ac83e55aba..6c5c5dd183ee3ac79c57bf4f5cf744b91a15ad47 100644 (file)
@@ -14,6 +14,7 @@
  */
 #include <linux/types.h>
 #include <linux/errno.h>
+#include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
 
@@ -85,7 +86,8 @@ static int grow(rh_info_t * info, int max_blocks)
        info->flags &= ~RHIF_STATIC_BLOCK;
 
        /* add all new blocks to the free list */
-       for (i = 0, blk = block + info->max_blocks; i < new_blocks; i++, blk++)
+       blk = block + info->max_blocks - new_blocks;
+       for (i = 0; i < new_blocks; i++, blk++)
                list_add(&blk->list, &info->empty_list);
 
        return 0;
@@ -670,7 +672,7 @@ void rh_dump(rh_info_t * info)
        int maxnr;
        int i, nr;
 
-       maxnr = sizeof(st) / sizeof(st[0]);
+       maxnr = ARRAY_SIZE(st);
 
        printk(KERN_INFO
               "info @0x%p (%d slots empty / %d max)\n",
index 1bb20d841080cb0cbdb739bfd0facd9f5ef496bd..8c77c791f87eacafaf33899e3908457ed9ecb28f 100644 (file)
@@ -1014,7 +1014,6 @@ repeat:
 
                /* Primary is full, try the secondary */
                if (unlikely(slot == -1)) {
-                       new_pte |= _PAGE_F_SECOND;
                        hpte_group = ((~hash & htab_hash_mask) *
                                      HPTES_PER_GROUP) & ~0x7UL; 
                        slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags,
@@ -1033,7 +1032,7 @@ repeat:
                if (unlikely(slot == -2))
                        panic("hash_huge_page: pte_insert failed\n");
 
-               new_pte |= (slot << 12) & _PAGE_F_GIX;
+               new_pte |= (slot << 12) & (_PAGE_F_SECOND | _PAGE_F_GIX);
        }
 
        /*
index d1c0758c56110628e5cc691263f48d1eda36bbb9..77b4637097e93ce40682e6a4f57a26e81dee2ea9 100644 (file)
@@ -61,10 +61,6 @@ unsigned long memory_limit;
 extern void hash_preload(struct mm_struct *mm, unsigned long ea,
                         unsigned long access, unsigned long trap);
 
-/*
- * This is called by /dev/mem to know if a given address has to
- * be mapped non-cacheable or not
- */
 int page_is_ram(unsigned long pfn)
 {
        unsigned long paddr = (pfn << PAGE_SHIFT);
@@ -490,19 +486,19 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
            !cpu_has_feature(CPU_FTR_NOEXECUTE) &&
            pfn_valid(pfn)) {
                struct page *page = pfn_to_page(pfn);
+#ifdef CONFIG_8xx
+               /* On 8xx, cache control instructions (particularly
+                * "dcbst" from flush_dcache_icache) fault as write
+                * operation if there is an unpopulated TLB entry
+                * for the address in question. To workaround that,
+                * we invalidate the TLB here, thus avoiding dcbst
+                * misbehaviour.
+                */
+               _tlbie(address);
+#endif
                if (!PageReserved(page)
                    && !test_bit(PG_arch_1, &page->flags)) {
                        if (vma->vm_mm == current->active_mm) {
-#ifdef CONFIG_8xx
-                       /* On 8xx, cache control instructions (particularly 
-                        * "dcbst" from flush_dcache_icache) fault as write 
-                        * operation if there is an unpopulated TLB entry 
-                        * for the address in question. To workaround that, 
-                        * we invalidate the TLB here, thus avoiding dcbst 
-                        * misbehaviour.
-                        */
-                               _tlbie(address);
-#endif
                                __flush_dcache_icache((void *) address);
                        } else
                                flush_dcache_icache_page(page);
index 1891dbeeb8e9deb7ac88718fbb4680f54b579558..bd02272bcb0fee3dcdcfcc507c725b7d23bd8404 100644 (file)
@@ -294,11 +294,8 @@ void __init mapin_ram(void)
        }
 }
 
-/* is x a power of 2? */
-#define is_power_of_2(x)       ((x) != 0 && (((x) & ((x) - 1)) == 0))
-
 /* is x a power of 4? */
-#define is_power_of_4(x)       ((x) != 0 && (((x) & (x-1)) == 0) && (ffs(x) & 1))
+#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1))
 
 /*
  * Set up a mapping for a block of I/O.
index b6d82390b6a6a8bbf854b04d72135ba91439da97..fbd62eacfdf4264c5620167ce78edc77f157654b 100644 (file)
@@ -149,6 +149,8 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
 #ifdef CONFIG_PPC64
 #ifdef CONFIG_PPC_CELL_NATIVE
                case PPC_OPROFILE_CELL:
+                       if (firmware_has_feature(FW_FEATURE_LPAR))
+                               return -ENODEV;
                        model = &op_model_cell;
                        break;
 #endif
index f481c0ed5e675eec7bac1656e4edeadc1cec49ef..5d1bbaf35ccbe3db836aba30934fb4b5dd6adc14 100644 (file)
@@ -137,9 +137,9 @@ static void fsl7450_start(struct op_counter_config *ctr)
 
        for (i = 0; i < NUM_CTRS; ++i) {
                if (ctr[i].enabled)
-                       ctr_write(i, reset_value[i]);
+                       classic_ctr_write(i, reset_value[i]);
                else
-                       ctr_write(i, 0);
+                       classic_ctr_write(i, 0);
        }
 
        /* Clear the freeze bit, and enable the interrupt.
@@ -179,13 +179,13 @@ static void fsl7450_handle_interrupt(struct pt_regs *regs,
        is_kernel = is_kernel_addr(pc);
 
        for (i = 0; i < NUM_CTRS; ++i) {
-               val = ctr_read(i);
+               val = classic_ctr_read(i);
                if (val < 0) {
                        if (oprofile_running && ctr[i].enabled) {
                                oprofile_add_ext_sample(pc, regs, i, is_kernel);
-                               ctr_write(i, reset_value[i]);
+                               classic_ctr_write(i, reset_value[i]);
                        } else {
-                               ctr_write(i, 0);
+                               classic_ctr_write(i, 0);
                        }
                }
        }
index 0b3c31f5209ef4377e6be0bd48030d321734c07e..2267eb8c661b4bdd3d97581464cd5df234dc9a31 100644 (file)
@@ -32,6 +32,87 @@ static unsigned long reset_value[OP_MAX_COUNTER];
 static int num_counters;
 static int oprofile_running;
 
+static inline u32 get_pmlca(int ctr)
+{
+       u32 pmlca;
+
+       switch (ctr) {
+               case 0:
+                       pmlca = mfpmr(PMRN_PMLCA0);
+                       break;
+               case 1:
+                       pmlca = mfpmr(PMRN_PMLCA1);
+                       break;
+               case 2:
+                       pmlca = mfpmr(PMRN_PMLCA2);
+                       break;
+               case 3:
+                       pmlca = mfpmr(PMRN_PMLCA3);
+                       break;
+               default:
+                       panic("Bad ctr number\n");
+       }
+
+       return pmlca;
+}
+
+static inline void set_pmlca(int ctr, u32 pmlca)
+{
+       switch (ctr) {
+               case 0:
+                       mtpmr(PMRN_PMLCA0, pmlca);
+                       break;
+               case 1:
+                       mtpmr(PMRN_PMLCA1, pmlca);
+                       break;
+               case 2:
+                       mtpmr(PMRN_PMLCA2, pmlca);
+                       break;
+               case 3:
+                       mtpmr(PMRN_PMLCA3, pmlca);
+                       break;
+               default:
+                       panic("Bad ctr number\n");
+       }
+}
+
+static inline unsigned int ctr_read(unsigned int i)
+{
+       switch(i) {
+               case 0:
+                       return mfpmr(PMRN_PMC0);
+               case 1:
+                       return mfpmr(PMRN_PMC1);
+               case 2:
+                       return mfpmr(PMRN_PMC2);
+               case 3:
+                       return mfpmr(PMRN_PMC3);
+               default:
+                       return 0;
+       }
+}
+
+static inline void ctr_write(unsigned int i, unsigned int val)
+{
+       switch(i) {
+               case 0:
+                       mtpmr(PMRN_PMC0, val);
+                       break;
+               case 1:
+                       mtpmr(PMRN_PMC1, val);
+                       break;
+               case 2:
+                       mtpmr(PMRN_PMC2, val);
+                       break;
+               case 3:
+                       mtpmr(PMRN_PMC3, val);
+                       break;
+               default:
+                       break;
+       }
+}
+
+
 static void init_pmc_stop(int ctr)
 {
        u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU |
index 356709d515b9707ab3c44276dcf12e279cfb99a6..fe597a154d4f31b553674117ca44e1d05b3f881d 100644 (file)
@@ -121,9 +121,9 @@ static void power4_start(struct op_counter_config *ctr)
 
        for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) {
                if (ctr[i].enabled) {
-                       ctr_write(i, reset_value[i]);
+                       classic_ctr_write(i, reset_value[i]);
                } else {
-                       ctr_write(i, 0);
+                       classic_ctr_write(i, 0);
                }
        }
 
@@ -254,13 +254,13 @@ static void power4_handle_interrupt(struct pt_regs *regs,
        mtmsrd(mfmsr() | MSR_PMM);
 
        for (i = 0; i < cur_cpu_spec->num_pmcs; ++i) {
-               val = ctr_read(i);
+               val = classic_ctr_read(i);
                if (val < 0) {
                        if (oprofile_running && ctr[i].enabled) {
                                oprofile_add_ext_sample(pc, regs, i, is_kernel);
-                               ctr_write(i, reset_value[i]);
+                               classic_ctr_write(i, reset_value[i]);
                        } else {
-                               ctr_write(i, 0);
+                               classic_ctr_write(i, 0);
                        }
                }
        }
index 19c5ee089bc99550b2bc06eedb27086e56f70fab..c731acbfb2a5f6deb431a5f89bec06401fb081f6 100644 (file)
@@ -137,10 +137,10 @@ static void rs64_start(struct op_counter_config *ctr)
 
        for (i = 0; i < num_counters; ++i) {
                if (ctr[i].enabled) {
-                       ctr_write(i, reset_value[i]);
+                       classic_ctr_write(i, reset_value[i]);
                        ctrl_write(i, ctr[i].event);
                } else {
-                       ctr_write(i, 0);
+                       classic_ctr_write(i, 0);
                }
        }
 
@@ -186,13 +186,13 @@ static void rs64_handle_interrupt(struct pt_regs *regs,
        mtmsrd(mfmsr() | MSR_PMM);
 
        for (i = 0; i < num_counters; ++i) {
-               val = ctr_read(i);
+               val = classic_ctr_read(i);
                if (val < 0) {
                        if (ctr[i].enabled) {
                                oprofile_add_ext_sample(pc, regs, i, is_kernel);
-                               ctr_write(i, reset_value[i]);
+                               classic_ctr_write(i, reset_value[i]);
                        } else {
-                               ctr_write(i, 0);
+                               classic_ctr_write(i, 0);
                        }
                }
        }
index a46184a0c750394a441604226cafbfbc7eb2699b..795b713ec9ee5bc6925178509ade409a7adeb494 100644 (file)
@@ -3,6 +3,7 @@
 #
 ifeq ($(CONFIG_PPC_MERGE),y)
 obj-y                          += mpc52xx_pic.o mpc52xx_common.o
+obj-$(CONFIG_PCI)              += mpc52xx_pci.o
 endif
 
 obj-$(CONFIG_PPC_EFIKA)                += efika-setup.o efika-pci.o
index 0f21bab33f6ce31f7006f487e5b55467fb7d4ff2..cdb16bfa6ca67976cc7dfba0499ef4b6839ffc55 100644 (file)
@@ -107,6 +107,12 @@ static void __init lite52xx_setup_arch(void)
        mpc52xx_setup_cpu();    /* Generic */
        lite52xx_setup_cpu();   /* Platorm specific */
 
+#ifdef CONFIG_PCI
+       np = of_find_node_by_type(np, "pci");
+       if (np)
+               mpc52xx_add_bridge(np);
+#endif
+
 #ifdef CONFIG_BLK_DEV_INITRD
        if (initrd_start)
                ROOT_DEV = Root_RAM0;
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pci.c b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
new file mode 100644 (file)
index 0000000..faf161b
--- /dev/null
@@ -0,0 +1,412 @@
+/*
+ * PCI code for the Freescale MPC52xx embedded CPU.
+ *
+ * Copyright (C) 2006 Secret Lab Technologies Ltd.
+ *                        Grant Likely <grant.likely@secretlab.ca>
+ * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.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.
+ */
+
+#undef DEBUG
+
+#include <asm/pci.h>
+#include <asm/mpc52xx.h>
+#include <asm/delay.h>
+#include <asm/machdep.h>
+#include <linux/kernel.h>
+
+
+/* ======================================================================== */
+/* PCI windows config                                                       */
+/* ======================================================================== */
+
+#define MPC52xx_PCI_TARGET_IO  0xf0000000
+#define MPC52xx_PCI_TARGET_MEM 0x00000000
+
+
+/* ======================================================================== */
+/* Structures mapping & Defines for PCI Unit                                */
+/* ======================================================================== */
+
+#define MPC52xx_PCI_GSCR_BM            0x40000000
+#define MPC52xx_PCI_GSCR_PE            0x20000000
+#define MPC52xx_PCI_GSCR_SE            0x10000000
+#define MPC52xx_PCI_GSCR_XLB2PCI_MASK  0x07000000
+#define MPC52xx_PCI_GSCR_XLB2PCI_SHIFT 24
+#define MPC52xx_PCI_GSCR_IPG2PCI_MASK  0x00070000
+#define MPC52xx_PCI_GSCR_IPG2PCI_SHIFT 16
+#define MPC52xx_PCI_GSCR_BME           0x00004000
+#define MPC52xx_PCI_GSCR_PEE           0x00002000
+#define MPC52xx_PCI_GSCR_SEE           0x00001000
+#define MPC52xx_PCI_GSCR_PR            0x00000001
+
+
+#define MPC52xx_PCI_IWBTAR_TRANSLATION(proc_ad,pci_ad,size)      \
+               ( ( (proc_ad) & 0xff000000 )                    | \
+                 ( (((size) - 1) >> 8) & 0x00ff0000 )          | \
+                 ( ((pci_ad) >> 16) & 0x0000ff00 ) )
+
+#define MPC52xx_PCI_IWCR_PACK(win0,win1,win2)  (((win0) << 24) | \
+                                                ((win1) << 16) | \
+                                                ((win2) <<  8))
+
+#define MPC52xx_PCI_IWCR_DISABLE       0x0
+#define MPC52xx_PCI_IWCR_ENABLE                0x1
+#define MPC52xx_PCI_IWCR_READ          0x0
+#define MPC52xx_PCI_IWCR_READ_LINE     0x2
+#define MPC52xx_PCI_IWCR_READ_MULTI    0x4
+#define MPC52xx_PCI_IWCR_MEM           0x0
+#define MPC52xx_PCI_IWCR_IO            0x8
+
+#define MPC52xx_PCI_TCR_P              0x01000000
+#define MPC52xx_PCI_TCR_LD             0x00010000
+
+#define MPC52xx_PCI_TBATR_DISABLE      0x0
+#define MPC52xx_PCI_TBATR_ENABLE       0x1
+
+struct mpc52xx_pci {
+       u32     idr;            /* PCI + 0x00 */
+       u32     scr;            /* PCI + 0x04 */
+       u32     ccrir;          /* PCI + 0x08 */
+       u32     cr1;            /* PCI + 0x0C */
+       u32     bar0;           /* PCI + 0x10 */
+       u32     bar1;           /* PCI + 0x14 */
+       u8      reserved1[16];  /* PCI + 0x18 */
+       u32     ccpr;           /* PCI + 0x28 */
+       u32     sid;            /* PCI + 0x2C */
+       u32     erbar;          /* PCI + 0x30 */
+       u32     cpr;            /* PCI + 0x34 */
+       u8      reserved2[4];   /* PCI + 0x38 */
+       u32     cr2;            /* PCI + 0x3C */
+       u8      reserved3[32];  /* PCI + 0x40 */
+       u32     gscr;           /* PCI + 0x60 */
+       u32     tbatr0;         /* PCI + 0x64 */
+       u32     tbatr1;         /* PCI + 0x68 */
+       u32     tcr;            /* PCI + 0x6C */
+       u32     iw0btar;        /* PCI + 0x70 */
+       u32     iw1btar;        /* PCI + 0x74 */
+       u32     iw2btar;        /* PCI + 0x78 */
+       u8      reserved4[4];   /* PCI + 0x7C */
+       u32     iwcr;           /* PCI + 0x80 */
+       u32     icr;            /* PCI + 0x84 */
+       u32     isr;            /* PCI + 0x88 */
+       u32     arb;            /* PCI + 0x8C */
+       u8      reserved5[104]; /* PCI + 0x90 */
+       u32     car;            /* PCI + 0xF8 */
+       u8      reserved6[4];   /* PCI + 0xFC */
+};
+
+
+/* ======================================================================== */
+/* PCI configuration acess                                                  */
+/* ======================================================================== */
+
+static int
+mpc52xx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
+                               int offset, int len, u32 *val)
+{
+       struct pci_controller *hose = bus->sysdata;
+       u32 value;
+
+       if (ppc_md.pci_exclude_device)
+               if (ppc_md.pci_exclude_device(bus->number, devfn))
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+
+       out_be32(hose->cfg_addr,
+               (1 << 31) |
+               ((bus->number - hose->bus_offset) << 16) |
+               (devfn << 8) |
+               (offset & 0xfc));
+       mb();
+
+#if defined(CONFIG_PPC_MPC5200_BUGFIX)
+       if (bus->number != hose->bus_offset) {
+               /* workaround for the bug 435 of the MPC5200 (L25R);
+                * Don't do 32 bits config access during type-1 cycles */
+               switch (len) {
+                     case 1:
+                       value = in_8(((u8 __iomem *)hose->cfg_data) +
+                                    (offset & 3));
+                       break;
+                     case 2:
+                       value = in_le16(((u16 __iomem *)hose->cfg_data) +
+                                       ((offset>>1) & 1));
+                       break;
+
+                     default:
+                       value = in_le16((u16 __iomem *)hose->cfg_data) |
+                               (in_le16(((u16 __iomem *)hose->cfg_data) + 1) << 16);
+                       break;
+               }
+       }
+       else
+#endif
+       {
+               value = in_le32(hose->cfg_data);
+
+               if (len != 4) {
+                       value >>= ((offset & 0x3) << 3);
+                       value &= 0xffffffff >> (32 - (len << 3));
+               }
+       }
+
+       *val = value;
+
+       out_be32(hose->cfg_addr, 0);
+       mb();
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int
+mpc52xx_pci_write_config(struct pci_bus *bus, unsigned int devfn,
+                               int offset, int len, u32 val)
+{
+       struct pci_controller *hose = bus->sysdata;
+       u32 value, mask;
+
+       if (ppc_md.pci_exclude_device)
+               if (ppc_md.pci_exclude_device(bus->number, devfn))
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+
+       out_be32(hose->cfg_addr,
+               (1 << 31) |
+               ((bus->number - hose->bus_offset) << 16) |
+               (devfn << 8) |
+               (offset & 0xfc));
+       mb();
+
+#if defined(CONFIG_PPC_MPC5200_BUGFIX)
+       if (bus->number != hose->bus_offset) {
+               /* workaround for the bug 435 of the MPC5200 (L25R);
+                * Don't do 32 bits config access during type-1 cycles */
+               switch (len) {
+                     case 1:
+                       out_8(((u8 __iomem *)hose->cfg_data) +
+                               (offset & 3), val);
+                       break;
+                     case 2:
+                       out_le16(((u16 __iomem *)hose->cfg_data) +
+                               ((offset>>1) & 1), val);
+                       break;
+
+                     default:
+                       out_le16((u16 __iomem *)hose->cfg_data,
+                               (u16)val);
+                       out_le16(((u16 __iomem *)hose->cfg_data) + 1,
+                               (u16)(val>>16));
+                       break;
+               }
+       }
+       else
+#endif
+       {
+               if (len != 4) {
+                       value = in_le32(hose->cfg_data);
+
+                       offset = (offset & 0x3) << 3;
+                       mask = (0xffffffff >> (32 - (len << 3)));
+                       mask <<= offset;
+
+                       value &= ~mask;
+                       val = value | ((val << offset) & mask);
+               }
+
+               out_le32(hose->cfg_data, val);
+       }
+       mb();
+
+       out_be32(hose->cfg_addr, 0);
+       mb();
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops mpc52xx_pci_ops = {
+       .read  = mpc52xx_pci_read_config,
+       .write = mpc52xx_pci_write_config
+};
+
+
+/* ======================================================================== */
+/* PCI setup                                                                */
+/* ======================================================================== */
+
+static void __init
+mpc52xx_pci_setup(struct pci_controller *hose,
+                  struct mpc52xx_pci __iomem *pci_regs)
+{
+       struct resource *res;
+       u32 tmp;
+       int iwcr0 = 0, iwcr1 = 0, iwcr2 = 0;
+
+       pr_debug("mpc52xx_pci_setup(hose=%p, pci_regs=%p)\n", hose, pci_regs);
+
+       /* pci_process_bridge_OF_ranges() found all our addresses for us;
+        * now store them in the right places */
+       hose->cfg_addr = &pci_regs->car;
+       hose->cfg_data = hose->io_base_virt;
+
+       /* Control regs */
+       tmp = in_be32(&pci_regs->scr);
+       tmp |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       out_be32(&pci_regs->scr, tmp);
+
+       /* Memory windows */
+       res = &hose->mem_resources[0];
+       if (res->flags) {
+               pr_debug("mem_resource[0] = {.start=%x, .end=%x, .flags=%lx}\n",
+                        res->start, res->end, res->flags);
+               out_be32(&pci_regs->iw0btar,
+                        MPC52xx_PCI_IWBTAR_TRANSLATION(res->start, res->start,
+                                 res->end - res->start + 1));
+               iwcr0 = MPC52xx_PCI_IWCR_ENABLE | MPC52xx_PCI_IWCR_MEM;
+               if (res->flags & IORESOURCE_PREFETCH)
+                       iwcr0 |= MPC52xx_PCI_IWCR_READ_MULTI;
+               else
+                       iwcr0 |= MPC52xx_PCI_IWCR_READ;
+       }
+
+       res = &hose->mem_resources[1];
+       if (res->flags) {
+               pr_debug("mem_resource[1] = {.start=%x, .end=%x, .flags=%lx}\n",
+                        res->start, res->end, res->flags);
+               out_be32(&pci_regs->iw1btar,
+                        MPC52xx_PCI_IWBTAR_TRANSLATION(res->start, res->start,
+                                 res->end - res->start + 1));
+               iwcr1 = MPC52xx_PCI_IWCR_ENABLE | MPC52xx_PCI_IWCR_MEM;
+               if (res->flags & IORESOURCE_PREFETCH)
+                       iwcr1 |= MPC52xx_PCI_IWCR_READ_MULTI;
+               else
+                       iwcr1 |= MPC52xx_PCI_IWCR_READ;
+       }
+
+       /* IO resources */
+       res = &hose->io_resource;
+       if (!res) {
+               printk(KERN_ERR "%s: Didn't find IO resources\n", __FILE__);
+               return;
+       }
+       pr_debug(".io_resource={.start=%x,.end=%x,.flags=%lx} "
+                ".io_base_phys=0x%p\n",
+                res->start, res->end, res->flags, (void*)hose->io_base_phys);
+       out_be32(&pci_regs->iw2btar,
+                MPC52xx_PCI_IWBTAR_TRANSLATION(hose->io_base_phys,
+                                               res->start,
+                                               res->end - res->start + 1));
+       iwcr2 = MPC52xx_PCI_IWCR_ENABLE | MPC52xx_PCI_IWCR_IO;
+
+       /* Set all the IWCR fields at once; they're in the same reg */
+       out_be32(&pci_regs->iwcr, MPC52xx_PCI_IWCR_PACK(iwcr0, iwcr1, iwcr2));
+
+       out_be32(&pci_regs->tbatr0,
+               MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_IO );
+       out_be32(&pci_regs->tbatr1,
+               MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_MEM );
+
+       out_be32(&pci_regs->tcr, MPC52xx_PCI_TCR_LD);
+
+       tmp = in_be32(&pci_regs->gscr);
+#if 0
+       /* Reset the exteral bus ( internal PCI controller is NOT resetted ) */
+       /* Not necessary and can be a bad thing if for example the bootloader
+          is displaying a splash screen or ... Just left here for
+          documentation purpose if anyone need it */
+       out_be32(&pci_regs->gscr, tmp | MPC52xx_PCI_GSCR_PR);
+       udelay(50);
+#endif
+
+       /* Make sure the PCI bridge is out of reset */
+       out_be32(&pci_regs->gscr, tmp & ~MPC52xx_PCI_GSCR_PR);
+}
+
+static void
+mpc52xx_pci_fixup_resources(struct pci_dev *dev)
+{
+       int i;
+
+       pr_debug("mpc52xx_pci_fixup_resources() %.4x:%.4x\n",
+                dev->vendor, dev->device);
+
+       /* We don't rely on boot loader for PCI and resets all
+          devices */
+       for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+               struct resource *res = &dev->resource[i];
+               if (res->end > res->start) {    /* Only valid resources */
+                       res->end -= res->start;
+                       res->start = 0;
+                       res->flags |= IORESOURCE_UNSET;
+               }
+       }
+
+       /* The PCI Host bridge of MPC52xx has a prefetch memory resource
+          fixed to 1Gb. Doesn't fit in the resource system so we remove it */
+       if ( (dev->vendor == PCI_VENDOR_ID_MOTOROLA) &&
+            (   dev->device == PCI_DEVICE_ID_MOTOROLA_MPC5200
+             || dev->device == PCI_DEVICE_ID_MOTOROLA_MPC5200B) ) {
+               struct resource *res = &dev->resource[1];
+               res->start = res->end = res->flags = 0;
+       }
+}
+
+int __init
+mpc52xx_add_bridge(struct device_node *node)
+{
+       int len;
+       struct mpc52xx_pci __iomem *pci_regs;
+       struct pci_controller *hose;
+       const int *bus_range;
+       struct resource rsrc;
+
+       pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
+
+       pci_assign_all_buses = 1;
+
+       if (of_address_to_resource(node, 0, &rsrc) != 0) {
+               printk(KERN_ERR "Can't get %s resources\n", node->full_name);
+               return -EINVAL;
+       }
+
+       bus_range = get_property(node, "bus-range", &len);
+       if (bus_range == NULL || len < 2 * sizeof(int)) {
+               printk(KERN_WARNING "Can't get %s bus-range, assume bus 0\n",
+                      node->full_name);
+               bus_range = NULL;
+       }
+
+       /* There are some PCI quirks on the 52xx, register the hook to
+        * fix them. */
+       ppc_md.pcibios_fixup_resources = mpc52xx_pci_fixup_resources;
+
+       /* Alloc and initialize the pci controller.  Values in the device
+        * tree are needed to configure the 52xx PCI controller.  Rather
+        * than parse the tree here, let pci_process_bridge_OF_ranges()
+        * do it for us and extract the values after the fact */
+       hose = pcibios_alloc_controller();
+       if (!hose)
+               return -ENOMEM;
+
+       hose->arch_data = node;
+       hose->set_cfg_type = 1;
+
+       hose->first_busno = bus_range ? bus_range[0] : 0;
+       hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+       hose->bus_offset = 0;
+       hose->ops = &mpc52xx_pci_ops;
+
+       pci_regs = ioremap(rsrc.start, rsrc.end - rsrc.start + 1);
+       if (!pci_regs)
+               return -ENOMEM;
+
+       pci_process_bridge_OF_ranges(hose, node, 1);
+
+       /* Finish setting up PCI using values obtained by
+        * pci_proces_bridge_OF_ranges */
+       mpc52xx_pci_setup(hose, pci_regs);
+
+       return 0;
+}
index 0f5b30dc60da92b097f3e875069ab29281ed22b2..74e7892cdfcf9b9526ba0453f8d2742436facb53 100644 (file)
@@ -50,7 +50,7 @@
 #include <sysdev/fsl_soc.h>
 #include <sysdev/cpm2_pic.h>
 
-#include "pq2ads_pd.h"
+#include "pq2ads.h"
 
 static int __init get_freq(char *name, unsigned long *val)
 {
index ea880f1f0dcd4e71d73cad97b5e90ae9c833cd50..7334c1a15b90d549a9896e105fe588932ee572e4 100644 (file)
@@ -51,7 +51,7 @@
 #include <sysdev/fsl_soc.h>
 #include <../sysdev/cpm2_pic.h>
 
-#include "pq2ads_pd.h"
+#include "pq2ads.h"
 
 #ifdef CONFIG_PCI
 static uint pci_clk_frq;
index fb2f92bcd7700d88e22e4c9ab9a5369c5663263c..5b5cca6c8c8804d6e847a8b2a0995a9bb1b68d4a 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef __MACH_ADS8260_DEFS
 #define __MACH_ADS8260_DEFS
 
+#include <linux/seq_file.h>
 #include <asm/ppcboot.h>
 
 /* For our show_cpuinfo hooks. */
 #define BCSR1_RS232_EN1                ((uint)0x02000000)      /* 0 ==enable */
 #define BCSR1_RS232_EN2                ((uint)0x01000000)      /* 0 ==enable */
 #define BCSR3_FETHIEN2         ((uint)0x10000000)      /* 0 == enable*/
-#define BCSR3_FETH2_RS         ((uint)0x80000000)      /* 0 == reset */
+#define BCSR3_FETH2_RST                ((uint)0x80000000)      /* 0 == reset */
 
 /* cpm serial driver works with constants below */
 
 #define SIU_INT_SMC1           ((uint)0x04+CPM_IRQ_OFFSET)
-#define SIU_INT_SMC2i          ((uint)0x05+CPM_IRQ_OFFSET)
+#define SIU_INT_SMC2           ((uint)0x05+CPM_IRQ_OFFSET)
 #define SIU_INT_SCC1           ((uint)0x28+CPM_IRQ_OFFSET)
 #define SIU_INT_SCC2           ((uint)0x29+CPM_IRQ_OFFSET)
 #define SIU_INT_SCC3           ((uint)0x2a+CPM_IRQ_OFFSET)
index f0c6df61faa9e0a025243507d68553948e78ad92..f01806c940e14b8e62b3d54d0cd77c300e1a4040 100644 (file)
 
 #include "mpc83xx.h"
 
+static __be32 __iomem *restart_reg_base;
+
+static int __init mpc83xx_restart_init(void)
+{
+       /* map reset restart_reg_baseister space */
+       restart_reg_base = ioremap(get_immrbase() + 0x900, 0xff);
+
+       return 0;
+}
+
+arch_initcall(mpc83xx_restart_init);
+
 void mpc83xx_restart(char *cmd)
 {
 #define RST_OFFSET     0x00000900
 #define RST_PROT_REG   0x00000018
 #define RST_CTRL_REG   0x0000001c
-       __be32 __iomem *reg;
-
-       /* map reset register space */
-       reg = ioremap(get_immrbase() + 0x900, 0xff);
 
        local_irq_disable();
 
-       /* enable software reset "RSTE" */
-       out_be32(reg + (RST_PROT_REG >> 2), 0x52535445);
+       if (restart_reg_base) {
+               /* enable software reset "RSTE" */
+               out_be32(restart_reg_base + (RST_PROT_REG >> 2), 0x52535445);
+
+               /* set software hard reset */
+               out_be32(restart_reg_base + (RST_CTRL_REG >> 2), 0x2);
+       } else {
+               printk (KERN_EMERG "Error: Restart registers not mapped, spinning!\n");
+       }
 
-       /* set software hard reset */
-       out_be32(reg + (RST_CTRL_REG >> 2), 0x2);
        for (;;) ;
 }
 
index 4d471190be8dc8ea877ca35fbc893b29b42fc635..3ecb55f8a6e265c8c16607e3ba9221089d42b10b 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/initrd.h>
 
 #include <asm/of_device.h>
+#include <asm/of_platform.h>
 #include <asm/system.h>
 #include <asm/atomic.h>
 #include <asm/time.h>
@@ -153,7 +154,7 @@ static int __init mpc832x_declare_of_platform_devices(void)
 }
 device_initcall(mpc832x_declare_of_platform_devices);
 
-void __init mpc832x_sys_init_IRQ(void)
+static void __init mpc832x_sys_init_IRQ(void)
 {
 
        struct device_node *np;
index 314c42ac604834ea7dcf508bfe9a92c81a11bada..2446dea9407ec17a1a83b90ce225e62389bbe16b 100644 (file)
@@ -81,7 +81,7 @@ static void __init mpc834x_itx_setup_arch(void)
 #endif
 }
 
-void __init mpc834x_itx_init_IRQ(void)
+static void __init mpc834x_itx_init_IRQ(void)
 {
        struct device_node *np;
 
index 80b735a414d913c9840d3ccb776b470a431785e0..f30393f0b8320343e4ebf8f3c88af9b671ff7cae 100644 (file)
@@ -79,7 +79,7 @@ static void __init mpc834x_sys_setup_arch(void)
 #endif
 }
 
-void __init mpc834x_sys_init_IRQ(void)
+static void __init mpc834x_sys_init_IRQ(void)
 {
        struct device_node *np;
 
index 53b92a904e8e11a74ea1f76ad8b476008e23ebba..ccce2f9f283dad9b4db7542f54d93605774d2523 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/initrd.h>
 
 #include <asm/of_device.h>
+#include <asm/of_platform.h>
 #include <asm/system.h>
 #include <asm/atomic.h>
 #include <asm/time.h>
@@ -158,7 +159,7 @@ static int __init mpc8360_declare_of_platform_devices(void)
 }
 device_initcall(mpc8360_declare_of_platform_devices);
 
-void __init mpc8360_sys_init_IRQ(void)
+static void __init mpc8360_sys_init_IRQ(void)
 {
 
        struct device_node *np;
index d1ecc0f9ab586164277dd12c27021af74d00a836..0c70944d0e37464825b19fe2a68d4dafdc1863e1 100644 (file)
@@ -8,6 +8,7 @@ choice
 config MPC8641_HPCN
        bool "Freescale MPC8641 HPCN"
        select PPC_I8259
+       select DEFAULT_UIMAGE
        help
          This option enables support for the MPC8641 HPCN board.
 
index bb7fb41933ad8abe557ae857ceaaf5b8d3f22d53..7ef0c6854799b68bc2164bce879fd86f832a52d1 100644 (file)
@@ -65,7 +65,6 @@ smp_86xx_kick_cpu(int nr)
        pr_debug("smp_86xx_kick_cpu: kick CPU #%d\n", nr);
 
        local_irq_save(flags);
-       local_irq_disable();
 
        /* Save reset vector */
        save_vector = *vector;
index c8c0ba3cf8e89ab1f184a847c9489e0742c101b5..beea6834bb7e351f4a90913327893f496ef4013e 100644 (file)
+menu "Platform support"
+        depends on PPC_8xx
+
 config FADS
        bool
 
+config CPM1
+       bool
+
 choice
        prompt "8xx Machine Type"
        depends on 8xx
-       default RPXLITE
-
-config RPXLITE
-       bool "RPX-Lite"
-       ---help---
-         Single-board computers based around the PowerPC MPC8xx chips and
-         intended for embedded applications.  The following types are
-         supported:
-
-         RPX-Lite:
-         Embedded Planet RPX Lite. PC104 form-factor SBC based on the MPC823.
-
-         RPX-Classic:
-         Embedded Planet RPX Classic Low-fat. Credit-card-size SBC based on
-         the MPC 860
-
-         BSE-IP:
-         Bright Star Engineering ip-Engine.
-
-         TQM823L:
-         TQM850L:
-         TQM855L:
-         TQM860L:
-         MPC8xx based family of mini modules, half credit card size,
-         up to 64 MB of RAM, 8 MB Flash, (Fast) Ethernet, 2 x serial ports,
-         2 x CAN bus interface, ...
-         Manufacturer: TQ Components, www.tq-group.de
-         Date of Release: October (?) 1999
-         End of Life: not yet :-)
-         URL:
-         - module: <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>
-         - starter kit: <http://www.denx.de/PDF/STK8xxLHWM201.pdf>
-         - images: <http://www.denx.de/embedded-ppc-en.html>
-
-         FPS850L:
-         FingerPrint Sensor System (based on TQM850L)
-         Manufacturer: IKENDI AG, <http://www.ikendi.com/>
-         Date of Release: November 1999
-         End of life: end 2000 ?
-         URL: see TQM850L
-
-         IVMS8:
-         MPC860 based board used in the "Integrated Voice Mail System",
-         Small Version (8 voice channels)
-         Manufacturer: Speech Design, <http://www.speech-design.de/>
-         Date of Release: December 2000 (?)
-         End of life: -
-         URL: <http://www.speech-design.de/>
-
-         IVML24:
-         MPC860 based board used in the "Integrated Voice Mail System",
-         Large Version (24 voice channels)
-         Manufacturer: Speech Design, <http://www.speech-design.de/>
-         Date of Release: March 2001  (?)
-         End of life: -
-         URL: <http://www.speech-design.de/>
-
-         HERMES:
-         Hermes-Pro ISDN/LAN router with integrated 8 x hub
-         Manufacturer: Multidata Gesellschaft fur Datentechnik und Informatik
-         <http://www.multidata.de/>
-         Date of Release: 2000 (?)
-         End of life: -
-         URL: <http://www.multidata.de/english/products/hpro.htm>
-
-         IP860:
-         VMEBus IP (Industry Pack) carrier board with MPC860
-         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-         Date of Release: ?
-         End of life: -
-         URL: <http://www.microsys.de/html/ip860.html>
-
-         PCU_E:
-         PCU = Peripheral Controller Unit, Extended
-         Manufacturer: Siemens AG, ICN (Information and Communication Networks)
-               <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
-         Date of Release: April 2001
-         End of life: August 2001
-         URL: n. a.
-
-config RPXCLASSIC
-       bool "RPX-Classic"
-       help
-         The RPX-Classic is a single-board computer based on the Motorola
-         MPC860.  It features 16MB of DRAM and a variable amount of flash,
-         I2C EEPROM, thermal monitoring, a PCMCIA slot, a DIP switch and two
-         LEDs.  Variants with Ethernet ports exist.  Say Y here to support it
-         directly.
-
-config BSEIP
-       bool "BSE-IP"
-       help
-         Say Y here to support the Bright Star Engineering ipEngine SBC.
-         This is a credit-card-sized device featuring a MPC823 processor,
-         26MB DRAM, 4MB flash, Ethernet, a 16K-gate FPGA, USB, an LCD/video
-         controller, and two RS232 ports.
+       default MPC885ADS
 
 config MPC8XXFADS
        bool "FADS"
@@ -107,110 +18,58 @@ config MPC8XXFADS
 
 config MPC86XADS
        bool "MPC86XADS"
+       select CPM1
        help
          MPC86x Application Development System by Freescale Semiconductor.
          The MPC86xADS is meant to serve as a platform for s/w and h/w
          development around the MPC86X processor families.
-       select FADS
 
 config MPC885ADS
        bool "MPC885ADS"
+       select CPM1
        help
          Freescale Semiconductor MPC885 Application Development System (ADS).
          Also known as DUET.
          The MPC885ADS is meant to serve as a platform for s/w and h/w
          development around the MPC885 processor family.
 
-config TQM823L
-       bool "TQM823L"
-       help
-         Say Y here to support the TQM823L, one of an MPC8xx-based family of
-         mini SBCs (half credit-card size) from TQ Components first released
-         in late 1999.  Technical references are at
-         <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-         <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-         <http://www.denx.de/embedded-ppc-en.html>.
-
-config TQM850L
-       bool "TQM850L"
-       help
-         Say Y here to support the TQM850L, one of an MPC8xx-based family of
-         mini SBCs (half credit-card size) from TQ Components first released
-         in late 1999.  Technical references are at
-         <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-         <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-         <http://www.denx.de/embedded-ppc-en.html>.
-
-config TQM855L
-       bool "TQM855L"
-       help
-         Say Y here to support the TQM855L, one of an MPC8xx-based family of
-         mini SBCs (half credit-card size) from TQ Components first released
-         in late 1999.  Technical references are at
-         <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-         <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-         <http://www.denx.de/embedded-ppc-en.html>.
-
-config TQM860L
-       bool "TQM860L"
-       help
-         Say Y here to support the TQM860L, one of an MPC8xx-based family of
-         mini SBCs (half credit-card size) from TQ Components first released
-         in late 1999.  Technical references are at
-         <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-         <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-         <http://www.denx.de/embedded-ppc-en.html>.
-
-config FPS850L
-       bool "FPS850L"
-
-config IVMS8
-       bool "IVMS8"
-       help
-         Say Y here to support the Integrated Voice-Mail Small 8-channel SBC
-         from Speech Design, released March 2001.  The manufacturer's website
-         is at <http://www.speech-design.de/>.
-
-config IVML24
-       bool "IVML24"
-       help
-         Say Y here to support the Integrated Voice-Mail Large 24-channel SBC
-         from Speech Design, released March 2001.  The manufacturer's website
-         is at <http://www.speech-design.de/>.
-
-config HERMES_PRO
-       bool "HERMES"
-
-config IP860
-       bool "IP860"
-
-config LWMON
-       bool "LWMON"
-
-config PCU_E
-       bool "PCU_E"
-
-config CCM
-       bool "CCM"
-
-config LANTEC
-       bool "LANTEC"
+endchoice
 
-config MBX
-       bool "MBX"
-       help
-         MBX is a line of Motorola single-board computer based around the
-         MPC821 and MPC860 processors, and intended for embedded-controller
-         applications.  Say Y here to support these boards directly.
+menu "Freescale Ethernet driver platform-specific options"
+        depends on (FS_ENET && MPC885ADS)
+
+        config MPC8xx_SECOND_ETH
+        bool "Second Ethernet channel"
+        depends on MPC885ADS
+        default y
+        help
+          This enables support for second Ethernet on MPC885ADS and MPC86xADS boards.
+          The latter will use SCC1, for 885ADS you can select it below.
+
+        choice
+                prompt "Second Ethernet channel"
+                depends on MPC8xx_SECOND_ETH
+                default MPC8xx_SECOND_ETH_FEC2
+
+                config MPC8xx_SECOND_ETH_FEC2
+                bool "FEC2"
+                depends on MPC885ADS
+                help
+                  Enable FEC2 to serve as 2-nd Ethernet channel. Note that SMC2
+                  (often 2-nd UART) will not work if this is enabled.
+
+                config MPC8xx_SECOND_ETH_SCC3
+                bool "SCC3"
+                depends on MPC885ADS
+                help
+                  Enable SCC3 to serve as 2-nd Ethernet channel. Note that SMC1
+                  (often 1-nd UART) will not work if this is enabled.
+
+        endchoice
 
-config WINCEPT
-       bool "WinCept"
-       help
-         The Wincept 100/110 is a Motorola single-board computer based on the
-         MPC821 PowerPC, introduced in 1998 and designed to be used in
-         thin-client machines.  Say Y to support it directly.
+endmenu
 
-endchoice
+endmenu
 
 #
 # MPC8xx Communication options
@@ -219,79 +78,6 @@ endchoice
 menu "MPC8xx CPM Options"
        depends on 8xx
 
-config SCC_ENET
-       bool "CPM SCC Ethernet"
-       depends on NET_ETHERNET
-       help
-         Enable Ethernet support via the Motorola MPC8xx serial
-         communications controller.
-
-choice
-       prompt "SCC used for Ethernet"
-       depends on SCC_ENET
-       default SCC1_ENET
-
-config SCC1_ENET
-       bool "SCC1"
-       help
-         Use MPC8xx serial communications controller 1 to drive Ethernet
-         (default).
-
-config SCC2_ENET
-       bool "SCC2"
-       help
-         Use MPC8xx serial communications controller 2 to drive Ethernet.
-
-config SCC3_ENET
-       bool "SCC3"
-       help
-         Use MPC8xx serial communications controller 3 to drive Ethernet.
-
-endchoice
-
-config FEC_ENET
-       bool "860T FEC Ethernet"
-       depends on NET_ETHERNET
-       help
-         Enable Ethernet support via the Fast Ethernet Controller (FCC) on
-         the Motorola MPC8260.
-
-config USE_MDIO
-       bool "Use MDIO for PHY configuration"
-       depends on FEC_ENET
-       help
-         On some boards the hardware configuration of the ethernet PHY can be
-         used without any software interaction over the MDIO interface, so
-         all MII code can be omitted. Say N here if unsure or if you don't
-         need link status reports.
-
-config  FEC_AM79C874
-       bool "Support AMD79C874 PHY"
-       depends on USE_MDIO
-
-config FEC_LXT970
-       bool "Support LXT970 PHY"
-       depends on USE_MDIO
-
-config FEC_LXT971
-       bool "Support LXT971 PHY"
-       depends on USE_MDIO
-       
-config FEC_QS6612
-       bool "Support QS6612 PHY"
-       depends on USE_MDIO
-       
-config ENET_BIG_BUFFERS
-       bool "Use Big CPM Ethernet Buffers"
-       depends on SCC_ENET || FEC_ENET
-       help
-         Allocate large buffers for MPC8xx Ethernet. Increases throughput
-         and decreases the likelihood of dropped packets, but costs memory.
-
-config HTDMSOUND
-       bool "Embedded Planet HIOX Audio"
-       depends on SOUND=y
-
 # This doesn't really belong here, but it is convenient to ask
 # 8xx specific questions.
 comment "Generic MPC8xx Options"
diff --git a/arch/powerpc/platforms/8xx/Makefile b/arch/powerpc/platforms/8xx/Makefile
new file mode 100644 (file)
index 0000000..5e2dae3
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# Makefile for the PowerPC 8xx linux kernel.
+#
+obj-$(CONFIG_PPC_8xx)    += m8xx_setup.o
+obj-$(CONFIG_MPC885ADS)   += mpc885ads_setup.o
+obj-$(CONFIG_MPC86XADS)   += mpc86xads_setup.o
diff --git a/arch/powerpc/platforms/8xx/m8xx_setup.c b/arch/powerpc/platforms/8xx/m8xx_setup.c
new file mode 100644 (file)
index 0000000..9ed7125
--- /dev/null
@@ -0,0 +1,303 @@
+/*
+ *  Copyright (C) 1995  Linus Torvalds
+ *  Adapted from 'alpha' version by Gary Thomas
+ *  Modified by Cort Dougan (cort@cs.nmt.edu)
+ *  Modified for MBX using prep/chrp/pmac functions by Dan (dmalek@jlc.net)
+ *  Further modified for generic 8xx by Dan.
+ */
+
+/*
+ * bootup setup stuff..
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/tty.h>
+#include <linux/major.h>
+#include <linux/interrupt.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+#include <linux/initrd.h>
+#include <linux/ioport.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/time.h>
+#include <linux/rtc.h>
+
+#include <asm/mmu.h>
+#include <asm/reg.h>
+#include <asm/residual.h>
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/mpc8xx.h>
+#include <asm/8xx_immap.h>
+#include <asm/machdep.h>
+#include <asm/bootinfo.h>
+#include <asm/time.h>
+#include <asm/prom.h>
+#include <asm/fs_pd.h>
+#include <mm/mmu_decl.h>
+
+#include "sysdev/mpc8xx_pic.h"
+
+void m8xx_calibrate_decr(void);
+extern void m8xx_wdt_handler_install(bd_t *bp);
+extern int cpm_pic_init(void);
+extern int cpm_get_irq(void);
+
+/* A place holder for time base interrupts, if they are ever enabled. */
+irqreturn_t timebase_interrupt(int irq, void * dev)
+{
+       printk ("timebase_interrupt()\n");
+
+       return IRQ_HANDLED;
+}
+
+static struct irqaction tbint_irqaction = {
+       .handler = timebase_interrupt,
+       .mask = CPU_MASK_NONE,
+       .name = "tbint",
+};
+
+/* per-board overridable init_internal_rtc() function. */
+void __init __attribute__ ((weak))
+init_internal_rtc(void)
+{
+       sit8xx_t *sys_tmr = (sit8xx_t *) immr_map(im_sit);
+
+       /* Disable the RTC one second and alarm interrupts. */
+       clrbits16(&sys_tmr->sit_rtcsc, (RTCSC_SIE | RTCSC_ALE));
+
+       /* Enable the RTC */
+       setbits16(&sys_tmr->sit_rtcsc, (RTCSC_RTF | RTCSC_RTE));
+       immr_unmap(sys_tmr);
+}
+
+static int __init get_freq(char *name, unsigned long *val)
+{
+        struct device_node *cpu;
+        unsigned int *fp;
+        int found = 0;
+
+        /* The cpu node should have timebase and clock frequency properties */
+        cpu = of_find_node_by_type(NULL, "cpu");
+
+        if (cpu) {
+                fp = (unsigned int *)get_property(cpu, name, NULL);
+                if (fp) {
+                        found = 1;
+                        *val = *fp++;
+                }
+
+                of_node_put(cpu);
+        }
+
+        return found;
+}
+
+/* The decrementer counts at the system (internal) clock frequency divided by
+ * sixteen, or external oscillator divided by four.  We force the processor
+ * to use system clock divided by sixteen.
+ */
+void __init mpc8xx_calibrate_decr(void)
+{
+       struct device_node *cpu;
+       cark8xx_t *clk_r1;
+       car8xx_t *clk_r2;
+       sitk8xx_t *sys_tmr1;
+       sit8xx_t *sys_tmr2;
+       int irq, virq;
+
+        clk_r1 = (cark8xx_t *) immr_map(im_clkrstk);
+
+       /* Unlock the SCCR. */
+       out_be32(&clk_r1->cark_sccrk, ~KAPWR_KEY);
+       out_be32(&clk_r1->cark_sccrk, KAPWR_KEY);
+       immr_unmap(clk_r1);
+
+       /* Force all 8xx processors to use divide by 16 processor clock. */
+        clk_r2 = (car8xx_t *) immr_map(im_clkrst);
+       setbits32(&clk_r2->car_sccr, 0x02000000);
+       immr_unmap(clk_r2);
+
+       /* Processor frequency is MHz.
+        */
+        ppc_tb_freq = 50000000;
+        if (!get_freq("bus-frequency", &ppc_tb_freq)) {
+                printk(KERN_ERR "WARNING: Estimating decrementer frequency "
+                                "(not found)\n");
+        }
+        ppc_tb_freq /= 16;
+        ppc_proc_freq = 50000000;
+        if (!get_freq("clock-frequency", &ppc_proc_freq))
+                printk(KERN_ERR "WARNING: Estimating processor frequency"
+                                "(not found)\n");
+
+        printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
+
+       /* Perform some more timer/timebase initialization.  This used
+        * to be done elsewhere, but other changes caused it to get
+        * called more than once....that is a bad thing.
+        *
+        * First, unlock all of the registers we are going to modify.
+        * To protect them from corruption during power down, registers
+        * that are maintained by keep alive power are "locked".  To
+        * modify these registers we have to write the key value to
+        * the key location associated with the register.
+        * Some boards power up with these unlocked, while others
+        * are locked.  Writing anything (including the unlock code?)
+        * to the unlocked registers will lock them again.  So, here
+        * we guarantee the registers are locked, then we unlock them
+        * for our use.
+        */
+        sys_tmr1 = (sitk8xx_t *) immr_map(im_sitk);
+       out_be32(&sys_tmr1->sitk_tbscrk, ~KAPWR_KEY);
+       out_be32(&sys_tmr1->sitk_rtcsck, ~KAPWR_KEY);
+       out_be32(&sys_tmr1->sitk_tbk, ~KAPWR_KEY);
+       out_be32(&sys_tmr1->sitk_tbscrk, KAPWR_KEY);
+       out_be32(&sys_tmr1->sitk_rtcsck, KAPWR_KEY);
+       out_be32(&sys_tmr1->sitk_tbk, KAPWR_KEY);
+       immr_unmap(sys_tmr1);
+
+       init_internal_rtc();
+
+       /* Enabling the decrementer also enables the timebase interrupts
+        * (or from the other point of view, to get decrementer interrupts
+        * we have to enable the timebase).  The decrementer interrupt
+        * is wired into the vector table, nothing to do here for that.
+        */
+        cpu = of_find_node_by_type(NULL, "cpu");
+        virq= irq_of_parse_and_map(cpu, 0);
+       irq = irq_map[virq].hwirq;
+
+       sys_tmr2 = (sit8xx_t *) immr_map(im_sit);
+       out_be16(&sys_tmr2->sit_tbscr, ((1 << (7 - (irq/2))) << 8) |
+                                       (TBSCR_TBF | TBSCR_TBE));
+       immr_unmap(sys_tmr2);
+
+       if (setup_irq(virq, &tbint_irqaction))
+               panic("Could not allocate timer IRQ!");
+
+#ifdef CONFIG_8xx_WDT
+       /* Install watchdog timer handler early because it might be
+        * already enabled by the bootloader
+        */
+       m8xx_wdt_handler_install(binfo);
+#endif
+}
+
+/* The RTC on the MPC8xx is an internal register.
+ * We want to protect this during power down, so we need to unlock,
+ * modify, and re-lock.
+ */
+
+int mpc8xx_set_rtc_time(struct rtc_time *tm)
+{
+       sitk8xx_t *sys_tmr1;
+       sit8xx_t *sys_tmr2;
+       int time;
+
+        sys_tmr1 = (sitk8xx_t *) immr_map(im_sitk);
+       sys_tmr2 = (sit8xx_t *) immr_map(im_sit);
+       time = mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
+                      tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+       out_be32(&sys_tmr1->sitk_rtck, KAPWR_KEY);
+       out_be32(&sys_tmr2->sit_rtc, time);
+       out_be32(&sys_tmr1->sitk_rtck, ~KAPWR_KEY);
+
+       immr_unmap(sys_tmr2);
+       immr_unmap(sys_tmr1);
+       return 0;
+}
+
+void mpc8xx_get_rtc_time(struct rtc_time *tm)
+{
+       unsigned long data;
+       sit8xx_t *sys_tmr = (sit8xx_t *) immr_map(im_sit);
+
+       /* Get time from the RTC. */
+       data = in_be32(&sys_tmr->sit_rtc);
+       to_tm(data, tm);
+        tm->tm_year -= 1900;
+        tm->tm_mon -= 1;
+       immr_unmap(sys_tmr);
+       return;
+}
+
+void mpc8xx_restart(char *cmd)
+{
+       __volatile__ unsigned char dummy;
+       car8xx_t * clk_r = (car8xx_t *) immr_map(im_clkrst);
+
+
+       local_irq_disable();
+
+       setbits32(&clk_r->car_plprcr, 0x00000080);
+       /* Clear the ME bit in MSR to cause checkstop on machine check
+       */
+       mtmsr(mfmsr() & ~0x1000);
+
+       dummy = in_8(&clk_r->res[0]);
+       printk("Restart failed\n");
+       while(1);
+}
+
+void mpc8xx_show_cpuinfo(struct seq_file *m)
+{
+       struct device_node *root;
+       uint memsize = total_memory;
+       const char *model = "";
+
+       seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n");
+
+       root = of_find_node_by_path("/");
+       if (root)
+               model = get_property(root, "model", NULL);
+       seq_printf(m, "Machine\t\t: %s\n", model);
+       of_node_put(root);
+
+       seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
+}
+
+static void cpm_cascade(unsigned int irq, struct irq_desc *desc)
+{
+       int cascade_irq;
+
+       if ((cascade_irq = cpm_get_irq()) >= 0) {
+               struct irq_desc *cdesc = irq_desc + cascade_irq;
+
+               generic_handle_irq(cascade_irq);
+               cdesc->chip->eoi(cascade_irq);
+       }
+       desc->chip->eoi(irq);
+}
+
+/* Initialize the internal interrupt controller.  The number of
+ * interrupts supported can vary with the processor type, and the
+ * 82xx family can have up to 64.
+ * External interrupts can be either edge or level triggered, and
+ * need to be initialized by the appropriate driver.
+ */
+void __init m8xx_pic_init(void)
+{
+       int irq;
+
+       if (mpc8xx_pic_init()) {
+                printk(KERN_ERR "Failed interrupt 8xx controller  initialization\n");
+               return;
+       }
+
+       irq = cpm_pic_init();
+       if (irq != NO_IRQ)
+               set_irq_chained_handler(irq, cpm_cascade);
+}
diff --git a/arch/powerpc/platforms/8xx/mpc86xads.h b/arch/powerpc/platforms/8xx/mpc86xads.h
new file mode 100644 (file)
index 0000000..b5d19dd
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * A collection of structures, addresses, and values associated with
+ * the Freescale MPC86xADS board.
+ * Copied from the FADS stuff.
+ *
+ * Author: MontaVista Software, Inc.
+ *         source@mvista.com
+ *
+ * 2005 (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.
+ */
+
+#ifdef __KERNEL__
+#ifndef __ASM_MPC86XADS_H__
+#define __ASM_MPC86XADS_H__
+
+#include <asm/ppcboot.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 IMAP_ADDR              (get_immrbase())
+#define IMAP_SIZE              ((uint)(64 * 1024))
+
+#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)
+#define BCSR1_IRDAEN           ((uint)0x10000000)
+#define BCSR1_RS232EN_1                ((uint)0x01000000)
+#define BCSR1_PCCEN            ((uint)0x00800000)
+#define BCSR1_PCCVCC0          ((uint)0x00400000)
+#define BCSR1_PCCVPP0          ((uint)0x00200000)
+#define BCSR1_PCCVPP1          ((uint)0x00100000)
+#define BCSR1_PCCVPP_MASK      (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
+#define BCSR1_RS232EN_2                ((uint)0x00040000)
+#define BCSR1_PCCVCC1          ((uint)0x00010000)
+#define BCSR1_PCCVCC_MASK      (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
+
+#define BCSR4_ETH10_RST                ((uint)0x80000000)      /* 10Base-T PHY reset*/
+#define BCSR4_USB_LO_SPD       ((uint)0x04000000)
+#define BCSR4_USB_VCC          ((uint)0x02000000)
+#define BCSR4_USB_FULL_SPD     ((uint)0x00040000)
+#define BCSR4_USB_EN           ((uint)0x00020000)
+
+#define BCSR5_MII2_EN          0x40
+#define BCSR5_MII2_RST         0x20
+#define BCSR5_T1_RST           0x10
+#define BCSR5_ATM155_RST       0x08
+#define BCSR5_ATM25_RST                0x04
+#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 --git a/arch/powerpc/platforms/8xx/mpc86xads_setup.c b/arch/powerpc/platforms/8xx/mpc86xads_setup.c
new file mode 100644 (file)
index 0000000..ef52ce7
--- /dev/null
@@ -0,0 +1,301 @@
+/*arch/ppc/platforms/mpc86xads-setup.c
+ *
+ * Platform setup for the Freescale mpc86xads board
+ *
+ * Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * Copyright 2005 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/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 <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/ppcboot.h>
+#include <asm/mpc8xx.h>
+#include <asm/8xx_immap.h>
+#include <asm/commproc.h>
+#include <asm/fs_pd.h>
+#include <asm/prom.h>
+
+extern void cpm_reset(void);
+extern void mpc8xx_show_cpuinfo(struct seq_file*);
+extern void mpc8xx_restart(char *cmd);
+extern void mpc8xx_calibrate_decr(void);
+extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
+extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
+extern void m8xx_pic_init(void);
+extern unsigned int mpc8xx_get_irq(void);
+
+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);
+
+       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);
+}
+
+
+static void init_fec1_ioports(struct fs_platform_info* ptr)
+{
+       iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
+
+       /* configure FEC1 pins  */
+
+       setbits16(&io_port->iop_pdpar, 0x1fff);
+       setbits16(&io_port->iop_pddir, 0x1fff);
+
+       immr_unmap(io_port);
+}
+
+void init_fec_ioports(struct fs_platform_info *fpi)
+{
+       int fec_no = fs_get_fec_index(fpi->fs_no);
+
+       switch (fec_no) {
+       case 0:
+               init_fec1_ioports(fpi);
+               break;
+       default:
+               printk(KERN_ERR "init_fec_ioports: invalid FEC number\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);
+
+       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);
+       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)
+{
+        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);
+}
+
+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);
+}
+
+void init_smc_ioports(struct fs_uart_platform_info *data)
+{
+       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;
+       }
+}
+
+int platform_device_skip(char *model, int id)
+{
+       return 0;
+}
+
+static void __init mpc86xads_setup_arch(void)
+{
+       struct device_node *cpu;
+
+       cpu = of_find_node_by_type(NULL, "cpu");
+       if (cpu != 0) {
+               const unsigned int *fp;
+
+               fp = get_property(cpu, "clock-frequency", NULL);
+               if (fp != 0)
+                       loops_per_jiffy = *fp / HZ;
+               else
+                       loops_per_jiffy = 50000000 / HZ;
+               of_node_put(cpu);
+       }
+
+       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;
+}
+
+define_machine(mpc86x_ads) {
+       .name                   = "MPC86x ADS",
+       .probe                  = mpc86xads_probe,
+       .setup_arch             = mpc86xads_setup_arch,
+       .init_IRQ               = m8xx_pic_init,
+       .show_cpuinfo           = mpc8xx_show_cpuinfo,
+       .get_irq                = mpc8xx_get_irq,
+       .restart                = mpc8xx_restart,
+       .calibrate_decr         = mpc8xx_calibrate_decr,
+       .set_rtc_time           = mpc8xx_set_rtc_time,
+       .get_rtc_time           = mpc8xx_get_rtc_time,
+};
diff --git a/arch/powerpc/platforms/8xx/mpc885ads.h b/arch/powerpc/platforms/8xx/mpc885ads.h
new file mode 100644 (file)
index 0000000..30cbebf
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * A collection of structures, addresses, and values associated with
+ * the Freescale MPC885ADS board.
+ * Copied from the FADS stuff.
+ *
+ * Author: MontaVista Software, Inc.
+ *         source@mvista.com
+ *
+ * 2005 (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.
+ */
+
+#ifdef __KERNEL__
+#ifndef __ASM_MPC885ADS_H__
+#define __ASM_MPC885ADS_H__
+
+#include <asm/ppcboot.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 IMAP_ADDR              (get_immrbase())
+#define IMAP_SIZE              ((uint)(64 * 1024))
+
+#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)
+#define BCSR1_IRDAEN           ((uint)0x10000000)
+#define BCSR1_RS232EN_1                ((uint)0x01000000)
+#define BCSR1_PCCEN            ((uint)0x00800000)
+#define BCSR1_PCCVCC0          ((uint)0x00400000)
+#define BCSR1_PCCVPP0          ((uint)0x00200000)
+#define BCSR1_PCCVPP1          ((uint)0x00100000)
+#define BCSR1_PCCVPP_MASK      (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
+#define BCSR1_RS232EN_2                ((uint)0x00040000)
+#define BCSR1_PCCVCC1          ((uint)0x00010000)
+#define BCSR1_PCCVCC_MASK      (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
+
+#define BCSR4_ETH10_RST                ((uint)0x80000000)      /* 10Base-T PHY reset*/
+#define BCSR4_USB_LO_SPD       ((uint)0x04000000)
+#define BCSR4_USB_VCC          ((uint)0x02000000)
+#define BCSR4_USB_FULL_SPD     ((uint)0x00040000)
+#define BCSR4_USB_EN           ((uint)0x00020000)
+
+#define BCSR5_MII2_EN          0x40
+#define BCSR5_MII2_RST         0x20
+#define BCSR5_T1_RST           0x10
+#define BCSR5_ATM155_RST       0x08
+#define BCSR5_ATM25_RST                0x04
+#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 SIU_INT_FEC2   SIU_LEVEL3      /* FEC2 interrupt */
+#define FEC_INTERRUPT  SIU_INT_FEC1    /* FEC interrupt */
+
+/* We don't use the 8259 */
+#define NR_8259_INTS   0
+
+/* CPM Ethernet through SCC3 */
+#define PA_ENET_RXD    ((ushort)0x0040)
+#define PA_ENET_TXD    ((ushort)0x0080)
+#define PE_ENET_TCLK   ((uint)0x00004000)
+#define PE_ENET_RCLK   ((uint)0x00008000)
+#define PE_ENET_TENA   ((uint)0x00000010)
+#define PC_ENET_CLSN   ((ushort)0x0400)
+#define PC_ENET_RENA   ((ushort)0x0800)
+
+/* Control bits in the SICR to route TCLK (CLK5) and RCLK (CLK6) to
+ * SCC3.  Also, make sure GR3 (bit 8) and SC3 (bit 9) are zero */
+#define SICR_ENET_MASK ((uint)0x00ff0000)
+#define SICR_ENET_CLKRT        ((uint)0x002c0000)
+
+#endif /* __ASM_MPC885ADS_H__ */
+#endif /* __KERNEL__ */
diff --git a/arch/powerpc/platforms/8xx/mpc885ads_setup.c b/arch/powerpc/platforms/8xx/mpc885ads_setup.c
new file mode 100644 (file)
index 0000000..c5fefdf
--- /dev/null
@@ -0,0 +1,387 @@
+/*arch/ppc/platforms/mpc885ads-setup.c
+ *
+ * Platform setup for the Freescale mpc885ads board
+ *
+ * Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * Copyright 2005 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/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 <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/ppcboot.h>
+#include <asm/mpc8xx.h>
+#include <asm/8xx_immap.h>
+#include <asm/commproc.h>
+#include <asm/fs_pd.h>
+#include <asm/prom.h>
+
+extern void cpm_reset(void);
+extern void mpc8xx_show_cpuinfo(struct seq_file*);
+extern void mpc8xx_restart(char *cmd);
+extern void mpc8xx_calibrate_decr(void);
+extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
+extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
+extern void m8xx_pic_init(void);
+extern unsigned int mpc8xx_get_irq(void);
+
+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_scc3_ioports(struct fs_platform_info* ptr);
+
+void __init mpc885ads_board_setup(void)
+{
+       cpm8xx_t *cp;
+       unsigned int *bcsr_io;
+       u8 tmpval8;
+
+#ifdef CONFIG_FS_ENET
+       iop8xx_t *io_port;
+#endif
+
+       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
+       cp = (cpm8xx_t *)immr_map(im_cpm);
+
+       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);     /* brg1 */
+#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);
+
+#ifdef CONFIG_FS_ENET
+       /* use MDC for MII (common) */
+       io_port = (iop8xx_t*)immr_map(im_ioport);
+       setbits16(&io_port->iop_pdpar, 0x0080);
+       clrbits16(&io_port->iop_pddir, 0x0080);
+
+       bcsr_io = ioremap(BCSR5, sizeof(unsigned long));
+       clrbits32(bcsr_io,BCSR5_MII1_EN);
+       clrbits32(bcsr_io,BCSR5_MII1_RST);
+#ifndef CONFIG_FC_ENET_HAS_SCC
+       clrbits32(bcsr_io,BCSR5_MII2_EN);
+       clrbits32(bcsr_io,BCSR5_MII2_RST);
+
+#endif
+       iounmap(bcsr_io);
+       immr_unmap(io_port);
+
+#endif
+}
+
+
+static void init_fec1_ioports(struct fs_platform_info* ptr)
+{
+       cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
+       iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
+
+       /* configure FEC1 pins  */
+       setbits16(&io_port->iop_papar, 0xf830);
+       setbits16(&io_port->iop_padir, 0x0830);
+       clrbits16(&io_port->iop_padir, 0xf000);
+
+       setbits32(&cp->cp_pbpar, 0x00001001);
+       clrbits32(&cp->cp_pbdir, 0x00001001);
+
+       setbits16(&io_port->iop_pcpar, 0x000c);
+       clrbits16(&io_port->iop_pcdir, 0x000c);
+
+       setbits32(&cp->cp_pepar, 0x00000003);
+       setbits32(&cp->cp_pedir, 0x00000003);
+       clrbits32(&cp->cp_peso, 0x00000003);
+       clrbits32(&cp->cp_cptr, 0x00000100);
+
+       immr_unmap(io_port);
+       immr_unmap(cp);
+}
+
+
+static void init_fec2_ioports(struct fs_platform_info* ptr)
+{
+       cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
+       iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
+
+       /* configure FEC2 pins */
+       setbits32(&cp->cp_pepar, 0x0003fffc);
+       setbits32(&cp->cp_pedir, 0x0003fffc);
+       clrbits32(&cp->cp_peso, 0x000087fc);
+       setbits32(&cp->cp_peso, 0x00037800);
+       clrbits32(&cp->cp_cptr, 0x00000080);
+
+       immr_unmap(io_port);
+       immr_unmap(cp);
+}
+
+void init_fec_ioports(struct fs_platform_info *fpi)
+{
+       int fec_no = fs_get_fec_index(fpi->fs_no);
+
+       switch (fec_no) {
+       case 0:
+               init_fec1_ioports(fpi);
+               break;
+       case 1:
+               init_fec2_ioports(fpi);
+               break;
+       default:
+               printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
+               return;
+       }
+}
+
+static void init_scc3_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);
+
+       if (bcsr_io == NULL) {
+               printk(KERN_CRIT "Could not remap BCSR\n");
+               return;
+       }
+
+       /* Enable the PHY.
+        */
+       clrbits32(bcsr_io+4, BCSR4_ETH10_RST);
+       udelay(1000);
+       setbits32(bcsr_io+4, BCSR4_ETH10_RST);
+       /* 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);
+
+       /* 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 E for TCLK and RCLK.
+        */
+       setbits32(&cp->cp_pepar, PE_ENET_TCLK | PE_ENET_RCLK);
+       clrbits32(&cp->cp_pepar, PE_ENET_TENA);
+       clrbits32(&cp->cp_pedir,
+                 PE_ENET_TCLK | PE_ENET_RCLK | PE_ENET_TENA);
+       clrbits32(&cp->cp_peso, PE_ENET_TCLK | PE_ENET_RCLK);
+       setbits32(&cp->cp_peso, PE_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);
+
+       /* Disable Rx and Tx. SMC1 sshould be stopped if SCC3 eternet are used.
+        */
+       clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
+       /* On the MPC885ADS SCC ethernet PHY is initialized in the full duplex mode
+        * by H/W setting after reset. SCC ethernet controller support only half duplex.
+        * This discrepancy of modes causes a lot of carrier lost errors.
+        */
+
+       /* In the original SCC enet driver the following code is placed at
+          the end of the initialization */
+       setbits32(&cp->cp_pepar, PE_ENET_TENA);
+       clrbits32(&cp->cp_pedir, PE_ENET_TENA);
+       setbits32(&cp->cp_peso, PE_ENET_TENA);
+
+       setbits32(bcsr_io+4, BCSR1_ETHEN);
+       iounmap(bcsr_io);
+       immr_unmap(io_port);
+       immr_unmap(cp);
+}
+
+void init_scc_ioports(struct fs_platform_info *fpi)
+{
+       int scc_no = fs_get_scc_index(fpi->fs_no);
+
+       switch (scc_no) {
+       case 2:
+               init_scc3_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)
+{
+        unsigned *bcsr_io;
+       cpm8xx_t *cp;
+
+       cp = (cpm8xx_t *)immr_map(im_cpm);
+       setbits32(&cp->cp_pepar, 0x000000c0);
+       clrbits32(&cp->cp_pedir, 0x000000c0);
+       clrbits32(&cp->cp_peso, 0x00000040);
+       setbits32(&cp->cp_peso, 0x00000080);
+       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);
+}
+
+static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi)
+{
+        unsigned *bcsr_io;
+       cpm8xx_t *cp;
+
+       cp = (cpm8xx_t *)immr_map(im_cpm);
+       setbits32(&cp->cp_pepar, 0x00000c00);
+       clrbits32(&cp->cp_pedir, 0x00000c00);
+       clrbits32(&cp->cp_peso, 0x00000400);
+       setbits32(&cp->cp_peso, 0x00000800);
+       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);
+}
+
+void init_smc_ioports(struct fs_uart_platform_info *data)
+{
+       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;
+       }
+}
+
+int platform_device_skip(char *model, int id)
+{
+#ifdef CONFIG_MPC8xx_SECOND_ETH_SCC3
+       const char *dev = "FEC";
+       int n = 2;
+#else
+       const char *dev = "SCC";
+       int n = 3;
+#endif
+
+       if (!strcmp(model, dev) && n == id)
+               return 1;
+
+       return 0;
+}
+
+static void __init mpc885ads_setup_arch(void)
+{
+       struct device_node *cpu;
+
+       cpu = of_find_node_by_type(NULL, "cpu");
+       if (cpu != 0) {
+               const unsigned int *fp;
+
+               fp = get_property(cpu, "clock-frequency", NULL);
+               if (fp != 0)
+                       loops_per_jiffy = *fp / HZ;
+               else
+                       loops_per_jiffy = 50000000 / HZ;
+               of_node_put(cpu);
+       }
+
+       cpm_reset();
+
+       mpc885ads_board_setup();
+
+       ROOT_DEV = Root_NFS;
+}
+
+static int __init mpc885ads_probe(void)
+{
+       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
+                                         "model", NULL);
+       if (model == NULL)
+               return 0;
+       if (strcmp(model, "MPC885ADS"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(mpc885_ads) {
+       .name                   = "MPC885 ADS",
+       .probe                  = mpc885ads_probe,
+       .setup_arch             = mpc885ads_setup_arch,
+       .init_IRQ               = m8xx_pic_init,
+       .show_cpuinfo           = mpc8xx_show_cpuinfo,
+       .get_irq                = mpc8xx_get_irq,
+       .restart                = mpc8xx_restart,
+       .calibrate_decr         = mpc8xx_calibrate_decr,
+       .set_rtc_time           = mpc8xx_set_rtc_time,
+       .get_rtc_time           = mpc8xx_get_rtc_time,
+};
index 507d1b98f270521776a3596d6c4b1b6226abe01c..65e612315b9bd6e4f80314a95a8f0a5cd179e046 100644 (file)
@@ -8,6 +8,8 @@ endif
 obj-$(CONFIG_PPC_MPC52xx)      += 52xx/
 obj-$(CONFIG_PPC_CHRP)         += chrp/
 obj-$(CONFIG_4xx)              += 4xx/
+obj-$(CONFIG_PPC_8xx)          += 8xx/
+obj-$(CONFIG_PPC_82xx)         += 82xx/
 obj-$(CONFIG_PPC_83xx)         += 83xx/
 obj-$(CONFIG_PPC_85xx)         += 85xx/
 obj-$(CONFIG_PPC_86xx)         += 86xx/
@@ -17,4 +19,5 @@ obj-$(CONFIG_PPC_MAPLE)               += maple/
 obj-$(CONFIG_PPC_PASEMI)       += pasemi/
 obj-$(CONFIG_PPC_CELL)         += cell/
 obj-$(CONFIG_PPC_PS3)          += ps3/
+obj-$(CONFIG_PPC_CELLEB)       += celleb/
 obj-$(CONFIG_EMBEDDED6xx)      += embedded6xx/
index f90e8337796cbe3b35046db8c145579f5e398e14..869af89df6ffe0daaee14ed9f4bda25eecb3247d 100644 (file)
@@ -14,7 +14,12 @@ endif
 spufs-modular-$(CONFIG_SPU_FS)         += spu_syscalls.o
 spu-priv1-$(CONFIG_PPC_CELL_NATIVE)    += spu_priv1_mmio.o
 
+spu-manage-$(CONFIG_PPC_CELLEB)                += spu_manage.o
+spu-manage-$(CONFIG_PPC_CELL_NATIVE)   += spu_manage.o
+
 obj-$(CONFIG_SPU_BASE)                 += spu_callbacks.o spu_base.o \
                                           spu_coredump.o \
                                           $(spufs-modular-m) \
-                                          $(spu-priv1-y) spufs/
+                                          $(spu-priv1-y) \
+                                          $(spu-manage-y) \
+                                          spufs/
index bd7bffc3ddd08be19caf0a15572b5e727c6f0cd2..c43999a10deb76fd07cfc63146728210f3314a0b 100644 (file)
@@ -170,9 +170,11 @@ int
 spu_irq_class_0_bottom(struct spu *spu)
 {
        unsigned long stat, mask;
+       unsigned long flags;
 
        spu->class_0_pending = 0;
 
+       spin_lock_irqsave(&spu->register_lock, flags);
        mask = spu_int_mask_get(spu, 0);
        stat = spu_int_stat_get(spu, 0);
 
@@ -188,6 +190,7 @@ spu_irq_class_0_bottom(struct spu *spu)
                __spu_trap_error(spu);
 
        spu_int_stat_clear(spu, 0, stat);
+       spin_unlock_irqrestore(&spu->register_lock, flags);
 
        return (stat & 0x7) ? -EIO : 0;
 }
diff --git a/arch/powerpc/platforms/cell/spu_manage.c b/arch/powerpc/platforms/cell/spu_manage.c
new file mode 100644 (file)
index 0000000..d8b39fe
--- /dev/null
@@ -0,0 +1,420 @@
+/*
+ * spu management operations for of based platforms
+ *
+ * (C) Copyright IBM Deutschland Entwicklung GmbH 2005
+ * Copyright 2006 Sony Corp.
+ * (C) Copyright 2007 TOSHIBA 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.
+ *
+ * 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.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/wait.h>
+#include <linux/mm.h>
+#include <linux/io.h>
+#include <linux/mutex.h>
+#include <linux/device.h>
+
+#include <asm/spu.h>
+#include <asm/spu_priv1.h>
+#include <asm/firmware.h>
+#include <asm/prom.h>
+
+#include "interrupt.h"
+
+struct device_node *spu_devnode(struct spu *spu)
+{
+       return spu->devnode;
+}
+
+EXPORT_SYMBOL_GPL(spu_devnode);
+
+static u64 __init find_spu_unit_number(struct device_node *spe)
+{
+       const unsigned int *prop;
+       int proplen;
+       prop = get_property(spe, "unit-id", &proplen);
+       if (proplen == 4)
+               return (u64)*prop;
+
+       prop = get_property(spe, "reg", &proplen);
+       if (proplen == 4)
+               return (u64)*prop;
+
+       return 0;
+}
+
+static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
+               const char *prop)
+{
+       const struct address_prop {
+               unsigned long address;
+               unsigned int len;
+       } __attribute__((packed)) *p;
+       int proplen;
+
+       unsigned long start_pfn, nr_pages;
+       struct pglist_data *pgdata;
+       struct zone *zone;
+       int ret;
+
+       p = get_property(spe, prop, &proplen);
+       WARN_ON(proplen != sizeof (*p));
+
+       start_pfn = p->address >> PAGE_SHIFT;
+       nr_pages = ((unsigned long)p->len + PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+       pgdata = NODE_DATA(spu->node);
+       zone = pgdata->node_zones;
+
+       ret = __add_pages(zone, start_pfn, nr_pages);
+
+       return ret;
+}
+
+static void __iomem * __init map_spe_prop(struct spu *spu,
+               struct device_node *n, const char *name)
+{
+       const struct address_prop {
+               unsigned long address;
+               unsigned int len;
+       } __attribute__((packed)) *prop;
+
+       const void *p;
+       int proplen;
+       void __iomem *ret = NULL;
+       int err = 0;
+
+       p = get_property(n, name, &proplen);
+       if (proplen != sizeof (struct address_prop))
+               return NULL;
+
+       prop = p;
+
+       err = cell_spuprop_present(spu, n, name);
+       if (err && (err != -EEXIST))
+               goto out;
+
+       ret = ioremap(prop->address, prop->len);
+
+ out:
+       return ret;
+}
+
+static void spu_unmap(struct spu *spu)
+{
+       if (!firmware_has_feature(FW_FEATURE_LPAR))
+               iounmap(spu->priv1);
+       iounmap(spu->priv2);
+       iounmap(spu->problem);
+       iounmap((__force u8 __iomem *)spu->local_store);
+}
+
+static int __init spu_map_interrupts_old(struct spu *spu,
+       struct device_node *np)
+{
+       unsigned int isrc;
+       const u32 *tmp;
+       int nid;
+
+       /* Get the interrupt source unit from the device-tree */
+       tmp = get_property(np, "isrc", NULL);
+       if (!tmp)
+               return -ENODEV;
+       isrc = tmp[0];
+
+       tmp = get_property(np->parent->parent, "node-id", NULL);
+       if (!tmp) {
+               printk(KERN_WARNING "%s: can't find node-id\n", __FUNCTION__);
+               nid = spu->node;
+       } else
+               nid = tmp[0];
+
+       /* Add the node number */
+       isrc |= nid << IIC_IRQ_NODE_SHIFT;
+
+       /* Now map interrupts of all 3 classes */
+       spu->irqs[0] = irq_create_mapping(NULL, IIC_IRQ_CLASS_0 | isrc);
+       spu->irqs[1] = irq_create_mapping(NULL, IIC_IRQ_CLASS_1 | isrc);
+       spu->irqs[2] = irq_create_mapping(NULL, IIC_IRQ_CLASS_2 | isrc);
+
+       /* Right now, we only fail if class 2 failed */
+       return spu->irqs[2] == NO_IRQ ? -EINVAL : 0;
+}
+
+static int __init spu_map_device_old(struct spu *spu)
+{
+       struct device_node *node = spu->devnode;
+       const char *prop;
+       int ret;
+
+       ret = -ENODEV;
+       spu->name = get_property(node, "name", NULL);
+       if (!spu->name)
+               goto out;
+
+       prop = get_property(node, "local-store", NULL);
+       if (!prop)
+               goto out;
+       spu->local_store_phys = *(unsigned long *)prop;
+
+       /* we use local store as ram, not io memory */
+       spu->local_store = (void __force *)
+               map_spe_prop(spu, node, "local-store");
+       if (!spu->local_store)
+               goto out;
+
+       prop = get_property(node, "problem", NULL);
+       if (!prop)
+               goto out_unmap;
+       spu->problem_phys = *(unsigned long *)prop;
+
+       spu->problem = map_spe_prop(spu, node, "problem");
+       if (!spu->problem)
+               goto out_unmap;
+
+       spu->priv2 = map_spe_prop(spu, node, "priv2");
+       if (!spu->priv2)
+               goto out_unmap;
+
+       if (!firmware_has_feature(FW_FEATURE_LPAR)) {
+               spu->priv1 = map_spe_prop(spu, node, "priv1");
+               if (!spu->priv1)
+                       goto out_unmap;
+       }
+
+       ret = 0;
+       goto out;
+
+out_unmap:
+       spu_unmap(spu);
+out:
+       return ret;
+}
+
+static int __init spu_map_interrupts(struct spu *spu, struct device_node *np)
+{
+       struct of_irq oirq;
+       int ret;
+       int i;
+
+       for (i=0; i < 3; i++) {
+               ret = of_irq_map_one(np, i, &oirq);
+               if (ret) {
+                       pr_debug("spu_new: failed to get irq %d\n", i);
+                       goto err;
+               }
+               ret = -EINVAL;
+               pr_debug("  irq %d no 0x%x on %s\n", i, oirq.specifier[0],
+                        oirq.controller->full_name);
+               spu->irqs[i] = irq_create_of_mapping(oirq.controller,
+                                       oirq.specifier, oirq.size);
+               if (spu->irqs[i] == NO_IRQ) {
+                       pr_debug("spu_new: failed to map it !\n");
+                       goto err;
+               }
+       }
+       return 0;
+
+err:
+       pr_debug("failed to map irq %x for spu %s\n", *oirq.specifier,
+               spu->name);
+       for (; i >= 0; i--) {
+               if (spu->irqs[i] != NO_IRQ)
+                       irq_dispose_mapping(spu->irqs[i]);
+       }
+       return ret;
+}
+
+static int spu_map_resource(struct spu *spu, int nr,
+                           void __iomem** virt, unsigned long *phys)
+{
+       struct device_node *np = spu->devnode;
+       unsigned long start_pfn, nr_pages;
+       struct pglist_data *pgdata;
+       struct zone *zone;
+       struct resource resource = { };
+       unsigned long len;
+       int ret;
+
+       ret = of_address_to_resource(np, nr, &resource);
+       if (ret)
+               goto out;
+
+       if (phys)
+               *phys = resource.start;
+       len = resource.end - resource.start + 1;
+       *virt = ioremap(resource.start, len);
+       if (!*virt)
+               ret = -EINVAL;
+
+       start_pfn = resource.start >> PAGE_SHIFT;
+       nr_pages = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+       pgdata = NODE_DATA(spu->node);
+       zone = pgdata->node_zones;
+
+       ret = __add_pages(zone, start_pfn, nr_pages);
+
+out:
+       return ret;
+}
+
+static int __init spu_map_device(struct spu *spu)
+{
+       struct device_node *np = spu->devnode;
+       int ret = -ENODEV;
+
+       spu->name = get_property(np, "name", NULL);
+       if (!spu->name)
+               goto out;
+
+       ret = spu_map_resource(spu, 0, (void __iomem**)&spu->local_store,
+                              &spu->local_store_phys);
+       if (ret) {
+               pr_debug("spu_new: failed to map %s resource 0\n",
+                        np->full_name);
+               goto out;
+       }
+       ret = spu_map_resource(spu, 1, (void __iomem**)&spu->problem,
+                              &spu->problem_phys);
+       if (ret) {
+               pr_debug("spu_new: failed to map %s resource 1\n",
+                        np->full_name);
+               goto out_unmap;
+       }
+       ret = spu_map_resource(spu, 2, (void __iomem**)&spu->priv2, NULL);
+       if (ret) {
+               pr_debug("spu_new: failed to map %s resource 2\n",
+                        np->full_name);
+               goto out_unmap;
+       }
+       if (!firmware_has_feature(FW_FEATURE_LPAR))
+               ret = spu_map_resource(spu, 3,
+                              (void __iomem**)&spu->priv1, NULL);
+       if (ret) {
+               pr_debug("spu_new: failed to map %s resource 3\n",
+                        np->full_name);
+               goto out_unmap;
+       }
+       pr_debug("spu_new: %s maps:\n", np->full_name);
+       pr_debug("  local store   : 0x%016lx -> 0x%p\n",
+                spu->local_store_phys, spu->local_store);
+       pr_debug("  problem state : 0x%016lx -> 0x%p\n",
+                spu->problem_phys, spu->problem);
+       pr_debug("  priv2         :                       0x%p\n", spu->priv2);
+       pr_debug("  priv1         :                       0x%p\n", spu->priv1);
+
+       return 0;
+
+out_unmap:
+       spu_unmap(spu);
+out:
+       pr_debug("failed to map spe %s: %d\n", spu->name, ret);
+       return ret;
+}
+
+static int __init of_enumerate_spus(int (*fn)(void *data))
+{
+       int ret;
+       struct device_node *node;
+
+       ret = -ENODEV;
+       for (node = of_find_node_by_type(NULL, "spe");
+                       node; node = of_find_node_by_type(node, "spe")) {
+               ret = fn(node);
+               if (ret) {
+                       printk(KERN_WARNING "%s: Error initializing %s\n",
+                               __FUNCTION__, node->name);
+                       break;
+               }
+       }
+       return ret;
+}
+
+static int __init of_create_spu(struct spu *spu, void *data)
+{
+       int ret;
+       struct device_node *spe = (struct device_node *)data;
+       static int legacy_map = 0, legacy_irq = 0;
+
+       spu->devnode = of_node_get(spe);
+       spu->spe_id = find_spu_unit_number(spe);
+
+       spu->node = of_node_to_nid(spe);
+       if (spu->node >= MAX_NUMNODES) {
+               printk(KERN_WARNING "SPE %s on node %d ignored,"
+                      " node number too big\n", spe->full_name, spu->node);
+               printk(KERN_WARNING "Check if CONFIG_NUMA is enabled.\n");
+               ret = -ENODEV;
+               goto out;
+       }
+
+       ret = spu_map_device(spu);
+       if (ret) {
+               if (!legacy_map) {
+                       legacy_map = 1;
+                       printk(KERN_WARNING "%s: Legacy device tree found, "
+                               "trying to map old style\n", __FUNCTION__);
+               }
+               ret = spu_map_device_old(spu);
+               if (ret) {
+                       printk(KERN_ERR "Unable to map %s\n",
+                               spu->name);
+                       goto out;
+               }
+       }
+
+       ret = spu_map_interrupts(spu, spe);
+       if (ret) {
+               if (!legacy_irq) {
+                       legacy_irq = 1;
+                       printk(KERN_WARNING "%s: Legacy device tree found, "
+                               "trying old style irq\n", __FUNCTION__);
+               }
+               ret = spu_map_interrupts_old(spu, spe);
+               if (ret) {
+                       printk(KERN_ERR "%s: could not map interrupts",
+                               spu->name);
+                       goto out_unmap;
+               }
+       }
+
+       pr_debug("Using SPE %s %p %p %p %p %d\n", spu->name,
+               spu->local_store, spu->problem, spu->priv1,
+               spu->priv2, spu->number);
+       goto out;
+
+out_unmap:
+       spu_unmap(spu);
+out:
+       return ret;
+}
+
+static int of_destroy_spu(struct spu *spu)
+{
+       spu_unmap(spu);
+       of_node_put(spu->devnode);
+       return 0;
+}
+
+const struct spu_management_ops spu_management_of_ops = {
+       .enumerate_spus = of_enumerate_spus,
+       .create_spu = of_create_spu,
+       .destroy_spu = of_destroy_spu,
+};
index 910a926b61a23c7fce9390799d0becc89122819a..67fa7247b80a4e0dac21d6702c2fcc0c1d6b1867 100644 (file)
 #include "interrupt.h"
 #include "spu_priv1_mmio.h"
 
-static DEFINE_MUTEX(add_spumem_mutex);
-
-struct spu_pdata {
-       struct device_node *devnode;
-       struct spu_priv1 __iomem *priv1;
-};
-
-static struct spu_pdata *spu_get_pdata(struct spu *spu)
-{
-       BUG_ON(!spu->pdata);
-       return spu->pdata;
-}
-
-struct device_node *spu_devnode(struct spu *spu)
-{
-       return spu_get_pdata(spu)->devnode;
-}
-
-EXPORT_SYMBOL_GPL(spu_devnode);
-
-static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
-               const char *prop)
-{
-       const struct address_prop {
-               unsigned long address;
-               unsigned int len;
-       } __attribute__((packed)) *p;
-       int proplen;
-
-       unsigned long start_pfn, nr_pages;
-       struct pglist_data *pgdata;
-       struct zone *zone;
-       int ret;
-
-       p = get_property(spe, prop, &proplen);
-       WARN_ON(proplen != sizeof (*p));
-
-       start_pfn = p->address >> PAGE_SHIFT;
-       nr_pages = ((unsigned long)p->len + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       pgdata = NODE_DATA(spu->node);
-       zone = pgdata->node_zones;
-
-       /* XXX rethink locking here */
-       mutex_lock(&add_spumem_mutex);
-       ret = __add_pages(zone, start_pfn, nr_pages);
-       mutex_unlock(&add_spumem_mutex);
-
-       return ret;
-}
-
-static void __iomem * __init map_spe_prop(struct spu *spu,
-               struct device_node *n, const char *name)
-{
-       const struct address_prop {
-               unsigned long address;
-               unsigned int len;
-       } __attribute__((packed)) *prop;
-
-       const void *p;
-       int proplen;
-       void __iomem *ret = NULL;
-       int err = 0;
-
-       p = get_property(n, name, &proplen);
-       if (proplen != sizeof (struct address_prop))
-               return NULL;
-
-       prop = p;
-
-       err = cell_spuprop_present(spu, n, name);
-       if (err && (err != -EEXIST))
-               goto out;
-
-       ret = ioremap(prop->address, prop->len);
-
- out:
-       return ret;
-}
-
-static void spu_unmap(struct spu *spu)
-{
-       iounmap(spu->priv2);
-       iounmap(spu_get_pdata(spu)->priv1);
-       iounmap(spu->problem);
-       iounmap((__force u8 __iomem *)spu->local_store);
-}
-
-static int __init spu_map_interrupts_old(struct spu *spu,
-       struct device_node *np)
-{
-       unsigned int isrc;
-       const u32 *tmp;
-       int nid;
-
-       /* Get the interrupt source unit from the device-tree */
-       tmp = get_property(np, "isrc", NULL);
-       if (!tmp)
-               return -ENODEV;
-       isrc = tmp[0];
-
-       tmp = get_property(np->parent->parent, "node-id", NULL);
-       if (!tmp) {
-               printk(KERN_WARNING "%s: can't find node-id\n", __FUNCTION__);
-               nid = spu->node;
-       } else
-               nid = tmp[0];
-
-       /* Add the node number */
-       isrc |= nid << IIC_IRQ_NODE_SHIFT;
-
-       /* Now map interrupts of all 3 classes */
-       spu->irqs[0] = irq_create_mapping(NULL, IIC_IRQ_CLASS_0 | isrc);
-       spu->irqs[1] = irq_create_mapping(NULL, IIC_IRQ_CLASS_1 | isrc);
-       spu->irqs[2] = irq_create_mapping(NULL, IIC_IRQ_CLASS_2 | isrc);
-
-       /* Right now, we only fail if class 2 failed */
-       return spu->irqs[2] == NO_IRQ ? -EINVAL : 0;
-}
-
-static int __init spu_map_device_old(struct spu *spu, struct device_node *node)
-{
-       const char *prop;
-       int ret;
-
-       ret = -ENODEV;
-       spu->name = get_property(node, "name", NULL);
-       if (!spu->name)
-               goto out;
-
-       prop = get_property(node, "local-store", NULL);
-       if (!prop)
-               goto out;
-       spu->local_store_phys = *(unsigned long *)prop;
-
-       /* we use local store as ram, not io memory */
-       spu->local_store = (void __force *)
-               map_spe_prop(spu, node, "local-store");
-       if (!spu->local_store)
-               goto out;
-
-       prop = get_property(node, "problem", NULL);
-       if (!prop)
-               goto out_unmap;
-       spu->problem_phys = *(unsigned long *)prop;
-
-       spu->problem= map_spe_prop(spu, node, "problem");
-       if (!spu->problem)
-               goto out_unmap;
-
-       spu_get_pdata(spu)->priv1= map_spe_prop(spu, node, "priv1");
-
-       spu->priv2= map_spe_prop(spu, node, "priv2");
-       if (!spu->priv2)
-               goto out_unmap;
-       ret = 0;
-       goto out;
-
-out_unmap:
-       spu_unmap(spu);
-out:
-       return ret;
-}
-
-static int __init spu_map_interrupts(struct spu *spu, struct device_node *np)
-{
-       struct of_irq oirq;
-       int ret;
-       int i;
-
-       for (i=0; i < 3; i++) {
-               ret = of_irq_map_one(np, i, &oirq);
-               if (ret) {
-                       pr_debug("spu_new: failed to get irq %d\n", i);
-                       goto err;
-               }
-               ret = -EINVAL;
-               pr_debug("  irq %d no 0x%x on %s\n", i, oirq.specifier[0],
-                        oirq.controller->full_name);
-               spu->irqs[i] = irq_create_of_mapping(oirq.controller,
-                                       oirq.specifier, oirq.size);
-               if (spu->irqs[i] == NO_IRQ) {
-                       pr_debug("spu_new: failed to map it !\n");
-                       goto err;
-               }
-       }
-       return 0;
-
-err:
-       pr_debug("failed to map irq %x for spu %s\n", *oirq.specifier,
-               spu->name);
-       for (; i >= 0; i--) {
-               if (spu->irqs[i] != NO_IRQ)
-                       irq_dispose_mapping(spu->irqs[i]);
-       }
-       return ret;
-}
-
-static int spu_map_resource(struct spu *spu, int nr,
-                           void __iomem** virt, unsigned long *phys)
-{
-       struct device_node *np = spu_get_pdata(spu)->devnode;
-       unsigned long start_pfn, nr_pages;
-       struct pglist_data *pgdata;
-       struct zone *zone;
-       struct resource resource = { };
-       unsigned long len;
-       int ret;
-
-       ret = of_address_to_resource(np, nr, &resource);
-       if (ret)
-               goto out;
-
-       if (phys)
-               *phys = resource.start;
-       len = resource.end - resource.start + 1;
-       *virt = ioremap(resource.start, len);
-       if (!*virt)
-               ret = -EINVAL;
-
-       start_pfn = resource.start >> PAGE_SHIFT;
-       nr_pages = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       pgdata = NODE_DATA(spu->node);
-       zone = pgdata->node_zones;
-
-       /* XXX rethink locking here */
-       mutex_lock(&add_spumem_mutex);
-       ret = __add_pages(zone, start_pfn, nr_pages);
-       mutex_unlock(&add_spumem_mutex);
-
-out:
-       return ret;
-}
-
-static int __init spu_map_device(struct spu *spu)
-{
-       struct device_node *np = spu_get_pdata(spu)->devnode;
-       int ret = -ENODEV;
-
-       spu->name = get_property(np, "name", NULL);
-       if (!spu->name)
-               goto out;
-
-       ret = spu_map_resource(spu, 0, (void __iomem**)&spu->local_store,
-                              &spu->local_store_phys);
-       if (ret) {
-               pr_debug("spu_new: failed to map %s resource 0\n",
-                        np->full_name);
-               goto out;
-       }
-       ret = spu_map_resource(spu, 1, (void __iomem**)&spu->problem,
-                              &spu->problem_phys);
-       if (ret) {
-               pr_debug("spu_new: failed to map %s resource 1\n",
-                        np->full_name);
-               goto out_unmap;
-       }
-       ret = spu_map_resource(spu, 2, (void __iomem**)&spu->priv2, NULL);
-       if (ret) {
-               pr_debug("spu_new: failed to map %s resource 2\n",
-                        np->full_name);
-               goto out_unmap;
-       }
-       if (!firmware_has_feature(FW_FEATURE_LPAR))
-               ret = spu_map_resource(spu, 3,
-                              (void __iomem**)&spu_get_pdata(spu)->priv1, NULL);
-       if (ret) {
-               pr_debug("spu_new: failed to map %s resource 3\n",
-                        np->full_name);
-               goto out_unmap;
-       }
-       pr_debug("spu_new: %s maps:\n", np->full_name);
-       pr_debug("  local store   : 0x%016lx -> 0x%p\n",
-                spu->local_store_phys, spu->local_store);
-       pr_debug("  problem state : 0x%016lx -> 0x%p\n",
-                spu->problem_phys, spu->problem);
-       pr_debug("  priv2         :                       0x%p\n", spu->priv2);
-       pr_debug("  priv1         :                       0x%p\n",
-                spu_get_pdata(spu)->priv1);
-
-       return 0;
-
-out_unmap:
-       spu_unmap(spu);
-out:
-       pr_debug("failed to map spe %s: %d\n", spu->name, ret);
-       return ret;
-}
-
-static int __init of_enumerate_spus(int (*fn)(void *data))
-{
-       int ret;
-       struct device_node *node;
-
-       ret = -ENODEV;
-       for (node = of_find_node_by_type(NULL, "spe");
-                       node; node = of_find_node_by_type(node, "spe")) {
-               ret = fn(node);
-               if (ret) {
-                       printk(KERN_WARNING "%s: Error initializing %s\n",
-                               __FUNCTION__, node->name);
-                       break;
-               }
-       }
-       return ret;
-}
-
-static int __init of_create_spu(struct spu *spu, void *data)
-{
-       int ret;
-       struct device_node *spe = (struct device_node *)data;
-
-       spu->pdata = kzalloc(sizeof(struct spu_pdata),
-               GFP_KERNEL);
-       if (!spu->pdata) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       spu_get_pdata(spu)->devnode = of_node_get(spe);
-
-       spu->node = of_node_to_nid(spe);
-       if (spu->node >= MAX_NUMNODES) {
-               printk(KERN_WARNING "SPE %s on node %d ignored,"
-                      " node number too big\n", spe->full_name, spu->node);
-               printk(KERN_WARNING "Check if CONFIG_NUMA is enabled.\n");
-               ret = -ENODEV;
-               goto out_free;
-       }
-
-       ret = spu_map_device(spu);
-       /* try old method */
-       if (ret)
-               ret = spu_map_device_old(spu, spe);
-       if (ret)
-               goto out_free;
-
-       ret = spu_map_interrupts(spu, spe);
-       if (ret)
-               ret = spu_map_interrupts_old(spu, spe);
-       if (ret)
-               goto out_unmap;
-
-       pr_debug(KERN_DEBUG "Using SPE %s %p %p %p %p %d\n", spu->name,
-               spu->local_store, spu->problem, spu_get_pdata(spu)->priv1,
-               spu->priv2, spu->number);
-       goto out;
-
-out_unmap:
-       spu_unmap(spu);
-out_free:
-       kfree(spu->pdata);
-       spu->pdata = NULL;
-out:
-       return ret;
-}
-
-static int of_destroy_spu(struct spu *spu)
-{
-       spu_unmap(spu);
-       of_node_put(spu_get_pdata(spu)->devnode);
-       kfree(spu->pdata);
-       spu->pdata = NULL;
-       return 0;
-}
-
-const struct spu_management_ops spu_management_of_ops = {
-       .enumerate_spus = of_enumerate_spus,
-       .create_spu = of_create_spu,
-       .destroy_spu = of_destroy_spu,
-};
-
 static void int_mask_and(struct spu *spu, int class, u64 mask)
 {
        u64 old_mask;
 
-       old_mask = in_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class]);
-       out_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class],
-               old_mask & mask);
+       old_mask = in_be64(&spu->priv1->int_mask_RW[class]);
+       out_be64(&spu->priv1->int_mask_RW[class], old_mask & mask);
 }
 
 static void int_mask_or(struct spu *spu, int class, u64 mask)
 {
        u64 old_mask;
 
-       old_mask = in_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class]);
-       out_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class],
-               old_mask | mask);
+       old_mask = in_be64(&spu->priv1->int_mask_RW[class]);
+       out_be64(&spu->priv1->int_mask_RW[class], old_mask | mask);
 }
 
 static void int_mask_set(struct spu *spu, int class, u64 mask)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class], mask);
+       out_be64(&spu->priv1->int_mask_RW[class], mask);
 }
 
 static u64 int_mask_get(struct spu *spu, int class)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->int_mask_RW[class]);
+       return in_be64(&spu->priv1->int_mask_RW[class]);
 }
 
 static void int_stat_clear(struct spu *spu, int class, u64 stat)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->int_stat_RW[class], stat);
+       out_be64(&spu->priv1->int_stat_RW[class], stat);
 }
 
 static u64 int_stat_get(struct spu *spu, int class)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->int_stat_RW[class]);
+       return in_be64(&spu->priv1->int_stat_RW[class]);
 }
 
 static void cpu_affinity_set(struct spu *spu, int cpu)
 {
        u64 target = iic_get_target_id(cpu);
        u64 route = target << 48 | target << 32 | target << 16;
-       out_be64(&spu_get_pdata(spu)->priv1->int_route_RW, route);
+       out_be64(&spu->priv1->int_route_RW, route);
 }
 
 static u64 mfc_dar_get(struct spu *spu)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->mfc_dar_RW);
+       return in_be64(&spu->priv1->mfc_dar_RW);
 }
 
 static u64 mfc_dsisr_get(struct spu *spu)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->mfc_dsisr_RW);
+       return in_be64(&spu->priv1->mfc_dsisr_RW);
 }
 
 static void mfc_dsisr_set(struct spu *spu, u64 dsisr)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->mfc_dsisr_RW, dsisr);
+       out_be64(&spu->priv1->mfc_dsisr_RW, dsisr);
 }
 
 static void mfc_sdr_setup(struct spu *spu)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->mfc_sdr_RW, mfspr(SPRN_SDR1));
+       out_be64(&spu->priv1->mfc_sdr_RW, mfspr(SPRN_SDR1));
 }
 
 static void mfc_sr1_set(struct spu *spu, u64 sr1)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->mfc_sr1_RW, sr1);
+       out_be64(&spu->priv1->mfc_sr1_RW, sr1);
 }
 
 static u64 mfc_sr1_get(struct spu *spu)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->mfc_sr1_RW);
+       return in_be64(&spu->priv1->mfc_sr1_RW);
 }
 
 static void mfc_tclass_id_set(struct spu *spu, u64 tclass_id)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->mfc_tclass_id_RW, tclass_id);
+       out_be64(&spu->priv1->mfc_tclass_id_RW, tclass_id);
 }
 
 static u64 mfc_tclass_id_get(struct spu *spu)
 {
-       return in_be64(&spu_get_pdata(spu)->priv1->mfc_tclass_id_RW);
+       return in_be64(&spu->priv1->mfc_tclass_id_RW);
 }
 
 static void tlb_invalidate(struct spu *spu)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->tlb_invalidate_entry_W, 0ul);
+       out_be64(&spu->priv1->tlb_invalidate_entry_W, 0ul);
 }
 
 static void resource_allocation_groupID_set(struct spu *spu, u64 id)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->resource_allocation_groupID_RW,
-               id);
+       out_be64(&spu->priv1->resource_allocation_groupID_RW, id);
 }
 
 static u64 resource_allocation_groupID_get(struct spu *spu)
 {
-       return in_be64(
-               &spu_get_pdata(spu)->priv1->resource_allocation_groupID_RW);
+       return in_be64(&spu->priv1->resource_allocation_groupID_RW);
 }
 
 static void resource_allocation_enable_set(struct spu *spu, u64 enable)
 {
-       out_be64(&spu_get_pdata(spu)->priv1->resource_allocation_enable_RW,
-               enable);
+       out_be64(&spu->priv1->resource_allocation_enable_RW, enable);
 }
 
 static u64 resource_allocation_enable_get(struct spu *spu)
 {
-       return in_be64(
-               &spu_get_pdata(spu)->priv1->resource_allocation_enable_RW);
+       return in_be64(&spu->priv1->resource_allocation_enable_RW);
 }
 
 const struct spu_priv1_ops spu_priv1_mmio_ops =
diff --git a/arch/powerpc/platforms/celleb/Makefile b/arch/powerpc/platforms/celleb/Makefile
new file mode 100644 (file)
index 0000000..3baf658
--- /dev/null
@@ -0,0 +1,9 @@
+obj-y                          += interrupt.o iommu.o setup.o \
+                                  htab.o beat.o pci.o \
+                                  scc_epci.o hvCall.o
+
+obj-$(CONFIG_SMP)              += smp.o
+obj-$(CONFIG_PPC_UDBG_BEAT)    += udbg_beat.o
+obj-$(CONFIG_USB)              += scc_uhc.o
+obj-$(CONFIG_HAS_TXX9_SERIAL)  += scc_sio.o
+obj-$(CONFIG_SPU_BASE)         += spu_priv1.o
diff --git a/arch/powerpc/platforms/celleb/beat.c b/arch/powerpc/platforms/celleb/beat.c
new file mode 100644 (file)
index 0000000..99341ce
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Simple routines for Celleb/Beat
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/rtc.h>
+
+#include <asm/hvconsole.h>
+#include <asm/time.h>
+
+#include "beat_wrapper.h"
+#include "beat.h"
+
+void beat_restart(char *cmd)
+{
+       beat_shutdown_logical_partition(1);
+}
+
+void beat_power_off(void)
+{
+       beat_shutdown_logical_partition(0);
+}
+
+u64 beat_halt_code = 0x1000000000000000UL;
+
+void beat_halt(void)
+{
+       beat_shutdown_logical_partition(beat_halt_code);
+}
+
+int beat_set_rtc_time(struct rtc_time *rtc_time)
+{
+       u64 tim;
+       tim = mktime(rtc_time->tm_year+1900,
+                    rtc_time->tm_mon+1, rtc_time->tm_mday,
+                    rtc_time->tm_hour, rtc_time->tm_min, rtc_time->tm_sec);
+       if (beat_rtc_write(tim))
+               return -1;
+       return 0;
+}
+
+void beat_get_rtc_time(struct rtc_time *rtc_time)
+{
+       u64 tim;
+
+       if (beat_rtc_read(&tim))
+               tim = 0;
+       to_tm(tim, rtc_time);
+       rtc_time->tm_year -= 1900;
+       rtc_time->tm_mon -= 1;
+}
+
+#define        BEAT_NVRAM_SIZE 4096
+
+ssize_t beat_nvram_read(char *buf, size_t count, loff_t *index)
+{
+       unsigned int i;
+       unsigned long len;
+       char *p = buf;
+
+       if (*index >= BEAT_NVRAM_SIZE)
+               return -ENODEV;
+       i = *index;
+       if (i + count > BEAT_NVRAM_SIZE)
+               count = BEAT_NVRAM_SIZE - i;
+
+       for (; count != 0; count -= len) {
+               len = count;
+               if (len > BEAT_NVRW_CNT)
+                       len = BEAT_NVRW_CNT;
+               if (beat_eeprom_read(i, len, p)) {
+                       return -EIO;
+               }
+
+               p += len;
+               i += len;
+       }
+       *index = i;
+       return p - buf;
+}
+
+ssize_t beat_nvram_write(char *buf, size_t count, loff_t *index)
+{
+       unsigned int i;
+       unsigned long len;
+       char *p = buf;
+
+       if (*index >= BEAT_NVRAM_SIZE)
+               return -ENODEV;
+       i = *index;
+       if (i + count > BEAT_NVRAM_SIZE)
+               count = BEAT_NVRAM_SIZE - i;
+
+       for (; count != 0; count -= len) {
+               len = count;
+               if (len > BEAT_NVRW_CNT)
+                       len = BEAT_NVRW_CNT;
+               if (beat_eeprom_write(i, len, p)) {
+                       return -EIO;
+               }
+
+               p += len;
+               i += len;
+       }
+       *index = i;
+       return p - buf;
+}
+
+ssize_t beat_nvram_get_size(void)
+{
+       return BEAT_NVRAM_SIZE;
+}
+
+int beat_set_xdabr(unsigned long dabr)
+{
+       if (beat_set_dabr(dabr, DABRX_KERNEL | DABRX_USER))
+               return -1;
+       return 0;
+}
+
+int64_t beat_get_term_char(u64 vterm, u64 *len, u64 *t1, u64 *t2)
+{
+       u64 db[2];
+       s64 ret;
+
+       ret = beat_get_characters_from_console(vterm, len, (u8*)db);
+       if (ret == 0) {
+               *t1 = db[0];
+               *t2 = db[1];
+       }
+       return ret;
+}
+
+int64_t beat_put_term_char(u64 vterm, u64 len, u64 t1, u64 t2)
+{
+       u64 db[2];
+
+       db[0] = t1;
+       db[1] = t2;
+       return beat_put_characters_to_console(vterm, len, (u8*)db);
+}
+
+EXPORT_SYMBOL(beat_get_term_char);
+EXPORT_SYMBOL(beat_put_term_char);
+EXPORT_SYMBOL(beat_halt_code);
diff --git a/arch/powerpc/platforms/celleb/beat.h b/arch/powerpc/platforms/celleb/beat.h
new file mode 100644 (file)
index 0000000..2b16bf3
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Guest OS Interfaces.
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _CELLEB_BEAT_H
+#define _CELLEB_BEAT_H
+
+#define DABRX_KERNEL           (1UL<<1)
+#define DABRX_USER             (1UL<<0)
+
+int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*);
+int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t);
+int64_t beat_repository_encode(int, const char *, uint64_t[4]);
+void beat_restart(char *);
+void beat_power_off(void);
+void beat_halt(void);
+int beat_set_rtc_time(struct rtc_time *);
+void beat_get_rtc_time(struct rtc_time *);
+ssize_t beat_nvram_get_size(void);
+ssize_t beat_nvram_read(char *, size_t, loff_t *);
+ssize_t beat_nvram_write(char *, size_t, loff_t *);
+int beat_set_xdabr(unsigned long);
+
+#endif /* _CELLEB_BEAT_H */
diff --git a/arch/powerpc/platforms/celleb/beat_syscall.h b/arch/powerpc/platforms/celleb/beat_syscall.h
new file mode 100644 (file)
index 0000000..14e1697
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * Beat hypervisor call numbers
+ *
+ * (C) Copyright 2004-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef BEAT_BEAT_syscall_H
+#define BEAT_BEAT_syscall_H
+
+#ifdef __ASSEMBLY__
+#define        __BEAT_ADD_VENDOR_ID(__x, __v)  ((__v)<<60|(__x))
+#else
+#define        __BEAT_ADD_VENDOR_ID(__x, __v)  ((u64)(__v)<<60|(__x))
+#endif
+#define HV_allocate_memory __BEAT_ADD_VENDOR_ID(0, 0)
+#define HV_construct_virtual_address_space __BEAT_ADD_VENDOR_ID(2, 0)
+#define HV_destruct_virtual_address_space __BEAT_ADD_VENDOR_ID(10, 0)
+#define HV_get_virtual_address_space_id_of_ppe __BEAT_ADD_VENDOR_ID(4, 0)
+#define HV_query_logical_partition_address_region_info                         \
+                                               __BEAT_ADD_VENDOR_ID(6, 0)
+#define HV_release_memory __BEAT_ADD_VENDOR_ID(13, 0)
+#define HV_select_virtual_address_space __BEAT_ADD_VENDOR_ID(7, 0)
+#define HV_load_range_registers __BEAT_ADD_VENDOR_ID(68, 0)
+#define HV_set_ppe_l2cache_rmt_entry __BEAT_ADD_VENDOR_ID(70, 0)
+#define HV_set_ppe_tlb_rmt_entry __BEAT_ADD_VENDOR_ID(71, 0)
+#define HV_set_spe_tlb_rmt_entry __BEAT_ADD_VENDOR_ID(72, 0)
+#define HV_get_io_address_translation_fault_info __BEAT_ADD_VENDOR_ID(14, 0)
+#define HV_get_iopte __BEAT_ADD_VENDOR_ID(16, 0)
+#define HV_preload_iopt_cache __BEAT_ADD_VENDOR_ID(17, 0)
+#define HV_put_iopte __BEAT_ADD_VENDOR_ID(15, 0)
+#define HV_connect_event_ports __BEAT_ADD_VENDOR_ID(21, 0)
+#define HV_construct_event_receive_port __BEAT_ADD_VENDOR_ID(18, 0)
+#define HV_destruct_event_receive_port __BEAT_ADD_VENDOR_ID(19, 0)
+#define HV_destruct_event_send_port __BEAT_ADD_VENDOR_ID(22, 0)
+#define HV_get_state_of_event_send_port __BEAT_ADD_VENDOR_ID(25, 0)
+#define HV_request_to_connect_event_ports __BEAT_ADD_VENDOR_ID(20, 0)
+#define HV_send_event_externally __BEAT_ADD_VENDOR_ID(23, 0)
+#define HV_send_event_locally __BEAT_ADD_VENDOR_ID(24, 0)
+#define HV_construct_and_connect_irq_plug __BEAT_ADD_VENDOR_ID(28, 0)
+#define HV_destruct_irq_plug __BEAT_ADD_VENDOR_ID(29, 0)
+#define HV_detect_pending_interrupts __BEAT_ADD_VENDOR_ID(26, 0)
+#define HV_end_of_interrupt __BEAT_ADD_VENDOR_ID(27, 0)
+#define HV_assign_control_signal_notification_port __BEAT_ADD_VENDOR_ID(45, 0)
+#define HV_end_of_control_signal_processing __BEAT_ADD_VENDOR_ID(48, 0)
+#define HV_get_control_signal __BEAT_ADD_VENDOR_ID(46, 0)
+#define HV_set_irq_mask_for_spe __BEAT_ADD_VENDOR_ID(61, 0)
+#define HV_shutdown_logical_partition __BEAT_ADD_VENDOR_ID(44, 0)
+#define HV_connect_message_ports __BEAT_ADD_VENDOR_ID(35, 0)
+#define HV_destruct_message_port __BEAT_ADD_VENDOR_ID(36, 0)
+#define HV_receive_message __BEAT_ADD_VENDOR_ID(37, 0)
+#define HV_get_message_port_info __BEAT_ADD_VENDOR_ID(34, 0)
+#define HV_request_to_connect_message_ports __BEAT_ADD_VENDOR_ID(33, 0)
+#define HV_send_message __BEAT_ADD_VENDOR_ID(32, 0)
+#define HV_get_logical_ppe_id __BEAT_ADD_VENDOR_ID(69, 0)
+#define HV_pause __BEAT_ADD_VENDOR_ID(9, 0)
+#define HV_destruct_shared_memory_handle __BEAT_ADD_VENDOR_ID(51, 0)
+#define HV_get_shared_memory_info __BEAT_ADD_VENDOR_ID(52, 0)
+#define HV_permit_sharing_memory __BEAT_ADD_VENDOR_ID(50, 0)
+#define HV_request_to_attach_shared_memory __BEAT_ADD_VENDOR_ID(49, 0)
+#define HV_enable_logical_spe_execution __BEAT_ADD_VENDOR_ID(55, 0)
+#define HV_construct_logical_spe __BEAT_ADD_VENDOR_ID(53, 0)
+#define HV_disable_logical_spe_execution __BEAT_ADD_VENDOR_ID(56, 0)
+#define HV_destruct_logical_spe __BEAT_ADD_VENDOR_ID(54, 0)
+#define HV_sense_spe_execution_status __BEAT_ADD_VENDOR_ID(58, 0)
+#define HV_insert_htab_entry __BEAT_ADD_VENDOR_ID(101, 0)
+#define HV_read_htab_entries __BEAT_ADD_VENDOR_ID(95, 0)
+#define HV_write_htab_entry __BEAT_ADD_VENDOR_ID(94, 0)
+#define HV_assign_io_address_translation_fault_port                    \
+                                               __BEAT_ADD_VENDOR_ID(100, 0)
+#define HV_set_interrupt_mask __BEAT_ADD_VENDOR_ID(73, 0)
+#define HV_get_logical_partition_id __BEAT_ADD_VENDOR_ID(74, 0)
+#define HV_create_repository_node2 __BEAT_ADD_VENDOR_ID(90, 0)
+#define HV_create_repository_node __BEAT_ADD_VENDOR_ID(90, 0) /* alias */
+#define HV_get_repository_node_value2 __BEAT_ADD_VENDOR_ID(91, 0)
+#define HV_get_repository_node_value __BEAT_ADD_VENDOR_ID(91, 0) /* alias */
+#define HV_modify_repository_node_value2 __BEAT_ADD_VENDOR_ID(92, 0)
+#define HV_modify_repository_node_value __BEAT_ADD_VENDOR_ID(92, 0) /* alias */
+#define HV_remove_repository_node2 __BEAT_ADD_VENDOR_ID(93, 0)
+#define HV_remove_repository_node __BEAT_ADD_VENDOR_ID(93, 0) /* alias */
+#define HV_cancel_shared_memory __BEAT_ADD_VENDOR_ID(104, 0)
+#define HV_clear_interrupt_status_of_spe __BEAT_ADD_VENDOR_ID(206, 0)
+#define HV_construct_spe_irq_outlet __BEAT_ADD_VENDOR_ID(80, 0)
+#define HV_destruct_spe_irq_outlet __BEAT_ADD_VENDOR_ID(81, 0)
+#define HV_disconnect_ipspc_service __BEAT_ADD_VENDOR_ID(88, 0)
+#define HV_execute_ipspc_command __BEAT_ADD_VENDOR_ID(86, 0)
+#define HV_get_interrupt_status_of_spe __BEAT_ADD_VENDOR_ID(205, 0)
+#define HV_get_spe_privileged_state_1_registers __BEAT_ADD_VENDOR_ID(208, 0)
+#define HV_permit_use_of_ipspc_service __BEAT_ADD_VENDOR_ID(85, 0)
+#define HV_reinitialize_logical_spe __BEAT_ADD_VENDOR_ID(82, 0)
+#define HV_request_ipspc_service __BEAT_ADD_VENDOR_ID(84, 0)
+#define HV_stop_ipspc_command __BEAT_ADD_VENDOR_ID(87, 0)
+#define HV_set_spe_privileged_state_1_registers __BEAT_ADD_VENDOR_ID(204, 0)
+#define HV_get_status_of_ipspc_service __BEAT_ADD_VENDOR_ID(203, 0)
+#define HV_put_characters_to_console __BEAT_ADD_VENDOR_ID(0x101, 1)
+#define HV_get_characters_from_console __BEAT_ADD_VENDOR_ID(0x102, 1)
+#define HV_get_base_clock __BEAT_ADD_VENDOR_ID(0x111, 1)
+#define HV_set_base_clock __BEAT_ADD_VENDOR_ID(0x112, 1)
+#define HV_get_frame_cycle __BEAT_ADD_VENDOR_ID(0x114, 1)
+#define HV_disable_console __BEAT_ADD_VENDOR_ID(0x115, 1)
+#define HV_disable_all_console __BEAT_ADD_VENDOR_ID(0x116, 1)
+#define HV_oneshot_timer __BEAT_ADD_VENDOR_ID(0x117, 1)
+#define HV_set_dabr __BEAT_ADD_VENDOR_ID(0x118, 1)
+#define HV_get_dabr __BEAT_ADD_VENDOR_ID(0x119, 1)
+#define HV_start_hv_stats __BEAT_ADD_VENDOR_ID(0x21c, 1)
+#define HV_stop_hv_stats __BEAT_ADD_VENDOR_ID(0x21d, 1)
+#define HV_get_hv_stats __BEAT_ADD_VENDOR_ID(0x21e, 1)
+#define HV_get_hv_error_stats __BEAT_ADD_VENDOR_ID(0x221, 1)
+#define HV_get_stats __BEAT_ADD_VENDOR_ID(0x224, 1)
+#define HV_get_heap_stats __BEAT_ADD_VENDOR_ID(0x225, 1)
+#define HV_get_memory_stats __BEAT_ADD_VENDOR_ID(0x227, 1)
+#define HV_get_memory_detail __BEAT_ADD_VENDOR_ID(0x228, 1)
+#define HV_set_priority_of_irq_outlet __BEAT_ADD_VENDOR_ID(0x122, 1)
+#define HV_get_physical_spe_by_reservation_id __BEAT_ADD_VENDOR_ID(0x128, 1)
+#define HV_get_spe_context __BEAT_ADD_VENDOR_ID(0x129, 1)
+#define HV_set_spe_context __BEAT_ADD_VENDOR_ID(0x12a, 1)
+#define HV_downcount_of_interrupt __BEAT_ADD_VENDOR_ID(0x12e, 1)
+#define HV_peek_spe_context __BEAT_ADD_VENDOR_ID(0x12f, 1)
+#define HV_read_bpa_register __BEAT_ADD_VENDOR_ID(0x131, 1)
+#define HV_write_bpa_register __BEAT_ADD_VENDOR_ID(0x132, 1)
+#define HV_map_context_table_of_spe __BEAT_ADD_VENDOR_ID(0x137, 1)
+#define HV_get_slb_for_logical_spe __BEAT_ADD_VENDOR_ID(0x138, 1)
+#define HV_set_slb_for_logical_spe __BEAT_ADD_VENDOR_ID(0x139, 1)
+#define HV_init_pm __BEAT_ADD_VENDOR_ID(0x150, 1)
+#define HV_set_pm_signal __BEAT_ADD_VENDOR_ID(0x151, 1)
+#define HV_get_pm_signal __BEAT_ADD_VENDOR_ID(0x152, 1)
+#define HV_set_pm_config __BEAT_ADD_VENDOR_ID(0x153, 1)
+#define HV_get_pm_config __BEAT_ADD_VENDOR_ID(0x154, 1)
+#define HV_get_inner_trace_data __BEAT_ADD_VENDOR_ID(0x155, 1)
+#define HV_set_ext_trace_buffer __BEAT_ADD_VENDOR_ID(0x156, 1)
+#define HV_get_ext_trace_buffer __BEAT_ADD_VENDOR_ID(0x157, 1)
+#define HV_set_pm_interrupt __BEAT_ADD_VENDOR_ID(0x158, 1)
+#define HV_get_pm_interrupt __BEAT_ADD_VENDOR_ID(0x159, 1)
+#define HV_kick_pm __BEAT_ADD_VENDOR_ID(0x160, 1)
+#define HV_construct_pm_context __BEAT_ADD_VENDOR_ID(0x164, 1)
+#define HV_destruct_pm_context __BEAT_ADD_VENDOR_ID(0x165, 1)
+#define HV_be_slow __BEAT_ADD_VENDOR_ID(0x170, 1)
+#define HV_assign_ipspc_server_connection_status_notification_port     \
+                                               __BEAT_ADD_VENDOR_ID(0x173, 1)
+#define HV_get_raid_of_physical_spe __BEAT_ADD_VENDOR_ID(0x174, 1)
+#define HV_set_physical_spe_to_rag __BEAT_ADD_VENDOR_ID(0x175, 1)
+#define HV_release_physical_spe_from_rag __BEAT_ADD_VENDOR_ID(0x176, 1)
+#define HV_rtc_read __BEAT_ADD_VENDOR_ID(0x190, 1)
+#define HV_rtc_write __BEAT_ADD_VENDOR_ID(0x191, 1)
+#define HV_eeprom_read __BEAT_ADD_VENDOR_ID(0x192, 1)
+#define HV_eeprom_write __BEAT_ADD_VENDOR_ID(0x193, 1)
+#endif
diff --git a/arch/powerpc/platforms/celleb/beat_wrapper.h b/arch/powerpc/platforms/celleb/beat_wrapper.h
new file mode 100644 (file)
index 0000000..76ea0a6
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Beat hypervisor call I/F
+ *
+ * (C) Copyright 2007 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/platforms/pseries/plpar_wrapper.h.
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#ifndef BEAT_HCALL
+#include "beat_syscall.h"
+
+/* defined in hvCall.S */
+extern s64 beat_hcall_norets(u64 opcode, ...);
+extern s64 beat_hcall_norets8(u64 opcode, u64 arg1, u64 arg2, u64 arg3,
+       u64 arg4, u64 arg5, u64 arg6, u64 arg7, u64 arg8);
+extern s64 beat_hcall1(u64 opcode, u64 retbuf[1], ...);
+extern s64 beat_hcall2(u64 opcode, u64 retbuf[2], ...);
+extern s64 beat_hcall3(u64 opcode, u64 retbuf[3], ...);
+extern s64 beat_hcall4(u64 opcode, u64 retbuf[4], ...);
+extern s64 beat_hcall5(u64 opcode, u64 retbuf[5], ...);
+extern s64 beat_hcall6(u64 opcode, u64 retbuf[6], ...);
+
+static inline s64 beat_downcount_of_interrupt(u64 plug_id)
+{
+       return beat_hcall_norets(HV_downcount_of_interrupt, plug_id);
+}
+
+static inline s64 beat_set_interrupt_mask(u64 index,
+       u64 val0, u64 val1, u64 val2, u64 val3)
+{
+       return beat_hcall_norets(HV_set_interrupt_mask, index,
+              val0, val1, val2, val3);
+}
+
+static inline s64 beat_destruct_irq_plug(u64 plug_id)
+{
+       return beat_hcall_norets(HV_destruct_irq_plug, plug_id);
+}
+
+static inline s64 beat_construct_and_connect_irq_plug(u64 plug_id,
+       u64 outlet_id)
+{
+       return beat_hcall_norets(HV_construct_and_connect_irq_plug, plug_id,
+              outlet_id);
+}
+
+static inline s64 beat_detect_pending_interrupts(u64 index, u64 *retbuf)
+{
+       return beat_hcall4(HV_detect_pending_interrupts, retbuf, index);
+}
+
+static inline s64 beat_pause(u64 style)
+{
+       return beat_hcall_norets(HV_pause, style);
+}
+
+static inline s64 beat_read_htab_entries(u64 htab_id, u64 index, u64 *retbuf)
+{
+       return beat_hcall5(HV_read_htab_entries, retbuf, htab_id, index);
+}
+
+static inline s64 beat_insert_htab_entry(u64 htab_id, u64 group,
+       u64 bitmask, u64 hpte_v, u64 hpte_r, u64 *slot)
+{
+       u64 dummy[3];
+       s64 ret;
+
+       ret = beat_hcall3(HV_insert_htab_entry, dummy, htab_id, group,
+               bitmask, hpte_v, hpte_r);
+       *slot = dummy[0];
+       return ret;
+}
+
+static inline s64 beat_write_htab_entry(u64 htab_id, u64 slot,
+       u64 hpte_v, u64 hpte_r, u64 mask_v, u64 mask_r,
+       u64 *ret_v, u64 *ret_r)
+{
+       u64 dummy[2];
+       s64 ret;
+
+       ret = beat_hcall2(HV_write_htab_entry, dummy, htab_id, slot,
+               hpte_v, hpte_r, mask_v, mask_r);
+       *ret_v = dummy[0];
+       *ret_r = dummy[1];
+       return ret;
+}
+
+static inline void beat_shutdown_logical_partition(u64 code)
+{
+       (void)beat_hcall_norets(HV_shutdown_logical_partition, code);
+}
+
+static inline s64 beat_rtc_write(u64 time_from_epoch)
+{
+       return beat_hcall_norets(HV_rtc_write, time_from_epoch);
+}
+
+static inline s64 beat_rtc_read(u64 *time_from_epoch)
+{
+       u64 dummy[1];
+       s64 ret;
+
+       ret = beat_hcall1(HV_rtc_read, dummy);
+       *time_from_epoch = dummy[0];
+       return ret;
+}
+
+#define        BEAT_NVRW_CNT   (sizeof(u64) * 6)
+
+static inline s64 beat_eeprom_write(u64 index, u64 length, u8 *buffer)
+{
+       u64     b[6];
+
+       if (length > BEAT_NVRW_CNT)
+               return -1;
+       memcpy(b, buffer, sizeof(b));
+       return beat_hcall_norets8(HV_eeprom_write, index, length,
+               b[0], b[1], b[2], b[3], b[4], b[5]);
+}
+
+static inline s64 beat_eeprom_read(u64 index, u64 length, u8 *buffer)
+{
+       u64     b[6];
+       s64     ret;
+
+       if (length > BEAT_NVRW_CNT)
+               return -1;
+       ret = beat_hcall6(HV_eeprom_read, b, index, length);
+       memcpy(buffer, b, length);
+       return ret;
+}
+
+static inline s64 beat_set_dabr(u64 value, u64 style)
+{
+       return beat_hcall_norets(HV_set_dabr, value, style);
+}
+
+static inline s64 beat_get_characters_from_console(u64 termno, u64 *len,
+       u8 *buffer)
+{
+       u64 dummy[3];
+       s64 ret;
+
+       ret = beat_hcall3(HV_get_characters_from_console, dummy, termno, len);
+       *len = dummy[0];
+       memcpy(buffer, dummy + 1, *len);
+       return ret;
+}
+
+static inline s64 beat_put_characters_to_console(u64 termno, u64 len,
+       u8 *buffer)
+{
+       u64 b[2];
+
+       memcpy(b, buffer, len);
+       return beat_hcall_norets(HV_put_characters_to_console, termno, len,                                      b[0], b[1]);
+}
+
+static inline s64 beat_get_spe_privileged_state_1_registers(
+               u64 id, u64 offsetof, u64 *value)
+{
+       u64 dummy[1];
+       s64 ret;
+
+       ret = beat_hcall1(HV_get_spe_privileged_state_1_registers, dummy, id,
+               offsetof);
+       *value = dummy[0];
+       return ret;
+}
+
+static inline s64 beat_set_irq_mask_for_spe(u64 id, u64 class, u64 mask)
+{
+       return beat_hcall_norets(HV_set_irq_mask_for_spe, id, class, mask);
+}
+
+static inline s64 beat_clear_interrupt_status_of_spe(u64 id, u64 class,
+       u64 mask)
+{
+       return beat_hcall_norets(HV_clear_interrupt_status_of_spe,
+               id, class, mask);
+}
+
+static inline s64 beat_set_spe_privileged_state_1_registers(
+               u64 id, u64 offsetof, u64 value)
+{
+       return beat_hcall_norets(HV_set_spe_privileged_state_1_registers,
+               id, offsetof, value);
+}
+
+static inline s64 beat_get_interrupt_status_of_spe(u64 id, u64 class, u64 *val)
+{
+       u64 dummy[1];
+       s64 ret;
+
+       ret = beat_hcall1(HV_get_interrupt_status_of_spe, dummy, id, class);
+       *val = dummy[0];
+       return ret;
+}
+
+static inline s64 beat_put_iopte(u64 ioas_id, u64 io_addr, u64 real_addr,
+       u64 ioid, u64 flags)
+{
+       return beat_hcall_norets(HV_put_iopte, ioas_id, io_addr, real_addr,
+               ioid, flags);
+}
+
+#endif
diff --git a/arch/powerpc/platforms/celleb/htab.c b/arch/powerpc/platforms/celleb/htab.c
new file mode 100644 (file)
index 0000000..ffa7c2c
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * "Cell Reference Set" HTAB support.
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/platforms/pseries/lpar.c:
+ *  Copyright (C) 2001 Todd Inglett, 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.
+ *
+ * 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.
+ */
+
+#undef DEBUG_LOW
+
+#include <linux/kernel.h>
+#include <linux/spinlock.h>
+
+#include <asm/mmu.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/machdep.h>
+#include <asm/udbg.h>
+
+#include "beat_wrapper.h"
+
+#ifdef DEBUG_LOW
+#define DBG_LOW(fmt...) do { udbg_printf(fmt); } while(0)
+#else
+#define DBG_LOW(fmt...) do { } while(0)
+#endif
+
+static DEFINE_SPINLOCK(beat_htab_lock);
+
+static inline unsigned int beat_read_mask(unsigned hpte_group)
+{
+       unsigned long hpte_v[5];
+       unsigned long rmask = 0;
+
+       beat_read_htab_entries(0, hpte_group + 0, hpte_v);
+       if (!(hpte_v[0] & HPTE_V_BOLTED))
+               rmask |= 0x8000;
+       if (!(hpte_v[1] & HPTE_V_BOLTED))
+               rmask |= 0x4000;
+       if (!(hpte_v[2] & HPTE_V_BOLTED))
+               rmask |= 0x2000;
+       if (!(hpte_v[3] & HPTE_V_BOLTED))
+               rmask |= 0x1000;
+       beat_read_htab_entries(0, hpte_group + 4, hpte_v);
+       if (!(hpte_v[0] & HPTE_V_BOLTED))
+               rmask |= 0x0800;
+       if (!(hpte_v[1] & HPTE_V_BOLTED))
+               rmask |= 0x0400;
+       if (!(hpte_v[2] & HPTE_V_BOLTED))
+               rmask |= 0x0200;
+       if (!(hpte_v[3] & HPTE_V_BOLTED))
+               rmask |= 0x0100;
+       hpte_group = ~hpte_group & (htab_hash_mask * HPTES_PER_GROUP);
+       beat_read_htab_entries(0, hpte_group + 0, hpte_v);
+       if (!(hpte_v[0] & HPTE_V_BOLTED))
+               rmask |= 0x80;
+       if (!(hpte_v[1] & HPTE_V_BOLTED))
+               rmask |= 0x40;
+       if (!(hpte_v[2] & HPTE_V_BOLTED))
+               rmask |= 0x20;
+       if (!(hpte_v[3] & HPTE_V_BOLTED))
+               rmask |= 0x10;
+       beat_read_htab_entries(0, hpte_group + 4, hpte_v);
+       if (!(hpte_v[0] & HPTE_V_BOLTED))
+               rmask |= 0x08;
+       if (!(hpte_v[1] & HPTE_V_BOLTED))
+               rmask |= 0x04;
+       if (!(hpte_v[2] & HPTE_V_BOLTED))
+               rmask |= 0x02;
+       if (!(hpte_v[3] & HPTE_V_BOLTED))
+               rmask |= 0x01;
+       return rmask;
+}
+
+static long beat_lpar_hpte_insert(unsigned long hpte_group,
+                                 unsigned long va, unsigned long pa,
+                                 unsigned long rflags, unsigned long vflags,
+                                 int psize)
+{
+       unsigned long lpar_rc;
+       unsigned long slot;
+       unsigned long hpte_v, hpte_r;
+       unsigned long flags;
+
+       /* same as iseries */
+       if (vflags & HPTE_V_SECONDARY)
+               return -1;
+
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW("hpte_insert(group=%lx, va=%016lx, pa=%016lx, "
+                       "rflags=%lx, vflags=%lx, psize=%d)\n",
+               hpte_group, va, pa, rflags, vflags, psize);
+
+       hpte_v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
+       hpte_r = hpte_encode_r(pa, psize) | rflags;
+
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
+
+       if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE))
+               hpte_r &= ~_PAGE_COHERENT;
+
+       spin_lock_irqsave(&beat_htab_lock, flags);
+       if ((lpar_rc = beat_read_mask(hpte_group)) == 0) {
+               if (!(vflags & HPTE_V_BOLTED))
+                       DBG_LOW(" full\n");
+               spin_unlock_irqrestore(&beat_htab_lock, flags);
+               return -1;
+       }
+
+       lpar_rc = beat_insert_htab_entry(0, hpte_group, lpar_rc << 48,
+               hpte_v, hpte_r, &slot);
+       spin_unlock_irqrestore(&beat_htab_lock, flags);
+
+       /*
+        * Since we try and ioremap PHBs we don't own, the pte insert
+        * will fail. However we must catch the failure in hash_page
+        * or we will loop forever, so return -2 in this case.
+        */
+       if (unlikely(lpar_rc != 0)) {
+               if (!(vflags & HPTE_V_BOLTED))
+                       DBG_LOW(" lpar err %lx\n", lpar_rc);
+               return -2;
+       }
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW(" -> slot: %lx\n", slot);
+
+       /* We have to pass down the secondary bucket bit here as well */
+       return (slot ^ hpte_group) & 15;
+}
+
+static long beat_lpar_hpte_remove(unsigned long hpte_group)
+{
+       DBG_LOW("hpte_remove(group=%lx)\n", hpte_group);
+       return -1;
+}
+
+static unsigned long beat_lpar_hpte_getword0(unsigned long slot)
+{
+       unsigned long dword0, dword[5];
+       unsigned long lpar_rc;
+
+       lpar_rc = beat_read_htab_entries(0, slot & ~3UL, dword);
+
+       dword0 = dword[slot&3];
+
+       BUG_ON(lpar_rc != 0);
+
+       return dword0;
+}
+
+static void beat_lpar_hptab_clear(void)
+{
+       unsigned long size_bytes = 1UL << ppc64_pft_size;
+       unsigned long hpte_count = size_bytes >> 4;
+       int i;
+       unsigned long dummy0, dummy1;
+
+       /* TODO: Use bulk call */
+       for (i = 0; i < hpte_count; i++)
+               beat_write_htab_entry(0, i, 0, 0, -1UL, -1UL, &dummy0, &dummy1);
+}
+
+/*
+ * NOTE: for updatepp ops we are fortunate that the linux "newpp" bits and
+ * the low 3 bits of flags happen to line up.  So no transform is needed.
+ * We can probably optimize here and assume the high bits of newpp are
+ * already zero.  For now I am paranoid.
+ */
+static long beat_lpar_hpte_updatepp(unsigned long slot,
+                                   unsigned long newpp,
+                                   unsigned long va,
+                                   int psize, int local)
+{
+       unsigned long lpar_rc;
+       unsigned long dummy0, dummy1, want_v;
+       unsigned long flags;
+
+       want_v = hpte_encode_v(va, psize);
+
+       DBG_LOW("    update: "
+               "avpnv=%016lx, slot=%016lx, psize: %d, newpp %016lx ... ",
+               want_v & HPTE_V_AVPN, slot, psize, newpp);
+
+       spin_lock_irqsave(&beat_htab_lock, flags);
+       dummy0 = beat_lpar_hpte_getword0(slot);
+       if ((dummy0 & ~0x7FUL) != (want_v & ~0x7FUL)) {
+               DBG_LOW("not found !\n");
+               spin_unlock_irqrestore(&beat_htab_lock, flags);
+               return -1;
+       }
+
+       lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7, &dummy0,
+                                       &dummy1);
+       spin_unlock_irqrestore(&beat_htab_lock, flags);
+       if (lpar_rc != 0 || dummy0 == 0) {
+               DBG_LOW("not found !\n");
+               return -1;
+       }
+
+       DBG_LOW("ok %lx %lx\n", dummy0, dummy1);
+
+       BUG_ON(lpar_rc != 0);
+
+       return 0;
+}
+
+static long beat_lpar_hpte_find(unsigned long va, int psize)
+{
+       unsigned long hash;
+       unsigned long i, j;
+       long slot;
+       unsigned long want_v, hpte_v;
+
+       hash = hpt_hash(va, mmu_psize_defs[psize].shift);
+       want_v = hpte_encode_v(va, psize);
+
+       for (j = 0; j < 2; j++) {
+               slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
+               for (i = 0; i < HPTES_PER_GROUP; i++) {
+                       hpte_v = beat_lpar_hpte_getword0(slot);
+
+                       if (HPTE_V_COMPARE(hpte_v, want_v)
+                           && (hpte_v & HPTE_V_VALID)
+                           && (!!(hpte_v & HPTE_V_SECONDARY) == j)) {
+                               /* HPTE matches */
+                               if (j)
+                                       slot = -slot;
+                               return slot;
+                       }
+                       ++slot;
+               }
+               hash = ~hash;
+       }
+
+       return -1;
+}
+
+static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
+                                         unsigned long ea,
+                                         int psize)
+{
+       unsigned long lpar_rc, slot, vsid, va, dummy0, dummy1;
+       unsigned long flags;
+
+       vsid = get_kernel_vsid(ea);
+       va = (vsid << 28) | (ea & 0x0fffffff);
+
+       spin_lock_irqsave(&beat_htab_lock, flags);
+       slot = beat_lpar_hpte_find(va, psize);
+       BUG_ON(slot == -1);
+
+       lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7,
+               &dummy0, &dummy1);
+       spin_unlock_irqrestore(&beat_htab_lock, flags);
+
+       BUG_ON(lpar_rc != 0);
+}
+
+static void beat_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
+                                        int psize, int local)
+{
+       unsigned long want_v;
+       unsigned long lpar_rc;
+       unsigned long dummy1, dummy2;
+       unsigned long flags;
+
+       DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d\n",
+               slot, va, psize, local);
+       want_v = hpte_encode_v(va, psize);
+
+       spin_lock_irqsave(&beat_htab_lock, flags);
+       dummy1 = beat_lpar_hpte_getword0(slot);
+
+       if ((dummy1 & ~0x7FUL) != (want_v & ~0x7FUL)) {
+               DBG_LOW("not found !\n");
+               spin_unlock_irqrestore(&beat_htab_lock, flags);
+               return;
+       }
+
+       lpar_rc = beat_write_htab_entry(0, slot, 0, 0, HPTE_V_VALID, 0,
+               &dummy1, &dummy2);
+       spin_unlock_irqrestore(&beat_htab_lock, flags);
+
+       BUG_ON(lpar_rc != 0);
+}
+
+void __init hpte_init_beat(void)
+{
+       ppc_md.hpte_invalidate  = beat_lpar_hpte_invalidate;
+       ppc_md.hpte_updatepp    = beat_lpar_hpte_updatepp;
+       ppc_md.hpte_updateboltedpp = beat_lpar_hpte_updateboltedpp;
+       ppc_md.hpte_insert      = beat_lpar_hpte_insert;
+       ppc_md.hpte_remove      = beat_lpar_hpte_remove;
+       ppc_md.hpte_clear_all   = beat_lpar_hptab_clear;
+}
diff --git a/arch/powerpc/platforms/celleb/hvCall.S b/arch/powerpc/platforms/celleb/hvCall.S
new file mode 100644 (file)
index 0000000..74c8174
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * Beat hypervisor call I/F
+ *
+ * (C) Copyright 2007 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/platforms/pseries/hvCall.S.
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <asm/ppc_asm.h>
+
+#define        STK_PARM(i)     (48 + ((i)-3)*8)
+
+/* Not implemented on Beat, now */
+#define        HCALL_INST_PRECALL
+#define        HCALL_INST_POSTCALL
+
+       .text
+
+#define        HVSC    .long   0x44000022
+
+/* Note: takes only 7 input parameters at maximum */
+_GLOBAL(beat_hcall_norets)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       mr      r11,r3
+       mr      r3,r4
+       mr      r4,r5
+       mr      r5,r6
+       mr      r6,r7
+       mr      r7,r8
+       mr      r8,r9
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes 8 input parameters at maximum */
+_GLOBAL(beat_hcall_norets8)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       mr      r11,r3
+       mr      r3,r4
+       mr      r4,r5
+       mr      r5,r6
+       mr      r6,r7
+       mr      r7,r8
+       mr      r8,r9
+       ld      r10,STK_PARM(r10)(r1)
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 1 output parameters at maximum */
+_GLOBAL(beat_hcall1)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 2 output parameters at maximum */
+_GLOBAL(beat_hcall2)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 3 output parameters at maximum */
+_GLOBAL(beat_hcall3)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 4 output parameters at maximum */
+_GLOBAL(beat_hcall4)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+       std     r7, 24(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 5 output parameters at maximum */
+_GLOBAL(beat_hcall5)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+       std     r7, 24(r12)
+       std     r8, 32(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
+
+/* Note: takes only 6 input parameters, 6 output parameters at maximum */
+_GLOBAL(beat_hcall6)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+
+       HCALL_INST_PRECALL
+
+       std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
+
+       mr      r11,r3
+       mr      r3,r5
+       mr      r4,r6
+       mr      r5,r7
+       mr      r6,r8
+       mr      r7,r9
+       mr      r8,r10
+
+       HVSC                            /* invoke the hypervisor */
+
+       HCALL_INST_POSTCALL
+
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+       std     r7, 24(r12)
+       std     r8, 32(r12)
+       std     r9, 40(r12)
+
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+
+       blr                             /* return r3 = status */
diff --git a/arch/powerpc/platforms/celleb/interrupt.c b/arch/powerpc/platforms/celleb/interrupt.c
new file mode 100644 (file)
index 0000000..98e6665
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * Celleb/Beat Interrupt controller
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/percpu.h>
+#include <linux/types.h>
+
+#include <asm/machdep.h>
+
+#include "interrupt.h"
+#include "beat_wrapper.h"
+
+#define        MAX_IRQS        NR_IRQS
+static DEFINE_SPINLOCK(beatic_irq_mask_lock);
+static uint64_t        beatic_irq_mask_enable[(MAX_IRQS+255)/64];
+static uint64_t        beatic_irq_mask_ack[(MAX_IRQS+255)/64];
+
+static struct irq_host *beatic_host = NULL;
+
+/*
+ * In this implementation, "virq" == "IRQ plug number",
+ * "(irq_hw_number_t)hwirq" == "IRQ outlet number".
+ */
+
+/* assumption: locked */
+static inline void beatic_update_irq_mask(unsigned int irq_plug)
+{
+       int off;
+       unsigned long masks[4];
+
+       off = (irq_plug / 256) * 4;
+       masks[0] = beatic_irq_mask_enable[off + 0]
+                  & beatic_irq_mask_ack[off + 0];
+       masks[1] = beatic_irq_mask_enable[off + 1]
+                  & beatic_irq_mask_ack[off + 1];
+       masks[2] = beatic_irq_mask_enable[off + 2]
+                  & beatic_irq_mask_ack[off + 2];
+       masks[3] = beatic_irq_mask_enable[off + 3]
+                  & beatic_irq_mask_ack[off + 3];
+       if (beat_set_interrupt_mask(irq_plug&~255UL,
+               masks[0], masks[1], masks[2], masks[3]) != 0)
+               panic("Failed to set mask IRQ!");
+}
+
+static void beatic_mask_irq(unsigned int irq_plug)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&beatic_irq_mask_lock, flags);
+       beatic_irq_mask_enable[irq_plug/64] &= ~(1UL << (63 - (irq_plug%64)));
+       beatic_update_irq_mask(irq_plug);
+       spin_unlock_irqrestore(&beatic_irq_mask_lock, flags);
+}
+
+static void beatic_unmask_irq(unsigned int irq_plug)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&beatic_irq_mask_lock, flags);
+       beatic_irq_mask_enable[irq_plug/64] |= 1UL << (63 - (irq_plug%64));
+       beatic_update_irq_mask(irq_plug);
+       spin_unlock_irqrestore(&beatic_irq_mask_lock, flags);
+}
+
+static void beatic_ack_irq(unsigned int irq_plug)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&beatic_irq_mask_lock, flags);
+       beatic_irq_mask_ack[irq_plug/64] &= ~(1UL << (63 - (irq_plug%64)));
+       beatic_update_irq_mask(irq_plug);
+       spin_unlock_irqrestore(&beatic_irq_mask_lock, flags);
+}
+
+static void beatic_end_irq(unsigned int irq_plug)
+{
+       s64 err;
+       unsigned long flags;
+
+       if ((err = beat_downcount_of_interrupt(irq_plug)) != 0) {
+               if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */
+                       panic("Failed to downcount IRQ! Error = %16lx", err);
+
+               printk(KERN_ERR "IRQ over-downcounted, plug %d\n", irq_plug);
+       }
+       spin_lock_irqsave(&beatic_irq_mask_lock, flags);
+       beatic_irq_mask_ack[irq_plug/64] |= 1UL << (63 - (irq_plug%64));
+       beatic_update_irq_mask(irq_plug);
+       spin_unlock_irqrestore(&beatic_irq_mask_lock, flags);
+}
+
+static struct irq_chip beatic_pic = {
+       .typename = " CELL-BEAT ",
+       .unmask = beatic_unmask_irq,
+       .mask = beatic_mask_irq,
+       .eoi = beatic_end_irq,
+};
+
+/*
+ * Dispose binding hardware IRQ number (hw) and Virtuql IRQ number (virq),
+ * update flags.
+ *
+ * Note that the number (virq) is already assigned at upper layer.
+ */
+static void beatic_pic_host_unmap(struct irq_host *h, unsigned int virq)
+{
+       beat_destruct_irq_plug(virq);
+}
+
+/*
+ * Create or update binding hardware IRQ number (hw) and Virtuql
+ * IRQ number (virq). This is called only once for a given mapping.
+ *
+ * Note that the number (virq) is already assigned at upper layer.
+ */
+static int beatic_pic_host_map(struct irq_host *h, unsigned int virq,
+                              irq_hw_number_t hw)
+{
+       struct irq_desc *desc = get_irq_desc(virq);
+       int64_t err;
+
+       if ((err = beat_construct_and_connect_irq_plug(virq, hw)) < 0)
+               return -EIO;
+
+       desc->status |= IRQ_LEVEL;
+       set_irq_chip_and_handler(virq, &beatic_pic, handle_fasteoi_irq);
+       return 0;
+}
+
+/*
+ * Update binding hardware IRQ number (hw) and Virtuql
+ * IRQ number (virq). This is called only once for a given mapping.
+ */
+static void beatic_pic_host_remap(struct irq_host *h, unsigned int virq,
+                              irq_hw_number_t hw)
+{
+       beat_construct_and_connect_irq_plug(virq, hw);
+}
+
+/*
+ * Translate device-tree interrupt spec to irq_hw_number_t style (ulong),
+ * to pass away to irq_create_mapping().
+ *
+ * Called from irq_create_of_mapping() only.
+ * Note: We have only 1 entry to translate.
+ */
+static int beatic_pic_host_xlate(struct irq_host *h, struct device_node *ct,
+                                u32 *intspec, unsigned int intsize,
+                                irq_hw_number_t *out_hwirq,
+                                unsigned int *out_flags)
+{
+       u64 *intspec2 = (u64 *)intspec;
+
+       *out_hwirq = *intspec2;
+       *out_flags |= IRQ_TYPE_LEVEL_LOW;
+       return 0;
+}
+
+static struct irq_host_ops beatic_pic_host_ops = {
+       .map = beatic_pic_host_map,
+       .remap = beatic_pic_host_remap,
+       .unmap = beatic_pic_host_unmap,
+       .xlate = beatic_pic_host_xlate,
+};
+
+/*
+ * Get an IRQ number
+ * Note: returns VIRQ
+ */
+static inline unsigned int beatic_get_irq_plug(void)
+{
+       int i;
+       uint64_t        pending[4], ub;
+
+       for (i = 0; i < MAX_IRQS; i += 256) {
+               beat_detect_pending_interrupts(i, pending);
+               __asm__ ("cntlzd %0,%1":"=r"(ub):
+                       "r"(pending[0] & beatic_irq_mask_enable[i/64+0]
+                                      & beatic_irq_mask_ack[i/64+0]));
+               if (ub != 64)
+                       return i + ub + 0;
+               __asm__ ("cntlzd %0,%1":"=r"(ub):
+                       "r"(pending[1] & beatic_irq_mask_enable[i/64+1]
+                                      & beatic_irq_mask_ack[i/64+1]));
+               if (ub != 64)
+                       return i + ub + 64;
+               __asm__ ("cntlzd %0,%1":"=r"(ub):
+                       "r"(pending[2] & beatic_irq_mask_enable[i/64+2]
+                                      & beatic_irq_mask_ack[i/64+2]));
+               if (ub != 64)
+                       return i + ub + 128;
+               __asm__ ("cntlzd %0,%1":"=r"(ub):
+                       "r"(pending[3] & beatic_irq_mask_enable[i/64+3]
+                                      & beatic_irq_mask_ack[i/64+3]));
+               if (ub != 64)
+                       return i + ub + 192;
+       }
+
+       return NO_IRQ;
+}
+unsigned int beatic_get_irq(void)
+{
+       unsigned int ret;
+
+       ret = beatic_get_irq_plug();
+       if (ret != NO_IRQ)
+               beatic_ack_irq(ret);
+       return ret;
+}
+
+/*
+ */
+void __init beatic_init_IRQ(void)
+{
+       int     i;
+
+       memset(beatic_irq_mask_enable, 0, sizeof(beatic_irq_mask_enable));
+       memset(beatic_irq_mask_ack, 255, sizeof(beatic_irq_mask_ack));
+       for (i = 0; i < MAX_IRQS; i += 256)
+               beat_set_interrupt_mask(i, 0L, 0L, 0L, 0L);
+
+       /* Set out get_irq function */
+       ppc_md.get_irq = beatic_get_irq;
+
+       /* Allocate an irq host */
+       beatic_host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0,
+                                        &beatic_pic_host_ops,
+                                        0);
+       BUG_ON(beatic_host == NULL);
+       irq_set_default_host(beatic_host);
+}
+
+#ifdef CONFIG_SMP
+
+/* Nullified to compile with SMP mode */
+void beatic_setup_cpu(int cpu)
+{
+}
+
+void beatic_cause_IPI(int cpu, int mesg)
+{
+}
+
+void beatic_request_IPIs(void)
+{
+}
+#endif /* CONFIG_SMP */
+
+void beatic_deinit_IRQ(void)
+{
+       int     i;
+
+       for (i = 1; i < NR_IRQS; i++)
+               beat_destruct_irq_plug(i);
+}
diff --git a/arch/powerpc/platforms/celleb/interrupt.h b/arch/powerpc/platforms/celleb/interrupt.h
new file mode 100644 (file)
index 0000000..b470fd0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Celleb/Beat Interrupt controller
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef ASM_BEAT_PIC_H
+#define ASM_BEAT_PIC_H
+#ifdef __KERNEL__
+
+extern void beatic_init_IRQ(void);
+extern unsigned int beatic_get_irq(void);
+extern void beatic_cause_IPI(int cpu, int mesg);
+extern void beatic_request_IPIs(void);
+extern void beatic_setup_cpu(int);
+extern void beatic_deinit_IRQ(void);
+
+#endif
+#endif /* ASM_BEAT_PIC_H */
diff --git a/arch/powerpc/platforms/celleb/iommu.c b/arch/powerpc/platforms/celleb/iommu.c
new file mode 100644 (file)
index 0000000..f63b94c
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Support for IOMMU on Celleb platform.
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/dma-mapping.h>
+#include <linux/pci.h>
+
+#include <asm/of_platform.h>
+
+#include "beat_wrapper.h"
+
+#define DMA_FLAGS 0xf800000000000000UL /* r/w permitted, coherency required,
+                                          strongest order */
+
+static int __init find_dma_window(u64 *io_space_id, u64 *ioid,
+                                 u64 *base, u64 *size, u64 *io_page_size)
+{
+       struct device_node *dn;
+       const unsigned long *dma_window;
+
+       for_each_node_by_type(dn, "ioif") {
+               dma_window = get_property(dn, "toshiba,dma-window", NULL);
+               if (dma_window) {
+                       *io_space_id = (dma_window[0] >> 32) & 0xffffffffUL;
+                       *ioid = dma_window[0] & 0x7ffUL;
+                       *base = dma_window[1];
+                       *size = dma_window[2];
+                       *io_page_size = 1 << dma_window[3];
+                       of_node_put(dn);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+static void __init celleb_init_direct_mapping(void)
+{
+       u64 lpar_addr, io_addr;
+       u64 io_space_id, ioid, dma_base, dma_size, io_page_size;
+
+       if (!find_dma_window(&io_space_id, &ioid, &dma_base, &dma_size,
+                            &io_page_size)) {
+               pr_info("No dma window found !\n");
+               return;
+       }
+
+       for (lpar_addr = 0; lpar_addr < dma_size; lpar_addr += io_page_size) {
+               io_addr = lpar_addr + dma_base;
+               (void)beat_put_iopte(io_space_id, io_addr, lpar_addr,
+                                    ioid, DMA_FLAGS);
+       }
+
+       dma_direct_offset = dma_base;
+}
+
+static int celleb_of_bus_notify(struct notifier_block *nb,
+                               unsigned long action, void *data)
+{
+       struct device *dev = data;
+
+       /* We are only intereted in device addition */
+       if (action != BUS_NOTIFY_ADD_DEVICE)
+               return 0;
+
+       dev->archdata.dma_ops = pci_dma_ops;
+
+       return 0;
+}
+
+static struct notifier_block celleb_of_bus_notifier = {
+       .notifier_call = celleb_of_bus_notify
+};
+
+static int __init celleb_init_iommu(void)
+{
+       if (!machine_is(celleb))
+               return -ENODEV;
+
+       celleb_init_direct_mapping();
+       pci_dma_ops = &dma_direct_ops;
+       bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
+
+       return 0;
+}
+
+arch_initcall(celleb_init_iommu);
diff --git a/arch/powerpc/platforms/celleb/pci.c b/arch/powerpc/platforms/celleb/pci.c
new file mode 100644 (file)
index 0000000..867f83a
--- /dev/null
@@ -0,0 +1,481 @@
+/*
+ * Support for PCI on Celleb platform.
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/kernel/rtas_pci.c:
+ *  Copyright (C) 2001 Dave Engebretsen, IBM Corporation
+ *  Copyright (C) 2003 Anton Blanchard <anton@au.ibm.com>, IBM
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/threads.h>
+#include <linux/pci.h>
+#include <linux/string.h>
+#include <linux/init.h>
+#include <linux/bootmem.h>
+#include <linux/pci_regs.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/ppc-pci.h>
+
+#include "pci.h"
+#include "interrupt.h"
+
+#define MAX_PCI_DEVICES    32
+#define MAX_PCI_FUNCTIONS   8
+#define MAX_PCI_BASE_ADDRS  3 /* use 64 bit address */
+
+/* definition for fake pci configuration area for GbE, .... ,and etc. */
+
+struct celleb_pci_resource {
+       struct resource r[MAX_PCI_BASE_ADDRS];
+};
+
+struct celleb_pci_private {
+       unsigned char *fake_config[MAX_PCI_DEVICES][MAX_PCI_FUNCTIONS];
+       struct celleb_pci_resource *res[MAX_PCI_DEVICES][MAX_PCI_FUNCTIONS];
+};
+
+static inline u8 celleb_fake_config_readb(void *addr)
+{
+       u8 *p = addr;
+       return *p;
+}
+
+static inline u16 celleb_fake_config_readw(void *addr)
+{
+       u16 *p = addr;
+       return le16_to_cpu(*p);
+}
+
+static inline u32 celleb_fake_config_readl(void *addr)
+{
+       u32 *p = addr;
+       return le32_to_cpu(*p);
+}
+
+static inline void celleb_fake_config_writeb(u32 val, void *addr)
+{
+       u8 *p = addr;
+       *p = val;
+}
+
+static inline void celleb_fake_config_writew(u32 val, void *addr)
+{
+       u16 val16;
+       u16 *p = addr;
+       val16 = cpu_to_le16(val);
+       *p = val16;
+}
+
+static inline void celleb_fake_config_writel(u32 val, void *addr)
+{
+       u32 val32;
+       u32 *p = addr;
+       val32 = cpu_to_le32(val);
+       *p = val32;
+}
+
+static unsigned char *get_fake_config_start(struct pci_controller *hose,
+                                           int devno, int fn)
+{
+       struct celleb_pci_private *private = hose->private_data;
+
+       if (private == NULL)
+               return NULL;
+
+       return private->fake_config[devno][fn];
+}
+
+static struct celleb_pci_resource *get_resource_start(
+                               struct pci_controller *hose,
+                               int devno, int fn)
+{
+       struct celleb_pci_private *private = hose->private_data;
+
+       if (private == NULL)
+               return NULL;
+
+       return private->res[devno][fn];
+}
+
+
+static void celleb_config_read_fake(unsigned char *config, int where,
+                                   int size, u32 *val)
+{
+       char *p = config + where;
+
+       switch (size) {
+       case 1:
+               *val = celleb_fake_config_readb(p);
+               break;
+       case 2:
+               *val = celleb_fake_config_readw(p);
+               break;
+       case 4:
+               *val = celleb_fake_config_readl(p);
+               break;
+       }
+
+       return;
+}
+
+static void celleb_config_write_fake(unsigned char *config, int where,
+                                    int size, u32 val)
+{
+       char *p = config + where;
+
+       switch (size) {
+       case 1:
+               celleb_fake_config_writeb(val, p);
+               break;
+       case 2:
+               celleb_fake_config_writew(val, p);
+               break;
+       case 4:
+               celleb_fake_config_writel(val, p);
+               break;
+       }
+       return;
+}
+
+static int celleb_fake_pci_read_config(struct pci_bus *bus,
+               unsigned int devfn, int where, int size, u32 *val)
+{
+       char *config;
+       struct device_node *node;
+       struct pci_controller *hose;
+       unsigned int devno = devfn >> 3;
+       unsigned int fn = devfn & 0x7;
+
+       /* allignment check */
+       BUG_ON(where % size);
+
+       pr_debug("    fake read: bus=0x%x, ", bus->number);
+       node = (struct device_node *)bus->sysdata;
+       hose = pci_find_hose_for_OF_device(node);
+       config = get_fake_config_start(hose, devno, fn);
+
+       pr_debug("devno=0x%x, where=0x%x, size=0x%x, ", devno, where, size);
+       if (!config) {
+               pr_debug("failed\n");
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       celleb_config_read_fake(config, where, size, val);
+       pr_debug("val=0x%x\n", *val);
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+
+static int celleb_fake_pci_write_config(struct pci_bus *bus,
+                unsigned int devfn, int where, int size, u32 val)
+{
+       char *config;
+       struct device_node *node;
+       struct pci_controller *hose;
+       struct celleb_pci_resource *res;
+       unsigned int devno = devfn >> 3;
+       unsigned int fn = devfn & 0x7;
+
+       /* allignment check */
+       BUG_ON(where % size);
+
+       node = (struct device_node *)bus->sysdata;
+       hose = pci_find_hose_for_OF_device(node);
+       config = get_fake_config_start(hose, devno, fn);
+
+       if (!config)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       if (val == ~0) {
+               int i = (where - PCI_BASE_ADDRESS_0) >> 3;
+
+               switch (where) {
+               case PCI_BASE_ADDRESS_0:
+               case PCI_BASE_ADDRESS_2:
+                       if (size != 4)
+                               return PCIBIOS_DEVICE_NOT_FOUND;
+                       res = get_resource_start(hose, devno, fn);
+                       if (!res)
+                               return PCIBIOS_DEVICE_NOT_FOUND;
+                       celleb_config_write_fake(config, where, size,
+                                       (res->r[i].end - res->r[i].start));
+                       return PCIBIOS_SUCCESSFUL;
+               case PCI_BASE_ADDRESS_1:
+               case PCI_BASE_ADDRESS_3:
+               case PCI_BASE_ADDRESS_4:
+               case PCI_BASE_ADDRESS_5:
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       celleb_config_write_fake(config, where, size, val);
+       pr_debug("    fake write: where=%x, size=%d, val=%x\n",
+                where, size, val);
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops celleb_fake_pci_ops = {
+       celleb_fake_pci_read_config,
+       celleb_fake_pci_write_config
+};
+
+static inline void celleb_setup_pci_base_addrs(struct pci_controller *hose,
+                                       unsigned int devno, unsigned int fn,
+                                       unsigned int num_base_addr)
+{
+       u32 val;
+       unsigned char *config;
+       struct celleb_pci_resource *res;
+
+       config = get_fake_config_start(hose, devno, fn);
+       res = get_resource_start(hose, devno, fn);
+
+       if (!config || !res)
+               return;
+
+       switch (num_base_addr) {
+       case 3:
+               val = (res->r[2].start & 0xfffffff0)
+                   | PCI_BASE_ADDRESS_MEM_TYPE_64;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_4, 4, val);
+               val = res->r[2].start >> 32;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_5, 4, val);
+               /* FALLTHROUGH */
+       case 2:
+               val = (res->r[1].start & 0xfffffff0)
+                   | PCI_BASE_ADDRESS_MEM_TYPE_64;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_2, 4, val);
+               val = res->r[1].start >> 32;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_3, 4, val);
+               /* FALLTHROUGH */
+       case 1:
+               val = (res->r[0].start & 0xfffffff0)
+                   | PCI_BASE_ADDRESS_MEM_TYPE_64;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_0, 4, val);
+               val = res->r[0].start >> 32;
+               celleb_config_write_fake(config, PCI_BASE_ADDRESS_1, 4, val);
+               break;
+       }
+
+       val = PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
+       celleb_config_write_fake(config, PCI_COMMAND, 2, val);
+}
+
+static int __devinit celleb_setup_fake_pci_device(struct device_node *node,
+                                                 struct pci_controller *hose)
+{
+       unsigned int rlen;
+       int num_base_addr = 0;
+       u32 val;
+       const u32 *wi0, *wi1, *wi2, *wi3, *wi4;
+       unsigned int devno, fn;
+       struct celleb_pci_private *private = hose->private_data;
+       unsigned char **config = NULL;
+       struct celleb_pci_resource **res = NULL;
+       const char *name;
+       const unsigned long *li;
+       int size, result;
+
+       if (private == NULL) {
+               printk(KERN_ERR "PCI: "
+                      "memory space for pci controller is not assigned\n");
+               goto error;
+       }
+
+       name = get_property(node, "model", &rlen);
+       if (!name) {
+               printk(KERN_ERR "PCI: model property not found.\n");
+               goto error;
+       }
+
+       wi4 = get_property(node, "reg", &rlen);
+       if (wi4 == NULL)
+               goto error;
+
+       devno = ((wi4[0] >> 8) & 0xff) >> 3;
+       fn = (wi4[0] >> 8) & 0x7;
+
+       pr_debug("PCI: celleb_setup_fake_pci() %s devno=%x fn=%x\n", name,
+                devno, fn);
+
+       size = 256;
+       config = &private->fake_config[devno][fn];
+       if (mem_init_done)
+               *config = kzalloc(size, GFP_KERNEL);
+       else
+               *config = alloc_bootmem(size);
+       if (*config == NULL) {
+               printk(KERN_ERR "PCI: "
+                      "not enough memory for fake configuration space\n");
+               goto error;
+       }
+       pr_debug("PCI: fake config area assigned 0x%016lx\n",
+                (unsigned long)*config);
+
+       size = sizeof(struct celleb_pci_resource);
+       res = &private->res[devno][fn];
+       if (mem_init_done)
+               *res = kzalloc(size, GFP_KERNEL);
+       else
+               *res = alloc_bootmem(size);
+       if (*res == NULL) {
+               printk(KERN_ERR
+                      "PCI: not enough memory for resource data space\n");
+               goto error;
+       }
+       pr_debug("PCI: res assigned 0x%016lx\n", (unsigned long)*res);
+
+       wi0 = get_property(node, "device-id", NULL);
+       wi1 = get_property(node, "vendor-id", NULL);
+       wi2 = get_property(node, "class-code", NULL);
+       wi3 = get_property(node, "revision-id", NULL);
+
+       celleb_config_write_fake(*config, PCI_DEVICE_ID, 2, wi0[0] & 0xffff);
+       celleb_config_write_fake(*config, PCI_VENDOR_ID, 2, wi1[0] & 0xffff);
+       pr_debug("class-code = 0x%08x\n", wi2[0]);
+
+       celleb_config_write_fake(*config, PCI_CLASS_PROG, 1, wi2[0] & 0xff);
+       celleb_config_write_fake(*config, PCI_CLASS_DEVICE, 2,
+                                (wi2[0] >> 8) & 0xffff);
+       celleb_config_write_fake(*config, PCI_REVISION_ID, 1, wi3[0]);
+
+       while (num_base_addr < MAX_PCI_BASE_ADDRS) {
+               result = of_address_to_resource(node,
+                               num_base_addr, &(*res)->r[num_base_addr]);
+               if (result)
+                       break;
+               num_base_addr++;
+       }
+
+       celleb_setup_pci_base_addrs(hose, devno, fn, num_base_addr);
+
+       li = get_property(node, "interrupts", &rlen);
+       val = li[0];
+       celleb_config_write_fake(*config, PCI_INTERRUPT_PIN, 1, 1);
+       celleb_config_write_fake(*config, PCI_INTERRUPT_LINE, 1, val);
+
+#ifdef DEBUG
+       pr_debug("PCI: %s irq=%ld\n", name, li[0]);
+       for (i = 0; i < 6; i++) {
+               celleb_config_read_fake(*config,
+                                       PCI_BASE_ADDRESS_0 + 0x4 * i, 4,
+                                       &val);
+               pr_debug("PCI: %s fn=%d base_address_%d=0x%x\n",
+                        name, fn, i, val);
+       }
+#endif
+
+       celleb_config_write_fake(*config, PCI_HEADER_TYPE, 1,
+                                PCI_HEADER_TYPE_NORMAL);
+
+       return 0;
+
+error:
+       if (mem_init_done) {
+               if (config && *config)
+                       kfree(*config);
+               if (res && *res)
+                       kfree(*res);
+
+       } else {
+               if (config && *config) {
+                       size = 256;
+                       free_bootmem((unsigned long)(*config), size);
+               }
+               if (res && *res) {
+                       size = sizeof(struct celleb_pci_resource);
+                       free_bootmem((unsigned long)(*res), size);
+               }
+       }
+
+       return 1;
+}
+
+static int __devinit phb_set_bus_ranges(struct device_node *dev,
+                                       struct pci_controller *phb)
+{
+       const int *bus_range;
+       unsigned int len;
+
+       bus_range = get_property(dev, "bus-range", &len);
+       if (bus_range == NULL || len < 2 * sizeof(int))
+               return 1;
+
+       phb->first_busno = bus_range[0];
+       phb->last_busno = bus_range[1];
+
+       return 0;
+}
+
+static void __devinit celleb_alloc_private_mem(struct pci_controller *hose)
+{
+       if (mem_init_done)
+               hose->private_data =
+                       kzalloc(sizeof(struct celleb_pci_private), GFP_KERNEL);
+       else
+               hose->private_data =
+                       alloc_bootmem(sizeof(struct celleb_pci_private));
+}
+
+int __devinit celleb_setup_phb(struct pci_controller *phb)
+{
+       const char *name;
+       struct device_node *dev = phb->arch_data;
+       struct device_node *node;
+       unsigned int rlen;
+
+       name = get_property(dev, "name", &rlen);
+       if (!name)
+               return 1;
+
+       pr_debug("PCI: celleb_setup_phb() %s\n", name);
+       phb_set_bus_ranges(dev, phb);
+
+       if (strcmp(name, "epci") == 0) {
+               phb->ops = &celleb_epci_ops;
+               return celleb_setup_epci(dev, phb);
+
+       } else if (strcmp(name, "pci-pseudo") == 0) {
+               phb->ops = &celleb_fake_pci_ops;
+               celleb_alloc_private_mem(phb);
+               for (node = of_get_next_child(dev, NULL);
+                    node != NULL; node = of_get_next_child(dev, node))
+                       celleb_setup_fake_pci_device(node, phb);
+
+       } else
+               return 1;
+
+       return 0;
+}
+
+int celleb_pci_probe_mode(struct pci_bus *bus)
+{
+       return PCI_PROBE_DEVTREE;
+}
diff --git a/arch/powerpc/platforms/celleb/pci.h b/arch/powerpc/platforms/celleb/pci.h
new file mode 100644 (file)
index 0000000..5340e34
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * pci prototypes for Celleb platform
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _CELLEB_PCI_H
+#define _CELLEB_PCI_H
+
+#include <linux/pci.h>
+
+#include <asm/pci-bridge.h>
+#include <asm/prom.h>
+
+extern int celleb_setup_phb(struct pci_controller *);
+extern int celleb_pci_probe_mode(struct pci_bus *);
+
+extern struct pci_ops celleb_epci_ops;
+extern int celleb_setup_epci(struct device_node *, struct pci_controller *);
+
+#endif /* _CELLEB_PCI_H */
diff --git a/arch/powerpc/platforms/celleb/scc.h b/arch/powerpc/platforms/celleb/scc.h
new file mode 100644 (file)
index 0000000..e9ce8a7
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * SCC (Super Companion Chip) definitions
+ *
+ * (C) Copyright 2004-2006 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _CELLEB_SCC_H
+#define _CELLEB_SCC_H
+
+#define PCI_VENDOR_ID_TOSHIBA_2                 0x102f
+#define PCI_DEVICE_ID_TOSHIBA_SCC_PCIEXC_BRIDGE 0x01b0
+#define PCI_DEVICE_ID_TOSHIBA_SCC_EPCI_BRIDGE   0x01b1
+#define PCI_DEVICE_ID_TOSHIBA_SCC_BRIDGE        0x01b2
+#define PCI_DEVICE_ID_TOSHIBA_SCC_GBE           0x01b3
+#define PCI_DEVICE_ID_TOSHIBA_SCC_ATA           0x01b4
+#define PCI_DEVICE_ID_TOSHIBA_SCC_USB2          0x01b5
+#define PCI_DEVICE_ID_TOSHIBA_SCC_USB           0x01b6
+#define PCI_DEVICE_ID_TOSHIBA_SCC_ENCDEC        0x01b7
+
+#define SCC_EPCI_REG            0x0000d000
+
+/* EPCI registers */
+#define SCC_EPCI_CNF10_REG      0x010
+#define SCC_EPCI_CNF14_REG      0x014
+#define SCC_EPCI_CNF18_REG      0x018
+#define SCC_EPCI_PVBAT          0x100
+#define SCC_EPCI_VPMBAT         0x104
+#define SCC_EPCI_VPIBAT         0x108
+#define SCC_EPCI_VCSR           0x110
+#define SCC_EPCI_VIENAB         0x114
+#define SCC_EPCI_VISTAT         0x118
+#define SCC_EPCI_VRDCOUNT       0x124
+#define SCC_EPCI_BAM0           0x12c
+#define SCC_EPCI_BAM1           0x134
+#define SCC_EPCI_BAM2           0x13c
+#define SCC_EPCI_IADR           0x164
+#define SCC_EPCI_CLKRST         0x800
+#define SCC_EPCI_INTSET         0x804
+#define SCC_EPCI_STATUS         0x808
+#define SCC_EPCI_ABTSET         0x80c
+#define SCC_EPCI_WATRP          0x810
+#define SCC_EPCI_DUMMYRADR      0x814
+#define SCC_EPCI_SWRESP         0x818
+#define SCC_EPCI_CNTOPT         0x81c
+#define SCC_EPCI_ECMODE         0xf00
+#define SCC_EPCI_IOM_AC_NUM     5
+#define SCC_EPCI_IOM_ACTE(n)    (0xf10 + (n) * 4)
+#define SCC_EPCI_IOT_AC_NUM     4
+#define SCC_EPCI_IOT_ACTE(n)    (0xf30 + (n) * 4)
+#define SCC_EPCI_MAEA           0xf50
+#define SCC_EPCI_MAEC           0xf54
+#define SCC_EPCI_CKCTRL         0xff0
+
+/* bits for SCC_EPCI_VCSR */
+#define SCC_EPCI_VCSR_FRE       0x00020000
+#define SCC_EPCI_VCSR_FWE       0x00010000
+#define SCC_EPCI_VCSR_DR        0x00000400
+#define SCC_EPCI_VCSR_SR        0x00000008
+#define SCC_EPCI_VCSR_AT        0x00000004
+
+/* bits for SCC_EPCI_VIENAB/SCC_EPCI_VISTAT */
+#define SCC_EPCI_VISTAT_PMPE    0x00000008
+#define SCC_EPCI_VISTAT_PMFE    0x00000004
+#define SCC_EPCI_VISTAT_PRA     0x00000002
+#define SCC_EPCI_VISTAT_PRD     0x00000001
+#define SCC_EPCI_VISTAT_ALL     0x0000000f
+
+#define SCC_EPCI_VIENAB_PMPEE   0x00000008
+#define SCC_EPCI_VIENAB_PMFEE   0x00000004
+#define SCC_EPCI_VIENAB_PRA     0x00000002
+#define SCC_EPCI_VIENAB_PRD     0x00000001
+#define SCC_EPCI_VIENAB_ALL     0x0000000f
+
+/* bits for SCC_EPCI_CLKRST */
+#define SCC_EPCI_CLKRST_CKS_MASK 0x00030000
+#define SCC_EPCI_CLKRST_CKS_2   0x00000000
+#define SCC_EPCI_CLKRST_CKS_4   0x00010000
+#define SCC_EPCI_CLKRST_CKS_8   0x00020000
+#define SCC_EPCI_CLKRST_PCICRST 0x00000400
+#define SCC_EPCI_CLKRST_BC      0x00000200
+#define SCC_EPCI_CLKRST_PCIRST  0x00000100
+#define SCC_EPCI_CLKRST_PCKEN   0x00000001
+
+/* bits for SCC_EPCI_INTSET/SCC_EPCI_STATUS */
+#define SCC_EPCI_INT_2M         0x01000000
+#define SCC_EPCI_INT_RERR       0x00200000
+#define SCC_EPCI_INT_SERR       0x00100000
+#define SCC_EPCI_INT_PRTER      0x00080000
+#define SCC_EPCI_INT_SER        0x00040000
+#define SCC_EPCI_INT_PER        0x00020000
+#define SCC_EPCI_INT_PAI        0x00010000
+#define SCC_EPCI_INT_1M         0x00000100
+#define SCC_EPCI_INT_PME        0x00000010
+#define SCC_EPCI_INT_INTD       0x00000008
+#define SCC_EPCI_INT_INTC       0x00000004
+#define SCC_EPCI_INT_INTB       0x00000002
+#define SCC_EPCI_INT_INTA       0x00000001
+#define SCC_EPCI_INT_DEVINT     0x0000000f
+#define SCC_EPCI_INT_ALL        0x003f001f
+#define SCC_EPCI_INT_ALLERR     0x003f0000
+
+/* bits for SCC_EPCI_CKCTRL */
+#define SCC_EPCI_CKCTRL_CRST0   0x00010000
+#define SCC_EPCI_CKCTRL_CRST1   0x00020000
+#define SCC_EPCI_CKCTRL_OCLKEN  0x00000100
+#define SCC_EPCI_CKCTRL_LCLKEN  0x00000001
+
+#define SCC_EPCI_IDSEL_AD_TO_SLOT(ad)       ((ad) - 10)
+#define SCC_EPCI_MAX_DEVNU      SCC_EPCI_IDSEL_AD_TO_SLOT(32)
+
+/* bits for SCC_EPCI_CNTOPT */
+#define SCC_EPCI_CNTOPT_O2PMB   0x00000002
+
+/* UHC registers */
+#define SCC_UHC_CKRCTRL         0xff0
+#define SCC_UHC_ECMODE          0xf00
+
+/* bits for SCC_UHC_CKRCTRL */
+#define SCC_UHC_F48MCKLEN       0x00000001
+#define SCC_UHC_P_SUSPEND       0x00000002
+#define SCC_UHC_PHY_SUSPEND_SEL 0x00000004
+#define SCC_UHC_HCLKEN          0x00000100
+#define SCC_UHC_USBEN           0x00010000
+#define SCC_UHC_USBCEN          0x00020000
+#define SCC_UHC_PHYEN           0x00040000
+
+/* bits for SCC_UHC_ECMODE */
+#define SCC_UHC_ECMODE_BY_BYTE  0x00000555
+#define SCC_UHC_ECMODE_BY_WORD  0x00000aaa
+
+#endif /* _CELLEB_SCC_H */
diff --git a/arch/powerpc/platforms/celleb/scc_epci.c b/arch/powerpc/platforms/celleb/scc_epci.c
new file mode 100644 (file)
index 0000000..0edbc0c
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+ * Support for SCC external PCI
+ *
+ * (C) Copyright 2004-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/threads.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/pci_regs.h>
+#include <linux/bootmem.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/ppc-pci.h>
+
+#include "scc.h"
+#include "pci.h"
+#include "interrupt.h"
+
+#define MAX_PCI_DEVICES   32
+#define MAX_PCI_FUNCTIONS  8
+
+#define iob()  __asm__ __volatile__("eieio; sync":::"memory")
+
+
+#if 0 /* test code for epci dummy read */
+static void celleb_epci_dummy_read(struct pci_dev *dev)
+{
+       void *epci_base;
+       struct device_node *node;
+       struct pci_controller *hose;
+       u32 val;
+
+       node = (struct device_node *)dev->bus->sysdata;
+       hose = pci_find_hose_for_OF_device(node);
+
+       if (!hose)
+               return;
+
+       epci_base = (void *)hose->cfg_addr;
+
+       val = in_be32(epci_base + SCC_EPCI_WATRP);
+       iosync();
+
+       return;
+}
+#endif
+
+static inline void clear_and_disable_master_abort_interrupt(
+                                       struct pci_controller *hose)
+{
+       void __iomem *addr;
+       addr = (void *)hose->cfg_addr + PCI_COMMAND;
+       out_be32(addr, in_be32(addr) | (PCI_STATUS_REC_MASTER_ABORT << 16));
+}
+
+static int celleb_epci_check_abort(struct pci_controller *hose,
+                                  unsigned long addr)
+{
+       void __iomem *reg, *epci_base;
+       u32 val;
+
+       iob();
+       epci_base = (void *)hose->cfg_addr;
+
+       reg = epci_base + PCI_COMMAND;
+       val = in_be32(reg);
+
+       if (val & (PCI_STATUS_REC_MASTER_ABORT << 16)) {
+               out_be32(reg,
+                        (val & 0xffff) | (PCI_STATUS_REC_MASTER_ABORT << 16));
+
+               /* clear PCI Controller error, FRE, PMFE */
+               reg = epci_base + SCC_EPCI_STATUS;
+               out_be32(reg, SCC_EPCI_INT_PAI);
+
+               reg = epci_base + SCC_EPCI_VCSR;
+               val = in_be32(reg) & 0xffff;
+               val |= SCC_EPCI_VCSR_FRE;
+               out_be32(reg, val);
+
+               reg = epci_base + SCC_EPCI_VISTAT;
+               out_be32(reg, SCC_EPCI_VISTAT_PMFE);
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static unsigned long celleb_epci_make_config_addr(struct pci_controller *hose,
+                                       unsigned int devfn, int where)
+{
+       unsigned long addr;
+       struct pci_bus *bus = hose->bus;
+
+       if (bus->self)
+               addr = (unsigned long)hose->cfg_data +
+                      (((bus->number & 0xff) << 16)
+                       | ((devfn & 0xff) << 8)
+                       | (where & 0xff)
+                       | 0x01000000);
+       else
+               addr = (unsigned long)hose->cfg_data +
+                      (((devfn & 0xff) << 8) | (where & 0xff));
+
+       pr_debug("EPCI: config_addr = 0x%016lx\n", addr);
+
+       return addr;
+}
+
+static int celleb_epci_read_config(struct pci_bus *bus,
+                       unsigned int devfn, int where, int size, u32 * val)
+{
+       unsigned long addr;
+       struct device_node *node;
+       struct pci_controller *hose;
+
+       /* allignment check */
+       BUG_ON(where % size);
+
+       node = (struct device_node *)bus->sysdata;
+       hose = pci_find_hose_for_OF_device(node);
+
+       if (!hose->cfg_data)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       if (bus->number == hose->first_busno && devfn == 0) {
+               /* EPCI controller self */
+
+               addr = (unsigned long)hose->cfg_addr + where;
+
+               switch (size) {
+               case 1:
+                       *val = in_8((u8 *)addr);
+                       break;
+               case 2:
+                       *val = in_be16((u16 *)addr);
+                       break;
+               case 4:
+                       *val = in_be32((u32 *)addr);
+                       break;
+               default:
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+               }
+
+       } else {
+
+               clear_and_disable_master_abort_interrupt(hose);
+               addr = celleb_epci_make_config_addr(hose, devfn, where);
+
+               switch (size) {
+               case 1:
+                       *val = in_8((u8 *)addr);
+                       break;
+               case 2:
+                       *val = in_le16((u16 *)addr);
+                       break;
+               case 4:
+                       *val = in_le32((u32 *)addr);
+                       break;
+               default:
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+               }
+       }
+
+       pr_debug("EPCI: "
+                "addr=0x%lx, devfn=0x%x, where=0x%x, size=0x%x, val=0x%x\n",
+                addr, devfn, where, size, *val);
+
+       return celleb_epci_check_abort(hose, 0);
+}
+
+static int celleb_epci_write_config(struct pci_bus *bus,
+                       unsigned int devfn, int where, int size, u32 val)
+{
+       unsigned long addr;
+       struct device_node *node;
+       struct pci_controller *hose;
+
+       /* allignment check */
+       BUG_ON(where % size);
+
+       node = (struct device_node *)bus->sysdata;
+       hose = pci_find_hose_for_OF_device(node);
+
+       if (!hose->cfg_data)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       if (bus->number == hose->first_busno && devfn == 0) {
+               /* EPCI controller self */
+
+               addr = (unsigned long)hose->cfg_addr + where;
+
+               switch (size) {
+               case 1:
+                       out_8((u8 *)addr, val);
+                       break;
+               case 2:
+                       out_be16((u16 *)addr, val);
+                       break;
+               case 4:
+                       out_be32((u32 *)addr, val);
+                       break;
+               default:
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+               }
+
+       } else {
+
+               clear_and_disable_master_abort_interrupt(hose);
+               addr = celleb_epci_make_config_addr(hose, devfn, where);
+
+               switch (size) {
+               case 1:
+                       out_8((u8 *)addr, val);
+                       break;
+               case 2:
+                       out_le16((u16 *)addr, val);
+                       break;
+               case 4:
+                       out_le32((u32 *)addr, val);
+                       break;
+               default:
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+               }
+       }
+
+       return celleb_epci_check_abort(hose, addr);
+}
+
+struct pci_ops celleb_epci_ops = {
+       celleb_epci_read_config,
+       celleb_epci_write_config,
+};
+
+/* to be moved in FW */
+static int __devinit celleb_epci_init(struct pci_controller *hose)
+{
+       u32 val;
+       void __iomem *reg, *epci_base;
+       int hwres = 0;
+
+       epci_base = (void *)hose->cfg_addr;
+
+       /* PCI core reset(Internal bus and PCI clock) */
+       reg = epci_base + SCC_EPCI_CKCTRL;
+       val = in_be32(reg);
+       if (val == 0x00030101)
+               hwres = 1;
+       else {
+               val &= ~(SCC_EPCI_CKCTRL_CRST0 | SCC_EPCI_CKCTRL_CRST1);
+               out_be32(reg, val);
+
+               /* set PCI core clock */
+               val = in_be32(reg);
+               val |= (SCC_EPCI_CKCTRL_OCLKEN | SCC_EPCI_CKCTRL_LCLKEN);
+               out_be32(reg, val);
+
+               /* release PCI core reset (internal bus) */
+               val = in_be32(reg);
+               val |= SCC_EPCI_CKCTRL_CRST0;
+               out_be32(reg, val);
+
+               /* set PCI clock select */
+               reg = epci_base + SCC_EPCI_CLKRST;
+               val = in_be32(reg);
+               val &= ~SCC_EPCI_CLKRST_CKS_MASK;
+               val |= SCC_EPCI_CLKRST_CKS_2;
+               out_be32(reg, val);
+
+               /* set arbiter */
+               reg = epci_base + SCC_EPCI_ABTSET;
+               out_be32(reg, 0x0f1f001f);      /* temporary value */
+
+               /* buffer on */
+               reg = epci_base + SCC_EPCI_CLKRST;
+               val = in_be32(reg);
+               val |= SCC_EPCI_CLKRST_BC;
+               out_be32(reg, val);
+
+               /* PCI clock enable */
+               val = in_be32(reg);
+               val |= SCC_EPCI_CLKRST_PCKEN;
+               out_be32(reg, val);
+
+               /* release PCI core reset (all) */
+               reg = epci_base + SCC_EPCI_CKCTRL;
+               val = in_be32(reg);
+               val |= (SCC_EPCI_CKCTRL_CRST0 | SCC_EPCI_CKCTRL_CRST1);
+               out_be32(reg, val);
+
+               /* set base translation registers. (already set by Beat) */
+
+               /* set base address masks. (already set by Beat) */
+       }
+
+       /* release interrupt masks and clear all interrupts */
+       reg = epci_base + SCC_EPCI_INTSET;
+       out_be32(reg, 0x013f011f);      /* all interrupts enable */
+       reg = epci_base + SCC_EPCI_VIENAB;
+       val = SCC_EPCI_VIENAB_PMPEE | SCC_EPCI_VIENAB_PMFEE;
+       out_be32(reg, val);
+       reg = epci_base + SCC_EPCI_STATUS;
+       out_be32(reg, 0xffffffff);
+       reg = epci_base + SCC_EPCI_VISTAT;
+       out_be32(reg, 0xffffffff);
+
+       /* disable PCI->IB address translation */
+       reg = epci_base + SCC_EPCI_VCSR;
+       val = in_be32(reg);
+       val &= ~(SCC_EPCI_VCSR_DR | SCC_EPCI_VCSR_AT);
+       out_be32(reg, val);
+
+       /* set base addresses. (no need to set?) */
+
+       /* memory space, bus master enable */
+       reg = epci_base + PCI_COMMAND;
+       val = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
+       out_be32(reg, val);
+
+       /* endian mode setup */
+       reg = epci_base + SCC_EPCI_ECMODE;
+       val = 0x00550155;
+       out_be32(reg, val);
+
+       /* set control option */
+       reg = epci_base + SCC_EPCI_CNTOPT;
+       val = in_be32(reg);
+       val |= SCC_EPCI_CNTOPT_O2PMB;
+       out_be32(reg, val);
+
+       /* XXX: temporay: set registers for address conversion setup */
+       reg = epci_base + SCC_EPCI_CNF10_REG;
+       out_be32(reg, 0x80000008);
+       reg = epci_base + SCC_EPCI_CNF14_REG;
+       out_be32(reg, 0x40000008);
+
+       reg = epci_base + SCC_EPCI_BAM0;
+       out_be32(reg, 0x80000000);
+       reg = epci_base + SCC_EPCI_BAM1;
+       out_be32(reg, 0xe0000000);
+
+       reg = epci_base + SCC_EPCI_PVBAT;
+       out_be32(reg, 0x80000000);
+
+       if (!hwres) {
+               /* release external PCI reset */
+               reg = epci_base + SCC_EPCI_CLKRST;
+               val = in_be32(reg);
+               val |= SCC_EPCI_CLKRST_PCIRST;
+               out_be32(reg, val);
+       }
+
+       return 0;
+}
+
+int __devinit celleb_setup_epci(struct device_node *node,
+                               struct pci_controller *hose)
+{
+       struct resource r;
+
+       pr_debug("PCI: celleb_setup_epci()\n");
+
+       if (of_address_to_resource(node, 0, &r))
+               goto error;
+       hose->cfg_addr = ioremap(r.start, (r.end - r.start + 1));
+       if (!hose->cfg_addr)
+               goto error;
+       pr_debug("EPCI: cfg_addr map 0x%016lx->0x%016lx + 0x%016lx\n",
+                r.start, (unsigned long)hose->cfg_addr,
+               (r.end - r.start + 1));
+
+       if (of_address_to_resource(node, 2, &r))
+               goto error;
+       hose->cfg_data = ioremap(r.start, (r.end - r.start + 1));
+       if (!hose->cfg_data)
+               goto error;
+       pr_debug("EPCI: cfg_data map 0x%016lx->0x%016lx + 0x%016lx\n",
+                r.start, (unsigned long)hose->cfg_data,
+               (r.end - r.start + 1));
+
+       celleb_epci_init(hose);
+
+       return 0;
+
+error:
+       return 1;
+}
diff --git a/arch/powerpc/platforms/celleb/scc_sio.c b/arch/powerpc/platforms/celleb/scc_sio.c
new file mode 100644 (file)
index 0000000..bcd25f5
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * setup serial port in SCC
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/tty.h>
+#include <linux/serial.h>
+#include <linux/serial_core.h>
+#include <linux/console.h>
+
+#include <asm/io.h>
+#include <asm/prom.h>
+
+/* sio irq0=0xb00010022 irq0=0xb00010023 irq2=0xb00010024
+    mmio=0xfff000-0x1000,0xff2000-0x1000 */
+static int txx9_serial_bitmap = 0;
+
+static struct {
+       uint32_t offset;
+       uint32_t index;
+} txx9_scc_tab[3] = {
+       { 0x300, 0 },   /* 0xFFF300 */
+       { 0x400, 0 },   /* 0xFFF400 */
+       { 0x800, 1 }    /* 0xFF2800 */
+};
+
+static int txx9_serial_init(void)
+{
+       extern int early_serial_txx9_setup(struct uart_port *port);
+       struct device_node *node;
+       int i;
+       struct uart_port req;
+       struct of_irq irq;
+       struct resource res;
+
+       node = of_find_node_by_path("/ioif1/sio");
+       if (!node)
+               return 0;
+
+       for(i = 0; i < sizeof(txx9_scc_tab)/sizeof(txx9_scc_tab[0]); i++) {
+               if (!(txx9_serial_bitmap & (1<<i)))
+                       continue;
+
+               if (of_irq_map_one(node, i, &irq))
+                       continue;
+               if (of_address_to_resource(node, txx9_scc_tab[i].index, &res))
+                       continue;
+
+               memset(&req, 0, sizeof(req));
+               req.line = i;
+               req.iotype = UPIO_MEM;
+               req.mapbase = res.start + txx9_scc_tab[i].offset;
+#ifdef CONFIG_SERIAL_TXX9_CONSOLE
+               req.membase = ioremap(req.mapbase, 0x24);
+#endif
+               req.irq = irq_create_of_mapping(irq.controller,
+                       irq.specifier, irq.size);
+               req.flags |= UPF_IOREMAP | UPF_BUGGY_UART /*HAVE_CTS_LINE*/;
+               req.uartclk = 83300000;
+               early_serial_txx9_setup(&req);
+       }
+
+       of_node_put(node);
+       return 0;
+}
+
+static int txx9_serial_config(char *ptr)
+{
+       int     i;
+
+       for (;;) {
+               switch(get_option(&ptr, &i)) {
+               default:
+                       return 0;
+               case 2:
+                       txx9_serial_bitmap |= 1 << i;
+                       break;
+               case 1:
+                       txx9_serial_bitmap |= 1 << i;
+                       return 0;
+               }
+       }
+}
+__setup("txx9_serial=", txx9_serial_config);
+
+console_initcall(txx9_serial_init);
diff --git a/arch/powerpc/platforms/celleb/scc_uhc.c b/arch/powerpc/platforms/celleb/scc_uhc.c
new file mode 100644 (file)
index 0000000..a7c548b
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * SCC (Super Companion Chip) UHC setup
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+
+#include <asm/delay.h>
+#include <asm/io.h>
+#include <asm/machdep.h>
+
+#include "scc.h"
+
+#define UHC_RESET_WAIT_MAX 10000
+
+static inline int uhc_clkctrl_ready(u32 val)
+{
+       const u32 mask = SCC_UHC_USBCEN | SCC_UHC_USBCEN;
+       return((val & mask) == mask);
+}
+
+/*
+ * UHC(usb host controler) enable function.
+ * affect to both of OHCI and EHCI core module.
+ */
+static void enable_scc_uhc(struct pci_dev *dev)
+{
+       void __iomem *uhc_base;
+       u32 __iomem *uhc_clkctrl;
+       u32 __iomem *uhc_ecmode;
+       u32 val = 0;
+       int i;
+
+       if (!machine_is(celleb))
+               return;
+
+       uhc_base = ioremap(pci_resource_start(dev, 0),
+                          pci_resource_len(dev, 0));
+       if (!uhc_base) {
+               printk(KERN_ERR "failed to map UHC register base.\n");
+               return;
+       }
+       uhc_clkctrl = uhc_base + SCC_UHC_CKRCTRL;
+       uhc_ecmode  = uhc_base + SCC_UHC_ECMODE;
+
+       /* setup for normal mode */
+       val |= SCC_UHC_F48MCKLEN;
+       out_be32(uhc_clkctrl, val);
+       val |= SCC_UHC_PHY_SUSPEND_SEL;
+       out_be32(uhc_clkctrl, val);
+       udelay(10);
+       val |= SCC_UHC_PHYEN;
+       out_be32(uhc_clkctrl, val);
+       udelay(50);
+
+       /* disable reset */
+       val |= SCC_UHC_HCLKEN;
+       out_be32(uhc_clkctrl, val);
+       val |= (SCC_UHC_USBCEN | SCC_UHC_USBEN);
+       out_be32(uhc_clkctrl, val);
+       i = 0;
+       while (!uhc_clkctrl_ready(in_be32(uhc_clkctrl))) {
+               udelay(10);
+               if (i++ > UHC_RESET_WAIT_MAX) {
+                       printk(KERN_ERR "Failed to disable UHC reset %x\n",
+                              in_be32(uhc_clkctrl));
+                       break;
+               }
+       }
+
+       /* Endian Conversion Mode for Master ALL area */
+       out_be32(uhc_ecmode, SCC_UHC_ECMODE_BY_BYTE);
+
+       iounmap(uhc_base);
+}
+
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2,
+                PCI_DEVICE_ID_TOSHIBA_SCC_USB, enable_scc_uhc);
diff --git a/arch/powerpc/platforms/celleb/setup.c b/arch/powerpc/platforms/celleb/setup.c
new file mode 100644 (file)
index 0000000..1de63ac
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Celleb setup code
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/platforms/cell/setup.c:
+ *  Copyright (C) 1995  Linus Torvalds
+ *  Adapted from 'alpha' version by Gary Thomas
+ *  Modified by Cort Dougan (cort@cs.nmt.edu)
+ *  Modified by PPC64 Team, IBM Corp
+ *  Modified by Cell Team, IBM Deutschland Entwicklung GmbH
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#undef DEBUG
+
+#include <linux/cpu.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/console.h>
+
+#include <asm/mmu.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/kexec.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/cputable.h>
+#include <asm/irq.h>
+#include <asm/spu_priv1.h>
+#include <asm/firmware.h>
+#include <asm/of_platform.h>
+
+#include "interrupt.h"
+#include "beat_wrapper.h"
+#include "beat.h"
+#include "pci.h"
+
+static char celleb_machine_type[128] = "Celleb";
+
+static void celleb_show_cpuinfo(struct seq_file *m)
+{
+       struct device_node *root;
+       const char *model = "";
+
+       root = of_find_node_by_path("/");
+       if (root)
+               model = get_property(root, "model", NULL);
+       /* using "CHRP" is to trick anaconda into installing FCx into Celleb */
+       seq_printf(m, "machine\t\t: %s %s\n", celleb_machine_type, model);
+       of_node_put(root);
+}
+
+static int celleb_machine_type_hack(char *ptr)
+{
+       strncpy(celleb_machine_type, ptr, sizeof(celleb_machine_type));
+       celleb_machine_type[sizeof(celleb_machine_type)-1] = 0;
+       return 0;
+}
+
+__setup("celleb_machine_type_hack", celleb_machine_type_hack);
+
+static void celleb_progress(char *s, unsigned short hex)
+{
+       printk("*** %04x : %s\n", hex, s ? s : "");
+}
+
+static void __init celleb_setup_arch(void)
+{
+#ifdef CONFIG_SPU_BASE
+       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;
+
+       if (ROOT_DEV == 0) {
+               printk("No ramdisk, default root is /dev/hda2\n");
+               ROOT_DEV = Root_HDA2;
+       }
+
+#ifdef CONFIG_DUMMY_CONSOLE
+       conswitchp = &dummy_con;
+#endif
+}
+
+static void beat_power_save(void)
+{
+       beat_pause(0);
+}
+
+static int __init celleb_probe(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;
+       hpte_init_beat();
+       return 1;
+}
+
+/*
+ * Cell has no legacy IO; anything calling this function has to
+ * fail or bad things will happen
+ */
+static int celleb_check_legacy_ioport(unsigned int baseport)
+{
+       return -ENODEV;
+}
+
+static void celleb_kexec_cpu_down(int crash, int secondary)
+{
+       beatic_deinit_IRQ();
+}
+
+static struct of_device_id celleb_bus_ids[] = {
+       { .type = "scc", },
+       { .type = "ioif", },    /* old style */
+       {},
+};
+
+static int __init celleb_publish_devices(void)
+{
+       if (!machine_is(celleb))
+               return 0;
+
+       /* Publish OF platform devices for southbridge IOs */
+       of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
+
+       return 0;
+}
+device_initcall(celleb_publish_devices);
+
+define_machine(celleb) {
+       .name                   = "Cell Reference Set",
+       .probe                  = celleb_probe,
+       .setup_arch             = celleb_setup_arch,
+       .show_cpuinfo           = celleb_show_cpuinfo,
+       .restart                = beat_restart,
+       .power_off              = beat_power_off,
+       .halt                   = beat_halt,
+       .get_rtc_time           = beat_get_rtc_time,
+       .set_rtc_time           = beat_set_rtc_time,
+       .calibrate_decr         = generic_calibrate_decr,
+       .check_legacy_ioport    = celleb_check_legacy_ioport,
+       .progress               = celleb_progress,
+       .power_save             = beat_power_save,
+       .nvram_size             = beat_nvram_get_size,
+       .nvram_read             = beat_nvram_read,
+       .nvram_write            = beat_nvram_write,
+       .set_dabr               = beat_set_xdabr,
+       .init_IRQ               = beatic_init_IRQ,
+       .get_irq                = beatic_get_irq,
+       .pci_probe_mode         = celleb_pci_probe_mode,
+       .pci_setup_phb          = celleb_setup_phb,
+#ifdef CONFIG_KEXEC
+       .kexec_cpu_down         = celleb_kexec_cpu_down,
+       .machine_kexec          = default_machine_kexec,
+       .machine_kexec_prepare  = default_machine_kexec_prepare,
+       .machine_crash_shutdown = default_machine_crash_shutdown,
+#endif
+};
diff --git a/arch/powerpc/platforms/celleb/smp.c b/arch/powerpc/platforms/celleb/smp.c
new file mode 100644 (file)
index 0000000..a763125
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * SMP support for Celleb platform. (Incomplete)
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This code is based on arch/powerpc/platforms/cell/smp.c:
+ * Dave Engebretsen, Peter Bergner, and
+ * Mike Corrigan {engebret|bergner|mikec}@us.ibm.com
+ * Plus various changes from other IBM teams...
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/threads.h>
+#include <linux/cpu.h>
+
+#include <asm/irq.h>
+#include <asm/smp.h>
+#include <asm/machdep.h>
+#include <asm/udbg.h>
+
+#include "interrupt.h"
+
+#ifdef DEBUG
+#define DBG(fmt...) udbg_printf(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+/*
+ * The primary thread of each non-boot processor is recorded here before
+ * smp init.
+ */
+/* static cpumask_t of_spin_map; */
+
+/**
+ * smp_startup_cpu() - start the given cpu
+ *
+ * At boot time, there is nothing to do for primary threads which were
+ * started from Open Firmware.  For anything else, call RTAS with the
+ * appropriate start location.
+ *
+ * Returns:
+ *     0       - failure
+ *     1       - success
+ */
+static inline int __devinit smp_startup_cpu(unsigned int lcpu)
+{
+       return 0;
+}
+
+static void smp_beatic_message_pass(int target, int msg)
+{
+       unsigned int i;
+
+       if (target < NR_CPUS) {
+               beatic_cause_IPI(target, msg);
+       } else {
+               for_each_online_cpu(i) {
+                       if (target == MSG_ALL_BUT_SELF
+                           && i == smp_processor_id())
+                               continue;
+                       beatic_cause_IPI(i, msg);
+               }
+       }
+}
+
+static int __init smp_beatic_probe(void)
+{
+       return cpus_weight(cpu_possible_map);
+}
+
+static void __devinit smp_beatic_setup_cpu(int cpu)
+{
+       beatic_setup_cpu(cpu);
+}
+
+static void __devinit smp_celleb_kick_cpu(int nr)
+{
+       BUG_ON(nr < 0 || nr >= NR_CPUS);
+
+       if (!smp_startup_cpu(nr))
+               return;
+}
+
+static int smp_celleb_cpu_bootable(unsigned int nr)
+{
+       return 1;
+}
+static struct smp_ops_t bpa_beatic_smp_ops = {
+       .message_pass   = smp_beatic_message_pass,
+       .probe          = smp_beatic_probe,
+       .kick_cpu       = smp_celleb_kick_cpu,
+       .setup_cpu      = smp_beatic_setup_cpu,
+       .cpu_bootable   = smp_celleb_cpu_bootable,
+};
+
+/* This is called very early */
+void __init smp_init_celleb(void)
+{
+       DBG(" -> smp_init_celleb()\n");
+
+       smp_ops = &bpa_beatic_smp_ops;
+
+       DBG(" <- smp_init_celleb()\n");
+}
diff --git a/arch/powerpc/platforms/celleb/spu_priv1.c b/arch/powerpc/platforms/celleb/spu_priv1.c
new file mode 100644 (file)
index 0000000..2bf6700
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * spu hypervisor abstraction for Beat
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/module.h>
+
+#include <asm/types.h>
+#include <asm/spu.h>
+#include <asm/spu_priv1.h>
+
+#include "beat_wrapper.h"
+
+static inline void _int_mask_set(struct spu *spu, int class, u64 mask)
+{
+       spu->shadow_int_mask_RW[class] = mask;
+       beat_set_irq_mask_for_spe(spu->spe_id, class, mask);
+}
+
+static inline u64 _int_mask_get(struct spu *spu, int class)
+{
+       return spu->shadow_int_mask_RW[class];
+}
+
+static void int_mask_set(struct spu *spu, int class, u64 mask)
+{
+       _int_mask_set(spu, class, mask);
+}
+
+static u64 int_mask_get(struct spu *spu, int class)
+{
+       return _int_mask_get(spu, class);
+}
+
+static void int_mask_and(struct spu *spu, int class, u64 mask)
+{
+       u64 old_mask;
+       old_mask = _int_mask_get(spu, class);
+       _int_mask_set(spu, class, old_mask & mask);
+}
+
+static void int_mask_or(struct spu *spu, int class, u64 mask)
+{
+       u64 old_mask;
+       old_mask = _int_mask_get(spu, class);
+       _int_mask_set(spu, class, old_mask | mask);
+}
+
+static void int_stat_clear(struct spu *spu, int class, u64 stat)
+{
+       beat_clear_interrupt_status_of_spe(spu->spe_id, class, stat);
+}
+
+static u64 int_stat_get(struct spu *spu, int class)
+{
+       u64 int_stat;
+       beat_get_interrupt_status_of_spe(spu->spe_id, class, &int_stat);
+       return int_stat;
+}
+
+static void cpu_affinity_set(struct spu *spu, int cpu)
+{
+       return;
+}
+
+static u64 mfc_dar_get(struct spu *spu)
+{
+       u64 dar;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_dar_RW), &dar);
+       return dar;
+}
+
+static u64 mfc_dsisr_get(struct spu *spu)
+{
+       u64 dsisr;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_dsisr_RW), &dsisr);
+       return dsisr;
+}
+
+static void mfc_dsisr_set(struct spu *spu, u64 dsisr)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_dsisr_RW), dsisr);
+}
+
+static void mfc_sdr_setup(struct spu *spu)
+{
+       return;
+}
+
+static void mfc_sr1_set(struct spu *spu, u64 sr1)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_sr1_RW), sr1);
+}
+
+static u64 mfc_sr1_get(struct spu *spu)
+{
+       u64 sr1;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_sr1_RW), &sr1);
+       return sr1;
+}
+
+static void mfc_tclass_id_set(struct spu *spu, u64 tclass_id)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_tclass_id_RW), tclass_id);
+}
+
+static u64 mfc_tclass_id_get(struct spu *spu)
+{
+       u64 tclass_id;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, mfc_tclass_id_RW), &tclass_id);
+       return tclass_id;
+}
+
+static void tlb_invalidate(struct spu *spu)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, tlb_invalidate_entry_W), 0ul);
+}
+
+static void resource_allocation_groupID_set(struct spu *spu, u64 id)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, resource_allocation_groupID_RW),
+               id);
+}
+
+static u64 resource_allocation_groupID_get(struct spu *spu)
+{
+       u64 id;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, resource_allocation_groupID_RW),
+               &id);
+       return id;
+}
+
+static void resource_allocation_enable_set(struct spu *spu, u64 enable)
+{
+       beat_set_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, resource_allocation_enable_RW),
+               enable);
+}
+
+static u64 resource_allocation_enable_get(struct spu *spu)
+{
+       u64 enable;
+       beat_get_spe_privileged_state_1_registers(
+               spu->spe_id,
+               offsetof(struct spu_priv1, resource_allocation_enable_RW),
+               &enable);
+       return enable;
+}
+
+const struct spu_priv1_ops spu_priv1_beat_ops =
+{
+       .int_mask_and = int_mask_and,
+       .int_mask_or = int_mask_or,
+       .int_mask_set = int_mask_set,
+       .int_mask_get = int_mask_get,
+       .int_stat_clear = int_stat_clear,
+       .int_stat_get = int_stat_get,
+       .cpu_affinity_set = cpu_affinity_set,
+       .mfc_dar_get = mfc_dar_get,
+       .mfc_dsisr_get = mfc_dsisr_get,
+       .mfc_dsisr_set = mfc_dsisr_set,
+       .mfc_sdr_setup = mfc_sdr_setup,
+       .mfc_sr1_set = mfc_sr1_set,
+       .mfc_sr1_get = mfc_sr1_get,
+       .mfc_tclass_id_set = mfc_tclass_id_set,
+       .mfc_tclass_id_get = mfc_tclass_id_get,
+       .tlb_invalidate = tlb_invalidate,
+       .resource_allocation_groupID_set = resource_allocation_groupID_set,
+       .resource_allocation_groupID_get = resource_allocation_groupID_get,
+       .resource_allocation_enable_set = resource_allocation_enable_set,
+       .resource_allocation_enable_get = resource_allocation_enable_get,
+};
diff --git a/arch/powerpc/platforms/celleb/udbg_beat.c b/arch/powerpc/platforms/celleb/udbg_beat.c
new file mode 100644 (file)
index 0000000..d888c46
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * udbg function for Beat
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/console.h>
+
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+
+#include "beat.h"
+
+#define        celleb_vtermno  0
+
+static void udbg_putc_beat(char c)
+{
+       unsigned long rc;
+
+       if (c == '\n')
+               udbg_putc_beat('\r');
+
+       rc = beat_put_term_char(celleb_vtermno, 1, (uint64_t)c << 56, 0);
+}
+
+/* Buffered chars getc */
+static long inbuflen;
+static long inbuf[2];  /* must be 2 longs */
+
+static int udbg_getc_poll_beat(void)
+{
+       /* The interface is tricky because it may return up to 16 chars.
+        * We save them statically for future calls to udbg_getc().
+        */
+       char ch, *buf = (char *)inbuf;
+       int i;
+       long rc;
+       if (inbuflen == 0) {
+               /* get some more chars. */
+               inbuflen = 0;
+               rc = beat_get_term_char(celleb_vtermno, &inbuflen, inbuf+0, inbuf+1);
+               if (rc != 0)
+                       inbuflen = 0;   /* otherwise inbuflen is garbage */
+       }
+       if (inbuflen <= 0 || inbuflen > 16) {
+               /* Catch error case as well as other oddities (corruption) */
+               inbuflen = 0;
+               return -1;
+       }
+       ch = buf[0];
+       for (i = 1; i < inbuflen; i++)  /* shuffle them down. */
+               buf[i-1] = buf[i];
+       inbuflen--;
+       return ch;
+}
+
+static int udbg_getc_beat(void)
+{
+       int ch;
+       for (;;) {
+               ch = udbg_getc_poll_beat();
+               if (ch == -1) {
+                       /* This shouldn't be needed...but... */
+                       volatile unsigned long delay;
+                       for (delay=0; delay < 2000000; delay++)
+                               ;
+               } else {
+                       return ch;
+               }
+       }
+}
+
+/* call this from early_init() for a working debug console on
+ * vterm capable LPAR machines
+ */
+void __init udbg_init_debug_beat(void)
+{
+       udbg_putc = udbg_putc_beat;
+       udbg_getc = udbg_getc_beat;
+       udbg_getc_poll = udbg_getc_poll_beat;
+}
index b3c2ce4cb7a812d7aff1292fa630929985f43afb..886c522d78e94b5b9b417b8adeb104cdf333dec3 100644 (file)
@@ -104,15 +104,6 @@ config RADSTONE_PPC7D
 config PAL4
        bool "SBS-Palomar4"
 
-config GEMINI
-       bool "Synergy-Gemini"
-       select PPC_INDIRECT_PCI
-       depends on BROKEN
-       help
-         Select Gemini if configuring for a Synergy Microsystems' Gemini
-         series Single Board Computer.  More information is available at:
-         <http://www.synergymicro.com/PressRel/97_10_15.html>.
-
 config EST8260
        bool "EST8260"
        ---help---
index 3f6a69f67195a0e7172a072925d6461eedc388fa..73c59904697fa00eb1325aa61daa46950f549628 100644 (file)
@@ -425,14 +425,6 @@ static void __init setup_u4_pcie(struct pci_controller* hose)
         hose->cfg_addr = ioremap(0xf0000000 + 0x800000, 0x1000);
         hose->cfg_data = ioremap(0xf0000000 + 0xc00000, 0x1000);
 
-        /* The bus contains a bridge from root -> device, we need to
-         * make it visible on bus 0 so that we pick the right type
-         * of config cycles. If we didn't, we would have to force all
-         * config cycles to be type 1. So we override the "bus-range"
-         * property here
-         */
-        hose->first_busno = 0x00;
-        hose->last_busno = 0xff;
         u4_pcie = hose;
 }
 
@@ -560,13 +552,16 @@ void __init maple_pci_init(void)
                return;
        }
        for (np = NULL; (np = of_get_next_child(root, np)) != NULL;) {
-               if (np->name == NULL)
+               if (!np->type)
                        continue;
-               if (!strcmp(np->name, "pci") || !strcmp(np->name, "pcie")) {
-                       if (add_bridge(np) == 0)
-                               of_node_get(np);
-               }
-               if (strcmp(np->name, "ht") == 0) {
+               if (strcmp(np->type, "pci") && strcmp(np->type, "ht"))
+                       continue;
+               if ((device_is_compatible(np, "u4-pcie") ||
+                    device_is_compatible(np, "u3-agp")) &&
+                   add_bridge(np) == 0)
+                       of_node_get(np);
+
+               if (device_is_compatible(np, "u3-ht")) {
                        of_node_get(np);
                        ht = np;
                }
index 50855d4fd5a08204d1cfcabdc4bc98ada2005fd6..82d3f9e28d7ce05a2170e19b730dea92d9662c83 100644 (file)
@@ -62,6 +62,7 @@
 #include <asm/mpic.h>
 #include <asm/rtas.h>
 #include <asm/udbg.h>
+#include <asm/nvram.h>
 
 #include "maple.h"
 
@@ -195,6 +196,8 @@ void __init maple_setup_arch(void)
        maple_use_rtas_reboot_and_halt_if_present();
 
        printk(KERN_DEBUG "Using native/NAP idle loop\n");
+
+       mmio_nvram_init();
 }
 
 /* 
diff --git a/arch/powerpc/platforms/pasemi/Kconfig b/arch/powerpc/platforms/pasemi/Kconfig
new file mode 100644 (file)
index 0000000..68dc529
--- /dev/null
@@ -0,0 +1,10 @@
+menu "PA Semi PWRficient options"
+       depends on PPC_PASEMI
+
+config PPC_PASEMI_IOMMU
+       bool "PA Semi IOMMU support"
+       depends on PPC_PASEMI
+       help
+         IOMMU support for PA6T-1682M
+
+endmenu
index 1be1a993c5f529c670e76b34e90519b64b0f877b..e657ccae90a9245f903b14c4faf78c1e6e65afb9 100644 (file)
@@ -1 +1,2 @@
-obj-y  += setup.o pci.o time.o
+obj-y  += setup.o pci.o time.o idle.o powersave.o iommu.o
+
diff --git a/arch/powerpc/platforms/pasemi/idle.c b/arch/powerpc/platforms/pasemi/idle.c
new file mode 100644 (file)
index 0000000..1ca3ff3
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2006-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
+ *
+ */
+
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+
+#include <asm/machdep.h>
+#include <asm/reg.h>
+
+#include "pasemi.h"
+
+struct sleep_mode {
+       char *name;
+       void (*entry)(void);
+};
+
+static struct sleep_mode modes[] = {
+       { .name = "spin", .entry = &idle_spin },
+       { .name = "doze", .entry = &idle_doze },
+};
+
+static int current_mode = 0;
+
+static int pasemi_system_reset_exception(struct pt_regs *regs)
+{
+       /* If we were woken up from power savings, we need to return
+        * to the calling function, since nip is not saved across
+        * all modes.
+        */
+
+       if (regs->msr & SRR1_WAKEMASK)
+               regs->nip = regs->link;
+
+       switch (regs->msr & SRR1_WAKEMASK) {
+       case SRR1_WAKEEE:
+               do_IRQ(regs);
+               break;
+       case SRR1_WAKEDEC:
+               timer_interrupt(regs);
+               break;
+       default:
+               /* do system reset */
+               return 0;
+       }
+       /* everything handled */
+       regs->msr |= MSR_RI;
+       return 1;
+}
+
+void __init pasemi_idle_init(void)
+{
+       ppc_md.system_reset_exception = pasemi_system_reset_exception;
+       ppc_md.power_save = modes[current_mode].entry;
+       printk(KERN_INFO "Using PA6T idle loop (%s)\n", modes[current_mode].name);
+}
+
+static int __init idle_param(char *p)
+{
+       int i;
+       for (i = 0; i < sizeof(modes)/sizeof(struct sleep_mode); i++) {
+               if (!strcmp(modes[i].name, p)) {
+                       current_mode = i;
+                       break;
+               }
+       }
+       return 0;
+}
+
+early_param("idle", idle_param);
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c
new file mode 100644 (file)
index 0000000..459a53b
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2005-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
+ */
+
+#undef DEBUG
+
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <linux/pci.h>
+#include <asm/iommu.h>
+#include <asm/machdep.h>
+#include <asm/abs_addr.h>
+
+
+#define IOBMAP_PAGE_SHIFT      12
+#define IOBMAP_PAGE_SIZE       (1 << IOBMAP_PAGE_SHIFT)
+#define IOBMAP_PAGE_MASK       (IOBMAP_PAGE_SIZE - 1)
+
+#define IOBMAP_PAGE_FACTOR     (PAGE_SHIFT - IOBMAP_PAGE_SHIFT)
+
+#define IOB_BASE               0xe0000000
+#define IOB_SIZE               0x3000
+/* Configuration registers */
+#define IOBCAP_REG             0x10
+#define IOBCOM_REG             0x40
+/* Enable IOB address translation */
+#define IOBCOM_ATEN            0x00000100
+
+/* Address decode configuration register */
+#define IOB_AD_REG             0x53
+/* IOBCOM_AD_REG fields */
+#define IOB_AD_VGPRT           0x00000e00
+#define IOB_AD_VGAEN           0x00000100
+/* Direct mapping settings */
+#define IOB_AD_MPSEL_MASK      0x00000030
+#define IOB_AD_MPSEL_B38       0x00000000
+#define IOB_AD_MPSEL_B40       0x00000010
+#define IOB_AD_MPSEL_B42       0x00000020
+/* Translation window size / enable */
+#define IOB_AD_TRNG_MASK       0x00000003
+#define IOB_AD_TRNG_256M       0x00000000
+#define IOB_AD_TRNG_2G         0x00000001
+#define IOB_AD_TRNG_128G       0x00000003
+
+#define IOB_TABLEBASE_REG      0x55
+
+/* Base of the 64 4-byte L1 registers */
+#define IOB_XLT_L1_REGBASE     0xac0
+
+/* Register to invalidate TLB entries */
+#define IOB_AT_INVAL_TLB_REG   0xb40
+
+/* The top two bits of the level 1 entry contains valid and type flags */
+#define IOBMAP_L1E_V           0x40000000
+#define IOBMAP_L1E_V_B         0x80000000
+
+/* For big page entries, the bottom two bits contains flags */
+#define IOBMAP_L1E_BIG_CACHED  0x00000002
+#define IOBMAP_L1E_BIG_PRIORITY        0x00000001
+
+/* For regular level 2 entries, top 2 bits contain valid and cache flags */
+#define IOBMAP_L2E_V           0x80000000
+#define IOBMAP_L2E_V_CACHED    0xc0000000
+
+static u32 *iob;
+static u32 iob_l1_emptyval;
+static u32 iob_l2_emptyval;
+static u32 *iob_l2_base;
+
+static struct iommu_table iommu_table_iobmap;
+static int iommu_table_iobmap_inited;
+
+static void iobmap_build(struct iommu_table *tbl, long index,
+                        long npages, unsigned long uaddr,
+                        enum dma_data_direction direction)
+{
+       u32 *ip;
+       u32 rpn;
+       unsigned long bus_addr;
+
+       pr_debug("iobmap: build at: %lx, %lx, addr: %lx\n", index, npages, uaddr);
+
+       bus_addr = (tbl->it_offset + index) << PAGE_SHIFT;
+
+       npages <<= IOBMAP_PAGE_FACTOR;
+       index <<= IOBMAP_PAGE_FACTOR;
+
+       ip = ((u32 *)tbl->it_base) + index;
+
+       while (npages--) {
+               rpn = virt_to_abs(uaddr) >> IOBMAP_PAGE_SHIFT;
+
+               *(ip++) = IOBMAP_L2E_V | rpn;
+               /* invalidate tlb, can be optimized more */
+               out_le32(iob+IOB_AT_INVAL_TLB_REG, bus_addr >> 14);
+
+               uaddr += IOBMAP_PAGE_SIZE;
+               bus_addr += IOBMAP_PAGE_SIZE;
+       }
+}
+
+
+static void iobmap_free(struct iommu_table *tbl, long index,
+                       long npages)
+{
+       u32 *ip;
+       unsigned long bus_addr;
+
+       pr_debug("iobmap: free at: %lx, %lx\n", index, npages);
+
+       bus_addr = (tbl->it_offset + index) << PAGE_SHIFT;
+
+       npages <<= IOBMAP_PAGE_FACTOR;
+       index <<= IOBMAP_PAGE_FACTOR;
+
+       ip = ((u32 *)tbl->it_base) + index;
+
+       while (npages--) {
+               *(ip++) = iob_l2_emptyval;
+               /* invalidate tlb, can be optimized more */
+               out_le32(iob+IOB_AT_INVAL_TLB_REG, bus_addr >> 14);
+               bus_addr += IOBMAP_PAGE_SIZE;
+       }
+}
+
+
+static void iommu_table_iobmap_setup(void)
+{
+       pr_debug(" -> %s\n", __func__);
+       iommu_table_iobmap.it_busno = 0;
+       iommu_table_iobmap.it_offset = 0;
+       /* it_size is in number of entries */
+       iommu_table_iobmap.it_size = 0x80000000 >> PAGE_SHIFT;
+
+       /* Initialize the common IOMMU code */
+       iommu_table_iobmap.it_base = (unsigned long)iob_l2_base;
+       iommu_table_iobmap.it_index = 0;
+       /* XXXOJN tune this to avoid IOB cache invals.
+        * Should probably be 8 (64 bytes)
+        */
+       iommu_table_iobmap.it_blocksize = 4;
+       iommu_init_table(&iommu_table_iobmap, 0);
+       pr_debug(" <- %s\n", __func__);
+}
+
+
+
+static void pci_dma_bus_setup_pasemi(struct pci_bus *bus)
+{
+       struct device_node *dn;
+
+       pr_debug("pci_dma_bus_setup, bus %p, bus->self %p\n", bus, bus->self);
+
+       if (!iommu_table_iobmap_inited) {
+               iommu_table_iobmap_inited = 1;
+               iommu_table_iobmap_setup();
+       }
+
+       dn = pci_bus_to_OF_node(bus);
+
+       if (dn)
+               PCI_DN(dn)->iommu_table = &iommu_table_iobmap;
+
+}
+
+
+static void pci_dma_dev_setup_pasemi(struct pci_dev *dev)
+{
+       pr_debug("pci_dma_dev_setup, dev %p (%s)\n", dev, pci_name(dev));
+
+       /* DMA device is untranslated, but all other PCI-e goes through
+        * the IOMMU
+        */
+       if (dev->vendor == 0x1959 && dev->device == 0xa007)
+               dev->dev.archdata.dma_ops = &dma_direct_ops;
+       else
+               dev->dev.archdata.dma_data = &iommu_table_iobmap;
+}
+
+static void pci_dma_bus_setup_null(struct pci_bus *b) { }
+static void pci_dma_dev_setup_null(struct pci_dev *d) { }
+
+int iob_init(struct device_node *dn)
+{
+       unsigned long tmp;
+       u32 regword;
+       int i;
+
+       pr_debug(" -> %s\n", __func__);
+
+       /* Allocate a spare page to map all invalid IOTLB pages. */
+       tmp = lmb_alloc(IOBMAP_PAGE_SIZE, IOBMAP_PAGE_SIZE);
+       if (!tmp)
+               panic("IOBMAP: Cannot allocate spare page!");
+       /* Empty l1 is marked invalid */
+       iob_l1_emptyval = 0;
+       /* Empty l2 is mapped to dummy page */
+       iob_l2_emptyval = IOBMAP_L2E_V | (tmp >> IOBMAP_PAGE_SHIFT);
+
+       iob = ioremap(IOB_BASE, IOB_SIZE);
+       if (!iob)
+               panic("IOBMAP: Cannot map registers!");
+
+       /* setup direct mapping of the L1 entries */
+       for (i = 0; i < 64; i++) {
+               /* Each L1 covers 32MB, i.e. 8K entries = 32K of ram */
+               regword = IOBMAP_L1E_V | (__pa(iob_l2_base + i*0x2000) >> 12);
+               out_le32(iob+IOB_XLT_L1_REGBASE+i, regword);
+       }
+
+       /* set 2GB translation window, based at 0 */
+       regword = in_le32(iob+IOB_AD_REG);
+       regword &= ~IOB_AD_TRNG_MASK;
+       regword |= IOB_AD_TRNG_2G;
+       out_le32(iob+IOB_AD_REG, regword);
+
+       /* Enable translation */
+       regword = in_le32(iob+IOBCOM_REG);
+       regword |= IOBCOM_ATEN;
+       out_le32(iob+IOBCOM_REG, regword);
+
+       pr_debug(" <- %s\n", __func__);
+
+       return 0;
+}
+
+
+/* These are called very early. */
+void iommu_init_early_pasemi(void)
+{
+       int iommu_off;
+
+#ifndef CONFIG_PPC_PASEMI_IOMMU
+       iommu_off = 1;
+#else
+       iommu_off = of_chosen &&
+                       get_property(of_chosen, "linux,iommu-off", NULL);
+#endif
+       if (iommu_off) {
+               /* Direct I/O, IOMMU off */
+               ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_null;
+               ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_null;
+               pci_dma_ops = &dma_direct_ops;
+
+               return;
+       }
+
+       iob_init(NULL);
+
+       ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_pasemi;
+       ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_pasemi;
+       ppc_md.tce_build = iobmap_build;
+       ppc_md.tce_free  = iobmap_free;
+       pci_dma_ops = &dma_iommu_ops;
+}
+
+void __init alloc_iobmap_l2(void)
+{
+#ifndef CONFIG_PPC_PASEMI_IOMMU
+       return;
+#endif
+       /* For 2G space, 8x64 pages (2^21 bytes) is max total l2 size */
+       iob_l2_base = (u32 *)abs_to_virt(lmb_alloc_base(1UL<<21, 1UL<<21, 0x80000000));
+
+       printk(KERN_INFO "IOBMAP L2 allocated at: %p\n", iob_l2_base);
+}
index 51c2a2397ecf100b8caba82c46c6b3af827f8309..2d3927e6edb04c89fcb0c564bfa7078132c440c5 100644 (file)
@@ -3,5 +3,17 @@
 
 extern unsigned long pas_get_boot_time(void);
 extern void pas_pci_init(void);
+extern void __devinit pas_pci_irq_fixup(struct pci_dev *dev);
+extern void __devinit pas_pci_dma_dev_setup(struct pci_dev *dev);
+
+extern void __init alloc_iobmap_l2(void);
+
+extern void __init pasemi_idle_init(void);
+
+/* Power savings modes, implemented in asm */
+extern void idle_spin(void);
+extern void idle_doze(void);
+
+
 
 #endif /* _PASEMI_PASEMI_H */
index faa618e0404767217430eaa86d5a03f075efc8b8..7ecb2ba24db9cd26c0b0c80fe13c61a57caa5641 100644 (file)
@@ -163,6 +163,19 @@ static void __init pas_fixup_phb_resources(void)
 }
 
 
+void __devinit pas_pci_irq_fixup(struct pci_dev *dev)
+{
+       /* DMA is special, 84 interrupts (128 -> 211), all but 128
+        * need to be mapped by hand here.
+        */
+       if (dev->vendor == 0x1959 && dev->device == 0xa007) {
+               int i;
+               for (i = 129; i < 212; i++)
+                       irq_create_mapping(NULL, i);
+       }
+}
+
+
 void __init pas_pci_init(void)
 {
        struct device_node *np, *root;
diff --git a/arch/powerpc/platforms/pasemi/powersave.S b/arch/powerpc/platforms/pasemi/powersave.S
new file mode 100644 (file)
index 0000000..6d0fba6
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2006-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 <asm/processor.h>
+#include <asm/page.h>
+#include <asm/ppc_asm.h>
+#include <asm/cputable.h>
+#include <asm/cache.h>
+#include <asm/thread_info.h>
+#include <asm/asm-offsets.h>
+
+/* Power savings opcodes since not all binutils have them at this time */
+#define DOZE   .long   0x4c000324
+#define NAP    .long   0x4c000364
+#define SLEEP  .long   0x4c0003a4
+#define RVW    .long   0x4c0003e4
+
+/* Common sequence to do before going to any of the
+ * powersavings modes.
+ */
+
+#define PRE_SLEEP_SEQUENCE     \
+       std     r3,8(r1);       \
+       ptesync ;               \
+       ld      r3,8(r1);       \
+1:     cmpd    r3,r3;          \
+       bne     1b
+
+_doze:
+       PRE_SLEEP_SEQUENCE
+       DOZE
+       b       .
+
+
+_GLOBAL(idle_spin)
+       blr
+
+_GLOBAL(idle_doze)
+       LOAD_REG_ADDR(r3, _doze)
+       b       sleep_common
+
+/* Add more modes here later */
+
+sleep_common:
+       mflr    r0
+       std     r0, 16(r1)
+       stdu    r1,-64(r1)
+
+       LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
+       mfmsr   r4
+       andc    r5,r4,r6
+       mtmsrd  r5,0
+
+       mtctr   r3
+       bctrl
+
+       mtmsrd  r4,0
+
+       addi    r1,r1,64
+       ld      r0,16(r1)
+       mtlr    r0
+       blr
+
index bea7d1bb1a3b48e5c24c05c15068430b9c8859c2..449cf1a08291b76f6dcce289e755bd99c34ad02f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 PA Semi, Inc
+ * Copyright (C) 2006-2007 PA Semi, Inc
  *
  * Authors: Kip Walker, PA Semi
  *         Olof Johansson, PA Semi
 
 #include "pasemi.h"
 
+static void __iomem *reset_reg;
+
 static void pas_restart(char *cmd)
 {
-       printk("restart unimplemented, looping...\n");
-       for (;;) ;
+       printk("Restarting...\n");
+       while (1)
+               out_le32(reset_reg, 0x6000000);
 }
 
-static void pas_power_off(void)
+#ifdef CONFIG_SMP
+static DEFINE_SPINLOCK(timebase_lock);
+
+static void __devinit pas_give_timebase(void)
 {
-       printk("power off unimplemented, looping...\n");
-       for (;;) ;
+       unsigned long tb;
+
+       spin_lock(&timebase_lock);
+       mtspr(SPRN_TBCTL, TBCTL_FREEZE);
+       tb = mftb();
+       mtspr(SPRN_TBCTL, TBCTL_UPDATE_LOWER | (tb & 0xffffffff));
+       mtspr(SPRN_TBCTL, TBCTL_UPDATE_UPPER | (tb >> 32));
+       mtspr(SPRN_TBCTL, TBCTL_RESTART);
+       spin_unlock(&timebase_lock);
+       pr_debug("pas_give_timebase: cpu %d gave tb %lx\n",
+                smp_processor_id(), tb);
 }
 
-static void pas_halt(void)
+static void __devinit pas_take_timebase(void)
 {
-       pas_power_off();
+       pr_debug("pas_take_timebase: cpu %d has tb %lx\n",
+                smp_processor_id(), mftb());
 }
 
-#ifdef CONFIG_SMP
 struct smp_ops_t pas_smp_ops = {
        .probe          = smp_mpic_probe,
        .message_pass   = smp_mpic_message_pass,
        .kick_cpu       = smp_generic_kick_cpu,
        .setup_cpu      = smp_mpic_setup_cpu,
-       .give_timebase  = smp_generic_give_timebase,
-       .take_timebase  = smp_generic_take_timebase,
+       .give_timebase  = pas_give_timebase,
+       .take_timebase  = pas_take_timebase,
 };
 #endif /* CONFIG_SMP */
 
@@ -72,9 +87,6 @@ void __init pas_setup_arch(void)
        /* Setup SMP callback */
        smp_ops = &pas_smp_ops;
 #endif
-       /* no iommu yet */
-       pci_dma_ops = &dma_direct_ops;
-
        /* Lookup PCI hosts */
        pas_pci_init();
 
@@ -82,7 +94,11 @@ void __init pas_setup_arch(void)
        conswitchp = &dummy_con;
 #endif
 
-       printk(KERN_DEBUG "Using default idle loop\n");
+       /* Remap SDC register for doing reset */
+       /* XXXOJN This should maybe come out of the device tree */
+       reset_reg = ioremap(0xfc101100, 4);
+
+       pasemi_idle_init();
 }
 
 /* No legacy IO on our parts */
@@ -130,8 +146,9 @@ static __init void pas_init_IRQ(void)
        openpic_addr = of_read_number(opprop, naddr);
        printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
 
-       mpic = mpic_alloc(mpic_node, openpic_addr, MPIC_PRIMARY, 0, 0,
-                         " PAS-OPIC  ");
+       mpic = mpic_alloc(mpic_node, openpic_addr,
+                         MPIC_PRIMARY|MPIC_LARGE_VECTORS,
+                         0, 0, " PAS-OPIC  ");
        BUG_ON(!mpic);
 
        mpic_assign_isu(mpic, 0, openpic_addr + 0x10000);
@@ -146,6 +163,53 @@ static void __init pas_progress(char *s, unsigned short hex)
 }
 
 
+static int pas_machine_check_handler(struct pt_regs *regs)
+{
+       int cpu = smp_processor_id();
+       unsigned long srr0, srr1, dsisr;
+
+       srr0 = regs->nip;
+       srr1 = regs->msr;
+       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);
+       printk(KERN_ERR "DSISR 0x%016lx DAR 0x%016lx\n", dsisr, regs->dar);
+       printk(KERN_ERR "Cause:\n");
+
+       if (srr1 & 0x200000)
+               printk(KERN_ERR "Signalled by SDC\n");
+       if (srr1 & 0x100000) {
+               printk(KERN_ERR "Load/Store detected error:\n");
+               if (dsisr & 0x8000)
+                       printk(KERN_ERR "D-cache ECC double-bit error or bus error\n");
+               if (dsisr & 0x4000)
+                       printk(KERN_ERR "LSU snoop response error\n");
+               if (dsisr & 0x2000)
+                       printk(KERN_ERR "MMU SLB multi-hit or invalid B field\n");
+               if (dsisr & 0x1000)
+                       printk(KERN_ERR "Recoverable Duptags\n");
+               if (dsisr & 0x800)
+                       printk(KERN_ERR "Recoverable D-cache parity error count overflow\n");
+               if (dsisr & 0x400)
+                       printk(KERN_ERR "TLB parity error count overflow\n");
+       }
+       if (srr1 & 0x80000)
+               printk(KERN_ERR "Bus Error\n");
+       if (srr1 & 0x40000)
+               printk(KERN_ERR "I-side SLB multiple hit\n");
+       if (srr1 & 0x20000)
+               printk(KERN_ERR "I-cache parity error hit\n");
+
+       /* SRR1[62] is from MSR[62] if recoverable, so pass that back */
+       return !!(srr1 & 0x2);
+}
+
+static void __init pas_init_early(void)
+{
+       iommu_init_early_pasemi();
+}
+
+
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
@@ -158,6 +222,8 @@ static int __init pas_probe(void)
 
        hpte_init_native();
 
+       alloc_iobmap_l2();
+
        return 1;
 }
 
@@ -165,13 +231,14 @@ define_machine(pas) {
        .name                   = "PA Semi PA6T-1682M",
        .probe                  = pas_probe,
        .setup_arch             = pas_setup_arch,
+       .init_early             = pas_init_early,
        .init_IRQ               = pas_init_IRQ,
        .get_irq                = mpic_get_irq,
        .restart                = pas_restart,
-       .power_off              = pas_power_off,
-       .halt                   = pas_halt,
        .get_boot_time          = pas_get_boot_time,
        .calibrate_decr         = generic_calibrate_decr,
        .check_legacy_ioport    = pas_check_legacy_ioport,
        .progress               = pas_progress,
+       .machine_check_exception = pas_machine_check_handler,
+       .pci_irq_fixup          = pas_pci_irq_fixup,
 };
index eeb2ae5ffc581a1a0c33707365cf7ee45d6ede78..d73fb73802bbef98e36ad0e29a9d06607ba441ad 100644 (file)
@@ -795,7 +795,6 @@ static void __devinit smp_core99_kick_cpu(int nr)
                ppc_md.progress("smp_core99_kick_cpu", 0x346);
 
        local_irq_save(flags);
-       local_irq_disable();
 
        /* Save reset vector */
        save_vector = *vector;
index 1994904f580f5eacb1c196f7f4380d757ffe587e..a0048fcf0866160c48a5e42ea5cff8558324ccc5 100644 (file)
@@ -1,5 +1,6 @@
 obj-y += setup.o mm.o time.o hvcall.o htab.o repository.o
 obj-y += interrupt.o exports.o os-area.o
+obj-y += system-bus.o
 
 obj-$(CONFIG_SMP) += smp.o
 obj-$(CONFIG_SPU_BASE) += spu.o
index 8fe1769655a326c558b206f7c63a591b23baf76f..a4b5a1bc60f4aa6c5a2c441dff52629a3e2da3bb 100644 (file)
@@ -23,7 +23,6 @@
 #include <asm/machdep.h>
 #include <asm/lmb.h>
 #include <asm/udbg.h>
-#include <asm/ps3.h>
 #include <asm/lv1call.h>
 
 #include "platform.h"
index 6f5de438b9808aa6293c590246f9dc6bbba3dd77..bb17283275aa7122aaa4c13d6cd7df99cba968f1 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <asm/machdep.h>
 #include <asm/udbg.h>
-#include <asm/ps3.h>
 #include <asm/lv1call.h>
 
 #include "platform.h"
 #define DBG(fmt...) do{if(0)printk(fmt);}while(0)
 #endif
 
+/**
+ * struct ps3_bmp - a per cpu irq status and mask bitmap structure
+ * @status: 256 bit status bitmap indexed by plug
+ * @unused_1:
+ * @mask: 256 bit mask bitmap indexed by plug
+ * @unused_2:
+ * @lock:
+ * @ipi_debug_brk_mask:
+ *
+ * The HV mantains per SMT thread mappings of HV outlet to HV plug on
+ * behalf of the guest.  These mappings are implemented as 256 bit guest
+ * supplied bitmaps indexed by plug number.  The addresses of the bitmaps
+ * are registered with the HV through lv1_configure_irq_state_bitmap().
+ * The HV requires that the 512 bits of status + mask not cross a page
+ * boundary.  PS3_BMP_MINALIGN is used to define this minimal 64 byte
+ * alignment.
+ *
+ * The HV supports 256 plugs per thread, assigned as {0..255}, for a total
+ * of 512 plugs supported on a processor.  To simplify the logic this
+ * implementation equates HV plug value to Linux virq value, constrains each
+ * interrupt to have a system wide unique plug number, and limits the range
+ * of the plug values to map into the first dword of the bitmaps.  This
+ * gives a usable range of plug values of  {NUM_ISA_INTERRUPTS..63}.  Note
+ * that there is no constraint on how many in this set an individual thread
+ * can acquire.
+ */
+
+#define PS3_BMP_MINALIGN 64
+
+struct ps3_bmp {
+       struct {
+               u64 status;
+               u64 unused_1[3];
+               u64 mask;
+               u64 unused_2[3];
+       };
+       u64 ipi_debug_brk_mask;
+       spinlock_t lock;
+};
+
+/**
+ * struct ps3_private - a per cpu data structure
+ * @bmp: ps3_bmp structure
+ * @node: HV logical_ppe_id
+ * @cpu: HV thread_id
+ */
+
+struct ps3_private {
+       struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN)));
+       u64 node;
+       unsigned int cpu;
+};
+
+static DEFINE_PER_CPU(struct ps3_private, ps3_private);
+
+int ps3_alloc_irq(enum ps3_cpu_binding cpu, unsigned long outlet,
+       unsigned int *virq)
+{
+       int result;
+       struct ps3_private *pd;
+
+       /* This defines the default interrupt distribution policy. */
+
+       if (cpu == PS3_BINDING_CPU_ANY)
+               cpu = 0;
+
+       pd = &per_cpu(ps3_private, cpu);
+
+       *virq = irq_create_mapping(NULL, outlet);
+
+       if (*virq == NO_IRQ) {
+               pr_debug("%s:%d: irq_create_mapping failed: outlet %lu\n",
+                       __func__, __LINE__, outlet);
+               result = -ENOMEM;
+               goto fail_create;
+       }
+
+       /* Binds outlet to cpu + virq. */
+
+       result = lv1_connect_irq_plug_ext(pd->node, pd->cpu, *virq, outlet, 0);
+
+       if (result) {
+               pr_info("%s:%d: lv1_connect_irq_plug_ext failed: %s\n",
+               __func__, __LINE__, ps3_result(result));
+               result = -EPERM;
+               goto fail_connect;
+       }
+
+       pr_debug("%s:%d: outlet %lu => cpu %u, virq %u\n", __func__, __LINE__,
+               outlet, cpu, *virq);
+
+       result = set_irq_chip_data(*virq, pd);
+
+       if (result) {
+               pr_debug("%s:%d: set_irq_chip_data failed\n",
+                       __func__, __LINE__);
+               goto fail_set;
+       }
+
+       return result;
+
+fail_set:
+       lv1_disconnect_irq_plug_ext(pd->node, pd->cpu, *virq);
+fail_connect:
+       irq_dispose_mapping(*virq);
+fail_create:
+       return result;
+}
+EXPORT_SYMBOL_GPL(ps3_alloc_irq);
+
+int ps3_free_irq(unsigned int virq)
+{
+       int result;
+       const struct ps3_private *pd = get_irq_chip_data(virq);
+
+       pr_debug("%s:%d: node %lu, cpu %d, virq %u\n", __func__, __LINE__,
+               pd->node, pd->cpu, virq);
+
+       result = lv1_disconnect_irq_plug_ext(pd->node, pd->cpu, virq);
+
+       if (result)
+               pr_info("%s:%d: lv1_disconnect_irq_plug_ext failed: %s\n",
+               __func__, __LINE__, ps3_result(result));
+
+       set_irq_chip_data(virq, NULL);
+       irq_dispose_mapping(virq);
+       return result;
+}
+EXPORT_SYMBOL_GPL(ps3_free_irq);
+
 /**
  * ps3_alloc_io_irq - Assign a virq to a system bus device.
- * interrupt_id: The device interrupt id read from the system repository.
+ * @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
+ * serviced on.
+ * @interrupt_id: The device interrupt id read from the system repository.
  * @virq: The assigned Linux virq.
  *
  * An io irq represents a non-virtualized device interrupt.  interrupt_id
  * coresponds to the interrupt number of the interrupt controller.
  */
 
-int ps3_alloc_io_irq(unsigned int interrupt_id, unsigned int *virq)
+int ps3_alloc_io_irq(enum ps3_cpu_binding cpu, unsigned int interrupt_id,
+       unsigned int *virq)
 {
        int result;
        unsigned long outlet;
@@ -57,12 +189,10 @@ int ps3_alloc_io_irq(unsigned int interrupt_id, unsigned int *virq)
                return result;
        }
 
-       *virq = irq_create_mapping(NULL, outlet);
-
-       pr_debug("%s:%d: interrupt_id %u => outlet %lu, virq %u\n",
-               __func__, __LINE__, interrupt_id, outlet, *virq);
+       result = ps3_alloc_irq(cpu, outlet, virq);
+       BUG_ON(result);
 
-       return 0;
+       return result;
 }
 
 int ps3_free_io_irq(unsigned int virq)
@@ -75,13 +205,15 @@ int ps3_free_io_irq(unsigned int virq)
                pr_debug("%s:%d: lv1_destruct_io_irq_outlet failed: %s\n",
                        __func__, __LINE__, ps3_result(result));
 
-       irq_dispose_mapping(virq);
+       ps3_free_irq(virq);
 
        return result;
 }
 
 /**
  * ps3_alloc_event_irq - Allocate a virq for use with a system event.
+ * @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
+ * serviced on.
  * @virq: The assigned Linux virq.
  *
  * The virq can be used with lv1_connect_interrupt_event_receive_port() to
@@ -89,7 +221,7 @@ int ps3_free_io_irq(unsigned int virq)
  * events.
  */
 
-int ps3_alloc_event_irq(unsigned int *virq)
+int ps3_alloc_event_irq(enum ps3_cpu_binding cpu, unsigned int *virq)
 {
        int result;
        unsigned long outlet;
@@ -103,12 +235,10 @@ int ps3_alloc_event_irq(unsigned int *virq)
                return result;
        }
 
-       *virq = irq_create_mapping(NULL, outlet);
-
-       pr_debug("%s:%d: outlet %lu, virq %u\n", __func__, __LINE__, outlet,
-               *virq);
+       result = ps3_alloc_irq(cpu, outlet, virq);
+       BUG_ON(result);
 
-       return 0;
+       return result;
 }
 
 int ps3_free_event_irq(unsigned int virq)
@@ -123,7 +253,7 @@ int ps3_free_event_irq(unsigned int virq)
                pr_debug("%s:%d: lv1_destruct_event_receive_port failed: %s\n",
                        __func__, __LINE__, ps3_result(result));
 
-       irq_dispose_mapping(virq);
+       ps3_free_irq(virq);
 
        pr_debug(" <- %s:%d\n", __func__, __LINE__);
        return result;
@@ -136,6 +266,8 @@ int ps3_send_event_locally(unsigned int virq)
 
 /**
  * ps3_connect_event_irq - Assign a virq to a system bus device.
+ * @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
+ * serviced on.
  * @did: The HV device identifier read from the system repository.
  * @interrupt_id: The device interrupt id read from the system repository.
  * @virq: The assigned Linux virq.
@@ -144,12 +276,13 @@ int ps3_send_event_locally(unsigned int virq)
  * coresponds to the software interrupt number.
  */
 
-int ps3_connect_event_irq(const struct ps3_device_id *did,
-       unsigned int interrupt_id, unsigned int *virq)
+int ps3_connect_event_irq(enum ps3_cpu_binding cpu,
+       const struct ps3_device_id *did, unsigned int interrupt_id,
+       unsigned int *virq)
 {
        int result;
 
-       result = ps3_alloc_event_irq(virq);
+       result = ps3_alloc_event_irq(cpu, virq);
 
        if (result)
                return result;
@@ -196,6 +329,8 @@ int ps3_disconnect_event_irq(const struct ps3_device_id *did,
 
 /**
  * ps3_alloc_vuart_irq - Configure the system virtual uart virq.
+ * @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
+ * serviced on.
  * @virt_addr_bmp: The caller supplied virtual uart interrupt bitmap.
  * @virq: The assigned Linux virq.
  *
@@ -203,13 +338,14 @@ int ps3_disconnect_event_irq(const struct ps3_device_id *did,
  * freeing the interrupt will return a wrong state error.
  */
 
-int ps3_alloc_vuart_irq(void* virt_addr_bmp, unsigned int *virq)
+int ps3_alloc_vuart_irq(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
+       unsigned int *virq)
 {
        int result;
        unsigned long outlet;
-       unsigned long lpar_addr;
+       u64 lpar_addr;
 
-       BUG_ON(!is_kernel_addr((unsigned long)virt_addr_bmp));
+       BUG_ON(!is_kernel_addr((u64)virt_addr_bmp));
 
        lpar_addr = ps3_mm_phys_to_lpar(__pa(virt_addr_bmp));
 
@@ -221,12 +357,10 @@ int ps3_alloc_vuart_irq(void* virt_addr_bmp, unsigned int *virq)
                return result;
        }
 
-       *virq = irq_create_mapping(NULL, outlet);
-
-       pr_debug("%s:%d: outlet %lu, virq %u\n", __func__, __LINE__,
-               outlet, *virq);
+       result = ps3_alloc_irq(cpu, outlet, virq);
+       BUG_ON(result);
 
-       return 0;
+       return result;
 }
 
 int ps3_free_vuart_irq(unsigned int virq)
@@ -241,21 +375,23 @@ int ps3_free_vuart_irq(unsigned int virq)
                return result;
        }
 
-       irq_dispose_mapping(virq);
+       ps3_free_irq(virq);
 
        return result;
 }
 
 /**
  * ps3_alloc_spe_irq - Configure an spe virq.
+ * @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
+ * serviced on.
  * @spe_id: The spe_id returned from lv1_construct_logical_spe().
  * @class: The spe interrupt class {0,1,2}.
  * @virq: The assigned Linux virq.
  *
  */
 
-int ps3_alloc_spe_irq(unsigned long spe_id, unsigned int class,
-       unsigned int *virq)
+int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id,
+       unsigned int class, unsigned int *virq)
 {
        int result;
        unsigned long outlet;
@@ -270,73 +406,24 @@ int ps3_alloc_spe_irq(unsigned long spe_id, unsigned int class,
                return result;
        }
 
-       *virq = irq_create_mapping(NULL, outlet);
-
-       pr_debug("%s:%d: spe_id %lu, class %u, outlet %lu, virq %u\n",
-               __func__, __LINE__, spe_id, class, outlet, *virq);
+       result = ps3_alloc_irq(cpu, outlet, virq);
+       BUG_ON(result);
 
-       return 0;
+       return result;
 }
 
 int ps3_free_spe_irq(unsigned int virq)
 {
-       irq_dispose_mapping(virq);
+       ps3_free_irq(virq);
        return 0;
 }
 
+
 #define PS3_INVALID_OUTLET ((irq_hw_number_t)-1)
 #define PS3_PLUG_MAX 63
 
-/**
- * struct bmp - a per cpu irq status and mask bitmap structure
- * @status: 256 bit status bitmap indexed by plug
- * @unused_1:
- * @mask: 256 bit mask bitmap indexed by plug
- * @unused_2:
- * @lock:
- * @ipi_debug_brk_mask:
- *
- * The HV mantains per SMT thread mappings of HV outlet to HV plug on
- * behalf of the guest.  These mappings are implemented as 256 bit guest
- * supplied bitmaps indexed by plug number.  The address of the bitmaps are
- * registered with the HV through lv1_configure_irq_state_bitmap().
- *
- * The HV supports 256 plugs per thread, assigned as {0..255}, for a total
- * of 512 plugs supported on a processor.  To simplify the logic this
- * implementation equates HV plug value to linux virq value, constrains each
- * interrupt to have a system wide unique plug number, and limits the range
- * of the plug values to map into the first dword of the bitmaps.  This
- * gives a usable range of plug values of  {NUM_ISA_INTERRUPTS..63}.  Note
- * that there is no constraint on how many in this set an individual thread
- * can aquire.
- */
-
-struct bmp {
-       struct {
-               unsigned long status;
-               unsigned long unused_1[3];
-               unsigned long mask;
-               unsigned long unused_2[3];
-       } __attribute__ ((packed));
-       spinlock_t lock;
-       unsigned long ipi_debug_brk_mask;
-};
-
-/**
- * struct private - a per cpu data structure
- * @node: HV node id
- * @cpu: HV thread id
- * @bmp: an HV bmp structure
- */
-
-struct private {
-       unsigned long node;
-       unsigned int cpu;
-       struct bmp bmp;
-};
-
 #if defined(DEBUG)
-static void _dump_64_bmp(const char *header, const unsigned long *p, unsigned cpu,
+static void _dump_64_bmp(const char *header, const u64 *p, unsigned cpu,
        const char* func, int line)
 {
        pr_debug("%s:%d: %s %u {%04lx_%04lx_%04lx_%04lx}\n",
@@ -346,14 +433,14 @@ static void _dump_64_bmp(const char *header, const unsigned long *p, unsigned cp
 }
 
 static void __attribute__ ((unused)) _dump_256_bmp(const char *header,
-       const unsigned long *p, unsigned cpu, const char* func, int line)
+       const u64 *p, unsigned cpu, const char* func, int line)
 {
        pr_debug("%s:%d: %s %u {%016lx:%016lx:%016lx:%016lx}\n",
                func, line, header, cpu, p[0], p[1], p[2], p[3]);
 }
 
 #define dump_bmp(_x) _dump_bmp(_x, __func__, __LINE__)
-static void _dump_bmp(struct private* pd, const char* func, int line)
+static void _dump_bmp(struct ps3_private* pd, const char* func, int line)
 {
        unsigned long flags;
 
@@ -364,7 +451,7 @@ static void _dump_bmp(struct private* pd, const char* func, int line)
 }
 
 #define dump_mask(_x) _dump_mask(_x, __func__, __LINE__)
-static void __attribute__ ((unused)) _dump_mask(struct private* pd,
+static void __attribute__ ((unused)) _dump_mask(struct ps3_private* pd,
        const char* func, int line)
 {
        unsigned long flags;
@@ -374,109 +461,94 @@ static void __attribute__ ((unused)) _dump_mask(struct private* pd,
        spin_unlock_irqrestore(&pd->bmp.lock, flags);
 }
 #else
-static void dump_bmp(struct private* pd) {};
+static void dump_bmp(struct ps3_private* pd) {};
 #endif /* defined(DEBUG) */
 
-static void chip_mask(unsigned int virq)
+static void ps3_chip_mask(unsigned int virq)
 {
+       struct ps3_private *pd = get_irq_chip_data(virq);
+       u64 bit = 0x8000000000000000UL >> virq;
+       u64 *p = &pd->bmp.mask;
+       u64 old;
        unsigned long flags;
-       struct private *pd = get_irq_chip_data(virq);
 
        pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
 
-       BUG_ON(virq < NUM_ISA_INTERRUPTS);
-       BUG_ON(virq > PS3_PLUG_MAX);
-
-       spin_lock_irqsave(&pd->bmp.lock, flags);
-       pd->bmp.mask &= ~(0x8000000000000000UL >> virq);
-       spin_unlock_irqrestore(&pd->bmp.lock, flags);
+       local_irq_save(flags);
+       asm volatile(
+                    "1:        ldarx %0,0,%3\n"
+                    "andc      %0,%0,%2\n"
+                    "stdcx.    %0,0,%3\n"
+                    "bne-      1b"
+                    : "=&r" (old), "+m" (*p)
+                    : "r" (bit), "r" (p)
+                    : "cc" );
 
        lv1_did_update_interrupt_mask(pd->node, pd->cpu);
+       local_irq_restore(flags);
 }
 
-static void chip_unmask(unsigned int virq)
+static void ps3_chip_unmask(unsigned int virq)
 {
+       struct ps3_private *pd = get_irq_chip_data(virq);
+       u64 bit = 0x8000000000000000UL >> virq;
+       u64 *p = &pd->bmp.mask;
+       u64 old;
        unsigned long flags;
-       struct private *pd = get_irq_chip_data(virq);
 
        pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
 
-       BUG_ON(virq < NUM_ISA_INTERRUPTS);
-       BUG_ON(virq > PS3_PLUG_MAX);
-
-       spin_lock_irqsave(&pd->bmp.lock, flags);
-       pd->bmp.mask |= (0x8000000000000000UL >> virq);
-       spin_unlock_irqrestore(&pd->bmp.lock, flags);
+       local_irq_save(flags);
+       asm volatile(
+                    "1:        ldarx %0,0,%3\n"
+                    "or        %0,%0,%2\n"
+                    "stdcx.    %0,0,%3\n"
+                    "bne-      1b"
+                    : "=&r" (old), "+m" (*p)
+                    : "r" (bit), "r" (p)
+                    : "cc" );
 
        lv1_did_update_interrupt_mask(pd->node, pd->cpu);
+       local_irq_restore(flags);
 }
 
-static void chip_eoi(unsigned int virq)
+static void ps3_chip_eoi(unsigned int virq)
 {
-       lv1_end_of_interrupt(virq);
+       const struct ps3_private *pd = get_irq_chip_data(virq);
+       lv1_end_of_interrupt_ext(pd->node, pd->cpu, virq);
 }
 
 static struct irq_chip irq_chip = {
        .typename = "ps3",
-       .mask = chip_mask,
-       .unmask = chip_unmask,
-       .eoi = chip_eoi,
+       .mask = ps3_chip_mask,
+       .unmask = ps3_chip_unmask,
+       .eoi = ps3_chip_eoi,
 };
 
-static void host_unmap(struct irq_host *h, unsigned int virq)
+static void ps3_host_unmap(struct irq_host *h, unsigned int virq)
 {
-       int result;
-
-       pr_debug("%s:%d: virq %d\n", __func__, __LINE__, virq);
-
-       lv1_disconnect_irq_plug(virq);
-
-       result = set_irq_chip_data(virq, NULL);
-       BUG_ON(result);
+       set_irq_chip_data(virq, NULL);
 }
 
-static DEFINE_PER_CPU(struct private, private);
-
-static int host_map(struct irq_host *h, unsigned int virq,
+static int ps3_host_map(struct irq_host *h, unsigned int virq,
        irq_hw_number_t hwirq)
 {
-       int result;
-       unsigned int cpu;
-
-       pr_debug(" -> %s:%d\n", __func__, __LINE__);
-       pr_debug("%s:%d: hwirq %lu => virq %u\n", __func__, __LINE__, hwirq,
+       pr_debug("%s:%d: hwirq %lu, virq %u\n", __func__, __LINE__, hwirq,
                virq);
 
-       /* bind this virq to a cpu */
-
-       preempt_disable();
-       cpu = smp_processor_id();
-       result = lv1_connect_irq_plug(virq, hwirq);
-       preempt_enable();
-
-       if (result) {
-               pr_info("%s:%d: lv1_connect_irq_plug failed:"
-                       " %s\n", __func__, __LINE__, ps3_result(result));
-               return -EPERM;
-       }
-
-       result = set_irq_chip_data(virq, &per_cpu(private, cpu));
-       BUG_ON(result);
-
        set_irq_chip_and_handler(virq, &irq_chip, handle_fasteoi_irq);
 
-       pr_debug(" <- %s:%d\n", __func__, __LINE__);
-       return result;
+       return 0;
 }
 
-static struct irq_host_ops host_ops = {
-       .map = host_map,
-       .unmap = host_unmap,
+static struct irq_host_ops ps3_host_ops = {
+       .map = ps3_host_map,
+       .unmap = ps3_host_unmap,
 };
 
 void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)
 {
-       struct private *pd = &per_cpu(private, cpu);
+       struct ps3_private *pd = &per_cpu(ps3_private, cpu);
 
        pd->bmp.ipi_debug_brk_mask = 0x8000000000000000UL >> virq;
 
@@ -484,57 +556,32 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)
                cpu, virq, pd->bmp.ipi_debug_brk_mask);
 }
 
-static int bmp_get_and_clear_status_bit(struct bmp *m)
+unsigned int ps3_get_irq(void)
 {
-       unsigned long flags;
-       unsigned int bit;
-       unsigned long x;
-
-       spin_lock_irqsave(&m->lock, flags);
+       struct ps3_private *pd = &__get_cpu_var(ps3_private);
+       u64 x = (pd->bmp.status & pd->bmp.mask);
+       unsigned int plug;
 
        /* check for ipi break first to stop this cpu ASAP */
 
-       if (m->status & m->ipi_debug_brk_mask) {
-               m->status &= ~m->ipi_debug_brk_mask;
-               spin_unlock_irqrestore(&m->lock, flags);
-               return __ilog2(m->ipi_debug_brk_mask);
-       }
-
-       x = (m->status & m->mask);
+       if (x & pd->bmp.ipi_debug_brk_mask)
+               x &= pd->bmp.ipi_debug_brk_mask;
 
-       for (bit = NUM_ISA_INTERRUPTS, x <<= bit; x; bit++, x <<= 1)
-               if (x & 0x8000000000000000UL) {
-                       m->status &= ~(0x8000000000000000UL >> bit);
-                       spin_unlock_irqrestore(&m->lock, flags);
-                       return bit;
-               }
+       asm volatile("cntlzd %0,%1" : "=r" (plug) : "r" (x));
+       plug &= 0x3f;
 
-       spin_unlock_irqrestore(&m->lock, flags);
-
-       pr_debug("%s:%d: not found\n", __func__, __LINE__);
-       return -1;
-}
-
-unsigned int ps3_get_irq(void)
-{
-       int plug;
-
-       struct private *pd = &__get_cpu_var(private);
-
-       plug = bmp_get_and_clear_status_bit(&pd->bmp);
-
-       if (plug < 1) {
+       if (unlikely(plug) == NO_IRQ) {
                pr_debug("%s:%d: no plug found: cpu %u\n", __func__, __LINE__,
                        pd->cpu);
-               dump_bmp(&per_cpu(private, 0));
-               dump_bmp(&per_cpu(private, 1));
+               dump_bmp(&per_cpu(ps3_private, 0));
+               dump_bmp(&per_cpu(ps3_private, 1));
                return NO_IRQ;
        }
 
 #if defined(DEBUG)
-       if (plug < NUM_ISA_INTERRUPTS || plug > PS3_PLUG_MAX) {
-               dump_bmp(&per_cpu(private, 0));
-               dump_bmp(&per_cpu(private, 1));
+       if (unlikely(plug < NUM_ISA_INTERRUPTS || plug > PS3_PLUG_MAX)) {
+               dump_bmp(&per_cpu(ps3_private, 0));
+               dump_bmp(&per_cpu(ps3_private, 1));
                BUG();
        }
 #endif
@@ -544,26 +591,27 @@ unsigned int ps3_get_irq(void)
 void __init ps3_init_IRQ(void)
 {
        int result;
-       unsigned long node;
        unsigned cpu;
        struct irq_host *host;
 
-       lv1_get_logical_ppe_id(&node);
-
-       host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &host_ops,
+       host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &ps3_host_ops,
                PS3_INVALID_OUTLET);
        irq_set_default_host(host);
        irq_set_virq_count(PS3_PLUG_MAX + 1);
 
        for_each_possible_cpu(cpu) {
-               struct private *pd = &per_cpu(private, cpu);
+               struct ps3_private *pd = &per_cpu(ps3_private, cpu);
 
-               pd->node = node;
-               pd->cpu = cpu;
+               lv1_get_logical_ppe_id(&pd->node);
+               pd->cpu = get_hard_smp_processor_id(cpu);
                spin_lock_init(&pd->bmp.lock);
 
-               result = lv1_configure_irq_state_bitmap(node, cpu,
-                       ps3_mm_phys_to_lpar(__pa(&pd->bmp.status)));
+               pr_debug("%s:%d: node %lu, cpu %d, bmp %lxh\n", __func__,
+                       __LINE__, pd->node, pd->cpu,
+                       ps3_mm_phys_to_lpar(__pa(&pd->bmp)));
+
+               result = lv1_configure_irq_state_bitmap(pd->node, pd->cpu,
+                       ps3_mm_phys_to_lpar(__pa(&pd->bmp)));
 
                if (result)
                        pr_debug("%s:%d: lv1_configure_irq_state_bitmap failed:"
index 49c0d010d491d761940bcbcb339f5d3c757cfb2c..42354de3f557e41e16202580181ab6dc160c79a8 100644 (file)
@@ -25,7 +25,6 @@
 #include <asm/firmware.h>
 #include <asm/lmb.h>
 #include <asm/udbg.h>
-#include <asm/ps3.h>
 #include <asm/lv1call.h>
 
 #include "platform.h"
index 58358305dc10061bebe54a4b0b6281c6b82bd9f2..5c3da08bc0c4cac0935379c7d40107ec21fcf69e 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/io.h>
 
 #include <asm/lmb.h>
-#include <asm/ps3.h>
 
 #include "platform.h"
 
@@ -59,20 +58,13 @@ struct os_area_header {
        u32 ldr_format;
        u32 ldr_size;
        u32 _reserved_2[6];
-} __attribute__ ((packed));
+};
 
 enum {
        PARAM_BOOT_FLAG_GAME_OS = 0,
        PARAM_BOOT_FLAG_OTHER_OS = 1,
 };
 
-enum {
-       PARAM_AV_MULTI_OUT_NTSC = 0,
-       PARAM_AV_MULTI_OUT_PAL_RGB = 1,
-       PARAM_AV_MULTI_OUT_PAL_YCBCR = 2,
-       PARAM_AV_MULTI_OUT_SECAM = 3,
-};
-
 enum {
        PARAM_CTRL_BUTTON_O_IS_YES = 0,
        PARAM_CTRL_BUTTON_X_IS_YES = 1,
@@ -114,7 +106,7 @@ struct os_area_params {
        u8 dns_primary[4];
        u8 dns_secondary[4];
        u8 _reserved_5[8];
-} __attribute__ ((packed));
+};
 
 /**
  * struct saved_params - Static working copies of data from the 'Other OS' area.
@@ -257,3 +249,13 @@ u64 ps3_os_area_rtc_diff(void)
 {
        return saved_params.rtc_diff ? saved_params.rtc_diff : 946684800UL;
 }
+
+/**
+ * ps3_os_area_get_av_multi_out - Returns the default video mode.
+ */
+
+enum ps3_param_av_multi_out ps3_os_area_get_av_multi_out(void)
+{
+    return saved_params.av_multi_out;
+}
+EXPORT_SYMBOL_GPL(ps3_os_area_get_av_multi_out);
index 23b111bea9d04be32e9da274ae35b930ea18e346..ca04f03305c76751307389bc94329c936a98872d 100644 (file)
@@ -22,6 +22,9 @@
 #define _PS3_PLATFORM_H
 
 #include <linux/rtc.h>
+#include <scsi/scsi.h>
+
+#include <asm/ps3.h>
 
 /* htab */
 
@@ -65,4 +68,152 @@ void ps3_spu_set_platform (void);
 static inline void ps3_spu_set_platform (void) {}
 #endif
 
+/* repository bus info */
+
+enum ps3_bus_type {
+       PS3_BUS_TYPE_SB = 4,
+       PS3_BUS_TYPE_STORAGE = 5,
+};
+
+enum ps3_dev_type {
+       PS3_DEV_TYPE_STOR_DISK = TYPE_DISK,     /* 0 */
+       PS3_DEV_TYPE_SB_GELIC = 3,
+       PS3_DEV_TYPE_SB_USB = 4,
+       PS3_DEV_TYPE_STOR_ROM = TYPE_ROM,       /* 5 */
+       PS3_DEV_TYPE_SB_GPIO = 6,
+       PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC,     /* 14 */
+};
+
+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_type(unsigned int bus_index,
+       enum ps3_bus_type *bus_type);
+int ps3_repository_read_bus_num_dev(unsigned int bus_index,
+       unsigned int *num_dev);
+
+/* repository bus device info */
+
+enum ps3_interrupt_type {
+       PS3_INTERRUPT_TYPE_EVENT_PORT = 2,
+       PS3_INTERRUPT_TYPE_SB_OHCI = 3,
+       PS3_INTERRUPT_TYPE_SB_EHCI = 4,
+       PS3_INTERRUPT_TYPE_OTHER = 5,
+};
+
+enum ps3_reg_type {
+       PS3_REG_TYPE_SB_OHCI = 3,
+       PS3_REG_TYPE_SB_EHCI = 4,
+       PS3_REG_TYPE_SB_GPIO = 5,
+};
+
+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);
+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,
+       unsigned int dev_index, unsigned int intr_index,
+       enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id);
+int ps3_repository_read_dev_reg_type(unsigned int bus_index,
+       unsigned int dev_index, unsigned int reg_index,
+       enum ps3_reg_type *reg_type);
+int ps3_repository_read_dev_reg_addr(unsigned int bus_index,
+       unsigned int dev_index, unsigned int reg_index, u64 *bus_addr,
+       u64 *len);
+int ps3_repository_read_dev_reg(unsigned int bus_index,
+       unsigned int dev_index, unsigned int reg_index,
+       enum ps3_reg_type *reg_type, u64 *bus_addr, u64 *len);
+
+/* repository bus enumerators */
+
+struct ps3_repository_device {
+       unsigned int bus_index;
+       unsigned int dev_index;
+       struct ps3_device_id did;
+};
+
+int ps3_repository_find_device(enum ps3_bus_type bus_type,
+       enum ps3_dev_type dev_type,
+       const struct ps3_repository_device *start_dev,
+       struct ps3_repository_device *dev);
+static inline int ps3_repository_find_first_device(
+       enum ps3_bus_type bus_type, enum ps3_dev_type dev_type,
+       struct ps3_repository_device *dev)
+{
+       return ps3_repository_find_device(bus_type, dev_type, NULL, dev);
+}
+int ps3_repository_find_interrupt(const struct ps3_repository_device *dev,
+       enum ps3_interrupt_type intr_type, unsigned int *interrupt_id);
+int ps3_repository_find_reg(const struct ps3_repository_device *dev,
+       enum ps3_reg_type reg_type, u64 *bus_addr, u64 *len);
+
+/* repository block device info */
+
+int ps3_repository_read_stor_dev_port(unsigned int bus_index,
+       unsigned int dev_index, u64 *port);
+int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
+       unsigned int dev_index, u64 *blk_size);
+int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
+       unsigned int dev_index, u64 *num_blocks);
+int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
+       unsigned int dev_index, unsigned int *num_regions);
+int ps3_repository_read_stor_dev_region_id(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index,
+       unsigned int *region_id);
+int ps3_repository_read_stor_dev_region_size(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index, u64 *region_size);
+int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index, u64 *region_start);
+int ps3_repository_read_stor_dev_info(unsigned int bus_index,
+       unsigned int dev_index, u64 *port, u64 *blk_size,
+       u64 *num_blocks, unsigned int *num_regions);
+int ps3_repository_read_stor_dev_region(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index,
+       unsigned int *region_id, u64 *region_start, u64 *region_size);
+
+/* repository 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_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);
+int ps3_repository_read_mm_info(u64 *rm_base, u64 *rm_size,
+       u64 *region_total);
+
+/* repository pme info */
+
+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_tb_freq(u64 node_id, u64 *tb_freq);
+int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq);
+
+/* repository 'Other OS' area */
+
+int ps3_repository_read_boot_dat_addr(u64 *lpar_addr);
+int ps3_repository_read_boot_dat_size(unsigned int *size);
+int ps3_repository_read_boot_dat_info(u64 *lpar_addr, unsigned int *size);
+
+/* repository spu info */
+
+/**
+ * enum spu_resource_type - Type of spu resource.
+ * @spu_resource_type_shared: Logical spu is shared with other partions.
+ * @spu_resource_type_exclusive: Logical spu is not shared with other partions.
+ *
+ * Returned by ps3_repository_read_spu_resource_id().
+ */
+
+enum ps3_spu_resource_type {
+       PS3_SPU_RESOURCE_TYPE_SHARED = 0,
+       PS3_SPU_RESOURCE_TYPE_EXCLUSIVE = 0x8000000000000000UL,
+};
+
+int ps3_repository_read_num_spu_reserved(unsigned int *num_spu_reserved);
+int ps3_repository_read_num_spu_resource_id(unsigned int *num_resource_id);
+int ps3_repository_read_spu_resource_id(unsigned int res_index,
+       enum ps3_spu_resource_type* resource_type, unsigned int *resource_id);
+
 #endif
index 273a0d621bdd6bbc7bbffd8ec980ac9ac313494f..ae586a0e5d3f9c75771058b7c22b9279fc8cb237 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#include <asm/ps3.h>
 #include <asm/lv1call.h>
 
+#include "platform.h"
+
 enum ps3_vendor_id {
        PS3_VENDOR_ID_NONE = 0,
        PS3_VENDOR_ID_SONY = 0x8000000000000000UL,
@@ -257,7 +258,7 @@ int ps3_repository_read_dev_type(unsigned int bus_index,
 
 int ps3_repository_read_dev_intr(unsigned int bus_index,
        unsigned int dev_index, unsigned int intr_index,
-       unsigned int *intr_type, unsigned int* interrupt_id)
+       enum ps3_interrupt_type *intr_type, unsigned int* interrupt_id)
 {
        int result;
        u64 v1;
@@ -275,7 +276,8 @@ int ps3_repository_read_dev_intr(unsigned int bus_index,
 }
 
 int ps3_repository_read_dev_reg_type(unsigned int bus_index,
-       unsigned int dev_index, unsigned int reg_index, unsigned int *reg_type)
+       unsigned int dev_index, unsigned int reg_index,
+       enum ps3_reg_type *reg_type)
 {
        int result;
        u64 v1;
@@ -302,8 +304,8 @@ int ps3_repository_read_dev_reg_addr(unsigned int bus_index,
 }
 
 int ps3_repository_read_dev_reg(unsigned int bus_index,
-       unsigned int dev_index, unsigned int reg_index, unsigned int *reg_type,
-       u64 *bus_addr, u64 *len)
+       unsigned int dev_index, unsigned int reg_index,
+       enum ps3_reg_type *reg_type, u64 *bus_addr, u64 *len)
 {
        int result = ps3_repository_read_dev_reg_type(bus_index, dev_index,
                reg_index, reg_type);
@@ -343,7 +345,7 @@ int ps3_repository_dump_resource_info(unsigned int bus_index,
        }
 
        for (res_index = 0; res_index < 10; res_index++) {
-               enum ps3_region_type reg_type;
+               enum ps3_reg_type reg_type;
                u64 bus_addr;
                u64 len;
 
@@ -367,7 +369,55 @@ int ps3_repository_dump_resource_info(unsigned int bus_index,
        return result;
 }
 
-static int dump_device_info(unsigned int bus_index, unsigned int num_dev)
+static int dump_stor_dev_info(unsigned int bus_index, unsigned int dev_index)
+{
+       int result = 0;
+       unsigned int num_regions, region_index;
+       u64 port, blk_size, num_blocks;
+
+       pr_debug(" -> %s:%d: (%u:%u)\n", __func__, __LINE__,
+               bus_index, dev_index);
+
+       result = ps3_repository_read_stor_dev_info(bus_index, dev_index, &port,
+               &blk_size, &num_blocks, &num_regions);
+       if (result) {
+               pr_debug("%s:%d ps3_repository_read_stor_dev_info"
+                       " (%u:%u) failed\n", __func__, __LINE__,
+                       bus_index, dev_index);
+               goto out;
+       }
+
+       pr_debug("%s:%d  (%u:%u): port %lu, blk_size %lu, num_blocks "
+                "%lu, num_regions %u\n",
+                __func__, __LINE__, bus_index, dev_index, port,
+                blk_size, num_blocks, num_regions);
+
+       for (region_index = 0; region_index < num_regions; region_index++) {
+               unsigned int region_id;
+               u64 region_start, region_size;
+
+               result = ps3_repository_read_stor_dev_region(bus_index,
+                       dev_index, region_index, &region_id, &region_start,
+                       &region_size);
+               if (result) {
+                        pr_debug("%s:%d ps3_repository_read_stor_dev_region"
+                                 " (%u:%u) failed\n", __func__, __LINE__,
+                                 bus_index, dev_index);
+                       break;
+               }
+
+               pr_debug("%s:%d (%u:%u) region_id %u, start %lxh, size %lxh\n",
+                        __func__, __LINE__, bus_index, dev_index, region_id,
+                        region_start, region_size);
+       }
+
+out:
+       pr_debug(" <- %s:%d\n", __func__, __LINE__);
+       return result;
+}
+
+static int dump_device_info(unsigned int bus_index, enum ps3_bus_type bus_type,
+                           unsigned int num_dev)
 {
        int result = 0;
        unsigned int dev_index;
@@ -402,6 +452,9 @@ static int dump_device_info(unsigned int bus_index, unsigned int num_dev)
                        __LINE__, bus_index, dev_index, dev_type, dev_id);
 
                ps3_repository_dump_resource_info(bus_index, dev_index);
+
+               if (bus_type == PS3_BUS_TYPE_STORAGE)
+                       dump_stor_dev_info(bus_index, dev_index);
        }
 
        pr_debug(" <- %s:%d\n", __func__, __LINE__);
@@ -452,7 +505,7 @@ int ps3_repository_dump_bus_info(void)
                        __func__, __LINE__, bus_index, bus_type, bus_id,
                        num_dev);
 
-               dump_device_info(bus_index, num_dev);
+               dump_device_info(bus_index, bus_type, num_dev);
        }
 
        pr_debug(" <- %s:%d\n", __func__, __LINE__);
@@ -487,7 +540,8 @@ static int find_device(unsigned int bus_index, unsigned int num_dev,
                        break;
        }
 
-       BUG_ON(dev_index == num_dev);
+       if (dev_index == num_dev)
+               return -1;
 
        pr_debug("%s:%d: found dev_type %u at dev_index %u\n",
                __func__, __LINE__, dev_type, dev_index);
@@ -521,7 +575,7 @@ int ps3_repository_find_device (enum ps3_bus_type bus_type,
        pr_debug("%s:%d: find bus_type %u, dev_type %u\n", __func__, __LINE__,
                bus_type, dev_type);
 
-       dev->bus_index = UINT_MAX;
+       BUG_ON(start_dev && start_dev->bus_index > 10);
 
        for (bus_index = start_dev ? start_dev->bus_index : 0; bus_index < 10;
                bus_index++) {
@@ -532,13 +586,15 @@ int ps3_repository_find_device (enum ps3_bus_type bus_type,
                if (result) {
                        pr_debug("%s:%d read_bus_type failed\n",
                                __func__, __LINE__);
+                       dev->bus_index = UINT_MAX;
                        return result;
                }
                if (x == bus_type)
                        break;
        }
 
-       BUG_ON(bus_index == 10);
+       if (bus_index >= 10)
+               return -ENODEV;
 
        pr_debug("%s:%d: found bus_type %u at bus_index %u\n",
                __func__, __LINE__, bus_type, bus_index);
@@ -604,7 +660,8 @@ int ps3_repository_find_interrupt(const struct ps3_repository_device *dev,
                }
        }
 
-       BUG_ON(res_index == 10);
+       if (res_index == 10)
+               return -ENODEV;
 
        pr_debug("%s:%d: found intr_type %u at res_index %u\n",
                __func__, __LINE__, intr_type, res_index);
@@ -612,8 +669,8 @@ int ps3_repository_find_interrupt(const struct ps3_repository_device *dev,
        return result;
 }
 
-int ps3_repository_find_region(const struct ps3_repository_device *dev,
-       enum ps3_region_type reg_type, u64 *bus_addr, u64 *len)
+int ps3_repository_find_reg(const struct ps3_repository_device *dev,
+       enum ps3_reg_type reg_type, u64 *bus_addr, u64 *len)
 {
        int result = 0;
        unsigned int res_index;
@@ -623,7 +680,7 @@ int ps3_repository_find_region(const struct ps3_repository_device *dev,
        *bus_addr = *len = 0;
 
        for (res_index = 0; res_index < 10; res_index++) {
-               enum ps3_region_type t;
+               enum ps3_reg_type t;
                u64 a;
                u64 l;
 
@@ -643,7 +700,8 @@ int ps3_repository_find_region(const struct ps3_repository_device *dev,
                }
        }
 
-       BUG_ON(res_index == 10);
+       if (res_index == 10)
+               return -ENODEV;
 
        pr_debug("%s:%d: found reg_type %u at res_index %u\n",
                __func__, __LINE__, reg_type, res_index);
@@ -651,6 +709,136 @@ int ps3_repository_find_region(const struct ps3_repository_device *dev,
        return result;
 }
 
+int ps3_repository_read_stor_dev_port(unsigned int bus_index,
+       unsigned int dev_index, u64 *port)
+{
+       return read_node(PS3_LPAR_ID_PME,
+               make_first_field("bus", bus_index),
+               make_field("dev", dev_index),
+               make_field("port", 0),
+               0, port, 0);
+}
+
+int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
+       unsigned int dev_index, u64 *blk_size)
+{
+       return read_node(PS3_LPAR_ID_PME,
+               make_first_field("bus", bus_index),
+               make_field("dev", dev_index),
+               make_field("blk_size", 0),
+               0, blk_size, 0);
+}
+
+int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
+       unsigned int dev_index, u64 *num_blocks)
+{
+       return read_node(PS3_LPAR_ID_PME,
+               make_first_field("bus", bus_index),
+               make_field("dev", dev_index),
+               make_field("n_blocks", 0),
+               0, num_blocks, 0);
+}
+
+int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
+       unsigned int dev_index, unsigned int *num_regions)
+{
+       int result;
+       u64 v1;
+
+       result = read_node(PS3_LPAR_ID_PME,
+               make_first_field("bus", bus_index),
+               make_field("dev", dev_index),
+               make_field("n_regs", 0),
+               0, &v1, 0);
+       *num_regions = v1;
+       return result;
+}
+
+int ps3_repository_read_stor_dev_region_id(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index,
+       unsigned int *region_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("region", region_index),
+           make_field("id", 0),
+           &v1, 0);
+       *region_id = v1;
+       return result;
+}
+
+int ps3_repository_read_stor_dev_region_size(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index, u64 *region_size)
+{
+       return read_node(PS3_LPAR_ID_PME,
+           make_first_field("bus", bus_index),
+           make_field("dev", dev_index),
+           make_field("region", region_index),
+           make_field("size", 0),
+           region_size, 0);
+}
+
+int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index, u64 *region_start)
+{
+       return read_node(PS3_LPAR_ID_PME,
+           make_first_field("bus", bus_index),
+           make_field("dev", dev_index),
+           make_field("region", region_index),
+           make_field("start", 0),
+           region_start, 0);
+}
+
+int ps3_repository_read_stor_dev_info(unsigned int bus_index,
+       unsigned int dev_index, u64 *port, u64 *blk_size,
+       u64 *num_blocks, unsigned int *num_regions)
+{
+       int result;
+
+       result = ps3_repository_read_stor_dev_port(bus_index, dev_index, port);
+       if (result)
+           return result;
+
+       result = ps3_repository_read_stor_dev_blk_size(bus_index, dev_index,
+               blk_size);
+       if (result)
+           return result;
+
+       result = ps3_repository_read_stor_dev_num_blocks(bus_index, dev_index,
+               num_blocks);
+       if (result)
+           return result;
+
+       result = ps3_repository_read_stor_dev_num_regions(bus_index, dev_index,
+               num_regions);
+       return result;
+}
+
+int ps3_repository_read_stor_dev_region(unsigned int bus_index,
+       unsigned int dev_index, unsigned int region_index,
+       unsigned int *region_id, u64 *region_start, u64 *region_size)
+{
+       int result;
+
+       result = ps3_repository_read_stor_dev_region_id(bus_index, dev_index,
+               region_index, region_id);
+       if (result)
+           return result;
+
+       result = ps3_repository_read_stor_dev_region_start(bus_index, dev_index,
+               region_index, region_start);
+       if (result)
+           return result;
+
+       result = ps3_repository_read_stor_dev_region_size(bus_index, dev_index,
+               region_index, region_size);
+       return result;
+}
+
 int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
 {
        return read_node(PS3_LPAR_ID_CURRENT,
index d8b5cadbe80e147cdae164e097f8d705947b8c88..e62505e1881300e17d5581cde9c0ebc018c56188 100644 (file)
 #define DBG(fmt...) do{if(0)printk(fmt);}while(0)
 #endif
 
-static void ps3_show_cpuinfo(struct seq_file *m)
+int ps3_get_firmware_version(union ps3_firmware_version *v)
 {
-       seq_printf(m, "machine\t\t: %s\n", ppc_md.name);
+       int result = lv1_get_version_info(&v->raw);
+
+       if (result) {
+               v->raw = 0;
+               return -1;
+       }
+
+       return result;
 }
+EXPORT_SYMBOL_GPL(ps3_get_firmware_version);
 
 static void ps3_power_save(void)
 {
@@ -74,8 +82,14 @@ static void ps3_panic(char *str)
 
 static void __init ps3_setup_arch(void)
 {
+       union ps3_firmware_version v;
+
        DBG(" -> %s:%d\n", __func__, __LINE__);
 
+       ps3_get_firmware_version(&v);
+       printk(KERN_INFO "PS3 firmware version %u.%u.%u\n", v.major, v.minor,
+               v.rev);
+
        ps3_spu_set_platform();
        ps3_map_htab();
 
@@ -156,7 +170,6 @@ define_machine(ps3) {
        .name                           = "PS3",
        .probe                          = ps3_probe,
        .setup_arch                     = ps3_setup_arch,
-       .show_cpuinfo                   = ps3_show_cpuinfo,
        .init_IRQ                       = ps3_init_IRQ,
        .panic                          = ps3_panic,
        .get_boot_time                  = ps3_get_boot_time,
index 11d2080607ed25fbf78a2c8ddbd995575d94455c..6fb887961a6d16128dfb203b9e5b18a5dbfc686d 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <asm/machdep.h>
 #include <asm/udbg.h>
-#include <asm/ps3.h>
 
 #include "platform.h"
 
@@ -111,7 +110,7 @@ static void __init ps3_smp_setup_cpu(int cpu)
        BUILD_BUG_ON(PPC_MSG_DEBUGGER_BREAK != 3);
 
        for (i = 0; i < MSG_COUNT; i++) {
-               result = ps3_alloc_event_irq(&virqs[i]);
+               result = ps3_alloc_event_irq(cpu, &virqs[i]);
 
                if (result)
                        continue;
index 644532c3b7c4d983910673d9063e8ec9f000cb3e..d1929721b0e47be7d868b64e07443190605616f3 100644 (file)
 
 #include <asm/spu.h>
 #include <asm/spu_priv1.h>
-#include <asm/ps3.h>
 #include <asm/lv1call.h>
 
+#include "platform.h"
+
 /* spu_management_ops */
 
 /**
@@ -50,7 +51,7 @@ enum spe_type {
  */
 
 struct spe_shadow {
-       u8 padding_0000[0x0140];
+       u8 padding_0140[0x0140];
        u64 int_status_class0_RW;       /* 0x0140 */
        u64 int_status_class1_RW;       /* 0x0148 */
        u64 int_status_class2_RW;       /* 0x0150 */
@@ -67,8 +68,7 @@ struct spe_shadow {
        u8 padding_0c08[0x0f00-0x0c08];
        u64 spe_execution_status;       /* 0x0f00 */
        u8 padding_0f08[0x1000-0x0f08];
-} __attribute__ ((packed));
-
+};
 
 /**
  * enum spe_ex_state - Logical spe execution state.
@@ -268,20 +268,20 @@ static int __init setup_interrupts(struct spu *spu)
 {
        int result;
 
-       result = ps3_alloc_spe_irq(spu_pdata(spu)->spe_id, 0,
-               &spu->irqs[0]);
+       result = ps3_alloc_spe_irq(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
+               0, &spu->irqs[0]);
 
        if (result)
                goto fail_alloc_0;
 
-       result = ps3_alloc_spe_irq(spu_pdata(spu)->spe_id, 1,
-               &spu->irqs[1]);
+       result = ps3_alloc_spe_irq(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
+               1, &spu->irqs[1]);
 
        if (result)
                goto fail_alloc_1;
 
-       result = ps3_alloc_spe_irq(spu_pdata(spu)->spe_id, 2,
-               &spu->irqs[2]);
+       result = ps3_alloc_spe_irq(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
+               2, &spu->irqs[2]);
 
        if (result)
                goto fail_alloc_2;
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c
new file mode 100644 (file)
index 0000000..bce6136
--- /dev/null
@@ -0,0 +1,382 @@
+/*
+ *  PS3 system bus driver.
+ *
+ *  Copyright (C) 2006 Sony Computer Entertainment Inc.
+ *  Copyright 2006 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/init.h>
+#include <linux/module.h>
+#include <linux/dma-mapping.h>
+#include <linux/err.h>
+
+#include <asm/udbg.h>
+#include <asm/lv1call.h>
+#include <asm/firmware.h>
+
+#include "platform.h"
+
+#define dump_mmio_region(_a) _dump_mmio_region(_a, __func__, __LINE__)
+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->did.bus_id,
+               r->did.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);
+       pr_debug("%s:%d: lpar_addr %lxh\n", func, line, r->lpar_addr);
+}
+
+int ps3_mmio_region_create(struct ps3_mmio_region *r)
+{
+       int result;
+
+       result = lv1_map_device_mmio_region(r->did.bus_id, r->did.dev_id,
+               r->bus_addr, r->len, r->page_size, &r->lpar_addr);
+
+       if (result) {
+               pr_debug("%s:%d: lv1_map_device_mmio_region failed: %s\n",
+                       __func__, __LINE__, ps3_result(result));
+               r->lpar_addr = 0;
+       }
+
+       dump_mmio_region(r);
+       return result;
+}
+
+int ps3_free_mmio_region(struct ps3_mmio_region *r)
+{
+       int result;
+
+       result = lv1_unmap_device_mmio_region(r->did.bus_id, r->did.dev_id,
+               r->lpar_addr);
+
+       if (result)
+               pr_debug("%s:%d: lv1_unmap_device_mmio_region failed: %s\n",
+                       __func__, __LINE__, ps3_result(result));
+
+       r->lpar_addr = 0;
+       return result;
+}
+
+static int ps3_system_bus_match(struct device *_dev,
+       struct device_driver *_drv)
+{
+       int result;
+       struct ps3_system_bus_driver *drv = to_ps3_system_bus_driver(_drv);
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+
+       result = dev->match_id == drv->match_id;
+
+       pr_info("%s:%d: dev=%u(%s), drv=%u(%s): %s\n", __func__, __LINE__,
+               dev->match_id, dev->core.bus_id, drv->match_id, drv->core.name,
+               (result ? "match" : "miss"));
+       return result;
+}
+
+static int ps3_system_bus_probe(struct device *_dev)
+{
+       int result;
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       struct ps3_system_bus_driver *drv =
+               to_ps3_system_bus_driver(_dev->driver);
+
+       result = lv1_open_device(dev->did.bus_id, dev->did.dev_id, 0);
+
+       if (result) {
+               pr_debug("%s:%d: lv1_open_device failed (%d)\n",
+                       __func__, __LINE__, result);
+               result = -EACCES;
+               goto clean_none;
+       }
+
+       if (dev->d_region->did.bus_id) {
+               result = ps3_dma_region_create(dev->d_region);
+
+               if (result) {
+                       pr_debug("%s:%d: ps3_dma_region_create failed (%d)\n",
+                               __func__, __LINE__, result);
+                       BUG_ON("check region type");
+                       result = -EINVAL;
+                       goto clean_device;
+               }
+       }
+
+       BUG_ON(!drv);
+
+       if (drv->probe)
+               result = drv->probe(dev);
+       else
+               pr_info("%s:%d: %s no probe method\n", __func__, __LINE__,
+                       dev->core.bus_id);
+
+       if (result) {
+               pr_debug("%s:%d: drv->probe failed\n", __func__, __LINE__);
+               goto clean_dma;
+       }
+
+       return result;
+
+clean_dma:
+       ps3_dma_region_free(dev->d_region);
+clean_device:
+       lv1_close_device(dev->did.bus_id, dev->did.dev_id);
+clean_none:
+       return result;
+}
+
+static int ps3_system_bus_remove(struct device *_dev)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       struct ps3_system_bus_driver *drv =
+               to_ps3_system_bus_driver(_dev->driver);
+
+       if (drv->remove)
+               drv->remove(dev);
+       else
+               pr_info("%s:%d: %s no remove method\n", __func__, __LINE__,
+                       dev->core.bus_id);
+
+       ps3_dma_region_free(dev->d_region);
+       ps3_free_mmio_region(dev->m_region);
+       lv1_close_device(dev->did.bus_id, dev->did.dev_id);
+
+       return 0;
+}
+
+struct bus_type ps3_system_bus_type = {
+       .name = "ps3_system_bus",
+       .match = ps3_system_bus_match,
+       .probe = ps3_system_bus_probe,
+       .remove = ps3_system_bus_remove,
+};
+
+int __init ps3_system_bus_init(void)
+{
+       int result;
+
+       if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
+               return 0;
+
+       result = bus_register(&ps3_system_bus_type);
+       BUG_ON(result);
+       return result;
+}
+
+core_initcall(ps3_system_bus_init);
+
+/* Allocates a contiguous real buffer and creates mappings over it.
+ * Returns the virtual address of the buffer and sets dma_handle
+ * to the dma address (mapping) of the first page.
+ */
+
+static void * ps3_alloc_coherent(struct device *_dev, size_t size,
+       dma_addr_t *dma_handle, gfp_t flag)
+{
+       int result;
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       unsigned long virt_addr;
+
+       BUG_ON(!dev->d_region->bus_addr);
+
+       flag &= ~(__GFP_DMA | __GFP_HIGHMEM);
+       flag |= __GFP_ZERO;
+
+       virt_addr = __get_free_pages(flag, get_order(size));
+
+       if (!virt_addr) {
+               pr_debug("%s:%d: get_free_pages failed\n", __func__, __LINE__);
+               goto clean_none;
+       }
+
+       result = ps3_dma_map(dev->d_region, virt_addr, size, dma_handle);
+
+       if (result) {
+               pr_debug("%s:%d: ps3_dma_map failed (%d)\n",
+                       __func__, __LINE__, result);
+               BUG_ON("check region type");
+               goto clean_alloc;
+       }
+
+       return (void*)virt_addr;
+
+clean_alloc:
+       free_pages(virt_addr, get_order(size));
+clean_none:
+       dma_handle = NULL;
+       return NULL;
+}
+
+static void ps3_free_coherent(struct device *_dev, size_t size, void *vaddr,
+       dma_addr_t dma_handle)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+
+       ps3_dma_unmap(dev->d_region, dma_handle, size);
+       free_pages((unsigned long)vaddr, get_order(size));
+}
+
+/* Creates TCEs for a user provided buffer.  The user buffer must be
+ * contiguous real kernel storage (not vmalloc).  The address of the buffer
+ * passed here is the kernel (virtual) address of the buffer.  The buffer
+ * need not be page aligned, the dma_addr_t returned will point to the same
+ * byte within the page as vaddr.
+ */
+
+static dma_addr_t ps3_map_single(struct device *_dev, void *ptr, size_t size,
+       enum dma_data_direction direction)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       int result;
+       unsigned long bus_addr;
+
+       result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size,
+               &bus_addr);
+
+       if (result) {
+               pr_debug("%s:%d: ps3_dma_map failed (%d)\n",
+                       __func__, __LINE__, result);
+       }
+
+       return bus_addr;
+}
+
+static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr,
+       size_t size, enum dma_data_direction direction)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       int result;
+
+       result = ps3_dma_unmap(dev->d_region, dma_addr, size);
+
+       if (result) {
+               pr_debug("%s:%d: ps3_dma_unmap failed (%d)\n",
+                       __func__, __LINE__, result);
+       }
+}
+
+static int ps3_map_sg(struct device *_dev, struct scatterlist *sg, int nents,
+       enum dma_data_direction direction)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       int i;
+
+#if defined(CONFIG_PS3_DYNAMIC_DMA)
+       BUG_ON("do");
+       return -EPERM;
+#else
+       for (i = 0; i < nents; i++, sg++) {
+               int result = ps3_dma_map(dev->d_region,
+                       page_to_phys(sg->page) + sg->offset, sg->length,
+                       &sg->dma_address);
+
+               if (result) {
+                       pr_debug("%s:%d: ps3_dma_map failed (%d)\n",
+                               __func__, __LINE__, result);
+                       return -EINVAL;
+               }
+
+               sg->dma_length = sg->length;
+       }
+
+       return nents;
+#endif
+}
+
+static void ps3_unmap_sg(struct device *_dev, struct scatterlist *sg,
+       int nents, enum dma_data_direction direction)
+{
+#if defined(CONFIG_PS3_DYNAMIC_DMA)
+       BUG_ON("do");
+#endif
+}
+
+static int ps3_dma_supported(struct device *_dev, u64 mask)
+{
+       return mask >= DMA_32BIT_MASK;
+}
+
+static struct dma_mapping_ops ps3_dma_ops = {
+       .alloc_coherent = ps3_alloc_coherent,
+       .free_coherent = ps3_free_coherent,
+       .map_single = ps3_map_single,
+       .unmap_single = ps3_unmap_single,
+       .map_sg = ps3_map_sg,
+       .unmap_sg = ps3_unmap_sg,
+       .dma_supported = ps3_dma_supported
+};
+
+/**
+ * ps3_system_bus_release_device - remove a device from the system bus
+ */
+
+static void ps3_system_bus_release_device(struct device *_dev)
+{
+       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
+       kfree(dev);
+}
+
+/**
+ * ps3_system_bus_device_register - add a device to the system bus
+ *
+ * ps3_system_bus_device_register() expects the dev object to be allocated
+ * dynamically by the caller.  The system bus takes ownership of the dev
+ * object and frees the object in ps3_system_bus_release_device().
+ */
+
+int ps3_system_bus_device_register(struct ps3_system_bus_device *dev)
+{
+       int result;
+       static unsigned int dev_count = 1;
+
+       dev->core.parent = NULL;
+       dev->core.bus = &ps3_system_bus_type;
+       dev->core.release = ps3_system_bus_release_device;
+
+       dev->core.archdata.of_node = NULL;
+       dev->core.archdata.dma_ops = &ps3_dma_ops;
+       dev->core.archdata.numa_node = 0;
+
+       snprintf(dev->core.bus_id, sizeof(dev->core.bus_id), "sb_%02x",
+               dev_count++);
+
+       pr_debug("%s:%d add %s\n", __func__, __LINE__, dev->core.bus_id);
+
+       result = device_register(&dev->core);
+       return result;
+}
+
+EXPORT_SYMBOL_GPL(ps3_system_bus_device_register);
+
+int ps3_system_bus_driver_register(struct ps3_system_bus_driver *drv)
+{
+       int result;
+
+       drv->core.bus = &ps3_system_bus_type;
+
+       result = driver_register(&drv->core);
+       return result;
+}
+
+EXPORT_SYMBOL_GPL(ps3_system_bus_driver_register);
+
+void ps3_system_bus_driver_unregister(struct ps3_system_bus_driver *drv)
+{
+       driver_unregister(&drv->core);
+}
+
+EXPORT_SYMBOL_GPL(ps3_system_bus_driver_unregister);
index da6e5362e7cd8f13f802729e957538cc491e41b3..9437f48cc9e731302f017905aa2099d233658659 100644 (file)
@@ -747,6 +747,7 @@ struct eeh_early_enable_info {
 /* Enable eeh for the given device node. */
 static void *early_enable_eeh(struct device_node *dn, void *data)
 {
+       unsigned int rets[3];
        struct eeh_early_enable_info *info = data;
        int ret;
        const char *status = get_property(dn, "status", NULL);
@@ -803,16 +804,14 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
                                regs[0], info->buid_hi, info->buid_lo,
                                EEH_ENABLE);
 
+               enable = 0;
                if (ret == 0) {
-                       eeh_subsystem_enabled = 1;
-                       pdn->eeh_mode |= EEH_MODE_SUPPORTED;
                        pdn->eeh_config_addr = regs[0];
 
                        /* If the newer, better, ibm,get-config-addr-info is supported, 
                         * then use that instead. */
                        pdn->eeh_pe_config_addr = 0;
                        if (ibm_get_config_addr_info != RTAS_UNKNOWN_SERVICE) {
-                               unsigned int rets[2];
                                ret = rtas_call (ibm_get_config_addr_info, 4, 2, rets, 
                                        pdn->eeh_config_addr, 
                                        info->buid_hi, info->buid_lo,
@@ -820,6 +819,20 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
                                if (ret == 0)
                                        pdn->eeh_pe_config_addr = rets[0];
                        }
+
+                       /* Some older systems (Power4) allow the
+                        * ibm,set-eeh-option call to succeed even on nodes
+                        * where EEH is not supported. Verify support
+                        * explicitly. */
+                       ret = read_slot_reset_state(pdn, rets);
+                       if ((ret == 0) && (rets[1] == 1))
+                               enable = 1;
+               }
+
+               if (enable) {
+                       eeh_subsystem_enabled = 1;
+                       pdn->eeh_mode |= EEH_MODE_SUPPORTED;
+
 #ifdef DEBUG
                        printk(KERN_DEBUG "EEH: %s: eeh enabled, config=%x pe_config=%x\n",
                               dn->full_name, pdn->eeh_config_addr, pdn->eeh_pe_config_addr);
index cbd6b0711ab450f1c306930d1ebdb50e3834201d..a4c0bf84ef2e96644f40f6cbe4eaa69c40a8fb53 100644 (file)
@@ -446,7 +446,8 @@ excess_failures:
         */
        printk(KERN_ERR
           "EEH: PCI device at location=%s driver=%s pci addr=%s \n"
-               "has failed %d times and has been permanently disabled. \n"
+               "has failed %d times in the last hour "
+               "and has been permanently disabled. \n"
                "Please try reseating this device or replacing it.\n",
                location, drv_str, pci_str, frozen_pdn->eeh_freeze_count);
        goto perm_error;
index 1c7b2baa5f73cf97758bf681a2420c75865bfaf3..90522e3c9d46b1979eb86d738fe7c0b7c62718a9 100644 (file)
@@ -59,6 +59,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = {
        {FW_FEATURE_XDABR,              "hcall-xdabr"},
        {FW_FEATURE_MULTITCE,           "hcall-multi-tce"},
        {FW_FEATURE_SPLPAR,             "hcall-splpar"},
+       {FW_FEATURE_BULK_REMOVE,        "hcall-bulk"},
 };
 
 /* Build up the firmware features bitmask using the contents of
index 721436db3ef0bf87967b2982ebe6deecfea4db83..7496005566efd6b48cc64d11ad841c0a4716d8dd 100644 (file)
@@ -502,23 +502,70 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
        BUG_ON(lpar_rc != H_SUCCESS);
 }
 
+/* Flag bits for H_BULK_REMOVE */
+#define HBR_REQUEST    0x4000000000000000UL
+#define HBR_RESPONSE   0x8000000000000000UL
+#define HBR_END                0xc000000000000000UL
+#define HBR_AVPN       0x0200000000000000UL
+#define HBR_ANDCOND    0x0100000000000000UL
+
 /*
  * Take a spinlock around flushes to avoid bouncing the hypervisor tlbie
  * lock.
  */
 static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
 {
-       int i;
+       unsigned long i, pix, rc;
        unsigned long flags = 0;
        struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
        int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
+       unsigned long param[9];
+       unsigned long va;
+       unsigned long hash, index, shift, hidx, slot;
+       real_pte_t pte;
+       int psize;
 
        if (lock_tlbie)
                spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags);
 
-       for (i = 0; i < number; i++)
-               flush_hash_page(batch->vaddr[i], batch->pte[i],
-                               batch->psize, local);
+       psize = batch->psize;
+       pix = 0;
+       for (i = 0; i < number; i++) {
+               va = batch->vaddr[i];
+               pte = batch->pte[i];
+               pte_iterate_hashed_subpages(pte, psize, va, index, shift) {
+                       hash = hpt_hash(va, shift);
+                       hidx = __rpte_to_hidx(pte, index);
+                       if (hidx & _PTEIDX_SECONDARY)
+                               hash = ~hash;
+                       slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
+                       slot += hidx & _PTEIDX_GROUP_IX;
+                       if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
+                               pSeries_lpar_hpte_invalidate(slot, va, psize,
+                                                            local);
+                       } else {
+                               param[pix] = HBR_REQUEST | HBR_AVPN | slot;
+                               param[pix+1] = hpte_encode_v(va, psize) &
+                                       HPTE_V_AVPN;
+                               pix += 2;
+                               if (pix == 8) {
+                                       rc = plpar_hcall9(H_BULK_REMOVE, param,
+                                               param[0], param[1], param[2],
+                                               param[3], param[4], param[5],
+                                               param[6], param[7]);
+                                       BUG_ON(rc != H_SUCCESS);
+                                       pix = 0;
+                               }
+                       }
+               } pte_iterate_hashed_end();
+       }
+       if (pix) {
+               param[pix] = HBR_END;
+               rc = plpar_hcall9(H_BULK_REMOVE, param, param[0], param[1],
+                                 param[2], param[3], param[4], param[5],
+                                 param[6], param[7]);
+               BUG_ON(rc != H_SUCCESS);
+       }
 
        if (lock_tlbie)
                spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
index 715db5c89908f73435c178ba820a2a15bc3cb8d1..c69bd15ced9c1497b8ec645e1ee11dbc8142464d 100644 (file)
@@ -77,7 +77,7 @@ void __init pSeries_final_fixup(void)
 
 /*
  * Assume the winbond 82c105 is the IDE controller on a
- * p610 We should probably be more careful in case
+ * p610/p615/p630. We should probably be more careful in case
  * someone tries to plug in a similar adapter.
  */
 static void fixup_winbond_82c105(struct pci_dev* dev)
index 2621a7e72d2d1f0ec7839c0ca1ba7b309600a198..85dcdf178415fe19ae150e1a2498c4965a183019 100644 (file)
@@ -22,4 +22,6 @@ endif
 ifeq ($(ARCH),powerpc)
 obj-$(CONFIG_MTD)              += rom.o
 obj-$(CONFIG_CPM2)             += cpm2_common.o cpm2_pic.o
+obj-$(CONFIG_8xx)              += mpc8xx_pic.o commproc.o
+obj-$(CONFIG_UCODE_PATCH)      += micropatch.o
 endif
diff --git a/arch/powerpc/sysdev/commproc.c b/arch/powerpc/sysdev/commproc.c
new file mode 100644 (file)
index 0000000..9b4fafd
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * General Purpose functions for the global management of the
+ * Communication Processor Module.
+ * Copyright (c) 1997 Dan error_act (dmalek@jlc.net)
+ *
+ * In addition to the individual control of the communication
+ * channels, there are a few functions that globally affect the
+ * communication processor.
+ *
+ * Buffer descriptors must be allocated from the dual ported memory
+ * space.  The allocator for that is here.  When the communication
+ * process is reset, we reclaim the memory available.  There is
+ * currently no deallocator for this memory.
+ * The amount of space available is platform dependent.  On the
+ * MBX, the EPPC software loads additional microcode into the
+ * communication processor, and uses some of the DP ram for this
+ * purpose.  Current, the first 512 bytes and the last 256 bytes of
+ * memory are used.  Right now I am conservative and only use the
+ * memory that can never be used for microcode.  If there are
+ * applications that require more DP ram, we can expand the boundaries
+ * but then we have to be careful of any downloaded microcode.
+ */
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/dma-mapping.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/module.h>
+#include <asm/mpc8xx.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/8xx_immap.h>
+#include <asm/commproc.h>
+#include <asm/io.h>
+#include <asm/tlbflush.h>
+#include <asm/rheap.h>
+#include <asm/prom.h>
+
+#include <asm/fs_pd.h>
+
+#define CPM_MAP_SIZE    (0x4000)
+
+static void m8xx_cpm_dpinit(void);
+static uint    host_buffer;    /* One page of host buffer */
+static uint    host_end;       /* end + 1 */
+cpm8xx_t       *cpmp;          /* Pointer to comm processor space */
+cpic8xx_t      *cpic_reg;
+
+static struct device_node *cpm_pic_node;
+static struct irq_host *cpm_pic_host;
+
+static void cpm_mask_irq(unsigned int irq)
+{
+       unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq;
+
+       clrbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));
+}
+
+static void cpm_unmask_irq(unsigned int irq)
+{
+       unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq;
+
+       setbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));
+}
+
+static void cpm_end_irq(unsigned int irq)
+{
+       unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq;
+
+       out_be32(&cpic_reg->cpic_cisr, (1 << cpm_vec));
+}
+
+static struct irq_chip cpm_pic = {
+       .typename = " CPM PIC ",
+       .mask = cpm_mask_irq,
+       .unmask = cpm_unmask_irq,
+       .eoi = cpm_end_irq,
+};
+
+int cpm_get_irq(void)
+{
+       int cpm_vec;
+
+       /* Get the vector by setting the ACK bit and then reading
+        * the register.
+        */
+       out_be16(&cpic_reg->cpic_civr, 1);
+       cpm_vec = in_be16(&cpic_reg->cpic_civr);
+       cpm_vec >>= 11;
+
+       return irq_linear_revmap(cpm_pic_host, cpm_vec);
+}
+
+static int cpm_pic_host_match(struct irq_host *h, struct device_node *node)
+{
+       return cpm_pic_node == node;
+}
+
+static int cpm_pic_host_map(struct irq_host *h, unsigned int virq,
+                         irq_hw_number_t hw)
+{
+       pr_debug("cpm_pic_host_map(%d, 0x%lx)\n", virq, hw);
+
+       get_irq_desc(virq)->status |= IRQ_LEVEL;
+       set_irq_chip_and_handler(virq, &cpm_pic, handle_fasteoi_irq);
+       return 0;
+}
+
+/* The CPM can generate the error interrupt when there is a race condition
+ * between generating and masking interrupts.  All we have to do is ACK it
+ * and return.  This is a no-op function so we don't need any special
+ * tests in the interrupt handler.
+ */
+static irqreturn_t cpm_error_interrupt(int irq, void *dev)
+{
+       return IRQ_HANDLED;
+}
+
+static struct irqaction cpm_error_irqaction = {
+       .handler = cpm_error_interrupt,
+       .mask = CPU_MASK_NONE,
+       .name = "error",
+};
+
+static struct irq_host_ops cpm_pic_host_ops = {
+       .match = cpm_pic_host_match,
+       .map = cpm_pic_host_map,
+};
+
+unsigned int cpm_pic_init(void)
+{
+       struct device_node *np = NULL;
+       struct resource res;
+       unsigned int sirq = NO_IRQ, hwirq, eirq;
+       int ret;
+
+       pr_debug("cpm_pic_init\n");
+
+       np = of_find_compatible_node(NULL, "cpm-pic", "CPM");
+       if (np == NULL) {
+               printk(KERN_ERR "CPM PIC init: can not find cpm-pic node\n");
+               return sirq;
+       }
+       ret = of_address_to_resource(np, 0, &res);
+       if (ret)
+               goto end;
+
+       cpic_reg = (void *)ioremap(res.start, res.end - res.start + 1);
+       if (cpic_reg == NULL)
+               goto end;
+
+       sirq = irq_of_parse_and_map(np, 0);
+       if (sirq == NO_IRQ)
+               goto end;
+
+       /* Initialize the CPM interrupt controller. */
+       hwirq = (unsigned int)irq_map[sirq].hwirq;
+       out_be32(&cpic_reg->cpic_cicr,
+           (CICR_SCD_SCC4 | CICR_SCC_SCC3 | CICR_SCB_SCC2 | CICR_SCA_SCC1) |
+               ((hwirq/2) << 13) | CICR_HP_MASK);
+
+       out_be32(&cpic_reg->cpic_cimr, 0);
+
+       cpm_pic_node = of_node_get(np);
+
+       cpm_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm_pic_host_ops, 64);
+       if (cpm_pic_host == NULL) {
+               printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
+               sirq = NO_IRQ;
+               goto end;
+       }
+       of_node_put(np);
+
+       /* Install our own error handler. */
+       np = of_find_node_by_type(NULL, "cpm");
+       if (np == NULL) {
+               printk(KERN_ERR "CPM PIC init: can not find cpm node\n");
+               goto end;
+       }
+       eirq= irq_of_parse_and_map(np, 0);
+       if (eirq == NO_IRQ)
+               goto end;
+
+       if (setup_irq(eirq, &cpm_error_irqaction))
+               printk(KERN_ERR "Could not allocate CPM error IRQ!");
+
+       setbits32(&cpic_reg->cpic_cicr, CICR_IEN);
+
+end:
+       of_node_put(np);
+       return sirq;
+}
+
+void cpm_reset(void)
+{
+       cpm8xx_t        *commproc;
+       sysconf8xx_t    *siu_conf;
+
+       commproc = (cpm8xx_t *)ioremap(CPM_MAP_ADDR, CPM_MAP_SIZE);
+
+#ifdef CONFIG_UCODE_PATCH
+       /* Perform a reset.
+       */
+       out_be16(&commproc->cp_cpcr,  CPM_CR_RST | CPM_CR_FLG);
+
+       /* Wait for it.
+       */
+       while (in_be16(&commproc->cp_cpcr) & CPM_CR_FLG);
+
+       cpm_load_patch(commproc);
+#endif
+
+       /* Set SDMA Bus Request priority 5.
+        * On 860T, this also enables FEC priority 6.  I am not sure
+        * this is what we realy want for some applications, but the
+        * manual recommends it.
+        * Bit 25, FAM can also be set to use FEC aggressive mode (860T).
+        */
+       siu_conf = (sysconf8xx_t*)immr_map(im_siu_conf);
+       out_be32(&siu_conf->sc_sdcr, 1);
+       immr_unmap(siu_conf);
+
+       /* Reclaim the DP memory for our use. */
+       m8xx_cpm_dpinit();
+
+       /* Tell everyone where the comm processor resides.
+       */
+       cpmp = commproc;
+}
+
+/* We used to do this earlier, but have to postpone as long as possible
+ * to ensure the kernel VM is now running.
+ */
+static void
+alloc_host_memory(void)
+{
+       dma_addr_t      physaddr;
+
+       /* Set the host page for allocation.
+       */
+       host_buffer = (uint)dma_alloc_coherent(NULL, PAGE_SIZE, &physaddr,
+                       GFP_KERNEL);
+       host_end = host_buffer + PAGE_SIZE;
+}
+
+/* We also own one page of host buffer space for the allocation of
+ * UART "fifos" and the like.
+ */
+uint
+m8xx_cpm_hostalloc(uint size)
+{
+       uint    retloc;
+
+       if (host_buffer == 0)
+               alloc_host_memory();
+
+       if ((host_buffer + size) >= host_end)
+               return(0);
+
+       retloc = host_buffer;
+       host_buffer += size;
+
+       return(retloc);
+}
+
+/* Set a baud rate generator.  This needs lots of work.  There are
+ * four BRGs, any of which can be wired to any channel.
+ * The internal baud rate clock is the system clock divided by 16.
+ * This assumes the baudrate is 16x oversampled by the uart.
+ */
+#define BRG_INT_CLK            (get_brgfreq())
+#define BRG_UART_CLK           (BRG_INT_CLK/16)
+#define BRG_UART_CLK_DIV16     (BRG_UART_CLK/16)
+
+void
+cpm_setbrg(uint brg, uint rate)
+{
+       volatile uint   *bp;
+
+       /* This is good enough to get SMCs running.....
+       */
+       bp = (uint *)&cpmp->cp_brgc1;
+       bp += brg;
+       /* The BRG has a 12-bit counter.  For really slow baud rates (or
+        * really fast processors), we may have to further divide by 16.
+        */
+       if (((BRG_UART_CLK / rate) - 1) < 4096)
+               *bp = (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN;
+       else
+               *bp = (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) |
+                                               CPM_BRG_EN | CPM_BRG_DIV16;
+}
+
+/*
+ * dpalloc / dpfree bits.
+ */
+static spinlock_t cpm_dpmem_lock;
+/*
+ * 16 blocks should be enough to satisfy all requests
+ * until the memory subsystem goes up...
+ */
+static rh_block_t cpm_boot_dpmem_rh_block[16];
+static rh_info_t cpm_dpmem_info;
+
+#define CPM_DPMEM_ALIGNMENT    8
+static u8* dpram_vbase;
+static uint dpram_pbase;
+
+void m8xx_cpm_dpinit(void)
+{
+       spin_lock_init(&cpm_dpmem_lock);
+
+       dpram_vbase = immr_map_size(im_cpm.cp_dpmem, CPM_DATAONLY_BASE + CPM_DATAONLY_SIZE);
+       dpram_pbase = (uint)&((immap_t *)IMAP_ADDR)->im_cpm.cp_dpmem;
+
+       /* Initialize the info header */
+       rh_init(&cpm_dpmem_info, CPM_DPMEM_ALIGNMENT,
+                       sizeof(cpm_boot_dpmem_rh_block) /
+                       sizeof(cpm_boot_dpmem_rh_block[0]),
+                       cpm_boot_dpmem_rh_block);
+
+       /*
+        * Attach the usable dpmem area.
+        * XXX: This is actually crap.  CPM_DATAONLY_BASE and
+        * CPM_DATAONLY_SIZE are a subset of the available dparm.  It varies
+        * with the processor and the microcode patches applied / activated.
+        * But the following should be at least safe.
+        */
+       rh_attach_region(&cpm_dpmem_info, (void *)CPM_DATAONLY_BASE, CPM_DATAONLY_SIZE);
+}
+
+/*
+ * Allocate the requested size worth of DP memory.
+ * This function returns an offset into the DPRAM area.
+ * Use cpm_dpram_addr() to get the virtual address of the area.
+ */
+uint cpm_dpalloc(uint size, uint align)
+{
+       void *start;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_dpmem_lock, flags);
+       cpm_dpmem_info.alignment = align;
+       start = rh_alloc(&cpm_dpmem_info, size, "commproc");
+       spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
+
+       return (uint)start;
+}
+EXPORT_SYMBOL(cpm_dpalloc);
+
+int cpm_dpfree(uint offset)
+{
+       int ret;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_dpmem_lock, flags);
+       ret = rh_free(&cpm_dpmem_info, (void *)offset);
+       spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(cpm_dpfree);
+
+uint cpm_dpalloc_fixed(uint offset, uint size, uint align)
+{
+       void *start;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_dpmem_lock, flags);
+       cpm_dpmem_info.alignment = align;
+       start = rh_alloc_fixed(&cpm_dpmem_info, (void *)offset, size, "commproc");
+       spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
+
+       return (uint)start;
+}
+EXPORT_SYMBOL(cpm_dpalloc_fixed);
+
+void cpm_dpdump(void)
+{
+       rh_dump(&cpm_dpmem_info);
+}
+EXPORT_SYMBOL(cpm_dpdump);
+
+void *cpm_dpram_addr(uint offset)
+{
+       return (void *)(dpram_vbase + offset);
+}
+EXPORT_SYMBOL(cpm_dpram_addr);
+
+uint cpm_dpram_phys(u8* addr)
+{
+       return (dpram_pbase + (uint)(addr - dpram_vbase));
+}
+EXPORT_SYMBOL(cpm_dpram_addr);
index 767ee6651adc2be412c3c574b4f7026126c27c1f..eabfe06fe05c11cddd563b2e04365211a1b2759a 100644 (file)
 #include <asm/mpc8260.h>
 #include <asm/io.h>
 #include <asm/prom.h>
+#include <asm/fs_pd.h>
 
 #include "cpm2_pic.h"
 
+/* External IRQS */
+#define CPM2_IRQ_EXT1          19
+#define CPM2_IRQ_EXT7          25
+
+/* Port C IRQS */
+#define CPM2_IRQ_PORTC15       48
+#define CPM2_IRQ_PORTC0                63
+
+static intctl_cpm2_t *cpm2_intctl;
+
 static struct device_node *cpm2_pic_node;
 static struct irq_host *cpm2_pic_host;
 #define NR_MASK_WORDS   ((NR_IRQS + 31) / 32)
@@ -68,68 +79,55 @@ static const u_char irq_to_siubit[] = {
        24, 25, 26, 27, 28, 29, 30, 31,
 };
 
-static void cpm2_mask_irq(unsigned int irq_nr)
+static void cpm2_mask_irq(unsigned int virq)
 {
        int     bit, word;
-       volatile uint   *simr;
-
-       irq_nr -= CPM_IRQ_OFFSET;
+       unsigned int irq_nr = virq_to_hw(virq);
 
        bit = irq_to_siubit[irq_nr];
        word = irq_to_siureg[irq_nr];
 
-       simr = &(cpm2_intctl->ic_simrh);
        ppc_cached_irq_mask[word] &= ~(1 << bit);
-       simr[word] = ppc_cached_irq_mask[word];
+       out_be32(&cpm2_intctl->ic_simrh + word, ppc_cached_irq_mask[word]);
 }
 
-static void cpm2_unmask_irq(unsigned int irq_nr)
+static void cpm2_unmask_irq(unsigned int virq)
 {
        int     bit, word;
-       volatile uint   *simr;
-
-       irq_nr -= CPM_IRQ_OFFSET;
+       unsigned int irq_nr = virq_to_hw(virq);
 
        bit = irq_to_siubit[irq_nr];
        word = irq_to_siureg[irq_nr];
 
-       simr = &(cpm2_intctl->ic_simrh);
        ppc_cached_irq_mask[word] |= 1 << bit;
-       simr[word] = ppc_cached_irq_mask[word];
+       out_be32(&cpm2_intctl->ic_simrh + word, ppc_cached_irq_mask[word]);
 }
 
-static void cpm2_mask_and_ack(unsigned int irq_nr)
+static void cpm2_ack(unsigned int virq)
 {
        int     bit, word;
-       volatile uint   *simr, *sipnr;
-
-       irq_nr -= CPM_IRQ_OFFSET;
+       unsigned int irq_nr = virq_to_hw(virq);
 
        bit = irq_to_siubit[irq_nr];
        word = irq_to_siureg[irq_nr];
 
-       simr = &(cpm2_intctl->ic_simrh);
-       sipnr = &(cpm2_intctl->ic_sipnrh);
-       ppc_cached_irq_mask[word] &= ~(1 << bit);
-       simr[word] = ppc_cached_irq_mask[word];
-       sipnr[word] = 1 << bit;
+       out_be32(&cpm2_intctl->ic_sipnrh + word, 1 << bit);
 }
 
-static void cpm2_end_irq(unsigned int irq_nr)
+static void cpm2_end_irq(unsigned int virq)
 {
        int     bit, word;
-       volatile uint   *simr;
+       unsigned int irq_nr = virq_to_hw(virq);
 
        if (!(irq_desc[irq_nr].status & (IRQ_DISABLED|IRQ_INPROGRESS))
                        && irq_desc[irq_nr].action) {
 
-               irq_nr -= CPM_IRQ_OFFSET;
                bit = irq_to_siubit[irq_nr];
                word = irq_to_siureg[irq_nr];
 
-               simr = &(cpm2_intctl->ic_simrh);
                ppc_cached_irq_mask[word] |= 1 << bit;
-               simr[word] = ppc_cached_irq_mask[word];
+               out_be32(&cpm2_intctl->ic_simrh + word, ppc_cached_irq_mask[word]);
+
                /*
                 * Work around large numbers of spurious IRQs on PowerPC 82xx
                 * systems.
@@ -138,13 +136,59 @@ static void cpm2_end_irq(unsigned int irq_nr)
        }
 }
 
+static int cpm2_set_irq_type(unsigned int virq, unsigned int flow_type)
+{
+       unsigned int src = virq_to_hw(virq);
+       struct irq_desc *desc = get_irq_desc(virq);
+       unsigned int vold, vnew, edibit;
+
+       if (flow_type == IRQ_TYPE_NONE)
+               flow_type = IRQ_TYPE_LEVEL_LOW;
+
+       if (flow_type & IRQ_TYPE_EDGE_RISING) {
+               printk(KERN_ERR "CPM2 PIC: sense type 0x%x not supported\n",
+                       flow_type);
+               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;
+       } else
+               desc->handle_irq = handle_edge_irq;
+
+       /* internal IRQ senses are LEVEL_LOW
+        * EXT IRQ and Port C IRQ senses are programmable
+        */
+       if (src >= CPM2_IRQ_EXT1 && src <= CPM2_IRQ_EXT7)
+                       edibit = (14 - (src - CPM2_IRQ_EXT1));
+       else
+               if (src >= CPM2_IRQ_PORTC15 && src <= CPM2_IRQ_PORTC0)
+                       edibit = (31 - (src - CPM2_IRQ_PORTC15));
+               else
+                       return (flow_type & IRQ_TYPE_LEVEL_LOW) ? 0 : -EINVAL;
+
+       vold = in_be32(&cpm2_intctl->ic_siexr);
+
+       if ((flow_type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_FALLING)
+               vnew = vold | (1 << edibit);
+       else
+               vnew = vold & ~(1 << edibit);
+
+       if (vold != vnew)
+               out_be32(&cpm2_intctl->ic_siexr, vnew);
+       return 0;
+}
+
 static struct irq_chip cpm2_pic = {
        .typename = " CPM2 SIU ",
-       .enable = cpm2_unmask_irq,
-       .disable = cpm2_mask_irq,
+       .mask = cpm2_mask_irq,
        .unmask = cpm2_unmask_irq,
-       .mask_ack = cpm2_mask_and_ack,
-       .end = cpm2_end_irq,
+       .ack = cpm2_ack,
+       .eoi = cpm2_end_irq,
+       .set_type = cpm2_set_irq_type,
 };
 
 unsigned int cpm2_get_irq(void)
@@ -154,17 +198,17 @@ unsigned int cpm2_get_irq(void)
 
        /* For CPM2, read the SIVEC register and shift the bits down
          * to get the irq number.         */
-        bits = cpm2_intctl->ic_sivec;
+        bits = in_be32(&cpm2_intctl->ic_sivec);
         irq = bits >> 26;
 
        if (irq == 0)
                return(-1);
-       return irq+CPM_IRQ_OFFSET;
+       return irq_linear_revmap(cpm2_pic_host, irq);
 }
 
 static int cpm2_pic_host_match(struct irq_host *h, struct device_node *node)
 {
-       return cpm2_pic_node == NULL || cpm2_pic_node == node;
+       return cpm2_pic_node == node;
 }
 
 static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq,
@@ -177,39 +221,21 @@ static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq,
        return 0;
 }
 
-static void cpm2_host_unmap(struct irq_host *h, unsigned int virq)
-{
-       /* Make sure irq is masked in hardware */
-       cpm2_mask_irq(virq);
-
-       /* remove chip and handler */
-       set_irq_chip_and_handler(virq, NULL, NULL);
-}
-
 static int cpm2_pic_host_xlate(struct irq_host *h, struct device_node *ct,
                            u32 *intspec, unsigned int intsize,
                            irq_hw_number_t *out_hwirq, unsigned int *out_flags)
 {
-       static const unsigned char map_cpm2_senses[4] = {
-               IRQ_TYPE_LEVEL_LOW,
-               IRQ_TYPE_LEVEL_HIGH,
-               IRQ_TYPE_EDGE_FALLING,
-               IRQ_TYPE_EDGE_RISING,
-       };
-
        *out_hwirq = intspec[0];
-       if (intsize > 1 && intspec[1] < 4)
-               *out_flags = map_cpm2_senses[intspec[1]];
+       if (intsize > 1)
+               *out_flags = intspec[1];
        else
                *out_flags = IRQ_TYPE_NONE;
-
        return 0;
 }
 
 static struct irq_host_ops cpm2_pic_host_ops = {
        .match = cpm2_pic_host_match,
        .map = cpm2_pic_host_map,
-       .unmap = cpm2_host_unmap,
        .xlate = cpm2_pic_host_xlate,
 };
 
@@ -217,37 +243,37 @@ void cpm2_pic_init(struct device_node *node)
 {
        int i;
 
+       cpm2_intctl = cpm2_map(im_intctl);
+
        /* Clear the CPM IRQ controller, in case it has any bits set
         * from the bootloader
         */
 
        /* Mask out everything */
 
-       cpm2_intctl->ic_simrh = 0x00000000;
-       cpm2_intctl->ic_simrl = 0x00000000;
+       out_be32(&cpm2_intctl->ic_simrh, 0x00000000);
+       out_be32(&cpm2_intctl->ic_simrl, 0x00000000);
 
        wmb();
 
        /* Ack everything */
-       cpm2_intctl->ic_sipnrh = 0xffffffff;
-       cpm2_intctl->ic_sipnrl = 0xffffffff;
+       out_be32(&cpm2_intctl->ic_sipnrh, 0xffffffff);
+       out_be32(&cpm2_intctl->ic_sipnrl, 0xffffffff);
        wmb();
 
        /* Dummy read of the vector */
-       i = cpm2_intctl->ic_sivec;
+       i = in_be32(&cpm2_intctl->ic_sivec);
        rmb();
 
        /* Initialize the default interrupt mapping priorities,
         * in case the boot rom changed something on us.
         */
-       cpm2_intctl->ic_sicr = 0;
-       cpm2_intctl->ic_scprrh = 0x05309770;
-       cpm2_intctl->ic_scprrl = 0x05309770;
+       out_be16(&cpm2_intctl->ic_sicr, 0);
+       out_be32(&cpm2_intctl->ic_scprrh, 0x05309770);
+       out_be32(&cpm2_intctl->ic_scprrl, 0x05309770);
 
        /* create a legacy host */
-       if (node)
-               cpm2_pic_node = of_node_get(node);
-
+       cpm2_pic_node = of_node_get(node);
        cpm2_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm2_pic_host_ops, 64);
        if (cpm2_pic_host == NULL) {
                printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
index 2840616529e46af0b514f5fa9d22018224fed718..30e5828a2781c0db956ad3a7be4b714bdfffd075 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _PPC_KERNEL_CPM2_H
 #define _PPC_KERNEL_CPM2_H
 
-extern intctl_cpm2_t *cpm2_intctl;
-
 extern unsigned int cpm2_get_irq(void);
 
 extern void cpm2_pic_init(struct device_node*);
index ad31e56e892ba32b6e97314c17f2fb66bfa7f316..9f2a9a444bfbce7cf8aa1dc5713f1b0ca11db625 100644 (file)
@@ -38,7 +38,8 @@
 #include <asm/cpm2.h>
 
 extern void init_fcc_ioports(struct fs_platform_info*);
-extern void init_scc_ioports(struct fs_uart_platform_info*);
+extern void init_fec_ioports(struct fs_platform_info*);
+extern void init_smc_ioports(struct fs_uart_platform_info*);
 static phys_addr_t immrbase = -1;
 
 phys_addr_t get_immrbase(void)
@@ -63,7 +64,7 @@ phys_addr_t get_immrbase(void)
 
 EXPORT_SYMBOL(get_immrbase);
 
-#ifdef CONFIG_CPM2
+#if defined(CONFIG_CPM2) || defined(CONFIG_8xx)
 
 static u32 brgfreq = -1;
 
@@ -544,6 +545,8 @@ arch_initcall(fsl_usb_of_init);
 
 #ifdef CONFIG_CPM2
 
+extern void init_scc_ioports(struct fs_uart_platform_info*);
+
 static const char fcc_regs[] = "fcc_regs";
 static const char fcc_regs_c[] = "fcc_regs_c";
 static const char fcc_pram[] = "fcc_pram";
@@ -792,3 +795,270 @@ err:
 
 arch_initcall(cpm_uart_of_init);
 #endif /* CONFIG_CPM2 */
+
+#ifdef CONFIG_8xx
+
+extern void init_scc_ioports(struct fs_platform_info*);
+extern int platform_device_skip(char *model, int id);
+
+static int __init fs_enet_mdio_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *mdio_dev;
+       struct resource res;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "mdio", "fs_enet")) != NULL;
+            i++) {
+               struct fs_mii_fec_platform_info mdio_data;
+
+               memset(&res, 0, sizeof(res));
+               memset(&mdio_data, 0, sizeof(mdio_data));
+
+               ret = of_address_to_resource(np, 0, &res);
+               if (ret)
+                       goto err;
+
+               mdio_dev =
+                   platform_device_register_simple("fsl-cpm-fec-mdio",
+                                                   res.start, &res, 1);
+               if (IS_ERR(mdio_dev)) {
+                       ret = PTR_ERR(mdio_dev);
+                       goto err;
+               }
+
+               mdio_data.mii_speed = ((((ppc_proc_freq + 4999999) / 2500000) / 2) & 0x3F) << 1;
+
+               ret =
+                   platform_device_add_data(mdio_dev, &mdio_data,
+                                            sizeof(struct fs_mii_fec_platform_info));
+               if (ret)
+                       goto unreg;
+       }
+       return 0;
+
+unreg:
+       platform_device_unregister(mdio_dev);
+err:
+       return ret;
+}
+
+arch_initcall(fs_enet_mdio_of_init);
+
+static const char *enet_regs = "regs";
+static const char *enet_pram = "pram";
+static const char *enet_irq = "interrupt";
+static char bus_id[9][BUS_ID_SIZE];
+
+static int __init fs_enet_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *fs_enet_dev = NULL;
+       struct resource res;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;
+            i++) {
+               struct resource r[4];
+               struct device_node *phy = NULL, *mdio = NULL;
+               struct fs_platform_info fs_enet_data;
+               unsigned int *id, *phy_addr;
+               void *mac_addr;
+               phandle *ph;
+               char *model;
+
+               memset(r, 0, sizeof(r));
+               memset(&fs_enet_data, 0, sizeof(fs_enet_data));
+
+               model = (char *)get_property(np, "model", NULL);
+               if (model == NULL) {
+                       ret = -ENODEV;
+                       goto unreg;
+               }
+
+               id = (u32 *) get_property(np, "device-id", NULL);
+               fs_enet_data.fs_no = *id;
+
+               if (platform_device_skip(model, *id))
+                       continue;
+
+               ret = of_address_to_resource(np, 0, &r[0]);
+               if (ret)
+                       goto err;
+               r[0].name = enet_regs;
+
+               mac_addr = (void *)get_property(np, "mac-address", NULL);
+               memcpy(fs_enet_data.macaddr, mac_addr, 6);
+
+               ph = (phandle *) get_property(np, "phy-handle", NULL);
+               if (ph != NULL)
+                       phy = of_find_node_by_phandle(*ph);
+
+               if (phy != NULL) {
+                       phy_addr = (u32 *) get_property(phy, "reg", NULL);
+                       fs_enet_data.phy_addr = *phy_addr;
+                       fs_enet_data.has_phy = 1;
+
+                       mdio = of_get_parent(phy);
+                       ret = of_address_to_resource(mdio, 0, &res);
+                       if (ret) {
+                               of_node_put(phy);
+                               of_node_put(mdio);
+                                goto unreg;
+                       }
+               }
+
+               model = (char*)get_property(np, "model", NULL);
+               strcpy(fs_enet_data.fs_type, model);
+
+               if (strstr(model, "FEC")) {
+                       r[1].start = r[1].end = irq_of_parse_and_map(np, 0);
+                       r[1].flags = IORESOURCE_IRQ;
+                       r[1].name = enet_irq;
+
+                       fs_enet_dev =
+                                   platform_device_register_simple("fsl-cpm-fec", i, &r[0], 2);
+
+                       if (IS_ERR(fs_enet_dev)) {
+                               ret = PTR_ERR(fs_enet_dev);
+                               goto err;
+                       }
+
+                       fs_enet_data.rx_ring = 128;
+                       fs_enet_data.tx_ring = 16;
+                       fs_enet_data.rx_copybreak = 240;
+                       fs_enet_data.use_napi = 1;
+                       fs_enet_data.napi_weight = 17;
+
+                       snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%x:%02x",
+                                                       (u32)res.start, fs_enet_data.phy_addr);
+                       fs_enet_data.bus_id = (char*)&bus_id[i];
+                       fs_enet_data.init_ioports = init_fec_ioports;
+               }
+               if (strstr(model, "SCC")) {
+                       ret = of_address_to_resource(np, 1, &r[1]);
+                       if (ret)
+                               goto err;
+                       r[1].name = enet_pram;
+
+                       r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
+                       r[2].flags = IORESOURCE_IRQ;
+                       r[2].name = enet_irq;
+
+                       fs_enet_dev =
+                                   platform_device_register_simple("fsl-cpm-scc", i, &r[0], 3);
+
+                       if (IS_ERR(fs_enet_dev)) {
+                               ret = PTR_ERR(fs_enet_dev);
+                               goto err;
+                       }
+
+                       fs_enet_data.rx_ring = 64;
+                       fs_enet_data.tx_ring = 8;
+                       fs_enet_data.rx_copybreak = 240;
+                       fs_enet_data.use_napi = 1;
+                       fs_enet_data.napi_weight = 17;
+
+                       snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%s", "fixed@10:1");
+                        fs_enet_data.bus_id = (char*)&bus_id[i];
+                       fs_enet_data.init_ioports = init_scc_ioports;
+               }
+
+               of_node_put(phy);
+               of_node_put(mdio);
+
+               ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
+                                            sizeof(struct
+                                                   fs_platform_info));
+               if (ret)
+                       goto unreg;
+       }
+       return 0;
+
+unreg:
+       platform_device_unregister(fs_enet_dev);
+err:
+       return ret;
+}
+
+arch_initcall(fs_enet_of_init);
+
+
+static const char *smc_regs = "regs";
+static const char *smc_pram = "pram";
+
+static int __init cpm_smc_uart_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *cpm_uart_dev;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;
+            i++) {
+               struct resource r[3];
+               struct fs_uart_platform_info cpm_uart_data;
+               int *id;
+               char *model;
+
+               memset(r, 0, sizeof(r));
+               memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));
+
+               ret = of_address_to_resource(np, 0, &r[0]);
+               if (ret)
+                       goto err;
+
+               r[0].name = smc_regs;
+
+               ret = of_address_to_resource(np, 1, &r[1]);
+               if (ret)
+                       goto err;
+               r[1].name = smc_pram;
+
+               r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
+               r[2].flags = IORESOURCE_IRQ;
+
+               cpm_uart_dev =
+                   platform_device_register_simple("fsl-cpm-smc:uart", i, &r[0], 3);
+
+               if (IS_ERR(cpm_uart_dev)) {
+                       ret = PTR_ERR(cpm_uart_dev);
+                       goto err;
+               }
+
+               model = (char*)get_property(np, "model", NULL);
+               strcpy(cpm_uart_data.fs_type, model);
+
+               id = (int*)get_property(np, "device-id", NULL);
+               cpm_uart_data.fs_no = *id;
+               cpm_uart_data.uart_clk = ppc_proc_freq;
+
+               cpm_uart_data.tx_num_fifo = 4;
+               cpm_uart_data.tx_buf_size = 32;
+               cpm_uart_data.rx_num_fifo = 4;
+               cpm_uart_data.rx_buf_size = 32;
+
+               ret =
+                   platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
+                                            sizeof(struct
+                                                   fs_uart_platform_info));
+               if (ret)
+                       goto unreg;
+       }
+
+       return 0;
+
+unreg:
+       platform_device_unregister(cpm_uart_dev);
+err:
+       return ret;
+}
+
+arch_initcall(cpm_smc_uart_of_init);
+
+#endif /* CONFIG_8xx */
index b6ec793a23be3a33bb629c0e0137129e10dba94c..42053625f498d223896aebc2fdf8d58934eefc63 100644 (file)
@@ -56,6 +56,8 @@ static inline void grackle_set_loop_snoop(struct pci_controller *bp, int enable)
 void __init setup_grackle(struct pci_controller *hose)
 {
        setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
+       if (machine_is_compatible("PowerMac1,1"))
+               pci_assign_all_buses = 1;
        if (machine_is_compatible("AAPL,PowerBook1998"))
                grackle_set_loop_snoop(hose, 1);
 #if 0  /* Disabled for now, HW problems ??? */
index 746f78c153756c29007c2bad272e0d0779926989..473c415e9e253bfd5a911274c5a5b42a90780929 100644 (file)
@@ -557,8 +557,7 @@ static struct irq_host_ops ipic_host_ops = {
        .xlate  = ipic_host_xlate,
 };
 
-void __init ipic_init(struct device_node *node,
-               unsigned int flags)
+struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
 {
        struct ipic     *ipic;
        struct resource res;
@@ -566,22 +565,24 @@ void __init ipic_init(struct device_node *node,
 
        ipic = alloc_bootmem(sizeof(struct ipic));
        if (ipic == NULL)
-               return;
+               return NULL;
 
        memset(ipic, 0, sizeof(struct ipic));
-       ipic->of_node = node ? of_node_get(node) : NULL;
+       ipic->of_node = of_node_get(node);
 
        ipic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR,
                                       NR_IPIC_INTS,
                                       &ipic_host_ops, 0);
        if (ipic->irqhost == NULL) {
                of_node_put(node);
-               return;
+               return NULL;
        }
 
        ret = of_address_to_resource(node, 0, &res);
-       if (ret)
-               return;
+       if (ret) {
+               of_node_put(node);
+               return NULL;
+       }
 
        ipic->regs = ioremap(res.start, res.end - res.start + 1);
 
@@ -625,6 +626,8 @@ void __init ipic_init(struct device_node *node,
 
        printk ("IPIC (%d IRQ sources) at %p\n", NR_IPIC_INTS,
                        primary_ipic->regs);
+
+       return ipic;
 }
 
 int ipic_set_priority(unsigned int virq, unsigned int priority)
diff --git a/arch/powerpc/sysdev/micropatch.c b/arch/powerpc/sysdev/micropatch.c
new file mode 100644 (file)
index 0000000..712b10a
--- /dev/null
@@ -0,0 +1,743 @@
+
+/* Microcode patches for the CPM as supplied by Motorola.
+ * This is the one for IIC/SPI.  There is a newer one that
+ * also relocates SMC2, but this would require additional changes
+ * to uart.c, so I am holding off on that for a moment.
+ */
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <asm/irq.h>
+#include <asm/mpc8xx.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/8xx_immap.h>
+#include <asm/commproc.h>
+
+/*
+ * I2C/SPI relocation patch arrays.
+ */
+
+#ifdef CONFIG_I2C_SPI_UCODE_PATCH
+
+uint patch_2000[] = {
+       0x7FFFEFD9,
+       0x3FFD0000,
+       0x7FFB49F7,
+       0x7FF90000,
+       0x5FEFADF7,
+       0x5F89ADF7,
+       0x5FEFAFF7,
+       0x5F89AFF7,
+       0x3A9CFBC8,
+       0xE7C0EDF0,
+       0x77C1E1BB,
+       0xF4DC7F1D,
+       0xABAD932F,
+       0x4E08FDCF,
+       0x6E0FAFF8,
+       0x7CCF76CF,
+       0xFD1FF9CF,
+       0xABF88DC6,
+       0xAB5679F7,
+       0xB0937383,
+       0xDFCE79F7,
+       0xB091E6BB,
+       0xE5BBE74F,
+       0xB3FA6F0F,
+       0x6FFB76CE,
+       0xEE0DF9CF,
+       0x2BFBEFEF,
+       0xCFEEF9CF,
+       0x76CEAD24,
+       0x90B2DF9A,
+       0x7FDDD0BF,
+       0x4BF847FD,
+       0x7CCF76CE,
+       0xCFEF7E1F,
+       0x7F1D7DFD,
+       0xF0B6EF71,
+       0x7FC177C1,
+       0xFBC86079,
+       0xE722FBC8,
+       0x5FFFDFFF,
+       0x5FB2FFFB,
+       0xFBC8F3C8,
+       0x94A67F01,
+       0x7F1D5F39,
+       0xAFE85F5E,
+       0xFFDFDF96,
+       0xCB9FAF7D,
+       0x5FC1AFED,
+       0x8C1C5FC1,
+       0xAFDD5FC3,
+       0xDF9A7EFD,
+       0xB0B25FB2,
+       0xFFFEABAD,
+       0x5FB2FFFE,
+       0x5FCE600B,
+       0xE6BB600B,
+       0x5FCEDFC6,
+       0x27FBEFDF,
+       0x5FC8CFDE,
+       0x3A9CE7C0,
+       0xEDF0F3C8,
+       0x7F0154CD,
+       0x7F1D2D3D,
+       0x363A7570,
+       0x7E0AF1CE,
+       0x37EF2E68,
+       0x7FEE10EC,
+       0xADF8EFDE,
+       0xCFEAE52F,
+       0x7D0FE12B,
+       0xF1CE5F65,
+       0x7E0A4DF8,
+       0xCFEA5F72,
+       0x7D0BEFEE,
+       0xCFEA5F74,
+       0xE522EFDE,
+       0x5F74CFDA,
+       0x0B627385,
+       0xDF627E0A,
+       0x30D8145B,
+       0xBFFFF3C8,
+       0x5FFFDFFF,
+       0xA7F85F5E,
+       0xBFFE7F7D,
+       0x10D31450,
+       0x5F36BFFF,
+       0xAF785F5E,
+       0xBFFDA7F8,
+       0x5F36BFFE,
+       0x77FD30C0,
+       0x4E08FDCF,
+       0xE5FF6E0F,
+       0xAFF87E1F,
+       0x7E0FFD1F,
+       0xF1CF5F1B,
+       0xABF80D5E,
+       0x5F5EFFEF,
+       0x79F730A2,
+       0xAFDD5F34,
+       0x47F85F34,
+       0xAFED7FDD,
+       0x50B24978,
+       0x47FD7F1D,
+       0x7DFD70AD,
+       0xEF717EC1,
+       0x6BA47F01,
+       0x2D267EFD,
+       0x30DE5F5E,
+       0xFFFD5F5E,
+       0xFFEF5F5E,
+       0xFFDF0CA0,
+       0xAFED0A9E,
+       0xAFDD0C3A,
+       0x5F3AAFBD,
+       0x7FBDB082,
+       0x5F8247F8
+};
+
+uint patch_2f00[] = {
+       0x3E303430,
+       0x34343737,
+       0xABF7BF9B,
+       0x994B4FBD,
+       0xBD599493,
+       0x349FFF37,
+       0xFB9B177D,
+       0xD9936956,
+       0xBBFDD697,
+       0xBDD2FD11,
+       0x31DB9BB3,
+       0x63139637,
+       0x93733693,
+       0x193137F7,
+       0x331737AF,
+       0x7BB9B999,
+       0xBB197957,
+       0x7FDFD3D5,
+       0x73B773F7,
+       0x37933B99,
+       0x1D115316,
+       0x99315315,
+       0x31694BF4,
+       0xFBDBD359,
+       0x31497353,
+       0x76956D69,
+       0x7B9D9693,
+       0x13131979,
+       0x79376935
+};
+#endif
+
+/*
+ * I2C/SPI/SMC1 relocation patch arrays.
+ */
+
+#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
+
+uint patch_2000[] = {
+       0x3fff0000,
+       0x3ffd0000,
+       0x3ffb0000,
+       0x3ff90000,
+       0x5f13eff8,
+       0x5eb5eff8,
+       0x5f88adf7,
+       0x5fefadf7,
+       0x3a9cfbc8,
+       0x77cae1bb,
+       0xf4de7fad,
+       0xabae9330,
+       0x4e08fdcf,
+       0x6e0faff8,
+       0x7ccf76cf,
+       0xfdaff9cf,
+       0xabf88dc8,
+       0xab5879f7,
+       0xb0925d8d,
+       0xdfd079f7,
+       0xb090e6bb,
+       0xe5bbe74f,
+       0x9e046f0f,
+       0x6ffb76ce,
+       0xee0cf9cf,
+       0x2bfbefef,
+       0xcfeef9cf,
+       0x76cead23,
+       0x90b3df99,
+       0x7fddd0c1,
+       0x4bf847fd,
+       0x7ccf76ce,
+       0xcfef77ca,
+       0x7eaf7fad,
+       0x7dfdf0b7,
+       0xef7a7fca,
+       0x77cafbc8,
+       0x6079e722,
+       0xfbc85fff,
+       0xdfff5fb3,
+       0xfffbfbc8,
+       0xf3c894a5,
+       0xe7c9edf9,
+       0x7f9a7fad,
+       0x5f36afe8,
+       0x5f5bffdf,
+       0xdf95cb9e,
+       0xaf7d5fc3,
+       0xafed8c1b,
+       0x5fc3afdd,
+       0x5fc5df99,
+       0x7efdb0b3,
+       0x5fb3fffe,
+       0xabae5fb3,
+       0xfffe5fd0,
+       0x600be6bb,
+       0x600b5fd0,
+       0xdfc827fb,
+       0xefdf5fca,
+       0xcfde3a9c,
+       0xe7c9edf9,
+       0xf3c87f9e,
+       0x54ca7fed,
+       0x2d3a3637,
+       0x756f7e9a,
+       0xf1ce37ef,
+       0x2e677fee,
+       0x10ebadf8,
+       0xefdecfea,
+       0xe52f7d9f,
+       0xe12bf1ce,
+       0x5f647e9a,
+       0x4df8cfea,
+       0x5f717d9b,
+       0xefeecfea,
+       0x5f73e522,
+       0xefde5f73,
+       0xcfda0b61,
+       0x5d8fdf61,
+       0xe7c9edf9,
+       0x7e9a30d5,
+       0x1458bfff,
+       0xf3c85fff,
+       0xdfffa7f8,
+       0x5f5bbffe,
+       0x7f7d10d0,
+       0x144d5f33,
+       0xbfffaf78,
+       0x5f5bbffd,
+       0xa7f85f33,
+       0xbffe77fd,
+       0x30bd4e08,
+       0xfdcfe5ff,
+       0x6e0faff8,
+       0x7eef7e9f,
+       0xfdeff1cf,
+       0x5f17abf8,
+       0x0d5b5f5b,
+       0xffef79f7,
+       0x309eafdd,
+       0x5f3147f8,
+       0x5f31afed,
+       0x7fdd50af,
+       0x497847fd,
+       0x7f9e7fed,
+       0x7dfd70a9,
+       0xef7e7ece,
+       0x6ba07f9e,
+       0x2d227efd,
+       0x30db5f5b,
+       0xfffd5f5b,
+       0xffef5f5b,
+       0xffdf0c9c,
+       0xafed0a9a,
+       0xafdd0c37,
+       0x5f37afbd,
+       0x7fbdb081,
+       0x5f8147f8,
+       0x3a11e710,
+       0xedf0ccdd,
+       0xf3186d0a,
+       0x7f0e5f06,
+       0x7fedbb38,
+       0x3afe7468,
+       0x7fedf4fc,
+       0x8ffbb951,
+       0xb85f77fd,
+       0xb0df5ddd,
+       0xdefe7fed,
+       0x90e1e74d,
+       0x6f0dcbf7,
+       0xe7decfed,
+       0xcb74cfed,
+       0xcfeddf6d,
+       0x91714f74,
+       0x5dd2deef,
+       0x9e04e7df,
+       0xefbb6ffb,
+       0xe7ef7f0e,
+       0x9e097fed,
+       0xebdbeffa,
+       0xeb54affb,
+       0x7fea90d7,
+       0x7e0cf0c3,
+       0xbffff318,
+       0x5fffdfff,
+       0xac59efea,
+       0x7fce1ee5,
+       0xe2ff5ee1,
+       0xaffbe2ff,
+       0x5ee3affb,
+       0xf9cc7d0f,
+       0xaef8770f,
+       0x7d0fb0c6,
+       0xeffbbfff,
+       0xcfef5ede,
+       0x7d0fbfff,
+       0x5ede4cf8,
+       0x7fddd0bf,
+       0x49f847fd,
+       0x7efdf0bb,
+       0x7fedfffd,
+       0x7dfdf0b7,
+       0xef7e7e1e,
+       0x5ede7f0e,
+       0x3a11e710,
+       0xedf0ccab,
+       0xfb18ad2e,
+       0x1ea9bbb8,
+       0x74283b7e,
+       0x73c2e4bb,
+       0x2ada4fb8,
+       0xdc21e4bb,
+       0xb2a1ffbf,
+       0x5e2c43f8,
+       0xfc87e1bb,
+       0xe74ffd91,
+       0x6f0f4fe8,
+       0xc7ba32e2,
+       0xf396efeb,
+       0x600b4f78,
+       0xe5bb760b,
+       0x53acaef8,
+       0x4ef88b0e,
+       0xcfef9e09,
+       0xabf8751f,
+       0xefef5bac,
+       0x741f4fe8,
+       0x751e760d,
+       0x7fdbf081,
+       0x741cafce,
+       0xefcc7fce,
+       0x751e70ac,
+       0x741ce7bb,
+       0x3372cfed,
+       0xafdbefeb,
+       0xe5bb760b,
+       0x53f2aef8,
+       0xafe8e7eb,
+       0x4bf8771e,
+       0x7e247fed,
+       0x4fcbe2cc,
+       0x7fbc30a9,
+       0x7b0f7a0f,
+       0x34d577fd,
+       0x308b5db7,
+       0xde553e5f,
+       0xaf78741f,
+       0x741f30f0,
+       0xcfef5e2c,
+       0x741f3eac,
+       0xafb8771e,
+       0x5e677fed,
+       0x0bd3e2cc,
+       0x741ccfec,
+       0xe5ca53cd,
+       0x6fcb4f74,
+       0x5dadde4b,
+       0x2ab63d38,
+       0x4bb3de30,
+       0x751f741c,
+       0x6c42effa,
+       0xefea7fce,
+       0x6ffc30be,
+       0xefec3fca,
+       0x30b3de2e,
+       0xadf85d9e,
+       0xaf7daefd,
+       0x5d9ede2e,
+       0x5d9eafdd,
+       0x761f10ac,
+       0x1da07efd,
+       0x30adfffe,
+       0x4908fb18,
+       0x5fffdfff,
+       0xafbb709b,
+       0x4ef85e67,
+       0xadf814ad,
+       0x7a0f70ad,
+       0xcfef50ad,
+       0x7a0fde30,
+       0x5da0afed,
+       0x3c12780f,
+       0xefef780f,
+       0xefef790f,
+       0xa7f85e0f,
+       0xffef790f,
+       0xefef790f,
+       0x14adde2e,
+       0x5d9eadfd,
+       0x5e2dfffb,
+       0xe79addfd,
+       0xeff96079,
+       0x607ae79a,
+       0xddfceff9,
+       0x60795dff,
+       0x607acfef,
+       0xefefefdf,
+       0xefbfef7f,
+       0xeeffedff,
+       0xebffe7ff,
+       0xafefafdf,
+       0xafbfaf7f,
+       0xaeffadff,
+       0xabffa7ff,
+       0x6fef6fdf,
+       0x6fbf6f7f,
+       0x6eff6dff,
+       0x6bff67ff,
+       0x2fef2fdf,
+       0x2fbf2f7f,
+       0x2eff2dff,
+       0x2bff27ff,
+       0x4e08fd1f,
+       0xe5ff6e0f,
+       0xaff87eef,
+       0x7e0ffdef,
+       0xf11f6079,
+       0xabf8f542,
+       0x7e0af11c,
+       0x37cfae3a,
+       0x7fec90be,
+       0xadf8efdc,
+       0xcfeae52f,
+       0x7d0fe12b,
+       0xf11c6079,
+       0x7e0a4df8,
+       0xcfea5dc4,
+       0x7d0befec,
+       0xcfea5dc6,
+       0xe522efdc,
+       0x5dc6cfda,
+       0x4e08fd1f,
+       0x6e0faff8,
+       0x7c1f761f,
+       0xfdeff91f,
+       0x6079abf8,
+       0x761cee24,
+       0xf91f2bfb,
+       0xefefcfec,
+       0xf91f6079,
+       0x761c27fb,
+       0xefdf5da7,
+       0xcfdc7fdd,
+       0xd09c4bf8,
+       0x47fd7c1f,
+       0x761ccfcf,
+       0x7eef7fed,
+       0x7dfdf093,
+       0xef7e7f1e,
+       0x771efb18,
+       0x6079e722,
+       0xe6bbe5bb,
+       0xae0ae5bb,
+       0x600bae85,
+       0xe2bbe2bb,
+       0xe2bbe2bb,
+       0xaf02e2bb,
+       0xe2bb2ff9,
+       0x6079e2bb
+};
+
+uint patch_2f00[] = {
+       0x30303030,
+       0x3e3e3434,
+       0xabbf9b99,
+       0x4b4fbdbd,
+       0x59949334,
+       0x9fff37fb,
+       0x9b177dd9,
+       0x936956bb,
+       0xfbdd697b,
+       0xdd2fd113,
+       0x1db9f7bb,
+       0x36313963,
+       0x79373369,
+       0x3193137f,
+       0x7331737a,
+       0xf7bb9b99,
+       0x9bb19795,
+       0x77fdfd3d,
+       0x573b773f,
+       0x737933f7,
+       0xb991d115,
+       0x31699315,
+       0x31531694,
+       0xbf4fbdbd,
+       0x35931497,
+       0x35376956,
+       0xbd697b9d,
+       0x96931313,
+       0x19797937,
+       0x6935af78,
+       0xb9b3baa3,
+       0xb8788683,
+       0x368f78f7,
+       0x87778733,
+       0x3ffffb3b,
+       0x8e8f78b8,
+       0x1d118e13,
+       0xf3ff3f8b,
+       0x6bd8e173,
+       0xd1366856,
+       0x68d1687b,
+       0x3daf78b8,
+       0x3a3a3f87,
+       0x8f81378f,
+       0xf876f887,
+       0x77fd8778,
+       0x737de8d6,
+       0xbbf8bfff,
+       0xd8df87f7,
+       0xfd876f7b,
+       0x8bfff8bd,
+       0x8683387d,
+       0xb873d87b,
+       0x3b8fd7f8,
+       0xf7338883,
+       0xbb8ee1f8,
+       0xef837377,
+       0x3337b836,
+       0x817d11f8,
+       0x7378b878,
+       0xd3368b7d,
+       0xed731b7d,
+       0x833731f3,
+       0xf22f3f23
+};
+
+uint patch_2e00[] = {
+       0x27eeeeee,
+       0xeeeeeeee,
+       0xeeeeeeee,
+       0xeeeeeeee,
+       0xee4bf4fb,
+       0xdbd259bb,
+       0x1979577f,
+       0xdfd2d573,
+       0xb773f737,
+       0x4b4fbdbd,
+       0x25b9b177,
+       0xd2d17376,
+       0x956bbfdd,
+       0x697bdd2f,
+       0xff9f79ff,
+       0xff9ff22f
+};
+#endif
+
+/*
+ *  USB SOF patch arrays.
+ */
+
+#ifdef CONFIG_USB_SOF_UCODE_PATCH
+
+uint patch_2000[] = {
+       0x7fff0000,
+       0x7ffd0000,
+       0x7ffb0000,
+       0x49f7ba5b,
+       0xba383ffb,
+       0xf9b8b46d,
+       0xe5ab4e07,
+       0xaf77bffe,
+       0x3f7bbf79,
+       0xba5bba38,
+       0xe7676076,
+       0x60750000
+};
+
+uint patch_2f00[] = {
+       0x3030304c,
+       0xcab9e441,
+       0xa1aaf220
+};
+#endif
+
+void
+cpm_load_patch(cpm8xx_t        *cp)
+{
+       volatile uint           *dp;            /* Dual-ported RAM. */
+       volatile cpm8xx_t       *commproc;
+       volatile iic_t          *iip;
+       volatile spi_t          *spp;
+       volatile smc_uart_t     *smp;
+       int     i;
+
+       commproc = cp;
+
+#ifdef CONFIG_USB_SOF_UCODE_PATCH
+       commproc->cp_rccr = 0;
+
+       dp = (uint *)(commproc->cp_dpmem);
+       for (i=0; i<(sizeof(patch_2000)/4); i++)
+               *dp++ = patch_2000[i];
+
+       dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
+       for (i=0; i<(sizeof(patch_2f00)/4); i++)
+               *dp++ = patch_2f00[i];
+
+       commproc->cp_rccr = 0x0009;
+
+       printk("USB SOF microcode patch installed\n");
+#endif /* CONFIG_USB_SOF_UCODE_PATCH */
+
+#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
+    defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
+
+       commproc->cp_rccr = 0;
+
+       dp = (uint *)(commproc->cp_dpmem);
+       for (i=0; i<(sizeof(patch_2000)/4); i++)
+               *dp++ = patch_2000[i];
+
+       dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
+       for (i=0; i<(sizeof(patch_2f00)/4); i++)
+               *dp++ = patch_2f00[i];
+
+       iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
+# define RPBASE 0x0500
+       iip->iic_rpbase = RPBASE;
+
+       /* Put SPI above the IIC, also 32-byte aligned.
+       */
+       i = (RPBASE + sizeof(iic_t) + 31) & ~31;
+       spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
+       spp->spi_rpbase = i;
+
+# if defined(CONFIG_I2C_SPI_UCODE_PATCH)
+       commproc->cp_cpmcr1 = 0x802a;
+       commproc->cp_cpmcr2 = 0x8028;
+       commproc->cp_cpmcr3 = 0x802e;
+       commproc->cp_cpmcr4 = 0x802c;
+       commproc->cp_rccr = 1;
+
+       printk("I2C/SPI microcode patch installed.\n");
+# endif /* CONFIG_I2C_SPI_UCODE_PATCH */
+
+# if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
+
+       dp = (uint *)&(commproc->cp_dpmem[0x0e00]);
+       for (i=0; i<(sizeof(patch_2e00)/4); i++)
+               *dp++ = patch_2e00[i];
+
+       commproc->cp_cpmcr1 = 0x8080;
+       commproc->cp_cpmcr2 = 0x808a;
+       commproc->cp_cpmcr3 = 0x8028;
+       commproc->cp_cpmcr4 = 0x802a;
+       commproc->cp_rccr = 3;
+
+       smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
+       smp->smc_rpbase = 0x1FC0;
+
+       printk("I2C/SPI/SMC1 microcode patch installed.\n");
+# endif /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
+
+#endif /* some variation of the I2C/SPI patch was selected */
+}
+
+/*
+ *  Take this entire routine out, since no one calls it and its
+ * logic is suspect.
+ */
+
+#if 0
+void
+verify_patch(volatile immap_t *immr)
+{
+       volatile uint           *dp;
+       volatile cpm8xx_t       *commproc;
+       int i;
+
+       commproc = (cpm8xx_t *)&immr->im_cpm;
+
+       printk("cp_rccr %x\n", commproc->cp_rccr);
+       commproc->cp_rccr = 0;
+
+       dp = (uint *)(commproc->cp_dpmem);
+       for (i=0; i<(sizeof(patch_2000)/4); i++)
+               if (*dp++ != patch_2000[i]) {
+                       printk("patch_2000 bad at %d\n", i);
+                       dp--;
+                       printk("found 0x%X, wanted 0x%X\n", *dp, patch_2000[i]);
+                       break;
+               }
+
+       dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
+       for (i=0; i<(sizeof(patch_2f00)/4); i++)
+               if (*dp++ != patch_2f00[i]) {
+                       printk("patch_2f00 bad at %d\n", i);
+                       dp--;
+                       printk("found 0x%X, wanted 0x%X\n", *dp, patch_2f00[i]);
+                       break;
+               }
+
+       commproc->cp_rccr = 0x0009;
+}
+#endif
diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c
new file mode 100644 (file)
index 0000000..2fc2bcd
--- /dev/null
@@ -0,0 +1,197 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/stddef.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/signal.h>
+#include <linux/irq.h>
+#include <linux/dma-mapping.h>
+#include <asm/prom.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <asm/8xx_immap.h>
+#include <asm/mpc8xx.h>
+
+#include "mpc8xx_pic.h"
+
+
+#define PIC_VEC_SPURRIOUS      15
+
+extern int cpm_get_irq(struct pt_regs *regs);
+
+static struct device_node *mpc8xx_pic_node;
+static struct irq_host *mpc8xx_pic_host;
+#define NR_MASK_WORDS   ((NR_IRQS + 31) / 32)
+static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
+static sysconf8xx_t    *siu_reg;
+
+int cpm_get_irq(struct pt_regs *regs);
+
+static void mpc8xx_unmask_irq(unsigned int virq)
+{
+       int     bit, word;
+       unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq;
+
+       bit = irq_nr & 0x1f;
+       word = irq_nr >> 5;
+
+       ppc_cached_irq_mask[word] |= (1 << (31-bit));
+       out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);
+}
+
+static void mpc8xx_mask_irq(unsigned int virq)
+{
+       int     bit, word;
+       unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq;
+
+       bit = irq_nr & 0x1f;
+       word = irq_nr >> 5;
+
+       ppc_cached_irq_mask[word] &= ~(1 << (31-bit));
+       out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);
+}
+
+static void mpc8xx_ack(unsigned int virq)
+{
+       int     bit;
+       unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq;
+
+       bit = irq_nr & 0x1f;
+       out_be32(&siu_reg->sc_sipend, 1 << (31-bit));
+}
+
+static void mpc8xx_end_irq(unsigned int virq)
+{
+       int bit, word;
+       unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq;
+
+       bit = irq_nr & 0x1f;
+       word = irq_nr >> 5;
+
+       ppc_cached_irq_mask[word] |= (1 << (31-bit));
+       out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);
+}
+
+static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type)
+{
+       struct irq_desc *desc = get_irq_desc(virq);
+
+       desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
+       desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
+       if (flow_type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
+               desc->status |= IRQ_LEVEL;
+
+       if (flow_type & IRQ_TYPE_EDGE_FALLING) {
+               irq_hw_number_t hw = (unsigned int)irq_map[virq].hwirq;
+               unsigned int siel = in_be32(&siu_reg->sc_siel);
+
+               /* only external IRQ senses are programmable */
+               if ((hw & 1) == 0) {
+                       siel |= (0x80000000 >> hw);
+                       out_be32(&siu_reg->sc_siel, siel);
+                       desc->handle_irq = handle_edge_irq;
+               }
+       }
+       return 0;
+}
+
+static struct irq_chip mpc8xx_pic = {
+       .typename = " MPC8XX SIU ",
+       .unmask = mpc8xx_unmask_irq,
+       .mask = mpc8xx_mask_irq,
+       .ack = mpc8xx_ack,
+       .eoi = mpc8xx_end_irq,
+       .set_type = mpc8xx_set_irq_type,
+};
+
+unsigned int mpc8xx_get_irq(void)
+{
+       int irq;
+
+       /* For MPC8xx, read the SIVEC register and shift the bits down
+        * to get the irq number.
+        */
+       irq = in_be32(&siu_reg->sc_sivec) >> 26;
+
+       if (irq == PIC_VEC_SPURRIOUS)
+               irq = NO_IRQ;
+
+        return irq_linear_revmap(mpc8xx_pic_host, irq);
+
+}
+
+static int mpc8xx_pic_host_match(struct irq_host *h, struct device_node *node)
+{
+       return mpc8xx_pic_node == node;
+}
+
+static int mpc8xx_pic_host_map(struct irq_host *h, unsigned int virq,
+                         irq_hw_number_t hw)
+{
+       pr_debug("mpc8xx_pic_host_map(%d, 0x%lx)\n", virq, hw);
+
+       /* Set default irq handle */
+       set_irq_chip_and_handler(virq, &mpc8xx_pic, handle_level_irq);
+       return 0;
+}
+
+
+static int mpc8xx_pic_host_xlate(struct irq_host *h, struct device_node *ct,
+                           u32 *intspec, unsigned int intsize,
+                           irq_hw_number_t *out_hwirq, unsigned int *out_flags)
+{
+       static unsigned char map_pic_senses[4] = {
+               IRQ_TYPE_EDGE_RISING,
+               IRQ_TYPE_LEVEL_LOW,
+               IRQ_TYPE_LEVEL_HIGH,
+               IRQ_TYPE_EDGE_FALLING,
+       };
+
+       *out_hwirq = intspec[0];
+       if (intsize > 1 && intspec[1] < 4)
+               *out_flags = map_pic_senses[intspec[1]];
+       else
+               *out_flags = IRQ_TYPE_NONE;
+
+       return 0;
+}
+
+
+static struct irq_host_ops mpc8xx_pic_host_ops = {
+       .match = mpc8xx_pic_host_match,
+       .map = mpc8xx_pic_host_map,
+       .xlate = mpc8xx_pic_host_xlate,
+};
+
+int mpc8xx_pic_init(void)
+{
+       struct resource res;
+       struct device_node *np = NULL;
+       int ret;
+
+       np = of_find_node_by_type(np, "mpc8xx-pic");
+
+       if (np == NULL) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return -ENOMEM;
+       }
+
+       mpc8xx_pic_node = of_node_get(np);
+
+       ret = of_address_to_resource(np, 0, &res);
+       of_node_put(np);
+       if (ret)
+               return ret;
+
+       siu_reg = (void *)ioremap(res.start, res.end - res.start + 1);
+       if (siu_reg == NULL)
+               return -EINVAL;
+
+       mpc8xx_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &mpc8xx_pic_host_ops, 64);
+       if (mpc8xx_pic_host == NULL) {
+               printk(KERN_ERR "MPC8xx PIC: failed to allocate irq host!\n");
+               ret = -ENOMEM;
+       }
+
+       return ret;
+}
diff --git a/arch/powerpc/sysdev/mpc8xx_pic.h b/arch/powerpc/sysdev/mpc8xx_pic.h
new file mode 100644 (file)
index 0000000..afa2ee6
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _PPC_KERNEL_MPC8xx_H
+#define _PPC_KERNEL_MPC8xx_H
+
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+
+extern struct hw_interrupt_type mpc8xx_pic;
+
+int mpc8xx_pic_init(void);
+unsigned int mpc8xx_get_irq(void);
+
+#endif /* _PPC_KERNEL_PPC8xx_H */
index d01ced11694d2b5bdd4dda33a3aa4913bc4e5aad..aa701cc27ecc5e20af599e4d66c28ca0c81f097c 100644 (file)
@@ -496,13 +496,18 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic)
 static struct mpic *mpic_find(unsigned int irq, unsigned int *is_ipi)
 {
        unsigned int src = mpic_irq_to_hw(irq);
+       struct mpic *mpic;
 
        if (irq < NUM_ISA_INTERRUPTS)
                return NULL;
+
+       mpic = irq_desc[irq].chip_data;
+
        if (is_ipi)
-               *is_ipi = (src >= MPIC_VEC_IPI_0 && src <= MPIC_VEC_IPI_3);
+               *is_ipi = (src >= mpic->ipi_vecs[0] &&
+                          src <= mpic->ipi_vecs[3]);
 
-       return irq_desc[irq].chip_data;
+       return mpic;
 }
 
 /* Convert a cpu mask from logical to physical cpu numbers. */
@@ -540,7 +545,11 @@ static inline void mpic_eoi(struct mpic *mpic)
 #ifdef CONFIG_SMP
 static irqreturn_t mpic_ipi_action(int irq, void *dev_id)
 {
-       smp_message_recv(mpic_irq_to_hw(irq) - MPIC_VEC_IPI_0);
+       struct mpic *mpic;
+
+       mpic = mpic_find(irq, NULL);
+       smp_message_recv(mpic_irq_to_hw(irq) - mpic->ipi_vecs[0]);
+
        return IRQ_HANDLED;
 }
 #endif /* CONFIG_SMP */
@@ -663,7 +672,7 @@ static void mpic_end_ht_irq(unsigned int irq)
 static void mpic_unmask_ipi(unsigned int irq)
 {
        struct mpic *mpic = mpic_from_ipi(irq);
-       unsigned int src = mpic_irq_to_hw(irq) - MPIC_VEC_IPI_0;
+       unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0];
 
        DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src);
        mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK);
@@ -807,11 +816,11 @@ static int mpic_host_map(struct irq_host *h, unsigned int virq,
 
        DBG("mpic: map virq %d, hwirq 0x%lx\n", virq, hw);
 
-       if (hw == MPIC_VEC_SPURRIOUS)
+       if (hw == mpic->spurious_vec)
                return -EINVAL;
 
 #ifdef CONFIG_SMP
-       else if (hw >= MPIC_VEC_IPI_0) {
+       else if (hw >= mpic->ipi_vecs[0]) {
                WARN_ON(!(mpic->flags & MPIC_PRIMARY));
 
                DBG("mpic: mapping as IPI\n");
@@ -904,6 +913,7 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        u32             reg;
        const char      *vers;
        int             i;
+       int             intvec_top;
        u64             paddr = phys_addr;
 
        mpic = alloc_bootmem(sizeof(struct mpic));
@@ -912,11 +922,11 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        
        memset(mpic, 0, sizeof(struct mpic));
        mpic->name = name;
-       mpic->of_node = node ? of_node_get(node) : NULL;
+       mpic->of_node = of_node_get(node);
 
-       mpic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 256,
+       mpic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, isu_size,
                                       &mpic_host_ops,
-                                      MPIC_VEC_SPURRIOUS);
+                                      flags & MPIC_LARGE_VECTORS ? 2048 : 256);
        if (mpic->irqhost == NULL) {
                of_node_put(node);
                return NULL;
@@ -944,6 +954,21 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        mpic->irq_count = irq_count;
        mpic->num_sources = 0; /* so far */
 
+       if (flags & MPIC_LARGE_VECTORS)
+               intvec_top = 2047;
+       else
+               intvec_top = 255;
+
+       mpic->timer_vecs[0] = intvec_top - 8;
+       mpic->timer_vecs[1] = intvec_top - 7;
+       mpic->timer_vecs[2] = intvec_top - 6;
+       mpic->timer_vecs[3] = intvec_top - 5;
+       mpic->ipi_vecs[0]   = intvec_top - 4;
+       mpic->ipi_vecs[1]   = intvec_top - 3;
+       mpic->ipi_vecs[2]   = intvec_top - 2;
+       mpic->ipi_vecs[3]   = intvec_top - 1;
+       mpic->spurious_vec  = intvec_top;
+
        /* Check for "big-endian" in device-tree */
        if (node && get_property(node, "big-endian", NULL) != NULL)
                mpic->flags |= MPIC_BIG_ENDIAN;
@@ -1084,11 +1109,6 @@ void __init mpic_init(struct mpic *mpic)
        int i;
 
        BUG_ON(mpic->num_sources == 0);
-       WARN_ON(mpic->num_sources > MPIC_VEC_IPI_0);
-
-       /* Sanitize source count */
-       if (mpic->num_sources > MPIC_VEC_IPI_0)
-               mpic->num_sources = MPIC_VEC_IPI_0;
 
        printk(KERN_INFO "mpic: Initializing for %d sources\n", mpic->num_sources);
 
@@ -1104,7 +1124,7 @@ void __init mpic_init(struct mpic *mpic)
                           i * MPIC_INFO(TIMER_STRIDE) +
                           MPIC_INFO(TIMER_VECTOR_PRI),
                           MPIC_VECPRI_MASK |
-                          (MPIC_VEC_TIMER_0 + i));
+                          (mpic->timer_vecs[0] + i));
        }
 
        /* Initialize IPIs to our reserved vectors and mark them disabled for now */
@@ -1113,7 +1133,7 @@ void __init mpic_init(struct mpic *mpic)
                mpic_ipi_write(i,
                               MPIC_VECPRI_MASK |
                               (10 << MPIC_VECPRI_PRIORITY_SHIFT) |
-                              (MPIC_VEC_IPI_0 + i));
+                              (mpic->ipi_vecs[0] + i));
        }
 
        /* Initialize interrupt sources */
@@ -1136,8 +1156,8 @@ void __init mpic_init(struct mpic *mpic)
                               1 << hard_smp_processor_id());
        }
        
-       /* Init spurrious vector */
-       mpic_write(mpic->gregs, MPIC_INFO(GREG_SPURIOUS), MPIC_VEC_SPURRIOUS);
+       /* Init spurious vector */
+       mpic_write(mpic->gregs, MPIC_INFO(GREG_SPURIOUS), mpic->spurious_vec);
 
        /* Disable 8259 passthrough, if supported */
        if (!(mpic->flags & MPIC_NO_PTHROU_DIS))
@@ -1184,9 +1204,9 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
 
        spin_lock_irqsave(&mpic_lock, flags);
        if (is_ipi) {
-               reg = mpic_ipi_read(src - MPIC_VEC_IPI_0) &
+               reg = mpic_ipi_read(src - mpic->ipi_vecs[0]) &
                        ~MPIC_VECPRI_PRIORITY_MASK;
-               mpic_ipi_write(src - MPIC_VEC_IPI_0,
+               mpic_ipi_write(src - mpic->ipi_vecs[0],
                               reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
        } else {
                reg = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI))
@@ -1207,7 +1227,7 @@ unsigned int mpic_irq_get_priority(unsigned int irq)
 
        spin_lock_irqsave(&mpic_lock, flags);
        if (is_ipi)
-               reg = mpic_ipi_read(src = MPIC_VEC_IPI_0);
+               reg = mpic_ipi_read(src = mpic->ipi_vecs[0]);
        else
                reg = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI));
        spin_unlock_irqrestore(&mpic_lock, flags);
@@ -1313,7 +1333,7 @@ unsigned int mpic_get_one_irq(struct mpic *mpic)
 #ifdef DEBUG_LOW
        DBG("%s: get_one_irq(): %d\n", mpic->name, src);
 #endif
-       if (unlikely(src == MPIC_VEC_SPURRIOUS))
+       if (unlikely(src == mpic->spurious_vec))
                return NO_IRQ;
        return irq_linear_revmap(mpic->irqhost, src);
 }
@@ -1345,7 +1365,7 @@ void mpic_request_ipis(void)
 
        for (i = 0; i < 4; i++) {
                unsigned int vipi = irq_create_mapping(mpic->irqhost,
-                                                      MPIC_VEC_IPI_0 + i);
+                                                      mpic->ipi_vecs[0] + i);
                if (vipi == NO_IRQ) {
                        printk(KERN_ERR "Failed to map IPI %d\n", i);
                        break;
index 74e48d94f27ced66c0ed03fad91644a5cdb26222..4d1dcb45963d8c8605ef718c4aa6dfb798f45d6f 100644 (file)
@@ -323,7 +323,7 @@ unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
        return irq_linear_revmap(qe_ic->irqhost, irq);
 }
 
-void fastcall qe_ic_cascade_low(unsigned int irq, struct irq_desc *desc)
+void qe_ic_cascade_low(unsigned int irq, struct irq_desc *desc)
 {
        struct qe_ic *qe_ic = desc->handler_data;
        unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
@@ -332,7 +332,7 @@ void fastcall qe_ic_cascade_low(unsigned int irq, struct irq_desc *desc)
                generic_handle_irq(cascade_irq);
 }
 
-void fastcall qe_ic_cascade_high(unsigned int irq, struct irq_desc *desc)
+void qe_ic_cascade_high(unsigned int irq, struct irq_desc *desc)
 {
        struct qe_ic *qe_ic = desc->handler_data;
        unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
@@ -352,7 +352,7 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags)
                return;
 
        memset(qe_ic, 0, sizeof(struct qe_ic));
-       qe_ic->of_node = node ? of_node_get(node) : NULL;
+       qe_ic->of_node = of_node_get(node);
 
        qe_ic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR,
                                        NR_QE_IC_INTS, &qe_ic_host_ops, 0);
index 5d841f4b353072deccd5b024b10d285b17cadf0f..af3780e52e7607e11ff9fe573dd79cf84b0f32d2 100644 (file)
@@ -21,6 +21,7 @@
    02110-1301, USA.  */
 
 #include <linux/stddef.h>
+#include <linux/kernel.h>
 #include "nonstdio.h"
 #include "ppc.h"
 
@@ -4932,8 +4933,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
 
 };
 
-const int powerpc_num_opcodes =
-  sizeof (powerpc_opcodes) / sizeof (powerpc_opcodes[0]);
+const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes);
 \f
 /* The macro table.  This is only used by the assembler.  */
 
@@ -4989,5 +4989,4 @@ const struct powerpc_macro powerpc_macros[] = {
 { "clrlslwi.",4,  PPCCOM,      "rlwinm. %0,%1,%3,(%2)-(%3),31-(%3)" },
 };
 
-const int powerpc_num_macros =
-  sizeof (powerpc_macros) / sizeof (powerpc_macros[0]);
+const int powerpc_num_macros = ARRAY_SIZE(powerpc_macros);
index efffde9edc6e1ddb50620bf6e77b21904129f4a3..530df3d6d7b238b047f5832e1787af538b1791c4 100644 (file)
@@ -18,6 +18,7 @@
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
+#include <linux/kernel.h>
 #include "spu.h"
 
 /* This file holds the Spu opcode table */
@@ -40,5 +41,4 @@ const struct spu_opcode spu_opcodes[] = {
 #undef APUOPFB
 };
 
-const int spu_num_opcodes =
-  sizeof (spu_opcodes) / sizeof (spu_opcodes[0]);
+const int spu_num_opcodes = ARRAY_SIZE(spu_opcodes);
index b7bb5f0b3c5f68a56fa0dde50392daec418c778f..684ed04eb8b8aedcd7bb1cd88b147de90f13b4da 100644 (file)
@@ -1379,7 +1379,6 @@ static void cs_nosound(unsigned long xx)
 }
 
 static DEFINE_TIMER(beep_timer, cs_nosound, 0, 0);
-};
 
 static void cs_mksound(unsigned int hz, unsigned int ticks)
 {
index 8eb82efe05a12072f0929380fffa74bfd05e6da5..c22e60619d9bb6c257f0b7a6483c355cf45112ea 100644 (file)
@@ -670,15 +670,6 @@ config RADSTONE_PPC7D
 config PAL4
        bool "SBS-Palomar4"
 
-config GEMINI
-       bool "Synergy-Gemini"
-       depends on BROKEN
-       select PPC_INDIRECT_PCI
-       help
-         Select Gemini if configuring for a Synergy Microsystems' Gemini
-         series Single Board Computer.  More information is available at:
-         <http://www.synergymicro.com/PressRel/97_10_15.html>.
-
 config EST8260
        bool "EST8260"
        ---help---
index 28be01b99c44b7837a73d135619ddca48f3eb394..bcfb6cde70c4c90b8463ec37fc25a1291b90eda6 100644 (file)
@@ -116,10 +116,6 @@ zimageinitrd-$(CONFIG_WALNUT)              := zImage.initrd-TREE
      extra.o-$(CONFIG_CHESTNUT)                := misc-chestnut.o
          end-$(CONFIG_CHESTNUT)                := chestnut
 
-      zimage-$(CONFIG_GEMINI)          := zImage-STRIPELF
-zimageinitrd-$(CONFIG_GEMINI)          := zImage.initrd-STRIPELF
-         end-$(CONFIG_GEMINI)          := gemini
-
      extra.o-$(CONFIG_KATANA)          := misc-katana.o
          end-$(CONFIG_KATANA)          := katana
    cacheflag-$(CONFIG_KATANA)          := -include $(clear_L2_L3)
index a5df089636955cc3ee327801ae86cfbb6db89ca0..c3d3305eb5ca33fbd4e68c93ade19e134942f181 100644 (file)
 #endif
 
 /* Will / Can the user give input?
- * Val Henson has requested that Gemini doesn't wait for the
- * user to edit the cmdline or not.
  */
 #if (defined(CONFIG_SERIAL_8250_CONSOLE) \
        || defined(CONFIG_VGA_CONSOLE) \
        || defined(CONFIG_SERIAL_MPC52xx_CONSOLE) \
-       || defined(CONFIG_SERIAL_MPSC_CONSOLE)) \
-       && !defined(CONFIG_GEMINI)
+       || defined(CONFIG_SERIAL_MPSC_CONSOLE))
 #define INTERACTIVE_CONSOLE    1
 #endif
 
@@ -178,16 +175,6 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
 
        if (keyb_present)
                CRT_tstc();  /* Forces keyboard to be initialized */
-#ifdef CONFIG_GEMINI
-       /*
-        * If cmd_line is empty and cmd_preset is not, copy cmd_preset
-        * to cmd_line.  This way we can override cmd_preset with the
-        * command line from Smon.
-        */
-
-       if ( (cmd_line[0] == '\0') && (cmd_preset[0] != '\0'))
-               memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));
-#endif
 
        /* Display standard Linux/PPC boot prompt for kernel args */
        puts("\nLinux/PPC load: ");
diff --git a/arch/ppc/configs/gemini_defconfig b/arch/ppc/configs/gemini_defconfig
deleted file mode 100644 (file)
index ebcd17b..0000000
+++ /dev/null
@@ -1,618 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_HAVE_DEC_LOCK=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-
-#
-# General setup
-#
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_EMBEDDED is not set
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-CONFIG_KMOD=y
-
-#
-# Platform support
-#
-CONFIG_PPC=y
-CONFIG_PPC32=y
-CONFIG_6xx=y
-# CONFIG_40x is not set
-# CONFIG_POWER3 is not set
-# CONFIG_8xx is not set
-
-#
-# IBM 4xx options
-#
-# CONFIG_8260 is not set
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_PPC_STD_MMU=y
-# CONFIG_PPC_MULTIPLATFORM is not set
-# CONFIG_APUS is not set
-# CONFIG_WILLOW_2 is not set
-# CONFIG_PCORE is not set
-# CONFIG_POWERPMC250 is not set
-# CONFIG_EV64260 is not set
-# CONFIG_SPRUCE is not set
-# CONFIG_LOPEC is not set
-# CONFIG_MCPN765 is not set
-# CONFIG_MVME5100 is not set
-# CONFIG_PPLUS is not set
-# CONFIG_PRPMC750 is not set
-# CONFIG_PRPMC800 is not set
-# CONFIG_SANDPOINT is not set
-# CONFIG_ADIR is not set
-# CONFIG_K2 is not set
-# CONFIG_PAL4 is not set
-CONFIG_GEMINI=y
-# CONFIG_SMP is not set
-# CONFIG_PREEMPT is not set
-CONFIG_ALTIVEC=y
-CONFIG_TAU=y
-# CONFIG_TAU_INT is not set
-# CONFIG_TAU_AVERAGE is not set
-# CONFIG_CPU_FREQ is not set
-
-#
-# General setup
-#
-# CONFIG_HIGHMEM is not set
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_KCORE_ELF=y
-CONFIG_BINFMT_ELF=y
-CONFIG_KERNEL_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
-# CONFIG_HOTPLUG is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-# CONFIG_PPC601_SYNC_FIX is not set
-# CONFIG_CMDLINE_BOOL 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
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# 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_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# ATA/IDE/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI support
-#
-CONFIG_SCSI=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CHR_DEV_OSST is not set
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=y
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_REPORT_LUNS is not set
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_BLK_DEV_3W_XXXX_RAID 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_DPT_I2O is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_AM53C974 is not set
-# CONFIG_SCSI_MEGARAID is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CPQFCTS is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_NCR53C7xx is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
-# CONFIG_SCSI_PCI2000 is not set
-# CONFIG_SCSI_PCI2220I is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
-# CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG 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_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_INET_ECN 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
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_IP_NF_CONNTRACK is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
-# CONFIG_IPV6 is not set
-# CONFIG_XFRM_USER is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IPV6_SCTP__=y
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-# CONFIG_ETHERTAP is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_OAKNET is not set
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_TIGON3 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_IXGB is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Token Ring devices (depends on LLC=y)
-#
-# CONFIG_NET_FC is not set
-# CONFIG_RCPCI is not set
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN_BOOL is not set
-
-#
-# Graphics support
-#
-# CONFIG_FB is not set
-
-#
-# Old CD-ROM drivers (not SCSI, not IDE)
-#
-# CONFIG_CD_NO_IDESCSI is not set
-
-#
-# Input device support
-#
-# CONFIG_INPUT is not set
-
-#
-# Userland interfaces
-#
-
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-# CONFIG_SERIO is not set
-
-#
-# Input Device Drivers
-#
-
-#
-# Macintosh device drivers
-#
-
-#
-# Character devices
-#
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# I2C Hardware Sensors Mainboard support
-#
-
-#
-# I2C Hardware Sensors Chip support
-#
-# CONFIG_I2C_SENSOR is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
-# CONFIG_QIC02_TAPE is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
-CONFIG_GEN_RTC=y
-# CONFIG_GEN_RTC_X is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_FTAPE is not set
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-# CONFIG_JOLIET is not set
-# CONFIG_ZISOFS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-# CONFIG_FAT_FS is not set
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_DEVFS_FS=y
-# CONFIG_DEVFS_MOUNT is not set
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVPTS_FS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
-CONFIG_TMPFS=y
-CONFIG_RAMFS=y
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_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 is not set
-# CONFIG_NFS_V4 is not set
-CONFIG_NFSD=y
-# CONFIG_NFSD_V3 is not set
-# CONFIG_NFSD_TCP is not set
-CONFIG_LOCKD=y
-CONFIG_EXPORTFS=y
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS 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_INTERMEZZO_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=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_NEC98_PARTITION is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-# CONFIG_USB is not set
-# CONFIG_USB_GADGET is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
-
-#
-# Library routines
-#
-# CONFIG_CRC32 is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_KALLSYMS is not set
-
-#
-# Security options
-#
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
index 466437f4bcbb40fa7113faf183b213850e5db6e2..6b4f022111e703fe23a062c4492e718f47b209c6 100644 (file)
@@ -12,7 +12,6 @@ obj-y                         := entry.o traps.o time.o misc.o \
                                        setup.o \
                                        ppc_htab.o
 obj-$(CONFIG_MODULES)          += ppc_ksyms.o
-obj-$(CONFIG_NOT_COHERENT_CACHE)       += dma-mapping.o
 obj-$(CONFIG_PCI)              += pci.o
 obj-$(CONFIG_RAPIDIO)          += rio.o
 obj-$(CONFIG_KGDB)             += ppc-stub.o
diff --git a/arch/ppc/kernel/dma-mapping.c b/arch/ppc/kernel/dma-mapping.c
deleted file mode 100644 (file)
index 10fec73..0000000
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- *  PowerPC version derived from arch/arm/mm/consistent.c
- *    Copyright (C) 2001 Dan Malek (dmalek@jlc.net)
- *
- *  Copyright (C) 2000 Russell King
- *
- * Consistent memory allocators.  Used for DMA devices that want to
- * share uncached memory with the processor core.  The function return
- * is the virtual address and 'dma_handle' is the physical address.
- * Mostly stolen from the ARM port, with some changes for PowerPC.
- *                                             -- Dan
- *
- * Reorganized to get rid of the arch-specific consistent_* functions
- * and provide non-coherent implementations for the DMA API. -Matt
- *
- * Added in_interrupt() safe dma_alloc_coherent()/dma_free_coherent()
- * implementation. This is pulled straight from ARM and barely
- * modified. -Matt
- *
- * 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/module.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/stddef.h>
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/bootmem.h>
-#include <linux/highmem.h>
-#include <linux/dma-mapping.h>
-#include <linux/hardirq.h>
-
-#include <asm/pgalloc.h>
-#include <asm/prom.h>
-#include <asm/io.h>
-#include <asm/mmu_context.h>
-#include <asm/pgtable.h>
-#include <asm/mmu.h>
-#include <asm/uaccess.h>
-#include <asm/smp.h>
-#include <asm/machdep.h>
-
-int map_page(unsigned long va, phys_addr_t pa, int flags);
-
-#include <asm/tlbflush.h>
-
-/*
- * This address range defaults to a value that is safe for all
- * platforms which currently set CONFIG_NOT_COHERENT_CACHE. It
- * can be further configured for specific applications under
- * the "Advanced Setup" menu. -Matt
- */
-#define CONSISTENT_BASE        (CONFIG_CONSISTENT_START)
-#define CONSISTENT_END (CONFIG_CONSISTENT_START + CONFIG_CONSISTENT_SIZE)
-#define CONSISTENT_OFFSET(x)   (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
-
-/*
- * This is the page table (2MB) covering uncached, DMA consistent allocations
- */
-static pte_t *consistent_pte;
-static DEFINE_SPINLOCK(consistent_lock);
-
-/*
- * VM region handling support.
- *
- * This should become something generic, handling VM region allocations for
- * vmalloc and similar (ioremap, module space, etc).
- *
- * I envisage vmalloc()'s supporting vm_struct becoming:
- *
- *  struct vm_struct {
- *    struct vm_region region;
- *    unsigned long    flags;
- *    struct page      **pages;
- *    unsigned int     nr_pages;
- *    unsigned long    phys_addr;
- *  };
- *
- * get_vm_area() would then call vm_region_alloc with an appropriate
- * struct vm_region head (eg):
- *
- *  struct vm_region vmalloc_head = {
- *     .vm_list        = LIST_HEAD_INIT(vmalloc_head.vm_list),
- *     .vm_start       = VMALLOC_START,
- *     .vm_end         = VMALLOC_END,
- *  };
- *
- * However, vmalloc_head.vm_start is variable (typically, it is dependent on
- * the amount of RAM found at boot time.)  I would imagine that get_vm_area()
- * would have to initialise this each time prior to calling vm_region_alloc().
- */
-struct vm_region {
-       struct list_head        vm_list;
-       unsigned long           vm_start;
-       unsigned long           vm_end;
-};
-
-static struct vm_region consistent_head = {
-       .vm_list        = LIST_HEAD_INIT(consistent_head.vm_list),
-       .vm_start       = CONSISTENT_BASE,
-       .vm_end         = CONSISTENT_END,
-};
-
-static struct vm_region *
-vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
-{
-       unsigned long addr = head->vm_start, end = head->vm_end - size;
-       unsigned long flags;
-       struct vm_region *c, *new;
-
-       new = kmalloc(sizeof(struct vm_region), gfp);
-       if (!new)
-               goto out;
-
-       spin_lock_irqsave(&consistent_lock, flags);
-
-       list_for_each_entry(c, &head->vm_list, vm_list) {
-               if ((addr + size) < addr)
-                       goto nospc;
-               if ((addr + size) <= c->vm_start)
-                       goto found;
-               addr = c->vm_end;
-               if (addr > end)
-                       goto nospc;
-       }
-
- found:
-       /*
-        * Insert this entry _before_ the one we found.
-        */
-       list_add_tail(&new->vm_list, &c->vm_list);
-       new->vm_start = addr;
-       new->vm_end = addr + size;
-
-       spin_unlock_irqrestore(&consistent_lock, flags);
-       return new;
-
- nospc:
-       spin_unlock_irqrestore(&consistent_lock, flags);
-       kfree(new);
- out:
-       return NULL;
-}
-
-static struct vm_region *vm_region_find(struct vm_region *head, unsigned long addr)
-{
-       struct vm_region *c;
-
-       list_for_each_entry(c, &head->vm_list, vm_list) {
-               if (c->vm_start == addr)
-                       goto out;
-       }
-       c = NULL;
- out:
-       return c;
-}
-
-/*
- * Allocate DMA-coherent memory space and return both the kernel remapped
- * virtual and bus address for that space.
- */
-void *
-__dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
-{
-       struct page *page;
-       struct vm_region *c;
-       unsigned long order;
-       u64 mask = 0x00ffffff, limit; /* ISA default */
-
-       if (!consistent_pte) {
-               printk(KERN_ERR "%s: not initialised\n", __func__);
-               dump_stack();
-               return NULL;
-       }
-
-       size = PAGE_ALIGN(size);
-       limit = (mask + 1) & ~mask;
-       if ((limit && size >= limit) || size >= (CONSISTENT_END - CONSISTENT_BASE)) {
-               printk(KERN_WARNING "coherent allocation too big (requested %#x mask %#Lx)\n",
-                      size, mask);
-               return NULL;
-       }
-
-       order = get_order(size);
-
-       if (mask != 0xffffffff)
-               gfp |= GFP_DMA;
-
-       page = alloc_pages(gfp, order);
-       if (!page)
-               goto no_page;
-
-       /*
-        * Invalidate any data that might be lurking in the
-        * kernel direct-mapped region for device DMA.
-        */
-       {
-               unsigned long kaddr = (unsigned long)page_address(page);
-               memset(page_address(page), 0, size);
-               flush_dcache_range(kaddr, kaddr + size);
-       }
-
-       /*
-        * Allocate a virtual address in the consistent mapping region.
-        */
-       c = vm_region_alloc(&consistent_head, size,
-                           gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
-       if (c) {
-               unsigned long vaddr = c->vm_start;
-               pte_t *pte = consistent_pte + CONSISTENT_OFFSET(vaddr);
-               struct page *end = page + (1 << order);
-
-               split_page(page, order);
-
-               /*
-                * Set the "dma handle"
-                */
-               *handle = page_to_bus(page);
-
-               do {
-                       BUG_ON(!pte_none(*pte));
-
-                       SetPageReserved(page);
-                       set_pte_at(&init_mm, vaddr,
-                                  pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
-                       page++;
-                       pte++;
-                       vaddr += PAGE_SIZE;
-               } while (size -= PAGE_SIZE);
-
-               /*
-                * Free the otherwise unused pages.
-                */
-               while (page < end) {
-                       __free_page(page);
-                       page++;
-               }
-
-               return (void *)c->vm_start;
-       }
-
-       if (page)
-               __free_pages(page, order);
- no_page:
-       return NULL;
-}
-EXPORT_SYMBOL(__dma_alloc_coherent);
-
-/*
- * free a page as defined by the above mapping.
- */
-void __dma_free_coherent(size_t size, void *vaddr)
-{
-       struct vm_region *c;
-       unsigned long flags, addr;
-       pte_t *ptep;
-
-       size = PAGE_ALIGN(size);
-
-       spin_lock_irqsave(&consistent_lock, flags);
-
-       c = vm_region_find(&consistent_head, (unsigned long)vaddr);
-       if (!c)
-               goto no_area;
-
-       if ((c->vm_end - c->vm_start) != size) {
-               printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n",
-                      __func__, c->vm_end - c->vm_start, size);
-               dump_stack();
-               size = c->vm_end - c->vm_start;
-       }
-
-       ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
-       addr = c->vm_start;
-       do {
-               pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
-               unsigned long pfn;
-
-               ptep++;
-               addr += PAGE_SIZE;
-
-               if (!pte_none(pte) && pte_present(pte)) {
-                       pfn = pte_pfn(pte);
-
-                       if (pfn_valid(pfn)) {
-                               struct page *page = pfn_to_page(pfn);
-                               ClearPageReserved(page);
-
-                               __free_page(page);
-                               continue;
-                       }
-               }
-
-               printk(KERN_CRIT "%s: bad page in kernel page table\n",
-                      __func__);
-       } while (size -= PAGE_SIZE);
-
-       flush_tlb_kernel_range(c->vm_start, c->vm_end);
-
-       list_del(&c->vm_list);
-
-       spin_unlock_irqrestore(&consistent_lock, flags);
-
-       kfree(c);
-       return;
-
- no_area:
-       spin_unlock_irqrestore(&consistent_lock, flags);
-       printk(KERN_ERR "%s: trying to free invalid coherent area: %p\n",
-              __func__, vaddr);
-       dump_stack();
-}
-EXPORT_SYMBOL(__dma_free_coherent);
-
-/*
- * Initialise the consistent memory allocation.
- */
-static int __init dma_alloc_init(void)
-{
-       pgd_t *pgd;
-       pmd_t *pmd;
-       pte_t *pte;
-       int ret = 0;
-
-       do {
-               pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
-               pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE);
-               if (!pmd) {
-                       printk(KERN_ERR "%s: no pmd tables\n", __func__);
-                       ret = -ENOMEM;
-                       break;
-               }
-               WARN_ON(!pmd_none(*pmd));
-
-               pte = pte_alloc_kernel(pmd, CONSISTENT_BASE);
-               if (!pte) {
-                       printk(KERN_ERR "%s: no pte tables\n", __func__);
-                       ret = -ENOMEM;
-                       break;
-               }
-
-               consistent_pte = pte;
-       } while (0);
-
-       return ret;
-}
-
-core_initcall(dma_alloc_init);
-
-/*
- * make an area consistent.
- */
-void __dma_sync(void *vaddr, size_t size, int direction)
-{
-       unsigned long start = (unsigned long)vaddr;
-       unsigned long end   = start + size;
-
-       switch (direction) {
-       case DMA_NONE:
-               BUG();
-       case DMA_FROM_DEVICE:   /* invalidate only */
-               invalidate_dcache_range(start, end);
-               break;
-       case DMA_TO_DEVICE:             /* writeback only */
-               clean_dcache_range(start, end);
-               break;
-       case DMA_BIDIRECTIONAL: /* writeback and invalidate */
-               flush_dcache_range(start, end);
-               break;
-       }
-}
-EXPORT_SYMBOL(__dma_sync);
-
-#ifdef CONFIG_HIGHMEM
-/*
- * __dma_sync_page() implementation for systems using highmem.
- * In this case, each page of a buffer must be kmapped/kunmapped
- * in order to have a virtual address for __dma_sync(). This must
- * not sleep so kmap_atomic()/kunmap_atomic() are used.
- *
- * Note: yes, it is possible and correct to have a buffer extend
- * beyond the first page.
- */
-static inline void __dma_sync_page_highmem(struct page *page,
-               unsigned long offset, size_t size, int direction)
-{
-       size_t seg_size = min((size_t)(PAGE_SIZE - offset), size);
-       size_t cur_size = seg_size;
-       unsigned long flags, start, seg_offset = offset;
-       int nr_segs = 1 + ((size - seg_size) + PAGE_SIZE - 1)/PAGE_SIZE;
-       int seg_nr = 0;
-
-       local_irq_save(flags);
-
-       do {
-               start = (unsigned long)kmap_atomic(page + seg_nr,
-                               KM_PPC_SYNC_PAGE) + seg_offset;
-
-               /* Sync this buffer segment */
-               __dma_sync((void *)start, seg_size, direction);
-               kunmap_atomic((void *)start, KM_PPC_SYNC_PAGE);
-               seg_nr++;
-
-               /* Calculate next buffer segment size */
-               seg_size = min((size_t)PAGE_SIZE, size - cur_size);
-
-               /* Add the segment size to our running total */
-               cur_size += seg_size;
-               seg_offset = 0;
-       } while (seg_nr < nr_segs);
-
-       local_irq_restore(flags);
-}
-#endif /* CONFIG_HIGHMEM */
-
-/*
- * __dma_sync_page makes memory consistent. identical to __dma_sync, but
- * takes a struct page instead of a virtual address
- */
-void __dma_sync_page(struct page *page, unsigned long offset,
-       size_t size, int direction)
-{
-#ifdef CONFIG_HIGHMEM
-       __dma_sync_page_highmem(page, offset, size, direction);
-#else
-       unsigned long start = (unsigned long)page_address(page) + offset;
-       __dma_sync((void *)start, size, direction);
-#endif
-}
-EXPORT_SYMBOL(__dma_sync_page);
index 100052aaea9aa9831a3bc0ed8ff1aa37dd74fbd5..c7cb9d5f24a381911a85c74f78cd1bd1bb2d5ad5 100644 (file)
@@ -310,12 +310,7 @@ i##n:                                                              \
 /* System reset */
 /* core99 pmac starts the seconary here by changing the vector, and
    putting it back to what it was (unknown_exception) when done.  */
-#if defined(CONFIG_GEMINI) && defined(CONFIG_SMP)
-       . = 0x100
-       b       __secondary_start_gemini
-#else
        EXCEPTION(0x100, Reset, unknown_exception, EXC_XFER_STD)
-#endif
 
 /* Machine check */
        . = 0x200
@@ -897,19 +892,6 @@ fix_mem_constants:
 #endif /* CONFIG_APUS */
 
 #ifdef CONFIG_SMP
-#ifdef CONFIG_GEMINI
-       .globl  __secondary_start_gemini
-__secondary_start_gemini:
-        mfspr   r4,SPRN_HID0
-        ori     r4,r4,HID0_ICFI
-        li      r3,0
-        ori     r3,r3,HID0_ICE
-        andc    r4,r4,r3
-        mtspr   SPRN_HID0,r4
-        sync
-        b       __secondary_start
-#endif /* CONFIG_GEMINI */
-
        .globl  __secondary_start_pmac_0
 __secondary_start_pmac_0:
        /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */
index c8b65ca8a350e8c5ecc8c5acc90c4f0b845ecbc1..1f49503317cb424789a78bdbcd5668ec9dbbc10e 100644 (file)
@@ -43,6 +43,7 @@
 #include <asm/div64.h>
 #include <asm/xmon.h>
 #include <asm/signal.h>
+#include <asm/dcr.h>
 
 #ifdef  CONFIG_8xx
 #include <asm/commproc.h>
index 31e511856dc58bc2b819e80c32a35840db5bd9ca..d40700795a9c05bc823a99378a3f6dd0885c9a39 100644 (file)
@@ -14,6 +14,7 @@
  */
 #include <linux/types.h>
 #include <linux/errno.h>
+#include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
 
@@ -654,7 +655,7 @@ void rh_dump(rh_info_t * info)
        int maxnr;
        int i, nr;
 
-       maxnr = sizeof(st) / sizeof(st[0]);
+       maxnr = ARRAY_SIZE(st);
 
        printk(KERN_INFO
               "info @0x%p (%d slots empty / %d max)\n",
index 354a9408f02436b83ac8204d8a854686c675e264..82b06a1ef95d6e532415bfb238d43311e5778e28 100644 (file)
@@ -313,11 +313,8 @@ void __init mapin_ram(void)
        }
 }
 
-/* is x a power of 2? */
-#define is_power_of_2(x)       ((x) != 0 && (((x) & ((x) - 1)) == 0))
-
 /* is x a power of 4? */
-#define is_power_of_4(x)       ((x) != 0 && (((x) & (x-1)) == 0) && (ffs(x) & 1))
+#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1))
 
 /*
  * Set up a mapping for a block of I/O.
index 90c6222944236b760694636979b051e9fd728782..e17fad4706218224c41a7c21cef4748568e9acec 100644 (file)
@@ -13,7 +13,6 @@ obj-$(CONFIG_TQM8260)         += tqm8260_setup.o
 obj-$(CONFIG_CPCI690)          += cpci690.o
 obj-$(CONFIG_EV64260)          += ev64260.o
 obj-$(CONFIG_CHESTNUT)         += chestnut.o
-obj-$(CONFIG_GEMINI)           += gemini_pci.o gemini_setup.o gemini_prom.o
 obj-$(CONFIG_LOPEC)            += lopec.o
 obj-$(CONFIG_KATANA)           += katana.o
 obj-$(CONFIG_HDPU)             += hdpu.o
diff --git a/arch/ppc/platforms/gemini.h b/arch/ppc/platforms/gemini.h
deleted file mode 100644 (file)
index 5528fd0..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Onboard registers and descriptions for Synergy Microsystems'
- *  "Gemini" boards.
- *
- */
-#ifdef __KERNEL__
-#ifndef __PPC_GEMINI_H
-#define __PPC_GEMINI_H
-
-/*  Registers  */
-
-#define GEMINI_SERIAL_B     (0xffeffb00)
-#define GEMINI_SERIAL_A     (0xffeffb08)
-#define GEMINI_USWITCH      (0xffeffd00)
-#define GEMINI_BREV         (0xffeffe00)
-#define GEMINI_BECO         (0xffeffe08)
-#define GEMINI_FEAT         (0xffeffe10)
-#define GEMINI_BSTAT        (0xffeffe18)
-#define GEMINI_CPUSTAT      (0xffeffe20)
-#define GEMINI_L2CFG        (0xffeffe30)
-#define GEMINI_MEMCFG       (0xffeffe38)
-#define GEMINI_FLROM        (0xffeffe40)
-#define GEMINI_P0PCI        (0xffeffe48)
-#define GEMINI_FLWIN        (0xffeffe50)
-#define GEMINI_P0INTMASK    (0xffeffe60)
-#define GEMINI_P0INTAP      (0xffeffe68)
-#define GEMINI_PCIERR       (0xffeffe70)
-#define GEMINI_LEDBASE      (0xffeffe80)
-#define GEMINI_RTC          (0xffe9fff8)
-#define GEMINI_LEDS         8
-#define GEMINI_SWITCHES     8
-
-
-/* Flash ROM bit definitions */
-#define GEMINI_FLS_WEN      (1<<0)
-#define GEMINI_FLS_JMP      (1<<6)
-#define GEMINI_FLS_BOOT     (1<<7)
-
-/* Memory bit definitions */
-#define GEMINI_MEM_TYPE_MASK 0xc0
-#define GEMINI_MEM_SIZE_MASK 0x38
-#define GEMINI_MEM_BANK_MASK 0x07
-
-/* L2 cache bit definitions */
-#define GEMINI_L2_SIZE_MASK  0xc0
-#define GEMINI_L2_RATIO_MASK 0x03
-
-/* Timebase register bit definitons */
-#define GEMINI_TIMEB0_EN     (1<<0)
-#define GEMINI_TIMEB1_EN     (1<<1)
-#define GEMINI_TIMEB2_EN     (1<<2)
-#define GEMINI_TIMEB3_EN     (1<<3)
-
-/* CPU status bit definitions */
-#define GEMINI_CPU_ID_MASK   0x03
-#define GEMINI_CPU_COUNT_MASK 0x0c
-#define GEMINI_CPU0_HALTED   (1<<4)
-#define GEMINI_CPU1_HALTED   (1<<5)
-#define GEMINI_CPU2_HALTED   (1<<6)
-#define GEMINI_CPU3_HALTED   (1<<7)
-
-/* Board status bit definitions */
-#define GEMINI_BRD_FAIL      (1<<0)   /* FAIL led is lit */
-#define GEMINI_BRD_BUS_MASK  0x0c     /* PowerPC bus speed */
-
-/* Board family/feature bit descriptions */
-#define GEMINI_FEAT_HAS_FLASH (1<<0)
-#define GEMINI_FEAT_HAS_ETH   (1<<1)
-#define GEMINI_FEAT_HAS_SCSI  (1<<2)
-#define GEMINI_FEAT_HAS_P0    (1<<3)
-#define GEMINI_FEAT_FAM_MASK  0xf0
-
-/* Mod/ECO bit definitions */
-#define GEMINI_ECO_LEVEL_MASK 0x0f
-#define GEMINI_MOD_MASK       0xf0
-
-/* Type/revision bit definitions */
-#define GEMINI_REV_MASK       0x0f
-#define GEMINI_TYPE_MASK      0xf0
-
-/* User switch definitions */
-#define GEMINI_SWITCH_VERBOSE    1     /* adds "debug" to boot cmd line */
-#define GEMINI_SWITCH_SINGLE_USER 7    /* boots into "single-user" mode */
-
-#define SGS_RTC_CONTROL  0
-#define SGS_RTC_SECONDS  1
-#define SGS_RTC_MINUTES  2
-#define SGS_RTC_HOURS    3
-#define SGS_RTC_DAY      4
-#define SGS_RTC_DAY_OF_MONTH 5
-#define SGS_RTC_MONTH    6
-#define SGS_RTC_YEAR     7
-
-#define SGS_RTC_SET  0x80
-#define SGS_RTC_IS_STOPPED 0x80
-
-#define GRACKLE_CONFIG_ADDR_ADDR  (0xfec00000)
-#define GRACKLE_CONFIG_DATA_ADDR  (0xfee00000)
-
-#define GEMINI_BOOT_INIT  (0xfff00100)
-
-#ifndef __ASSEMBLY__
-
-static inline void grackle_write( unsigned long addr, unsigned long data )
-{
-  __asm__ __volatile__(
-  " stwbrx %1, 0, %0\n \
-    sync\n \
-    stwbrx %3, 0, %2\n \
-    sync "
-  : /* no output */
-  : "r" (GRACKLE_CONFIG_ADDR_ADDR), "r" (addr),
-    "r" (GRACKLE_CONFIG_DATA_ADDR), "r" (data));
-}
-
-static inline unsigned long grackle_read( unsigned long addr )
-{
-  unsigned long val;
-
-  __asm__ __volatile__(
-  " stwbrx %1, 0, %2\n \
-    sync\n \
-    lwbrx %0, 0, %3\n \
-    sync "
-  : "=r" (val)
-  : "r" (addr), "r" (GRACKLE_CONFIG_ADDR_ADDR),
-    "r" (GRACKLE_CONFIG_DATA_ADDR));
-
-  return val;
-}
-
-static inline void gemini_led_on( int led )
-{
-  if (led >= 0 && led < GEMINI_LEDS)
-    *(unsigned char *)(GEMINI_LEDBASE + (led<<3)) = 1;
-}
-
-static inline void gemini_led_off(int led)
-{
-  if (led >= 0 && led < GEMINI_LEDS)
-    *(unsigned char *)(GEMINI_LEDBASE + (led<<3)) = 0;
-}
-
-static inline int gemini_led_val(int led)
-{
-  int val = 0;
-  if (led >= 0 && led < GEMINI_LEDS)
-    val = *(unsigned char *)(GEMINI_LEDBASE + (led<<3));
-  return (val & 0x1);
-}
-
-/* returns processor id from the board */
-static inline int gemini_processor(void)
-{
-  unsigned char cpu = *(unsigned char *)(GEMINI_CPUSTAT);
-  return (int) ((cpu == 0) ? 4 : (cpu & GEMINI_CPU_ID_MASK));
-}
-
-
-extern void _gemini_reboot(void);
-extern void gemini_prom_init(void);
-extern void gemini_init_l2(void);
-#endif /* __ASSEMBLY__ */
-#endif
-#endif /* __KERNEL__ */
diff --git a/arch/ppc/platforms/gemini_pci.c b/arch/ppc/platforms/gemini_pci.c
deleted file mode 100644 (file)
index 9565609..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-
-#include <asm/machdep.h>
-#include <platforms/gemini.h>
-#include <asm/byteorder.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/pci-bridge.h>
-
-void __init gemini_pcibios_fixup(void)
-{
-       int i;
-       struct pci_dev *dev = NULL;
-       
-       for_each_pci_dev(dev) {
-               for(i = 0; i < 6; i++) {
-                       if (dev->resource[i].flags & IORESOURCE_IO) {
-                               dev->resource[i].start |= (0xfe << 24);
-                               dev->resource[i].end |= (0xfe << 24);
-                       }
-               }
-       }
-}
-
-
-/* The "bootloader" for Synergy boards does none of this for us, so we need to
-   lay it all out ourselves... --Dan */
-void __init gemini_find_bridges(void)
-{
-       struct pci_controller* hose;
-       
-       ppc_md.pcibios_fixup = gemini_pcibios_fixup;
-
-       hose = pcibios_alloc_controller();
-       if (!hose)
-               return;
-       setup_indirect_pci(hose, 0xfec00000, 0xfee00000);
-}
diff --git a/arch/ppc/platforms/gemini_prom.S b/arch/ppc/platforms/gemini_prom.S
deleted file mode 100644 (file)
index e8c84d2..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Not really prom support code (yet), but sort of anti-prom code.  The current
- *  bootloader does a number of things it shouldn't and doesn't do things that it
- *  should.  The stuff in here is mainly a hodge-podge collection of setup code
- *  to get the board up and running.
- *    ---Dan
- */
-
-#include <asm/reg.h>
-#include <asm/page.h>
-#include <platforms/gemini.h>
-#include <asm/ppc_asm.h>
-
-/*
- *  On 750's the MMU is on when Linux is booted, so we need to clear out the
- *  bootloader's BAT settings, make sure we're in supervisor state (gotcha!),
- *  and turn off the MMU.
- *
- */
-
-_GLOBAL(gemini_prom_init)
-#ifdef CONFIG_SMP
-       /* Since the MMU's on, get stuff in rom space that we'll need */
-       lis     r4,GEMINI_CPUSTAT@h
-       ori     r4,r4,GEMINI_CPUSTAT@l
-       lbz     r5,0(r4)
-       andi.   r5,r5,3
-       mr      r24,r5          /* cpu # used later on */
-#endif
-       mfmsr   r4
-       li      r3,MSR_PR       /* ensure supervisor! */
-       ori     r3,r3,MSR_IR|MSR_DR
-       andc    r4,r4,r3
-       mtmsr   r4
-       isync
-#if 0
-       /* zero out the bats now that the MMU is off */
-prom_no_mmu:   
-       li      r3,0
-        mtspr   SPRN_IBAT0U,r3
-        mtspr   SPRN_IBAT0L,r3
-        mtspr   SPRN_IBAT1U,r3
-        mtspr   SPRN_IBAT1L,r3
-        mtspr   SPRN_IBAT2U,r3
-        mtspr   SPRN_IBAT2L,r3
-        mtspr   SPRN_IBAT3U,r3
-        mtspr   SPRN_IBAT3L,r3
-
-        mtspr   SPRN_DBAT0U,r3
-        mtspr   SPRN_DBAT0L,r3
-        mtspr   SPRN_DBAT1U,r3
-        mtspr   SPRN_DBAT1L,r3
-        mtspr   SPRN_DBAT2U,r3
-       mtspr   SPRN_DBAT2L,r3
-        mtspr   SPRN_DBAT3U,r3
-        mtspr   SPRN_DBAT3L,r3
-#endif
-
-       /* the bootloader (as far as I'm currently aware) doesn't mess with page
-          tables, but since we're already here, might as well zap these, too */
-       li      r4,0
-       mtspr   SPRN_SDR1,r4
-
-       li      r4,16
-       mtctr   r4
-       li      r3,0
-       li      r4,0
-3:     mtsrin  r3,r4
-       addi    r3,r3,1
-       bdnz    3b
-
-#ifdef CONFIG_SMP
-       /* The 750 book (and Mot/IBM support) says that this will "assist" snooping
-          when in SMP.  Not sure yet whether this should stay or leave... */
-       mfspr   r4,SPRN_HID0
-       ori     r4,r4,HID0_ABE
-       mtspr   SPRN_HID0,r4
-       sync
-#endif /* CONFIG_SMP */
-       blr
-
-/*  apparently, SMon doesn't pay attention to HID0[SRST].  Disable the MMU and
-    branch to 0xfff00100 */
-_GLOBAL(_gemini_reboot)
-       lis     r5,GEMINI_BOOT_INIT@h
-       ori     r5,r5,GEMINI_BOOT_INIT@l
-       li      r6,MSR_IP
-       mtspr   SPRN_SRR0,r5
-       mtspr   SPRN_SRR1,r6
-       rfi
diff --git a/arch/ppc/platforms/gemini_serial.h b/arch/ppc/platforms/gemini_serial.h
deleted file mode 100644 (file)
index b915eff..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifdef __KERNEL__
-#ifndef __ASMPPC_GEMINI_SERIAL_H
-#define __ASMPPC_GEMINI_SERIAL_H
-
-#include <platforms/gemini.h>
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define RS_TABLE_SIZE  64
-#else
-#define RS_TABLE_SIZE  4
-#endif
-
-/* Rate for the 24.576 Mhz clock for the onboard serial chip */
-#define BASE_BAUD  (24576000 / 16)
-
-#ifdef CONFIG_SERIAL_DETECT_IRQ
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF|ASYNC_SKIP_TEST|ASYNC_AUTO_IRQ)
-#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF|ASYNC_AUTO_IRQ)
-#else
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF|ASYNC_SKIP_TEST)
-#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF)
-#endif
-
-#define STD_SERIAL_PORT_DEFNS \
-        { 0, BASE_BAUD, GEMINI_SERIAL_A, 15, STD_COM_FLAGS }, /* ttyS0 */ \
-        { 0, BASE_BAUD, GEMINI_SERIAL_B, 14, STD_COM_FLAGS }, /* ttyS1 */ \
-
-#ifdef CONFIG_GEMINI_PU32
-#define PU32_SERIAL_PORT_DEFNS \
-        { 0, BASE_BAUD, NULL, 0, STD_COM_FLAGS },
-#else
-#define PU32_SERIAL_PORT_DEFNS
-#endif
-
-#define SERIAL_PORT_DFNS \
-        STD_SERIAL_PORT_DEFNS \
-        PU32_SERIAL_PORT_DEFNS
-
-#endif
-#endif /* __KERNEL__ */
diff --git a/arch/ppc/platforms/gemini_setup.c b/arch/ppc/platforms/gemini_setup.c
deleted file mode 100644 (file)
index f48048f..0000000
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- *  Copyright (C) 1995 Linus Torvalds
- *  Adapted from 'alpha' version by Gary Thomas
- *  Modified by Cort Dougan (cort@cs.nmt.edu)
- *  Synergy Microsystems board support by Dan Cox (dan@synergymicro.com)
- *
- */
-
-#include <linux/stddef.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/reboot.h>
-#include <linux/pci.h>
-#include <linux/time.h>
-#include <linux/kdev_t.h>
-#include <linux/types.h>
-#include <linux/major.h>
-#include <linux/initrd.h>
-#include <linux/console.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
-#include <linux/bcd.h>
-
-#include <asm/system.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/dma.h>
-#include <asm/io.h>
-#include <asm/m48t35.h>
-#include <platforms/gemini.h>
-#include <asm/time.h>
-#include <asm/open_pic.h>
-#include <asm/bootinfo.h>
-#include <asm/machdep.h>
-
-void gemini_find_bridges(void);
-static int gemini_get_clock_speed(void);
-extern void gemini_pcibios_fixup(void);
-
-static char *gemini_board_families[] = {
-  "VGM", "VSS", "KGM", "VGR", "VCM", "VCS", "KCM", "VCR"
-};
-static int gemini_board_count = sizeof(gemini_board_families) /
-                                 sizeof(gemini_board_families[0]);
-
-static unsigned int cpu_7xx[16] = {
-       0, 15, 14, 0, 0, 13, 5, 9, 6, 11, 8, 10, 16, 12, 7, 0
-};
-static unsigned int cpu_6xx[16] = {
-       0, 0, 14, 0, 0, 13, 5, 9, 6, 11, 8, 10, 0, 12, 7, 0
-};
-
-/*
- * prom_init is the Gemini version of prom.c:prom_init.  We only need
- * the BSS clearing code, so I copied that out of prom.c.  This is a
- * lot simpler than hacking prom.c so it will build with Gemini. -VAL
- */
-
-#define PTRRELOC(x)    ((typeof(x))((unsigned long)(x) + offset))
-
-unsigned long
-prom_init(void)
-{
-       unsigned long offset = reloc_offset();
-       unsigned long phys;
-       extern char __bss_start, _end;
-
-       /* First zero the BSS -- use memset, some arches don't have
-        * caches on yet */
-       memset_io(PTRRELOC(&__bss_start),0 , &_end - &__bss_start);
-
-       /* Default */
-       phys = offset + KERNELBASE;
-
-       gemini_prom_init();
-
-       return phys;
-}
-
-int
-gemini_show_cpuinfo(struct seq_file *m)
-{
-       unsigned char reg, rev;
-       char *family;
-       unsigned int type;
-
-       reg = readb(GEMINI_FEAT);
-       family = gemini_board_families[((reg>>4) & 0xf)];
-       if (((reg>>4) & 0xf) > gemini_board_count)
-               printk(KERN_ERR "cpuinfo(): unable to determine board family\n");
-
-       reg = readb(GEMINI_BREV);
-       type = (reg>>4) & 0xf;
-       rev = reg & 0xf;
-
-       reg = readb(GEMINI_BECO);
-
-       seq_printf(m, "machine\t\t: Gemini %s%d, rev %c, eco %d\n",
-                  family, type, (rev + 'A'), (reg & 0xf));
-
-       seq_printf(m, "board\t\t: Gemini %s", family);
-       if (type > 9)
-               seq_printf(m, "%c", (type - 10) + 'A');
-       else
-               seq_printf(m, "%d", type);
-
-       seq_printf(m, ", rev %c, eco %d\n", (rev + 'A'), (reg & 0xf));
-
-       seq_printf(m, "clock\t\t: %dMhz\n", gemini_get_clock_speed());
-
-       return 0;
-}
-
-static u_char gemini_openpic_initsenses[] = {
-       1,
-       1,
-       1,
-       1,
-       0,
-       0,
-       1, /* remainder are level-triggered */
-};
-
-#define GEMINI_MPIC_ADDR (0xfcfc0000)
-#define GEMINI_MPIC_PCI_CFG (0x80005800)
-
-void __init gemini_openpic_init(void)
-{
-
-       OpenPIC_Addr = (volatile struct OpenPIC *)
-               grackle_read(GEMINI_MPIC_PCI_CFG + 0x10);
-       OpenPIC_InitSenses = gemini_openpic_initsenses;
-       OpenPIC_NumInitSenses = sizeof( gemini_openpic_initsenses );
-
-       ioremap( GEMINI_MPIC_ADDR, OPENPIC_SIZE);
-}
-
-
-extern unsigned long loops_per_jiffy;
-extern int root_mountflags;
-extern char cmd_line[];
-
-void
-gemini_heartbeat(void)
-{
-       static unsigned long led = GEMINI_LEDBASE+(4*8);
-       static char direction = 8;
-
-
-       /* We only want to do this on 1 CPU */
-       if (smp_processor_id())
-               return;
-       *(char *)led = 0;
-       if ( (led + direction) > (GEMINI_LEDBASE+(7*8)) ||
-            (led + direction) < (GEMINI_LEDBASE+(4*8)) )
-               direction *= -1;
-       led += direction;
-       *(char *)led = 0xff;
-       ppc_md.heartbeat_count = ppc_md.heartbeat_reset;
-}
-
-void __init gemini_setup_arch(void)
-{
-       extern char cmd_line[];
-
-
-       loops_per_jiffy = 50000000/HZ;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       /* bootable off CDROM */
-       if (initrd_start)
-               ROOT_DEV = Root_SR0;
-       else
-#endif
-               ROOT_DEV = Root_SDA1;
-
-       /* nothing but serial consoles... */
-       sprintf(cmd_line, "%s console=ttyS0", cmd_line);
-
-       printk("Boot arguments: %s\n", cmd_line);
-
-       ppc_md.heartbeat = gemini_heartbeat;
-       ppc_md.heartbeat_reset = HZ/8;
-       ppc_md.heartbeat_count = 1;
-
-       /* Lookup PCI hosts */
-       gemini_find_bridges();
-       /* take special pains to map the MPIC, since it isn't mapped yet */
-       gemini_openpic_init();
-       /* start the L2 */
-       gemini_init_l2();
-}
-
-
-int
-gemini_get_clock_speed(void)
-{
-       unsigned long hid1, pvr;
-       int clock;
-
-       pvr = mfspr(SPRN_PVR);
-       hid1 = (mfspr(SPRN_HID1) >> 28) & 0xf;
-       if (PVR_VER(pvr) == 8 ||
-           PVR_VER(pvr) == 12)
-               hid1 = cpu_7xx[hid1];
-       else
-               hid1 = cpu_6xx[hid1];
-
-       switch((readb(GEMINI_BSTAT) & 0xc) >> 2) {
-
-       case 0:
-       default:
-               clock = (hid1*100)/3;
-               break;
-
-       case 1:
-               clock = (hid1*125)/3;
-               break;
-
-       case 2:
-               clock = (hid1*50);
-               break;
-       }
-
-       return clock;
-}
-
-void __init gemini_init_l2(void)
-{
-        unsigned char reg, brev, fam, creg;
-        unsigned long cache;
-        unsigned long pvr;
-
-        reg = readb(GEMINI_L2CFG);
-        brev = readb(GEMINI_BREV);
-        fam = readb(GEMINI_FEAT);
-        pvr = mfspr(SPRN_PVR);
-
-        switch(PVR_VER(pvr)) {
-
-        case 8:
-                if (reg & 0xc0)
-                        cache = (((reg >> 6) & 0x3) << 28);
-                else
-                        cache = 0x3 << 28;
-
-#ifdef CONFIG_SMP
-                /* Pre-3.0 processor revs had snooping errata.  Leave
-                   their L2's disabled with SMP. -- Dan */
-                if (PVR_CFG(pvr) < 3) {
-                        printk("Pre-3.0 750; L2 left disabled!\n");
-                        return;
-                }
-#endif /* CONFIG_SMP */
-
-                /* Special case: VGM5-B's came before L2 ratios were set on
-                   the board.  Processor speed shouldn't be too high, so
-                   set L2 ratio to 1:1.5.  */
-                if ((brev == 0x51) && ((fam & 0xa0) >> 4) == 0)
-                        reg |= 1;
-
-                /* determine best cache ratio based upon what the board
-                   tells us (which sometimes _may_ not be true) and
-                   the processor speed. */
-                else {
-                        if (gemini_get_clock_speed() > 250)
-                                reg = 2;
-                }
-                break;
-        case 12:
-       {
-               static unsigned long l2_size_val = 0;
-
-               if (!l2_size_val)
-                       l2_size_val = _get_L2CR();
-               cache = l2_size_val;
-                break;
-       }
-        case 4:
-        case 9:
-                creg = readb(GEMINI_CPUSTAT);
-                if (((creg & 0xc) >> 2) != 1)
-                        printk("Dual-604 boards don't support the use of L2\n");
-                else
-                        writeb(1, GEMINI_L2CFG);
-                return;
-        default:
-                printk("Unknown processor; L2 left disabled\n");
-                return;
-        }
-
-        cache |= ((1<<reg) << 25);
-        cache |= (L2CR_L2RAM_MASK|L2CR_L2CTL|L2CR_L2DO);
-        _set_L2CR(0);
-        _set_L2CR(cache | L2CR_L2E);
-
-}
-
-void
-gemini_restart(char *cmd)
-{
-       local_irq_disable();
-       /* make a clean restart, not via the MPIC */
-       _gemini_reboot();
-       for(;;);
-}
-
-void
-gemini_power_off(void)
-{
-       for(;;);
-}
-
-void
-gemini_halt(void)
-{
-       gemini_restart(NULL);
-}
-
-void __init gemini_init_IRQ(void)
-{
-       /* gemini has no 8259 */
-       openpic_init(1, 0, 0, -1);
-}
-
-#define gemini_rtc_read(x)       (readb(GEMINI_RTC+(x)))
-#define gemini_rtc_write(val,x)  (writeb((val),(GEMINI_RTC+(x))))
-
-/* ensure that the RTC is up and running */
-long __init gemini_time_init(void)
-{
-       unsigned char reg;
-
-       reg = gemini_rtc_read(M48T35_RTC_CONTROL);
-
-       if ( reg & M48T35_RTC_STOPPED ) {
-               printk(KERN_INFO "M48T35 real-time-clock was stopped. Now starting...\n");
-               gemini_rtc_write((reg & ~(M48T35_RTC_STOPPED)), M48T35_RTC_CONTROL);
-               gemini_rtc_write((reg | M48T35_RTC_SET), M48T35_RTC_CONTROL);
-       }
-       return 0;
-}
-
-#undef DEBUG_RTC
-
-unsigned long
-gemini_get_rtc_time(void)
-{
-       unsigned int year, mon, day, hour, min, sec;
-       unsigned char reg;
-
-       reg = gemini_rtc_read(M48T35_RTC_CONTROL);
-       gemini_rtc_write((reg|M48T35_RTC_READ), M48T35_RTC_CONTROL);
-#ifdef DEBUG_RTC
-       printk("get rtc: reg = %x\n", reg);
-#endif
-
-       do {
-               sec = gemini_rtc_read(M48T35_RTC_SECONDS);
-               min = gemini_rtc_read(M48T35_RTC_MINUTES);
-               hour = gemini_rtc_read(M48T35_RTC_HOURS);
-               day = gemini_rtc_read(M48T35_RTC_DOM);
-               mon = gemini_rtc_read(M48T35_RTC_MONTH);
-               year = gemini_rtc_read(M48T35_RTC_YEAR);
-       } while( sec != gemini_rtc_read(M48T35_RTC_SECONDS));
-#ifdef DEBUG_RTC
-       printk("get rtc: sec=%x, min=%x, hour=%x, day=%x, mon=%x, year=%x\n",
-              sec, min, hour, day, mon, year);
-#endif
-
-       gemini_rtc_write(reg, M48T35_RTC_CONTROL);
-
-       BCD_TO_BIN(sec);
-       BCD_TO_BIN(min);
-       BCD_TO_BIN(hour);
-       BCD_TO_BIN(day);
-       BCD_TO_BIN(mon);
-       BCD_TO_BIN(year);
-
-       if ((year += 1900) < 1970)
-               year += 100;
-#ifdef DEBUG_RTC
-       printk("get rtc: sec=%x, min=%x, hour=%x, day=%x, mon=%x, year=%x\n",
-              sec, min, hour, day, mon, year);
-#endif
-
-       return mktime( year, mon, day, hour, min, sec );
-}
-
-
-int
-gemini_set_rtc_time( unsigned long now )
-{
-       unsigned char reg;
-       struct rtc_time tm;
-
-       to_tm( now, &tm );
-
-       reg = gemini_rtc_read(M48T35_RTC_CONTROL);
-#ifdef DEBUG_RTC
-       printk("set rtc: reg = %x\n", reg);
-#endif
-
-       gemini_rtc_write((reg|M48T35_RTC_SET), M48T35_RTC_CONTROL);
-#ifdef DEBUG_RTC
-       printk("set rtc: tm vals - sec=%x, min=%x, hour=%x, mon=%x, mday=%x, year=%x\n",
-              tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mon, tm.tm_mday, tm.tm_year);
-#endif
-
-       tm.tm_year -= 1900;
-       BIN_TO_BCD(tm.tm_sec);
-       BIN_TO_BCD(tm.tm_min);
-       BIN_TO_BCD(tm.tm_hour);
-       BIN_TO_BCD(tm.tm_mon);
-       BIN_TO_BCD(tm.tm_mday);
-       BIN_TO_BCD(tm.tm_year);
-#ifdef DEBUG_RTC
-       printk("set rtc: tm vals - sec=%x, min=%x, hour=%x, mon=%x, mday=%x, year=%x\n",
-              tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mon, tm.tm_mday, tm.tm_year);
-#endif
-
-       gemini_rtc_write(tm.tm_sec, M48T35_RTC_SECONDS);
-       gemini_rtc_write(tm.tm_min, M48T35_RTC_MINUTES);
-       gemini_rtc_write(tm.tm_hour, M48T35_RTC_HOURS);
-       gemini_rtc_write(tm.tm_mday, M48T35_RTC_DOM);
-       gemini_rtc_write(tm.tm_mon, M48T35_RTC_MONTH);
-       gemini_rtc_write(tm.tm_year, M48T35_RTC_YEAR);
-
-       /* done writing */
-       gemini_rtc_write(reg, M48T35_RTC_CONTROL);
-
-       return 0;
-}
-
-/*  use the RTC to determine the decrementer count */
-void __init gemini_calibrate_decr(void)
-{
-       int freq, divisor;
-       unsigned char reg;
-
-       /* determine processor bus speed */
-       reg = readb(GEMINI_BSTAT);
-
-       switch(((reg & 0x0c)>>2)&0x3) {
-       case 0:
-       default:
-               freq = 66667;
-               break;
-       case 1:
-               freq = 83000;
-               break;
-       case 2:
-               freq = 100000;
-               break;
-       }
-
-       freq *= 1000;
-       divisor = 4;
-       tb_ticks_per_jiffy = freq / HZ / divisor;
-       tb_to_us = mulhwu_scale_factor(freq/divisor, 1000000);
-}
-
-unsigned long __init gemini_find_end_of_memory(void)
-{
-       unsigned long total;
-       unsigned char reg;
-
-       reg = readb(GEMINI_MEMCFG);
-       total = ((1<<((reg & 0x7) - 1)) *
-                (8<<((reg >> 3) & 0x7)));
-       total *= (1024*1024);
-       return total;
-}
-
-static void __init
-gemini_map_io(void)
-{
-       io_block_mapping(0xf0000000, 0xf0000000, 0x10000000, _PAGE_IO);
-       io_block_mapping(0x80000000, 0x80000000, 0x10000000, _PAGE_IO);
-}
-
-#ifdef CONFIG_SMP
-static int
-smp_gemini_probe(void)
-{
-       int i, nr;
-
-        nr = (readb(GEMINI_CPUSTAT) & GEMINI_CPU_COUNT_MASK) >> 2;
-       if (nr == 0)
-               nr = 4;
-
-       if (nr > 1) {
-               openpic_request_IPIs();
-               for (i = 1; i < nr; ++i)
-                       smp_hw_index[i] = i;
-       }
-
-       return nr;
-}
-
-static void
-smp_gemini_kick_cpu(int nr)
-{
-       openpic_reset_processor_phys(1 << nr);
-       openpic_reset_processor_phys(0);
-}
-
-static void
-smp_gemini_setup_cpu(int cpu_nr)
-{
-       if (OpenPIC_Addr)
-               do_openpic_setup_cpu();
-       if (cpu_nr > 0)
-               gemini_init_l2();
-}
-
-static struct smp_ops_t gemini_smp_ops = {
-       smp_openpic_message_pass,
-       smp_gemini_probe,
-       smp_gemini_kick_cpu,
-       smp_gemini_setup_cpu,
-       .give_timebase = smp_generic_give_timebase,
-       .take_timebase = smp_generic_take_timebase,
-};
-#endif /* CONFIG_SMP */
-
-void __init platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-                         unsigned long r6, unsigned long r7)
-{
-       int i;
-
-       /* Restore BATs for now */
-       mtspr(SPRN_DBAT3U, 0xf0001fff);
-       mtspr(SPRN_DBAT3L, 0xf000002a);
-
-       parse_bootinfo(find_bootinfo());
-
-       for(i = 0; i < GEMINI_LEDS; i++)
-               gemini_led_off(i);
-
-       ISA_DMA_THRESHOLD = 0;
-       DMA_MODE_READ = 0;
-       DMA_MODE_WRITE = 0;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       if ( r4 )
-       {
-               initrd_start = r4 + KERNELBASE;
-               initrd_end = r5 + KERNELBASE;
-       }
-#endif
-
-       ppc_md.setup_arch = gemini_setup_arch;
-       ppc_md.show_cpuinfo = gemini_show_cpuinfo;
-       ppc_md.init_IRQ = gemini_init_IRQ;
-       ppc_md.get_irq = openpic_get_irq;
-       ppc_md.init = NULL;
-
-       ppc_md.restart = gemini_restart;
-       ppc_md.power_off = gemini_power_off;
-       ppc_md.halt = gemini_halt;
-
-       ppc_md.time_init = gemini_time_init;
-       ppc_md.set_rtc_time = gemini_set_rtc_time;
-       ppc_md.get_rtc_time = gemini_get_rtc_time;
-       ppc_md.calibrate_decr = gemini_calibrate_decr;
-
-       ppc_md.find_end_of_memory = gemini_find_end_of_memory;
-       ppc_md.setup_io_mappings = gemini_map_io;
-
-       ppc_md.pcibios_fixup_bus = gemini_pcibios_fixup;
-
-#ifdef CONFIG_SMP
-       smp_ops = &gemini_smp_ops;
-#endif /* CONFIG_SMP */
-}
index 8a0c07eb4449157796fb0925da4483d4cef54843..5b05d4bd0df7de168959af76285423ee2b847fc7 100644 (file)
@@ -369,7 +369,7 @@ int __init mpc866ads_init(void)
        ppc_sys_device_setfunc(MPC8xx_CPM_SMC1, PPC_SYS_FUNC_UART);
 #endif
 
-#ifdef CONFIG_SERIAL_CPM_SMC
+#ifdef CONFIG_SERIAL_CPM_SMC2
        ppc_sys_device_enable(MPC8xx_CPM_SMC2);
        ppc_sys_device_setfunc(MPC8xx_CPM_SMC2, PPC_SYS_FUNC_UART);
 #endif
index dca23f2ef851b1fd43c9d38cd8d688362e273fde..d84f04666972d579ac15444566a20e9b2ba567d4 100644 (file)
@@ -45,7 +45,6 @@ obj-$(CONFIG_EBONY)           += pci_auto.o todc_time.o
 obj-$(CONFIG_EV64260)          += todc_time.o pci_auto.o
 obj-$(CONFIG_EV64360)          += todc_time.o
 obj-$(CONFIG_CHESTNUT)         += mv64360_pic.o pci_auto.o
-obj-$(CONFIG_GEMINI)           += open_pic.o
 obj-$(CONFIG_GT64260)          += gt64260_pic.o
 obj-$(CONFIG_LOPEC)            += pci_auto.o todc_time.o
 obj-$(CONFIG_HDPU)             += pci_auto.o
index 5475709ce07bb786f5bb6203efcef88a31294f9a..ebb8c8f8f30c4886c28214c9a5eea905c82e9f35 100644 (file)
@@ -105,7 +105,8 @@ void idma_pci9_init(void)
        idma_reg[IDMA_CHAN].idmr = 0;           /* mask all IDMA interrupts */
        idma_reg[IDMA_CHAN].idsr = 0xff;        /* clear all event flags */
 
-       printk("<4>Using IDMA%d for MPC8260 device erratum PCI 9 workaround\n",
+       printk(KERN_WARNING
+               "Using IDMA%d for MPC8260 device erratum PCI 9 workaround\n",
                IDMA_CHAN + 1);
 
        return;
index d8d299bd1a123d37f2bda11f7e85f60f9f8c3830..01e48d88f22d482e912070f86830bb5461a504bd 100644 (file)
@@ -77,7 +77,7 @@ static struct mtd_partition mpc8xxads_partitions[] = {
        }
 };
 
-#define mpc8xxads_part_num (sizeof (mpc8xxads_partitions) / sizeof (mpc8xxads_partitions[0]))
+#define mpc8xxads_part_num ARRAY_SIZE(mpc8xxads_partitions)
 
 #endif
 
index 05b0e94150852e0d8189adf0d529a6667c48fac8..2b097800cdd971945a883d80d5a0567649e3ca15 100644 (file)
@@ -59,8 +59,6 @@
 #define DBELL_TID(x)           (*(u8 *)(x + DOORBELL_TID_OFFSET))
 #define DBELL_INF(x)           (*(u16 *)(x + DOORBELL_INFO_OFFSET))
 
-#define is_power_of_2(x)       (((x) & ((x) - 1)) == 0)
-
 struct rio_atmu_regs {
        u32 rowtar;
        u32 pad1;
index 533a6c9973d43fa01cff0fb08f897e569ed85af8..034313cef6e7120907c2d2af16df5c4c547a80fa 100644 (file)
@@ -19,6 +19,7 @@ along with this file; see the file COPYING.  If not, write to the Free
 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <linux/posix_types.h>
+#include <linux/kernel.h>
 #include "ansidecl.h"
 #include "ppc.h"
 
@@ -2669,8 +2670,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
 
 };
 
-const int powerpc_num_opcodes =
-  sizeof (powerpc_opcodes) / sizeof (powerpc_opcodes[0]);
+const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes);
 \f
 /* The macro table.  This is only used by the assembler.  */
 
@@ -2717,5 +2717,4 @@ const struct powerpc_macro powerpc_macros[] = {
 
 };
 
-const int powerpc_num_macros =
-  sizeof (powerpc_macros) / sizeof (powerpc_macros[0]);
+const int powerpc_num_macros = ARRAY_SIZE(powerpc_macros);
index d74a883e5bdeab5b82e1069e6cae3fe038c1472d..8f0b953179fa9deffd1a69b2aff079641ba6ab81 100644 (file)
@@ -58,10 +58,7 @@ static struct sysrq_key_op sysrq_xmon_op =
 void
 xmon_map_scc(void)
 {
-#if defined(CONFIG_GEMINI)
-       /* should already be mapped by the kernel boot */
-       sccd = (volatile unsigned char *) 0xffeffb08;
-#elif defined(CONFIG_405GP)
+#if defined(CONFIG_405GP)
        sccd = (volatile unsigned char *)0xef600300;
 #elif defined(CONFIG_440EP)
        sccd = (volatile unsigned char *) ioremap(PPC440EP_UART0_ADDR, 8);
index 9e43e39dc35c09dc25efafa0c56555bfeabf4dea..d08bb4ee130751efee0b36bb4b380d491064b28f 100644 (file)
@@ -610,6 +610,13 @@ config HVC_RTAS
        help
          IBM Console device driver which makes use of RTAS
 
+config HVC_BEAT
+       bool "Toshiba's Beat Hypervisor Console support"
+       depends on PPC_CELLEB
+       select HVC_DRIVER
+       help
+         Toshiba's Cell Reference Set Beat Console device driver
+
 config HVCS
        tristate "IBM Hypervisor Virtual Console Server support"
        depends on PPC_PSERIES
index fc110637ced6ad4b4f6ae8b70bc3365d69110540..0326ca1a848a10e492740bf8e7e3baf0cd992d3d 100644 (file)
@@ -45,6 +45,7 @@ obj-$(CONFIG_RIO)             += rio/ generic_serial.o
 obj-$(CONFIG_HVC_CONSOLE)      += hvc_vio.o hvsi.o
 obj-$(CONFIG_HVC_ISERIES)      += hvc_iseries.o
 obj-$(CONFIG_HVC_RTAS)         += hvc_rtas.o
+obj-$(CONFIG_HVC_BEAT)         += hvc_beat.o
 obj-$(CONFIG_HVC_DRIVER)       += hvc_console.o
 obj-$(CONFIG_RAW_DRIVER)       += raw.o
 obj-$(CONFIG_SGI_SNSC)         += snsc.o snsc_event.o
diff --git a/drivers/char/hvc_beat.c b/drivers/char/hvc_beat.c
new file mode 100644 (file)
index 0000000..6f019f1
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Beat hypervisor console driver
+ *
+ * (C) Copyright 2006 TOSHIBA CORPORATION
+ *
+ * This code is based on drivers/char/hvc_rtas.c:
+ * (C) Copyright IBM Corporation 2001-2005
+ * (C) Copyright Red Hat, Inc. 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/string.h>
+#include <linux/console.h>
+#include <asm/prom.h>
+#include <asm/hvconsole.h>
+#include <asm/firmware.h>
+
+#include "hvc_console.h"
+
+extern int64_t beat_get_term_char(uint64_t, uint64_t *, uint64_t *, uint64_t *);
+extern int64_t beat_put_term_char(uint64_t, uint64_t, uint64_t, uint64_t);
+
+struct hvc_struct *hvc_beat_dev = NULL;
+
+/* bug: only one queue is available regardless of vtermno */
+static int hvc_beat_get_chars(uint32_t vtermno, char *buf, int cnt)
+{
+       static unsigned char q[sizeof(unsigned long) * 2]
+               __attribute__((aligned(sizeof(unsigned long))));
+       static int qlen = 0;
+       unsigned long got;
+
+again:
+       if (qlen) {
+               if (qlen > cnt) {
+                       memcpy(buf, q, cnt);
+                       qlen -= cnt;
+                       memmove(q + cnt, q, qlen);
+                       return cnt;
+               } else {        /* qlen <= cnt */
+                       int     r;
+
+                       memcpy(buf, q, qlen);
+                       r = qlen;
+                       qlen = 0;
+                       return r;
+               }
+       }
+       if (beat_get_term_char(vtermno, &got,
+               ((unsigned long *)q), ((unsigned long *)q) + 1) == 0) {
+               qlen = got;
+               goto again;
+       }
+       return 0;
+}
+
+static int hvc_beat_put_chars(uint32_t vtermno, const char *buf, int cnt)
+{
+       unsigned long kb[2];
+       int rest, nlen;
+
+       for (rest = cnt; rest > 0; rest -= nlen) {
+               nlen = (rest > 16) ? 16 : rest;
+               memcpy(kb, buf, nlen);
+               beat_put_term_char(vtermno, rest, kb[0], kb[1]);
+               rest -= nlen;
+       }
+       return cnt;
+}
+
+static struct hv_ops hvc_beat_get_put_ops = {
+       .get_chars = hvc_beat_get_chars,
+       .put_chars = hvc_beat_put_chars,
+};
+
+static int hvc_beat_useit = 1;
+
+static int hvc_beat_config(char *p)
+{
+       hvc_beat_useit = simple_strtoul(p, NULL, 0);
+       return 0;
+}
+
+static int hvc_beat_console_init(void)
+{
+       if (hvc_beat_useit && machine_is_compatible("Beat")) {
+               hvc_instantiate(0, 0, &hvc_beat_get_put_ops);
+       }
+       return 0;
+}
+
+/* temp */
+static int hvc_beat_init(void)
+{
+       struct hvc_struct *hp;
+
+       if (!firmware_has_feature(FW_FEATURE_BEAT))
+               return -ENODEV;
+
+       hp = hvc_alloc(0, NO_IRQ, &hvc_beat_get_put_ops, 16);
+       if (IS_ERR(hp))
+               return PTR_ERR(hp);
+       hvc_beat_dev = hp;
+       return 0;
+}
+
+static void __exit hvc_beat_exit(void)
+{
+       if (hvc_beat_dev)
+               hvc_remove(hvc_beat_dev);
+}
+
+module_init(hvc_beat_init);
+module_exit(hvc_beat_exit);
+
+__setup("hvc_beat=", hvc_beat_config);
+
+console_initcall(hvc_beat_console_init);
index 488902231cc237ec24cd76568af57c186bc6d12d..0e23f29f71abb42f27d38d4175f8dd5c91ee5730 100644 (file)
@@ -35,7 +35,7 @@
 #ifdef CONFIG_FSL_BOOKE
 #define WDT_PERIOD_DEFAULT 63  /* Ex. wdt_period=28 bus=333Mhz , reset=~40sec */
 #else
-#define WDT_PERIOD_DEFAULT 4   /* Refer to the PPC40x and PPC4xx manuals */
+#define WDT_PERIOD_DEFAULT 3   /* Refer to the PPC40x and PPC4xx manuals */
 #endif                         /* for timing information */
 
 u32 booke_wdt_enabled = 0;
@@ -47,6 +47,14 @@ u32 booke_wdt_period = WDT_PERIOD_DEFAULT;
 #define WDTP(x)                (TCR_WP(x))
 #endif
 
+/*
+ * booke_wdt_ping:
+ */
+static __inline__ void booke_wdt_ping(void)
+{
+       mtspr(SPRN_TSR, TSR_ENW|TSR_WIS);
+}
+
 /*
  * booke_wdt_enable:
  */
@@ -54,20 +62,14 @@ static __inline__ void booke_wdt_enable(void)
 {
        u32 val;
 
+       /* clear status before enabling watchdog */
+       booke_wdt_ping();
        val = mfspr(SPRN_TCR);
        val |= (TCR_WIE|TCR_WRC(WRC_CHIP)|WDTP(booke_wdt_period));
 
        mtspr(SPRN_TCR, val);
 }
 
-/*
- * booke_wdt_ping:
- */
-static __inline__ void booke_wdt_ping(void)
-{
-       mtspr(SPRN_TSR, TSR_ENW|TSR_WIS);
-}
-
 /*
  * booke_wdt_write:
  */
index e947af982f93503b0e20bd321247e4c6770b3abe..94c117ef20c1d74b59e4c445ef3e006f01399c51 100644 (file)
@@ -94,8 +94,6 @@ static int wf_thread_func(void *data)
        DBG("wf: thread started\n");
 
        while(!kthread_should_stop()) {
-               try_to_freeze();
-
                if (time_after_eq(jiffies, next)) {
                        wf_notify(WF_EVENT_TICK, NULL);
                        if (wf_overtemp) {
@@ -118,8 +116,8 @@ static int wf_thread_func(void *data)
                if (delay <= HZ)
                        schedule_timeout_interruptible(delay);
 
-               /* there should be no signal, but oh well */
-               if (signal_pending(current)) {
+               /* there should be no non-suspend signal, but oh well */
+               if (signal_pending(current) && !try_to_freeze()) {
                        printk(KERN_WARNING "windfarm: thread got sigl !\n");
                        break;
                }
index 92590d8fc24b4ee39b9e7bf7175132d5fa5a9002..569be225cd056b0955c3310c36706abb040fc8a7 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/dma-mapping.h>
 
 #include <linux/fs_enet_pd.h>
+#include <asm/fs_pd.h>
 
 #ifdef CONFIG_CPM1
 #include <asm/commproc.h>
index 6d71bea5e9003cd41549d3be8bd177311b080021..0d6943d6709638764e885400be50db4b283f1b49 100644 (file)
@@ -42,8 +42,6 @@
 
 #include "gianfar.h"
 
-#define is_power_of_2(x)        ((x) != 0 && (((x) & ((x) - 1)) == 0))
-
 extern void gfar_start(struct net_device *dev);
 extern int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit);
 
index 8433eb7562cb2c9ceb77e365564e12de90bae8d9..d547cf50ca9dc913a51a0ae2ba52f1e2e2509dd0 100644 (file)
@@ -1,2 +1 @@
-obj-y += system-bus.o
 obj-$(CONFIG_PS3_VUART) += vuart.o
diff --git a/drivers/ps3/system-bus.c b/drivers/ps3/system-bus.c
deleted file mode 100644 (file)
index d79f949..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *  PS3 system bus driver.
- *
- *  Copyright (C) 2006 Sony Computer Entertainment Inc.
- *  Copyright 2006 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/init.h>
-#include <linux/module.h>
-#include <linux/dma-mapping.h>
-#include <linux/err.h>
-
-#include <asm/udbg.h>
-#include <asm/ps3.h>
-#include <asm/lv1call.h>
-#include <asm/firmware.h>
-
-#define dump_mmio_region(_a) _dump_mmio_region(_a, __func__, __LINE__)
-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->did.bus_id,
-               r->did.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);
-       pr_debug("%s:%d: lpar_addr %lxh\n", func, line, r->lpar_addr);
-}
-
-int ps3_mmio_region_create(struct ps3_mmio_region *r)
-{
-       int result;
-
-       result = lv1_map_device_mmio_region(r->did.bus_id, r->did.dev_id,
-               r->bus_addr, r->len, r->page_size, &r->lpar_addr);
-
-       if (result) {
-               pr_debug("%s:%d: lv1_map_device_mmio_region failed: %s\n",
-                       __func__, __LINE__, ps3_result(result));
-               r->lpar_addr = r->len = r->bus_addr = 0;
-       }
-
-       dump_mmio_region(r);
-       return result;
-}
-
-int ps3_free_mmio_region(struct ps3_mmio_region *r)
-{
-       int result;
-
-       result = lv1_unmap_device_mmio_region(r->did.bus_id, r->did.dev_id,
-               r->bus_addr);
-
-       if (result)
-               pr_debug("%s:%d: lv1_unmap_device_mmio_region failed: %s\n",
-                       __func__, __LINE__, ps3_result(result));
-
-       r->lpar_addr = r->len = r->bus_addr = 0;
-       return result;
-}
-
-static int ps3_system_bus_match(struct device *_dev,
-       struct device_driver *_drv)
-{
-       int result;
-       struct ps3_system_bus_driver *drv = to_ps3_system_bus_driver(_drv);
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-
-       result = dev->match_id == drv->match_id;
-
-       pr_info("%s:%d: dev=%u(%s), drv=%u(%s): %s\n", __func__, __LINE__,
-               dev->match_id, dev->core.bus_id, drv->match_id, drv->core.name,
-               (result ? "match" : "miss"));
-       return result;
-}
-
-static int ps3_system_bus_probe(struct device *_dev)
-{
-       int result;
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       struct ps3_system_bus_driver *drv =
-               to_ps3_system_bus_driver(_dev->driver);
-
-       result = lv1_open_device(dev->did.bus_id, dev->did.dev_id, 0);
-
-       if (result) {
-               pr_debug("%s:%d: lv1_open_device failed (%d)\n",
-                       __func__, __LINE__, result);
-               result = -EACCES;
-               goto clean_none;
-       }
-
-       if (dev->d_region->did.bus_id) {
-               result = ps3_dma_region_create(dev->d_region);
-
-               if (result) {
-                       pr_debug("%s:%d: ps3_dma_region_create failed (%d)\n",
-                               __func__, __LINE__, result);
-                       BUG_ON("check region type");
-                       result = -EINVAL;
-                       goto clean_device;
-               }
-       }
-
-       BUG_ON(!drv);
-
-       if (drv->probe)
-               result = drv->probe(dev);
-       else
-               pr_info("%s:%d: %s no probe method\n", __func__, __LINE__,
-                       dev->core.bus_id);
-
-       if (result) {
-               pr_debug("%s:%d: drv->probe failed\n", __func__, __LINE__);
-               goto clean_dma;
-       }
-
-       return result;
-
-clean_dma:
-       ps3_dma_region_free(dev->d_region);
-clean_device:
-       lv1_close_device(dev->did.bus_id, dev->did.dev_id);
-clean_none:
-       return result;
-}
-
-static int ps3_system_bus_remove(struct device *_dev)
-{
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       struct ps3_system_bus_driver *drv =
-               to_ps3_system_bus_driver(_dev->driver);
-
-       if (drv->remove)
-               drv->remove(dev);
-       else
-               pr_info("%s:%d: %s no remove method\n", __func__, __LINE__,
-                       dev->core.bus_id);
-
-       ps3_dma_region_free(dev->d_region);
-       ps3_free_mmio_region(dev->m_region);
-       lv1_close_device(dev->did.bus_id, dev->did.dev_id);
-
-       return 0;
-}
-
-struct bus_type ps3_system_bus_type = {
-        .name = "ps3_system_bus",
-       .match = ps3_system_bus_match,
-       .probe = ps3_system_bus_probe,
-       .remove = ps3_system_bus_remove,
-};
-
-int __init ps3_system_bus_init(void)
-{
-       int result;
-
-       if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
-               return 0;
-
-       result = bus_register(&ps3_system_bus_type);
-       BUG_ON(result);
-       return result;
-}
-
-core_initcall(ps3_system_bus_init);
-
-/* Allocates a contiguous real buffer and creates mappings over it.
- * Returns the virtual address of the buffer and sets dma_handle
- * to the dma address (mapping) of the first page.
- */
-
-static void * ps3_alloc_coherent(struct device *_dev, size_t size,
-       dma_addr_t *dma_handle, gfp_t flag)
-{
-       int result;
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       unsigned long virt_addr;
-
-       BUG_ON(!dev->d_region->bus_addr);
-
-       flag &= ~(__GFP_DMA | __GFP_HIGHMEM);
-       flag |= __GFP_ZERO;
-
-       virt_addr = __get_free_pages(flag, get_order(size));
-
-       if (!virt_addr) {
-               pr_debug("%s:%d: get_free_pages failed\n", __func__, __LINE__);
-               goto clean_none;
-       }
-
-       result = ps3_dma_map(dev->d_region, virt_addr, size, dma_handle);
-
-       if (result) {
-               pr_debug("%s:%d: ps3_dma_map failed (%d)\n",
-                       __func__, __LINE__, result);
-               BUG_ON("check region type");
-               goto clean_alloc;
-       }
-
-       return (void*)virt_addr;
-
-clean_alloc:
-       free_pages(virt_addr, get_order(size));
-clean_none:
-       dma_handle = NULL;
-       return NULL;
-}
-
-static void ps3_free_coherent(struct device *_dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle)
-{
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-
-       ps3_dma_unmap(dev->d_region, dma_handle, size);
-       free_pages((unsigned long)vaddr, get_order(size));
-}
-
-/* Creates TCEs for a user provided buffer.  The user buffer must be
- * contiguous real kernel storage (not vmalloc).  The address of the buffer
- * passed here is the kernel (virtual) address of the buffer.  The buffer
- * need not be page aligned, the dma_addr_t returned will point to the same
- * byte within the page as vaddr.
- */
-
-static dma_addr_t ps3_map_single(struct device *_dev, void *ptr, size_t size,
-       enum dma_data_direction direction)
-{
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       int result;
-       unsigned long bus_addr;
-
-       result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size,
-               &bus_addr);
-
-       if (result) {
-               pr_debug("%s:%d: ps3_dma_map failed (%d)\n",
-                       __func__, __LINE__, result);
-       }
-
-       return bus_addr;
-}
-
-static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr,
-       size_t size, enum dma_data_direction direction)
-{
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       int result;
-
-       result = ps3_dma_unmap(dev->d_region, dma_addr, size);
-
-       if (result) {
-               pr_debug("%s:%d: ps3_dma_unmap failed (%d)\n",
-                       __func__, __LINE__, result);
-       }
-}
-
-static int ps3_map_sg(struct device *_dev, struct scatterlist *sg, int nents,
-       enum dma_data_direction direction)
-{
-#if defined(CONFIG_PS3_DYNAMIC_DMA)
-       BUG_ON("do");
-#endif
-       return 0;
-}
-
-static void ps3_unmap_sg(struct device *_dev, struct scatterlist *sg,
-       int nents, enum dma_data_direction direction)
-{
-#if defined(CONFIG_PS3_DYNAMIC_DMA)
-       BUG_ON("do");
-#endif
-}
-
-static int ps3_dma_supported(struct device *_dev, u64 mask)
-{
-       return 1;
-}
-
-static struct dma_mapping_ops ps3_dma_ops = {
-       .alloc_coherent = ps3_alloc_coherent,
-       .free_coherent = ps3_free_coherent,
-       .map_single = ps3_map_single,
-       .unmap_single = ps3_unmap_single,
-       .map_sg = ps3_map_sg,
-       .unmap_sg = ps3_unmap_sg,
-       .dma_supported = ps3_dma_supported
-};
-
-/**
- * ps3_system_bus_release_device - remove a device from the system bus
- */
-
-static void ps3_system_bus_release_device(struct device *_dev)
-{
-       struct ps3_system_bus_device *dev = to_ps3_system_bus_device(_dev);
-       kfree(dev);
-}
-
-/**
- * ps3_system_bus_device_register - add a device to the system bus
- *
- * ps3_system_bus_device_register() expects the dev object to be allocated
- * dynamically by the caller.  The system bus takes ownership of the dev
- * object and frees the object in ps3_system_bus_release_device().
- */
-
-int ps3_system_bus_device_register(struct ps3_system_bus_device *dev)
-{
-       int result;
-       static unsigned int dev_count = 1;
-
-       dev->core.parent = NULL;
-       dev->core.bus = &ps3_system_bus_type;
-       dev->core.release = ps3_system_bus_release_device;
-
-       dev->core.archdata.of_node = NULL;
-       dev->core.archdata.dma_ops = &ps3_dma_ops;
-       dev->core.archdata.numa_node = 0;
-
-       snprintf(dev->core.bus_id, sizeof(dev->core.bus_id), "sb_%02x",
-               dev_count++);
-
-       pr_debug("%s:%d add %s\n", __func__, __LINE__, dev->core.bus_id);
-
-       result = device_register(&dev->core);
-       return result;
-}
-
-EXPORT_SYMBOL_GPL(ps3_system_bus_device_register);
-
-int ps3_system_bus_driver_register(struct ps3_system_bus_driver *drv)
-{
-       int result;
-
-       drv->core.bus = &ps3_system_bus_type;
-
-       result = driver_register(&drv->core);
-       return result;
-}
-
-EXPORT_SYMBOL_GPL(ps3_system_bus_driver_register);
-
-void ps3_system_bus_driver_unregister(struct ps3_system_bus_driver *drv)
-{
-       driver_unregister(&drv->core);
-}
-
-EXPORT_SYMBOL_GPL(ps3_system_bus_driver_unregister);
index 6974f65bcda5edca108970cbbdccc62040d7c95b..a72da8f651f8e65850a284133a1840ba93cd29b3 100644 (file)
@@ -783,8 +783,8 @@ static int ps3_vuart_probe(struct device *_dev)
 
        vuart_private.in_use++;
        if (vuart_private.in_use == 1) {
-               result = ps3_alloc_vuart_irq((void*)&vuart_private.bmp.status,
-                       &vuart_private.virq);
+               result = ps3_alloc_vuart_irq(PS3_BINDING_CPU_ANY,
+                       (void*)&vuart_private.bmp.status, &vuart_private.virq);
 
                if (result) {
                        dev_dbg(&dev->core,
index 28fd89f0c8aa23fd6cfe7d3bbc31d909e4941f2d..11c421cf7a0342aaff8beaaddb5ae64ceaa57eed 100644 (file)
 #if !defined(_PS3_VUART_H)
 #define _PS3_VUART_H
 
-struct ps3_vuart_stats {
-       unsigned long bytes_written;
-       unsigned long bytes_read;
-       unsigned long tx_interrupts;
-       unsigned long rx_interrupts;
-       unsigned long disconnect_interrupts;
-};
-
-/**
- * struct ps3_vuart_port_device - a device on a vuart port
- */
-
-struct ps3_vuart_port_device {
-       enum ps3_match_id match_id;
-       struct device core;
-
-       /* private driver variables */
-       unsigned int port_number;
-       unsigned long interrupt_mask;
-       struct {
-               spinlock_t lock;
-               struct list_head head;
-       } tx_list;
-       struct {
-               unsigned long bytes_held;
-               spinlock_t lock;
-               struct list_head head;
-       } rx_list;
-       struct ps3_vuart_stats stats;
-};
-
 /**
  * struct ps3_vuart_port_driver - a driver for a device on a vuart port
  */
@@ -68,9 +37,9 @@ struct ps3_vuart_port_driver {
        /* int (*resume)(struct ps3_vuart_port_device *); */
 };
 
-int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
 int ps3_vuart_port_driver_register(struct ps3_vuart_port_driver *drv);
 void ps3_vuart_port_driver_unregister(struct ps3_vuart_port_driver *drv);
+
 int ps3_vuart_write(struct ps3_vuart_port_device *dev,
        const void* buf, unsigned int bytes);
 int ps3_vuart_read(struct ps3_vuart_port_device *dev, void* buf,
@@ -86,9 +55,4 @@ static inline struct ps3_vuart_port_device *to_ps3_vuart_port_device(
        return container_of(_dev, struct ps3_vuart_port_device, core);
 }
 
-int ps3_vuart_write(struct ps3_vuart_port_device *dev, const void* buf,
-       unsigned int bytes);
-int ps3_vuart_read(struct ps3_vuart_port_device *dev, void* buf,
-       unsigned int bytes);
-
 #endif
index 08e55fdc882a87b004e1fd8a04bf334c7e0b708e..925fb607d8c40f7fb37fa1874e28e0f23c2fb175 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <asm/io.h>
 #include <asm/irq.h>
+#include <asm/fs_pd.h>
 
 #include <linux/serial_core.h>
 #include <linux/kernel.h>
@@ -145,7 +146,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
                /* was hostalloc but changed cause it blows away the */
                /* large tlb mapping when pinning the kernel area    */
                mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8));
-               dma_addr = (u32)mem_addr;
+               dma_addr = (u32)cpm_dpram_phys(mem_addr);
        } else
                mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr,
                                              GFP_KERNEL);
@@ -205,7 +206,7 @@ int __init cpm_uart_init_portdesc(void)
            (unsigned long)&cpmp->cp_smc[0];
        cpm_uart_ports[UART_SMC1].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
        cpm_uart_ports[UART_SMC1].smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
-       cpm_uart_ports[UART_SMC1].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SMC1].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SMC1;
 #endif
 
@@ -217,7 +218,7 @@ int __init cpm_uart_init_portdesc(void)
            (unsigned long)&cpmp->cp_smc[1];
        cpm_uart_ports[UART_SMC2].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
        cpm_uart_ports[UART_SMC2].smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
-       cpm_uart_ports[UART_SMC2].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SMC2].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SMC2;
 #endif
 
@@ -231,7 +232,7 @@ int __init cpm_uart_init_portdesc(void)
            ~(UART_SCCM_TX | UART_SCCM_RX);
        cpm_uart_ports[UART_SCC1].sccp->scc_gsmrl &=
            ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-       cpm_uart_ports[UART_SCC1].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SCC1].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SCC1;
 #endif
 
@@ -245,7 +246,7 @@ int __init cpm_uart_init_portdesc(void)
            ~(UART_SCCM_TX | UART_SCCM_RX);
        cpm_uart_ports[UART_SCC2].sccp->scc_gsmrl &=
            ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-       cpm_uart_ports[UART_SCC2].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SCC2].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SCC2;
 #endif
 
@@ -259,7 +260,7 @@ int __init cpm_uart_init_portdesc(void)
            ~(UART_SCCM_TX | UART_SCCM_RX);
        cpm_uart_ports[UART_SCC3].sccp->scc_gsmrl &=
            ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-       cpm_uart_ports[UART_SCC3].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SCC3].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SCC3;
 #endif
 
@@ -273,7 +274,7 @@ int __init cpm_uart_init_portdesc(void)
            ~(UART_SCCM_TX | UART_SCCM_RX);
        cpm_uart_ports[UART_SCC4].sccp->scc_gsmrl &=
            ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-       cpm_uart_ports[UART_SCC4].port.uartclk = (((bd_t *) __res)->bi_intfreq);
+       cpm_uart_ports[UART_SCC4].port.uartclk = uart_clock();
        cpm_uart_port_map[cpm_uart_nr++] = UART_SCC4;
 #endif
        return 0;
index 5eb49ea63bfe4b76b2ce8449422d065c7acce890..a99e45e2b6d8d114db340681805297b99f431292 100644 (file)
@@ -20,9 +20,6 @@
 #define SCC3_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC3)
 #define SCC4_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC4)
 
-/* the CPM address */
-#define CPM_ADDR       IMAP_ADDR
-
 static inline void cpm_set_brg(int brg, int baud)
 {
        cpm_setbrg(brg, baud);
index 4b779111eaf9cc43e776ff3aff1a229d04fb0606..1b3219f56c81513a07381d5fa54263930c112b26 100644 (file)
@@ -20,9 +20,6 @@
 #define SCC3_IRQ       SIU_INT_SCC3
 #define SCC4_IRQ       SIU_INT_SCC4
 
-/* the CPM address */
-#define CPM_ADDR       CPM_MAP_ADDR
-
 static inline void cpm_set_brg(int brg, int baud)
 {
        cpm_setbrg(brg, baud);
index 7384b8086b75411e2bc001f60184e344e42b31cf..e870b5393175d310ff45858c2530f09d6423812d 100644 (file)
@@ -50,6 +50,12 @@ enum powerpc_oprofile_type {
        PPC_OPROFILE_CELL = 5,
 };
 
+enum powerpc_pmc_type {
+       PPC_PMC_DEFAULT = 0,
+       PPC_PMC_IBM = 1,
+       PPC_PMC_PA6T = 2,
+};
+
 struct cpu_spec {
        /* CPU is matched via (PVR & pvr_mask) == pvr_value */
        unsigned int    pvr_mask;
@@ -65,6 +71,7 @@ struct cpu_spec {
 
        /* number of performance monitor counters */
        unsigned int    num_pmcs;
+       enum powerpc_pmc_type pmc_type;
 
        /* this is called to initialize various CPU bits like L1 cache,
         * BHT, SPD, etc... from head.S before branching to identify_machine
@@ -337,12 +344,6 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
            CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \
            CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
            CPU_FTR_DSCR)
-#define CPU_FTRS_POWER6X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
-           CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
-           CPU_FTR_MMCRA | CPU_FTR_SMT | \
-           CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \
-           CPU_FTR_PURR | CPU_FTR_CI_LARGE_PAGE | \
-           CPU_FTR_SPURR | CPU_FTR_REAL_LE | CPU_FTR_DSCR)
 #define CPU_FTRS_CELL  (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \
            CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
            CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
index b66c5e6941f01cabfc128a7b0f4082ac71555fae..9338d50538f1bddf6d904e4e5e8023eea835fdc8 100644 (file)
@@ -33,6 +33,7 @@
  * base from the device-tree
  */
 #ifdef CONFIG_PPC_MERGE
+struct device_node;
 extern unsigned int dcr_resource_start(struct device_node *np,
                                       unsigned int index);
 extern unsigned int dcr_resource_len(struct device_node *np,
index d36426c01b6b95efe784c7d567b5f58a2212ecbf..de507995c7b1e0504c6831e84abb50c8eb2cfea3 100644 (file)
@@ -173,7 +173,7 @@ typedef elf_vrreg_t elf_vrregset_t32[ELF_NVRREG32];
    the loader.  We need to make sure that it is out of the way of the program
    that it will "exec", and that there is sufficient room for the brk.  */
 
-#define ELF_ET_DYN_BASE         (0x08000000)
+#define ELF_ET_DYN_BASE         (0x20000000)
 
 /* Common routine for both 32-bit and 64-bit processes */
 static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
index 98f7b62422c9751d9f398f5f276afd5a450f52bc..3671c128f271eae3806930d50bb54387b7cc0e6f 100644 (file)
@@ -43,6 +43,8 @@
 #define FW_FEATURE_ISERIES     ASM_CONST(0x0000000000200000)
 #define FW_FEATURE_LPAR                ASM_CONST(0x0000000000400000)
 #define FW_FEATURE_PS3_LV1     ASM_CONST(0x0000000000800000)
+#define FW_FEATURE_BEAT                ASM_CONST(0x0000000001000000)
+#define FW_FEATURE_BULK_REMOVE ASM_CONST(0x0000000002000000)
 
 #ifndef __ASSEMBLY__
 
@@ -61,6 +63,8 @@ enum {
        FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
        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_NATIVE_POSSIBLE = 0,
        FW_FEATURE_NATIVE_ALWAYS = 0,
        FW_FEATURE_POSSIBLE =
@@ -73,6 +77,9 @@ enum {
 #ifdef CONFIG_PPC_PS3
                FW_FEATURE_PS3_POSSIBLE |
 #endif
+#ifdef CONFIG_PPC_CELLEB
+               FW_FEATURE_CELLEB_POSSIBLE |
+#endif
 #ifdef CONFIG_PPC_NATIVE
                FW_FEATURE_NATIVE_ALWAYS |
 #endif
@@ -87,6 +94,9 @@ enum {
 #ifdef CONFIG_PPC_PS3
                FW_FEATURE_PS3_ALWAYS &
 #endif
+#ifdef CONFIG_PPC_CELLEB
+               FW_FEATURE_CELLEB_ALWAYS &
+#endif
 #ifdef CONFIG_PPC_NATIVE
                FW_FEATURE_NATIVE_ALWAYS &
 #endif
index 3d0e819d37f13ea1f55a027e4381c8e1ad5bf1b2..c624915b757e0ee7d75c2bf8a3f58560b8289d53 100644 (file)
 
 #ifndef FS_PD_H
 #define FS_PD_H
-#include <asm/cpm2.h>
 #include <sysdev/fsl_soc.h>
 #include <asm/time.h>
 
-static inline int uart_baudrate(void)
-{
-        return get_baudrate();
-}
+#ifdef CONFIG_CPM2
+#include <asm/cpm2.h>
 
-static inline int uart_clock(void)
-{
-        return ppc_proc_freq;
-}
+#if defined(CONFIG_8260)
+#include <asm/mpc8260.h>
+#elif defined(CONFIG_85xx)
+#include <asm/mpc85xx.h>
+#endif
 
 #define cpm2_map(member)                                               \
 ({                                                                     \
@@ -41,5 +39,38 @@ static inline int uart_clock(void)
 })
 
 #define cpm2_unmap(addr)       iounmap(addr)
+#endif
+
+#ifdef CONFIG_8xx
+#include <asm/8xx_immap.h>
+#include <asm/mpc8xx.h>
+
+#define immr_map(member)                                               \
+({                                                                     \
+       u32 offset = offsetof(immap_t, member);                         \
+       void *addr = ioremap (IMAP_ADDR + offset,                       \
+                             sizeof( ((immap_t*)0)->member));          \
+       addr;                                                           \
+})
+
+#define immr_map_size(member, size)                                    \
+({                                                                     \
+       u32 offset = offsetof(immap_t, member);                         \
+       void *addr = ioremap (IMAP_ADDR + offset, size);                \
+       addr;                                                           \
+})
+
+#define immr_unmap(addr)               iounmap(addr)
+#endif
+
+static inline int uart_baudrate(void)
+{
+        return get_baudrate();
+}
+
+static inline int uart_clock(void)
+{
+        return ppc_proc_freq;
+}
 
 #endif
index 7a500732b671db290c9bee9a595e9ad7ceec8329..60977806d2f4065868e5a6cea653fb2d6b3cf693 100644 (file)
 #define H_FREE_LOGICAL_LAN     0x118
 #define H_ADD_LOGICAL_LAN_BUFFER 0x11C
 #define H_SEND_LOGICAL_LAN     0x120
+#define H_BULK_REMOVE          0x124
 #define H_MULTICAST_CTRL       0x130
 #define H_SET_XDABR            0x134
 #define H_STUFF_TCE            0x138
index 1cd532379c30035fd64f01d5d973c7414ffb15dc..301c9bb308b18c858cd3129089ac541ee8084e02 100644 (file)
@@ -732,6 +732,12 @@ static inline void * bus_to_virt(unsigned long address)
 
 #endif /* CONFIG_PPC32 */
 
+/* access ports */
+#define setbits32(_addr, _v) out_be32((_addr), in_be32(_addr) |  (_v))
+#define clrbits32(_addr, _v) out_be32((_addr), in_be32(_addr) & ~(_v))
+
+#define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) |  (_v))
+#define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
 
 #endif /* __KERNEL__ */
 
index f85dbd305558c0a187d40bfce98593379daead00..b2e56b30306a4eacd253c863d896fb824c3ffc0f 100644 (file)
@@ -99,6 +99,7 @@ extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
 extern void iommu_init_early_pSeries(void);
 extern void iommu_init_early_iSeries(void);
 extern void iommu_init_early_dart(void);
+extern void iommu_init_early_pasemi(void);
 
 #ifdef CONFIG_PCI
 extern void pci_iommu_init(void);
index 9fbb034158608d2eb67397d1299ccd6df816f4c8..edec79dcb7c17b226ddb72814bd6005f52a616bb 100644 (file)
@@ -78,7 +78,7 @@ extern u32 ipic_get_mcp_status(void);
 extern void ipic_clear_mcp_status(u32 mask);
 
 #ifdef CONFIG_PPC_MERGE
-extern void ipic_init(struct device_node *node, unsigned int flags);
+extern struct ipic * ipic_init(struct device_node *node, unsigned int flags);
 extern unsigned int ipic_get_irq(void);
 #else
 extern void ipic_init(phys_addr_t phys_addr, unsigned int flags,
index 46476e9a494ad6d2ec615f562b6a6449b69d4c91..4734cc178db55d17cf2c840893236d49202919df 100644 (file)
@@ -89,6 +89,9 @@ struct irq_host_ops {
        /* Dispose of such a mapping */
        void (*unmap)(struct irq_host *h, unsigned int virq);
 
+       /* Update of such a mapping  */
+       void (*remap)(struct irq_host *h, unsigned int virq, irq_hw_number_t hw);
+
        /* Translate device-tree interrupt specifier from raw format coming
         * from the firmware to a irq_hw_number_t (interrupt line number) and
         * type (sense) that can be passed to set_irq_type(). In the absence
index 2dafa376a63f60f89b3697a2034c943583a1de87..3a5dd492588fed5560206c2e850825e79ce3ab64 100644 (file)
@@ -44,6 +44,7 @@ typedef unsigned int kprobe_opcode_t;
 #define IS_TDI(instr)          (((instr) & 0xfc000000) == 0x08000000)
 #define IS_TWI(instr)          (((instr) & 0xfc000000) == 0x0c000000)
 
+#ifdef CONFIG_PPC64
 /*
  * 64bit powerpc uses function descriptors.
  * Handle cases where:
@@ -67,9 +68,13 @@ typedef unsigned int kprobe_opcode_t;
 }
 
 #define JPROBE_ENTRY(pentry)   (kprobe_opcode_t *)((func_descr_t *)pentry)
-
 #define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \
                        IS_TWI(instr) || IS_TDI(instr))
+#else
+/* Use stock kprobe_lookup_name since ppc32 doesn't use function descriptors */
+#define JPROBE_ENTRY(pentry)   (kprobe_opcode_t *)(pentry)
+#define is_trap(instr) (IS_TW(instr) || IS_TWI(instr))
+#endif
 
 #define ARCH_SUPPORTS_KRETPROBES
 #define  ARCH_INACTIVE_KPROBE_COUNT 1
index 41c8c9c5a254e10339ceaa6fcef11ff4f626f605..200055a4b82b5d983504e22df1de7550a3b104eb 100644 (file)
@@ -247,6 +247,7 @@ extern void htab_initialize_secondary(void);
 extern void hpte_init_native(void);
 extern void hpte_init_lpar(void);
 extern void hpte_init_iSeries(void);
+extern void hpte_init_beat(void);
 
 extern void stabs_alloc(void);
 extern void slb_initialize(void);
index 4560d72fc75875ecd547a6e33a67131c83646228..7afd5bf945288f2ac73580cefd4951d309537fc2 100644 (file)
@@ -249,6 +249,8 @@ extern void mpc52xx_declare_of_platform_devices(void);
 extern void mpc52xx_init_irq(void);
 extern unsigned int mpc52xx_get_irq(void);
 
+extern int __init mpc52xx_add_bridge(struct device_node *node);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __ASM_POWERPC_MPC52xx_H__ */
diff --git a/include/asm-powerpc/mpc8260.h b/include/asm-powerpc/mpc8260.h
new file mode 100644 (file)
index 0000000..f1b83b0
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Since there are many different boards and no standard configuration,
+ * we have a unique include file for each.  Rather than change every
+ * file that has to include MPC8260 configuration, they all include
+ * this one and the configuration switching is done here.
+ */
+#ifdef __KERNEL__
+#ifndef __ASM_PPC_MPC8260_H__
+#define __ASM_PPC_MPC8260_H__
+
+
+#ifdef CONFIG_8260
+
+#if defined(CONFIG_PQ2ADS) || defined (CONFIG_PQ2FADS)
+#include <platforms/82xx/pq2ads.h>
+#endif
+
+#ifdef CONFIG_PCI_8260
+#include <platforms/82xx/m82xx_pci.h>
+#endif
+
+#endif /* CONFIG_8260 */
+#endif /* !__ASM_PPC_MPC8260_H__ */
+#endif /* __KERNEL__ */
diff --git a/include/asm-powerpc/mpc8xx.h b/include/asm-powerpc/mpc8xx.h
new file mode 100644 (file)
index 0000000..5803711
--- /dev/null
@@ -0,0 +1,28 @@
+/* This is the single file included by all MPC8xx build options.
+ * Since there are many different boards and no standard configuration,
+ * we have a unique include file for each.  Rather than change every
+ * file that has to include MPC8xx configuration, they all include
+ * this one and the configuration switching is done here.
+ */
+#ifdef __KERNEL__
+#ifndef __CONFIG_8xx_DEFS
+#define __CONFIG_8xx_DEFS
+
+
+#ifdef CONFIG_8xx
+
+#ifdef CONFIG_FADS
+#include <platforms/fads.h>
+#endif
+
+#if defined(CONFIG_MPC86XADS)
+#include <platforms/8xx/mpc86xads.h>
+#endif
+
+#if defined(CONFIG_MPC885ADS)
+#include <platforms/8xx/mpc885ads.h>
+#endif
+
+#endif /* CONFIG_8xx */
+#endif /* __CONFIG_8xx_DEFS */
+#endif /* __KERNEL__ */
index b71e7b32a5550abb26b7ddfeedca5e6503f6e1da..cb204a71e91233acc47812847ea1c17a3452e531 100644 (file)
 #define MPIC_MAX_CPUS          32
 #define MPIC_MAX_ISU           32
 
-/*
- * Special vector numbers (internal use only)
- */
-#define MPIC_VEC_SPURRIOUS     255
-#define MPIC_VEC_IPI_3         254
-#define MPIC_VEC_IPI_2         253
-#define MPIC_VEC_IPI_1         252
-#define MPIC_VEC_IPI_0         251
-
-/* unused */
-#define MPIC_VEC_TIMER_3       250
-#define MPIC_VEC_TIMER_2       249
-#define MPIC_VEC_TIMER_1       248
-#define MPIC_VEC_TIMER_0       247
-
 /*
  * Tsi108 implementation of MPIC has many differences from the original one
  */
@@ -276,6 +261,13 @@ struct mpic
        unsigned char           *senses;
        unsigned int            senses_count;
 
+       /* vector numbers used for internal sources (ipi/timers) */
+       unsigned int            ipi_vecs[4];
+       unsigned int            timer_vecs[4];
+
+       /* Spurious vector to program into unused sources */
+       unsigned int            spurious_vec;
+
 #ifdef CONFIG_MPIC_BROKEN_U3
        /* The fixup table */
        struct mpic_irq_fixup   *fixups;
@@ -332,6 +324,8 @@ struct mpic
 #define MPIC_NO_PTHROU_DIS             0x00000040
 /* DCR based MPIC */
 #define MPIC_USES_DCR                  0x00000080
+/* MPIC has 11-bit vector fields (or larger) */
+#define MPIC_LARGE_VECTORS             0x00000100
 
 /* MPIC HW modification ID */
 #define MPIC_REGSET_MASK               0xf0000000
index 71043bf3641f369311c3343c6b0700ff899ea981..94c0ad2bff961d8bef27e44ca780d99649a01cb4 100644 (file)
@@ -58,10 +58,8 @@ extern struct op_powerpc_model op_model_power4;
 extern struct op_powerpc_model op_model_7450;
 extern struct op_powerpc_model op_model_cell;
 
-#ifndef CONFIG_FSL_BOOKE
-
 /* All the classic PPC parts use these */
-static inline unsigned int ctr_read(unsigned int i)
+static inline unsigned int classic_ctr_read(unsigned int i)
 {
        switch(i) {
        case 0:
@@ -89,7 +87,7 @@ static inline unsigned int ctr_read(unsigned int i)
        }
 }
 
-static inline void ctr_write(unsigned int i, unsigned int val)
+static inline void classic_ctr_write(unsigned int i, unsigned int val)
 {
        switch(i) {
        case 0:
@@ -124,89 +122,6 @@ static inline void ctr_write(unsigned int i, unsigned int val)
                break;
        }
 }
-#else /* CONFIG_FSL_BOOKE */
-static inline u32 get_pmlca(int ctr)
-{
-       u32 pmlca;
-
-       switch (ctr) {
-               case 0:
-                       pmlca = mfpmr(PMRN_PMLCA0);
-                       break;
-               case 1:
-                       pmlca = mfpmr(PMRN_PMLCA1);
-                       break;
-               case 2:
-                       pmlca = mfpmr(PMRN_PMLCA2);
-                       break;
-               case 3:
-                       pmlca = mfpmr(PMRN_PMLCA3);
-                       break;
-               default:
-                       panic("Bad ctr number\n");
-       }
-
-       return pmlca;
-}
-
-static inline void set_pmlca(int ctr, u32 pmlca)
-{
-       switch (ctr) {
-               case 0:
-                       mtpmr(PMRN_PMLCA0, pmlca);
-                       break;
-               case 1:
-                       mtpmr(PMRN_PMLCA1, pmlca);
-                       break;
-               case 2:
-                       mtpmr(PMRN_PMLCA2, pmlca);
-                       break;
-               case 3:
-                       mtpmr(PMRN_PMLCA3, pmlca);
-                       break;
-               default:
-                       panic("Bad ctr number\n");
-       }
-}
-
-static inline unsigned int ctr_read(unsigned int i)
-{
-       switch(i) {
-               case 0:
-                       return mfpmr(PMRN_PMC0);
-               case 1:
-                       return mfpmr(PMRN_PMC1);
-               case 2:
-                       return mfpmr(PMRN_PMC2);
-               case 3:
-                       return mfpmr(PMRN_PMC3);
-               default:
-                       return 0;
-       }
-}
-
-static inline void ctr_write(unsigned int i, unsigned int val)
-{
-       switch(i) {
-               case 0:
-                       mtpmr(PMRN_PMC0, val);
-                       break;
-               case 1:
-                       mtpmr(PMRN_PMC1, val);
-                       break;
-               case 2:
-                       mtpmr(PMRN_PMC2, val);
-                       break;
-               case 3:
-                       mtpmr(PMRN_PMC3, val);
-                       break;
-               default:
-                       break;
-       }
-}
-
-
-#endif /* CONFIG_FSL_BOOKE */
 
 
 extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth);
index cb02c9d1ef938f0c0d8bcdc9169d22236012c543..d9bf5aba96cbd25c262f634410c51275cdb9ecfc 100644 (file)
@@ -53,6 +53,8 @@ struct pci_controller {
        unsigned long buid;
        unsigned long dma_window_base_cur;
        unsigned long dma_window_size;
+
+       void *private_data;
 };
 
 /*
index 52a69ed0d90a86eb92cc261085e815dc4b56b4ad..4f5a1e01fdace5454a9bfa78e369f3592b61ff90 100644 (file)
 #if !defined(_ASM_POWERPC_PS3_H)
 #define _ASM_POWERPC_PS3_H
 
-#include <linux/compiler.h> /* for __deprecated */
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/device.h>
 
+union ps3_firmware_version {
+       u64 raw;
+       struct {
+               u16 pad;
+               u16 major;
+               u16 minor;
+               u16 rev;
+       };
+};
+
+int ps3_get_firmware_version(union ps3_firmware_version *v);
+
+/* 'Other OS' area */
+
+enum ps3_param_av_multi_out {
+       PS3_PARAM_AV_MULTI_OUT_NTSC = 0,
+       PS3_PARAM_AV_MULTI_OUT_PAL_RGB = 1,
+       PS3_PARAM_AV_MULTI_OUT_PAL_YCBCR = 2,
+       PS3_PARAM_AV_MULTI_OUT_SECAM = 3,
+};
+
+enum ps3_param_av_multi_out ps3_os_area_get_av_multi_out(void);
+
 /**
  * struct ps3_device_id - HV bus device identifier from the system repository
  * @bus_id: HV bus id, {1..} (zero invalid)
@@ -139,20 +161,32 @@ unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr);
 
 /* inrerrupt routines */
 
-int ps3_alloc_io_irq(unsigned int interrupt_id, unsigned int *virq);
+enum ps3_cpu_binding {
+       PS3_BINDING_CPU_ANY = -1,
+       PS3_BINDING_CPU_0 = 0,
+       PS3_BINDING_CPU_1 = 1,
+};
+
+int ps3_alloc_io_irq(enum ps3_cpu_binding cpu, unsigned int interrupt_id,
+       unsigned int *virq);
 int ps3_free_io_irq(unsigned int virq);
-int ps3_alloc_event_irq(unsigned int *virq);
+int ps3_alloc_event_irq(enum ps3_cpu_binding cpu, unsigned int *virq);
 int ps3_free_event_irq(unsigned int virq);
 int ps3_send_event_locally(unsigned int virq);
-int ps3_connect_event_irq(const struct ps3_device_id *did,
-       unsigned int interrupt_id, unsigned int *virq);
+int ps3_connect_event_irq(enum ps3_cpu_binding cpu,
+       const struct ps3_device_id *did, unsigned int interrupt_id,
+       unsigned int *virq);
 int ps3_disconnect_event_irq(const struct ps3_device_id *did,
        unsigned int interrupt_id, unsigned int virq);
-int ps3_alloc_vuart_irq(void* virt_addr_bmp, unsigned int *virq);
-int ps3_free_vuart_irq(unsigned int virq);
-int ps3_alloc_spe_irq(unsigned long spe_id, unsigned int class,
+int ps3_alloc_vuart_irq(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
        unsigned int *virq);
+int ps3_free_vuart_irq(unsigned int virq);
+int ps3_alloc_spe_irq(enum ps3_cpu_binding cpu, unsigned long spe_id,
+       unsigned int class, unsigned int *virq);
 int ps3_free_spe_irq(unsigned int virq);
+int ps3_alloc_irq(enum ps3_cpu_binding cpu, unsigned long outlet,
+       unsigned int *virq);
+int ps3_free_irq(unsigned int virq);
 
 /* lv1 result codes */
 
@@ -247,146 +281,6 @@ static inline const char* ps3_result(int result)
 #endif
 }
 
-/* repository bus info */
-
-enum ps3_bus_type {
-       PS3_BUS_TYPE_SB = 4,
-       PS3_BUS_TYPE_STORAGE = 5,
-};
-
-enum ps3_dev_type {
-       PS3_DEV_TYPE_SB_GELIC = 3,
-       PS3_DEV_TYPE_SB_USB = 4,
-       PS3_DEV_TYPE_SB_GPIO = 6,
-};
-
-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_type(unsigned int bus_index,
-       enum ps3_bus_type *bus_type);
-int ps3_repository_read_bus_num_dev(unsigned int bus_index,
-       unsigned int *num_dev);
-
-/* repository bus device info */
-
-enum ps3_interrupt_type {
-       PS3_INTERRUPT_TYPE_EVENT_PORT = 2,
-       PS3_INTERRUPT_TYPE_SB_OHCI = 3,
-       PS3_INTERRUPT_TYPE_SB_EHCI = 4,
-       PS3_INTERRUPT_TYPE_OTHER = 5,
-};
-
-enum ps3_region_type {
-       PS3_REGION_TYPE_SB_OHCI = 3,
-       PS3_REGION_TYPE_SB_EHCI = 4,
-       PS3_REGION_TYPE_SB_GPIO = 5,
-};
-
-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);
-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,
-       unsigned int dev_index, unsigned int intr_index,
-       enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id);
-int ps3_repository_read_dev_reg_type(unsigned int bus_index,
-       unsigned int dev_index, unsigned int reg_index,
-       enum ps3_region_type *reg_type);
-int ps3_repository_read_dev_reg_addr(unsigned int bus_index,
-       unsigned int dev_index, unsigned int reg_index, u64 *bus_addr,
-       u64 *len);
-int ps3_repository_read_dev_reg(unsigned int bus_index,
-       unsigned int dev_index, unsigned int reg_index,
-       enum ps3_region_type *reg_type, u64 *bus_addr, u64 *len);
-
-/* repository bus enumerators */
-
-struct ps3_repository_device {
-       unsigned int bus_index;
-       unsigned int dev_index;
-       struct ps3_device_id did;
-};
-
-int ps3_repository_find_device(enum ps3_bus_type bus_type,
-       enum ps3_dev_type dev_type,
-       const struct ps3_repository_device *start_dev,
-       struct ps3_repository_device *dev);
-static inline int ps3_repository_find_first_device(
-       enum ps3_bus_type bus_type, enum ps3_dev_type dev_type,
-       struct ps3_repository_device *dev)
-{
-       return ps3_repository_find_device(bus_type, dev_type, NULL, dev);
-}
-int ps3_repository_find_interrupt(const struct ps3_repository_device *dev,
-       enum ps3_interrupt_type intr_type, unsigned int *interrupt_id);
-int ps3_repository_find_region(const struct ps3_repository_device *dev,
-       enum ps3_region_type reg_type, u64 *bus_addr, u64 *len);
-
-/* repository block device info */
-
-int ps3_repository_read_dev_port(unsigned int bus_index,
-       unsigned int dev_index, u64 *port);
-int ps3_repository_read_dev_blk_size(unsigned int bus_index,
-       unsigned int dev_index, u64 *blk_size);
-int ps3_repository_read_dev_num_blocks(unsigned int bus_index,
-       unsigned int dev_index, u64 *num_blocks);
-int ps3_repository_read_dev_num_regions(unsigned int bus_index,
-       unsigned int dev_index, unsigned int *num_regions);
-int ps3_repository_read_dev_region_id(unsigned int bus_index,
-       unsigned int dev_index, unsigned int region_index,
-       unsigned int *region_id);
-int ps3_repository_read_dev_region_size(unsigned int bus_index,
-       unsigned int dev_index, unsigned int region_index, u64 *region_size);
-int ps3_repository_read_dev_region_start(unsigned int bus_index,
-       unsigned int dev_index, unsigned int region_index, u64 *region_start);
-
-/* repository 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_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);
-int ps3_repository_read_mm_info(u64 *rm_base, u64 *rm_size,
-       u64 *region_total);
-
-/* repository pme info */
-
-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_tb_freq(u64 node_id, u64 *tb_freq);
-int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq);
-
-/* repository 'Other OS' area */
-
-int ps3_repository_read_boot_dat_addr(u64 *lpar_addr);
-int ps3_repository_read_boot_dat_size(unsigned int *size);
-int ps3_repository_read_boot_dat_info(u64 *lpar_addr, unsigned int *size);
-
-/* repository spu info */
-
-/**
- * enum spu_resource_type - Type of spu resource.
- * @spu_resource_type_shared: Logical spu is shared with other partions.
- * @spu_resource_type_exclusive: Logical spu is not shared with other partions.
- *
- * Returned by ps3_repository_read_spu_resource_id().
- */
-
-enum ps3_spu_resource_type {
-       PS3_SPU_RESOURCE_TYPE_SHARED = 0,
-       PS3_SPU_RESOURCE_TYPE_EXCLUSIVE = 0x8000000000000000UL,
-};
-
-int ps3_repository_read_num_spu_reserved(unsigned int *num_spu_reserved);
-int ps3_repository_read_num_spu_resource_id(unsigned int *num_resource_id);
-int ps3_repository_read_spu_resource_id(unsigned int res_index,
-       enum ps3_spu_resource_type* resource_type, unsigned int *resource_id);
-
-
 /* system bus routines */
 
 enum ps3_match_id {
@@ -459,4 +353,39 @@ static inline void *ps3_system_bus_get_driver_data(
 
 extern struct bus_type ps3_system_bus_type;
 
+/* vuart routines */
+
+struct ps3_vuart_stats {
+       unsigned long bytes_written;
+       unsigned long bytes_read;
+       unsigned long tx_interrupts;
+       unsigned long rx_interrupts;
+       unsigned long disconnect_interrupts;
+};
+
+/**
+ * struct ps3_vuart_port_device - a device on a vuart port
+ */
+
+struct ps3_vuart_port_device {
+       enum ps3_match_id match_id;
+       struct device core;
+
+       /* private driver variables */
+       unsigned int port_number;
+       u64 interrupt_mask;
+       struct {
+               spinlock_t lock;
+               struct list_head head;
+       } tx_list;
+       struct {
+               unsigned long bytes_held;
+               spinlock_t lock;
+               struct list_head head;
+       } rx_list;
+       struct ps3_vuart_stats stats;
+};
+
+int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
+
 #endif
index a3631b15754ca39bfd49984d631635e56b8f8cf2..0d7f0164ed814ee85cd26b3a2e4f22bbf87ed517 100644 (file)
 #define SPRN_TBWU      0x11D   /* Time Base Upper Register (super, R/W) */
 #define SPRN_SPURR     0x134   /* Scaled PURR */
 #define SPRN_HIOR      0x137   /* 970 Hypervisor interrupt offset */
+#define SPRN_LPCR      0x13E   /* LPAR Control Register */
 #define SPRN_DBAT0L    0x219   /* Data BAT 0 Lower Register */
 #define SPRN_DBAT0U    0x218   /* Data BAT 0 Upper Register */
 #define SPRN_DBAT1L    0x21B   /* Data BAT 1 Lower Register */
 #define SPRN_HSRR0     0x13A   /* Save/Restore Register 0 */
 #define SPRN_HSRR1     0x13B   /* Save/Restore Register 1 */
 
+#define SPRN_TBCTL     0x35f   /* PA6T Timebase control register */
+#define   TBCTL_FREEZE         0x0000000000000000ull /* Freeze all tbs */
+#define   TBCTL_RESTART                0x0000000100000000ull /* Restart all tbs */
+#define   TBCTL_UPDATE_UPPER   0x0000000200000000ull /* Set upper 32 bits */
+#define   TBCTL_UPDATE_LOWER   0x0000000300000000ull /* Set lower 32 bits */
+
 #ifndef SPRN_SVR
 #define SPRN_SVR       0x11E   /* System Version Register */
 #endif
 #define SPRN_SIAR      780
 #define SPRN_SDAR      781
 
+#define PA6T_SPRN_PMC0 787
+#define PA6T_SPRN_PMC1 788
+#define PA6T_SPRN_PMC2 789
+#define PA6T_SPRN_PMC3 790
+#define PA6T_SPRN_PMC4 791
+#define PA6T_SPRN_PMC5 792
+
 #else /* 32-bit */
 #define SPRN_MMCR0     952     /* Monitor Mode Control Register 0 */
 #define   MMCR0_FC     0x80000000UL /* freeze counters */
index 20ea7c70bc38105a77cefdf8c61c4e508f69271b..01717f266dc9f1ba07b6cf6723eedfcf17830229 100644 (file)
@@ -75,6 +75,7 @@ extern cpumask_t cpu_sibling_map[NR_CPUS];
 void smp_init_iSeries(void);
 void smp_init_pSeries(void);
 void smp_init_cell(void);
+void smp_init_celleb(void);
 void smp_setup_cpu_maps(void);
 
 extern int __cpu_disable(void);
index 3d90264e9d367b50a5c543bb66265ddc7a6ccd87..b634e16575f2e5586f9e42ecf22dac4dd987ced5 100644 (file)
 
 struct spu_context;
 struct spu_runqueue;
+struct device_node;
 
 struct spu {
        const char *name;
@@ -142,7 +143,19 @@ struct spu {
        char irq_c1[8];
        char irq_c2[8];
 
+       u64 spe_id;
+
        void* pdata; /* platform private data */
+
+       /* of based platforms only */
+       struct device_node *devnode;
+
+       /* native only */
+       struct spu_priv1 __iomem *priv1;
+
+       /* beat only */
+       u64 shadow_int_mask_RW[3];
+
        struct sys_device sysdev;
 };
 
index 69dcb0c53884f64f82960239d87462257cbc3e17..7e78f6a1ab8b0e9fe56606ff945aaa74beef394e 100644 (file)
@@ -206,6 +206,8 @@ spu_destroy_spu (struct spu *spu)
  */
 
 extern const struct spu_priv1_ops spu_priv1_mmio_ops;
+extern const struct spu_priv1_ops spu_priv1_beat_ops;
+
 extern const struct spu_management_ops spu_management_of_ops;
 
 #endif /* __KERNEL__ */
index 630a9889c07c0d735c0c6dbed91f34a64ecd5489..f593b0f9b6278ee5625173931bb19eb72fb3d894 100644 (file)
@@ -21,6 +21,7 @@ struct pt_regs;
  */
 #define IS_MTMSRD(instr)       (((instr) & 0xfc0007be) == 0x7c000124)
 #define IS_RFID(instr)         (((instr) & 0xfc0007fe) == 0x4c000024)
+#define IS_RFI(instr)          (((instr) & 0xfc0007fe) == 0x4c000064)
 
 /* Emulate instructions that cause a transfer of control. */
 extern int emulate_step(struct pt_regs *regs, unsigned int instr);
index 4cff977ad5266c5129ed5eca9114e38a55d258cf..3fd57c048f5908cec68aa96e20c1dc7b9a7b2dab 100644 (file)
@@ -39,6 +39,8 @@ extern void generic_calibrate_decr(void);
 extern void wakeup_decrementer(void);
 extern void snapshot_timebase(void);
 
+extern void set_dec_cpu6(unsigned int val);
+
 /* Some sane defaults: 125 MHz timebase, 1GHz processor */
 extern unsigned long ppc_proc_freq;
 #define DEFAULT_PROC_FREQ      (DEFAULT_TB_FREQ * 8)
index 55e57844fa789422f88858505f669a549809987f..4cbc313aa02a10dedf3d0ae0503504bba8b37860 100644 (file)
@@ -41,9 +41,11 @@ extern void __init udbg_early_init(void);
 extern void __init udbg_init_debug_lpar(void);
 extern void __init udbg_init_pmac_realmode(void);
 extern void __init udbg_init_maple_realmode(void);
+extern void __init udbg_init_pas_realmode(void);
 extern void __init udbg_init_iseries(void);
 extern void __init udbg_init_rtas_panel(void);
 extern void __init udbg_init_rtas_console(void);
+extern void __init udbg_init_debug_beat(void);
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */
index 7b06b4e6bf30d3fe267834130a9f6ee02d9d0b01..4f99df1bafd7ec6ad46df6147b533f983bcb27fe 100644 (file)
@@ -77,6 +77,7 @@ extern int cpm_dpfree(uint offset);
 extern uint cpm_dpalloc_fixed(uint offset, uint size, uint align);
 extern void cpm_dpdump(void);
 extern void *cpm_dpram_addr(uint offset);
+extern uint cpm_dpram_phys(u8* addr);
 extern void cpm_setbrg(uint brg, uint rate);
 
 extern uint m8xx_cpm_hostalloc(uint size);
index 499c14691c71dfe7ca8a9c043def011438d099af..7a64ede53bb6fd7ec5efde9852b7619b2d96e96a 100644 (file)
@@ -15,6 +15,7 @@
 #define __ASM_IBM4XX_H__
 
 #include <asm/types.h>
+#include <asm/dcr.h>
 
 #ifdef CONFIG_40x
 
diff --git a/include/asm-ppc/m48t35.h b/include/asm-ppc/m48t35.h
deleted file mode 100644 (file)
index a5277ea..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Registers for the SGS-Thomson M48T35 Timekeeper RAM chip
- *  and
- *  Registers for the SGS-Thomson M48T37 Timekeeper RAM chip
- *  The 37 is the 35 plus alarm and century thus the offsets
- *  are shifted by the extra registers.
- */
-
-#ifndef __PPC_M48T35_H
-#define __PPC_M48T35_H
-
-/* RTC offsets */
-#define M48T35_RTC_FLAGS       (-8)    /* the negative regs are really T37 only */
-#define M48T35_RTC_CENTURY     (-7)
-#define M48T35_RTC_AL_SEC      (-6)
-#define M48T35_RTC_AL_MIN      (-5)
-#define M48T35_RTC_AL_HRS      (-4)
-#define M48T35_RTC_AL_DOM      (-3)
-#define M48T35_RTC_INTERRUPT   (-2)
-#define M48T35_RTC_WATCHDOG    (-1)
-#define M48T35_RTC_CONTROL     0       /* T35 starts here */
-#define M48T35_RTC_SECONDS     1
-#define M48T35_RTC_MINUTES     2
-#define M48T35_RTC_HOURS       3
-#define M48T35_RTC_DAY         4
-#define M48T35_RTC_DOM         5
-#define M48T35_RTC_MONTH       6
-#define M48T35_RTC_YEAR                7
-
-/* this way help us know which bits go with which regs */
-#define M48T35_RTC_FLAGS_BL           0x10
-#define M48T35_RTC_FLAGS_AF           0x40
-#define M48T35_RTC_FLAGS_WDF          0x80
-
-#define M48T35_RTC_INTERRUPT_AFE       0x80
-#define M48T35_RTC_INTERRUPT_ABE       0x20
-#define M48T35_RTC_INTERRUPT_ALL       (M48T35_RTC_INTERRUPT_AFE|M48T35_RTC_INTERRUPT_ABE)
-
-#define M48T35_RTC_WATCHDOG_RB         0x03
-#define M48T35_RTC_WATCHDOG_BMB        0x7c
-#define M48T35_RTC_WATCHDOG_WDS        0x80
-#define M48T35_RTC_WATCHDOG_ALL        (M48T35_RTC_WATCHDOG_RB|M48T35_RTC_WATCHDOG_BMB|M48T35_RTC_W)
-
-#define M48T35_RTC_CONTROL_WRITE       0x80
-#define M48T35_RTC_CONTROL_READ        0x40
-#define M48T35_RTC_CONTROL_CAL_SIGN    0x20
-#define M48T35_RTC_CONTROL_CAL_VALUE   0x1f
-#define M48T35_RTC_CONTROL_LOCKED      (M48T35_RTC_WRITE|M48T35_RTC_READ)
-#define M48T35_RTC_CONTROL_CALIBRATION (M48T35_RTC_CONTROL_CAL_SIGN|M48T35_RTC_CONTROL_CAL_VALUE)
-
-#define M48T35_RTC_SECONDS_SEC_1       0x0f
-#define M48T35_RTC_SECONDS_SEC_10      0x70
-#define M48T35_RTC_SECONDS_ST          0x80
-#define M48T35_RTC_SECONDS_SEC_ALL     (M48T35_RTC_SECONDS_SEC_1|M48T35_RTC_SECONDS_SEC_10)
-
-#define M48T35_RTC_MINUTES_MIN_1       0x0f
-#define M48T35_RTC_MINUTES_MIN_10      0x70
-#define M48T35_RTC_MINUTES_MIN_ALL     (M48T35_RTC_MINUTES_MIN_1|M48T35_RTC_MINUTES_MIN_10)
-
-#define M48T35_RTC_HOURS_HRS_1         0x0f
-#define M48T35_RTC_HOURS_HRS_10        0x30
-#define M48T35_RTC_HOURS_HRS_ALL       (M48T35_RTC_HOURS_HRS_1|M48T35_RTC_HOURS_HRS_10)
-
-#define M48T35_RTC_DAY_DAY_1           0x03
-#define M48T35_RTC_DAY_FT              0x40
-
-#define M48T35_RTC_ALARM_OFF           0x00
-#define M48T35_RTC_WATCHDOG_OFF        0x00
-
-
-/* legacy */
-#define M48T35_RTC_SET      0x80
-#define M48T35_RTC_STOPPED  0x80
-#define M48T35_RTC_READ     0x40
-
-
-#endif
index a263fc1e65c41c6990cfc3f0a3ff93629c557778..82948ed2744a78f7f29e2b4423bed318b71c72af 100644 (file)
@@ -9,8 +9,6 @@
 #ifndef __ASM_PPC_REG_BOOKE_H__
 #define __ASM_PPC_REG_BOOKE_H__
 
-#include <asm/dcr.h>
-
 #ifndef __ASSEMBLY__
 /* Performance Monitor Registers */
 #define mfpmr(rn)      ({unsigned int rval; \
index 8a59f8871f32173449216a2b2aa233d5dfc2d071..8fc1b546613dc34e81fa1bcceb9e6c8694de1bed 100644 (file)
@@ -11,8 +11,6 @@
 #include <platforms/ev64260.h>
 #elif defined(CONFIG_CHESTNUT)
 #include <platforms/chestnut.h>
-#elif defined(CONFIG_GEMINI)
-#include <platforms/gemini_serial.h>
 #elif defined(CONFIG_POWERPMC250)
 #include <platforms/powerpmc250.h>
 #elif defined(CONFIG_LOPEC)
index d02e1a547a7e9deb1e8bc21857780bdc2c7693c0..99922bedfcc90acaef644369aee3d5e126b7d46d 100644 (file)
@@ -43,6 +43,17 @@ int __ilog2_u64(u64 n)
 }
 #endif
 
+/*
+ *  Determine whether some value is a power of two, where zero is
+ * *not* considered a power of two.
+ */
+
+static inline __attribute__((const))
+bool is_power_of_2(unsigned long n)
+{
+       return (n != 0 && ((n & (n - 1)) == 0));
+}
+
 /*
  * round up to nearest power of two
  */
index 166a2e58c2871da6dc0de55a3498ae075f869b65..389ccf858d378013f7cc86f94e51db5df46f9991 100644 (file)
@@ -98,12 +98,16 @@ struct sysdev_attribute {
 };
 
 
-#define SYSDEV_ATTR(_name,_mode,_show,_store)          \
-struct sysdev_attribute attr_##_name = {                       \
-       .attr = {.name = __stringify(_name), .mode = _mode },   \
+#define _SYSDEV_ATTR(_name,_mode,_show,_store)                 \
+{                                                              \
+       .attr = { .name = __stringify(_name), .mode = _mode,    \
+                .owner = THIS_MODULE },                        \
        .show   = _show,                                        \
        .store  = _store,                                       \
-};
+}
+
+#define SYSDEV_ATTR(_name,_mode,_show,_store)          \
+struct sysdev_attribute attr_##_name = _SYSDEV_ATTR(_name,_mode,_show,_store);
 
 extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
 extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);