Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Jul 2011 05:59:39 +0000 (22:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Jul 2011 05:59:39 +0000 (22:59 -0700)
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (99 commits)
  drivers/virt: add missing linux/interrupt.h to fsl_hypervisor.c
  powerpc/85xx: fix mpic configuration in CAMP mode
  powerpc: Copy back TIF flags on return from softirq stack
  powerpc/64: Make server perfmon only built on ppc64 server devices
  powerpc/pseries: Fix hvc_vio.c build due to recent changes
  powerpc: Exporting boot_cpuid_phys
  powerpc: Add CFAR to oops output
  hvc_console: Add kdb support
  powerpc/pseries: Fix hvterm_raw_get_chars to accept < 16 chars, fixing xmon
  powerpc/irq: Quieten irq mapping printks
  powerpc: Enable lockup and hung task detectors in pseries and ppc64 defeconfigs
  powerpc: Add mpt2sas driver to pseries and ppc64 defconfig
  powerpc: Disable IRQs off tracer in ppc64 defconfig
  powerpc: Sync pseries and ppc64 defconfigs
  powerpc/pseries/hvconsole: Fix dropped console output
  hvc_console: Improve tty/console put_chars handling
  powerpc/kdump: Fix timeout in crash_kexec_wait_realmode
  powerpc/mm: Fix output of total_ram.
  powerpc/cpufreq: Add cpufreq driver for Momentum Maple boards
  powerpc: Correct annotations of pmu registration functions
  ...

Fix up trivial Kconfig/Makefile conflicts in arch/powerpc, drivers, and
drivers/cpufreq

153 files changed:
Documentation/ioctl/ioctl-number.txt
Documentation/kernel-parameters.txt
MAINTAINERS
arch/powerpc/Kconfig
arch/powerpc/Kconfig.debug
arch/powerpc/Makefile
arch/powerpc/boot/dts/canyonlands.dts
arch/powerpc/boot/dts/glacier.dts
arch/powerpc/boot/dts/mpc8568mds.dts
arch/powerpc/boot/dts/p1010rdb.dts [new file with mode: 0644]
arch/powerpc/boot/dts/p1010si.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/p1022ds.dts
arch/powerpc/boot/dts/p1023rds.dts [new file with mode: 0644]
arch/powerpc/boot/dts/p2040rdb.dts [new file with mode: 0644]
arch/powerpc/boot/dts/p2040si.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/p3041ds.dts [new file with mode: 0644]
arch/powerpc/boot/dts/p3041si.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/p4080ds.dts
arch/powerpc/boot/dts/p4080si.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/p5020ds.dts [new file with mode: 0644]
arch/powerpc/boot/dts/p5020si.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/sequoia.dts
arch/powerpc/boot/dts/socrates.dts
arch/powerpc/boot/dts/taishan.dts
arch/powerpc/boot/dts/tqm8540.dts
arch/powerpc/boot/dts/tqm8548-bigflash.dts
arch/powerpc/boot/dts/tqm8548.dts
arch/powerpc/boot/dts/tqm8560.dts
arch/powerpc/boot/dts/xpedite5200.dts
arch/powerpc/boot/dts/xpedite5200_xmon.dts
arch/powerpc/boot/treeboot-iss4xx.c
arch/powerpc/configs/44x/iss476-smp_defconfig
arch/powerpc/configs/85xx/p1023rds_defconfig [new file with mode: 0644]
arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig
arch/powerpc/configs/corenet32_smp_defconfig [new file with mode: 0644]
arch/powerpc/configs/corenet64_smp_defconfig [new file with mode: 0644]
arch/powerpc/configs/e55xx_smp_defconfig [deleted file]
arch/powerpc/configs/mpc85xx_defconfig
arch/powerpc/configs/mpc85xx_smp_defconfig
arch/powerpc/configs/ppc64_defconfig
arch/powerpc/configs/pseries_defconfig
arch/powerpc/include/asm/dbell.h
arch/powerpc/include/asm/ehv_pic.h [new file with mode: 0644]
arch/powerpc/include/asm/epapr_hcalls.h [new file with mode: 0644]
arch/powerpc/include/asm/exception-64e.h
arch/powerpc/include/asm/fsl_hcalls.h [new file with mode: 0644]
arch/powerpc/include/asm/hvsi.h [new file with mode: 0644]
arch/powerpc/include/asm/irq.h
arch/powerpc/include/asm/jump_label.h [new file with mode: 0644]
arch/powerpc/include/asm/mmu.h
arch/powerpc/include/asm/pSeries_reconfig.h
arch/powerpc/include/asm/paca.h
arch/powerpc/include/asm/pgtable-ppc64.h
arch/powerpc/include/asm/processor.h
arch/powerpc/include/asm/reg.h
arch/powerpc/include/asm/setup.h
arch/powerpc/include/asm/smp.h
arch/powerpc/include/asm/udbg.h
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/crash.c
arch/powerpc/kernel/dma.c
arch/powerpc/kernel/exceptions-64e.S
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/head_booke.h
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/idle_e500.S
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/jump_label.c [new file with mode: 0644]
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/mpc7450-pmu.c
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/perf_event.c
arch/powerpc/kernel/power4-pmu.c
arch/powerpc/kernel/power5+-pmu.c
arch/powerpc/kernel/power5-pmu.c
arch/powerpc/kernel/power6-pmu.c
arch/powerpc/kernel/power7-pmu.c
arch/powerpc/kernel/ppc970-pmu.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/udbg.c
arch/powerpc/mm/44x_mmu.c
arch/powerpc/mm/init_32.c
arch/powerpc/mm/init_64.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/tlb_hash32.c
arch/powerpc/mm/tlb_low_64e.S
arch/powerpc/mm/tlb_nohash.c
arch/powerpc/platforms/85xx/Kconfig
arch/powerpc/platforms/85xx/Makefile
arch/powerpc/platforms/85xx/corenet_ds.c
arch/powerpc/platforms/85xx/mpc85xx_ds.c
arch/powerpc/platforms/85xx/mpc85xx_rdb.c
arch/powerpc/platforms/85xx/p1010rdb.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/p1022_ds.c
arch/powerpc/platforms/85xx/p1023_rds.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/p2040_rdb.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/p3041_ds.c
arch/powerpc/platforms/85xx/p4080_ds.c
arch/powerpc/platforms/85xx/p5020_ds.c
arch/powerpc/platforms/85xx/smp.c
arch/powerpc/platforms/86xx/mpc8610_hpcd.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/Kconfig.cputype
arch/powerpc/platforms/iseries/smp.c
arch/powerpc/platforms/maple/setup.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/platforms/pseries/dlpar.c
arch/powerpc/platforms/pseries/hotplug-cpu.c
arch/powerpc/platforms/pseries/hotplug-memory.c
arch/powerpc/platforms/pseries/hvconsole.c
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/pseries.h
arch/powerpc/platforms/pseries/reconfig.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/platforms/wsp/smp.c
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/ehv_pic.c [new file with mode: 0644]
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/fsl_soc.h
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/ppc4xx_pci.c
drivers/Kconfig
drivers/Makefile
drivers/base/platform.c
drivers/cpufreq/Kconfig
drivers/cpufreq/Kconfig.powerpc [new file with mode: 0644]
drivers/cpufreq/Makefile
drivers/cpufreq/maple-cpufreq.c [new file with mode: 0644]
drivers/of/platform.c
drivers/tty/hvc/Kconfig
drivers/tty/hvc/Makefile
drivers/tty/hvc/hvc_console.c
drivers/tty/hvc/hvc_console.h
drivers/tty/hvc/hvc_vio.c
drivers/tty/hvc/hvsi.c
drivers/tty/hvc/hvsi_lib.c [new file with mode: 0644]
drivers/virt/Kconfig [new file with mode: 0644]
drivers/virt/Makefile [new file with mode: 0644]
drivers/virt/fsl_hypervisor.c [new file with mode: 0644]
include/linux/Kbuild
include/linux/fsl_hypervisor.h [new file with mode: 0644]
include/linux/platform_device.h

index 3a46e360496dd6798fbcf9f1e59e4eec9728e5d5..72ba8d51dbc15f10b9ff1089b92c7114e75303d3 100644 (file)
@@ -301,6 +301,7 @@ Code  Seq#(hex)     Include File            Comments
                                        <mailto:rusty@rustcorp.com.au>
 0xAE   all     linux/kvm.h             Kernel-based Virtual Machine
                                        <mailto:kvm@vger.kernel.org>
+0xAF   00-1F   linux/fsl_hypervisor.h  Freescale hypervisor
 0xB0   all     RATIO devices           in development:
                                        <mailto:vgo@ratio.de>
 0xB1   00-1F   PPPoX                   <mailto:mostrows@styx.uwaterloo.ca>
index 40cc653984ee7b5cc13d7fc105fdd3ae744fd2e6..2d1e14ca35fd5fbf11a59770d81546264f354aa2 100644 (file)
@@ -2526,6 +2526,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        <port#>,<js1>,<js2>,<js3>,<js4>,<js5>,<js6>,<js7>
                        See also Documentation/input/joystick-parport.txt
 
+       udbg-immortal   [PPC] When debugging early kernel crashes that
+                       happen after console_init() and before a proper 
+                       console driver takes over, this boot options might
+                       help "seeing" what's going on.
+
        uhash_entries=  [KNL,NET]
                        Set number of hash buckets for UDP/UDP-Lite connections
 
index 846f70ddc8dbd354cf48c70ab885c51e4b67f4b3..f5474304e7ba284e7b16295b99d9a1d0547164ef 100644 (file)
@@ -3895,7 +3895,7 @@ F:        arch/powerpc/platforms/512x/
 F:     arch/powerpc/platforms/52xx/
 
 LINUX FOR POWERPC EMBEDDED PPC4XX
-M:     Josh Boyer <jwboyer@linux.vnet.ibm.com>
+M:     Josh Boyer <jwboyer@gmail.com>
 M:     Matt Porter <mporter@kernel.crashing.org>
 W:     http://www.penguinppc.org/
 L:     linuxppc-dev@lists.ozlabs.org
@@ -3927,6 +3927,7 @@ W:        http://www.penguinppc.org/
 L:     linuxppc-dev@lists.ozlabs.org
 S:     Maintained
 F:     arch/powerpc/platforms/83xx/
+F:     arch/powerpc/platforms/85xx/
 
 LINUX FOR POWERPC PA SEMI PWRFICIENT
 M:     Olof Johansson <olof@lixom.net>
index cdf7a0a644064c3ec7a1d94ee6412d88e963980c..374c475e56a3238bf5e55e161cd13d44a468d7be 100644 (file)
@@ -135,6 +135,7 @@ config PPC
        select HAVE_RCU_TABLE_FREE if SMP
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_BPF_JIT if (PPC64 && NET)
+       select HAVE_ARCH_JUMP_LABEL
 
 config EARLY_PRINTK
        bool
@@ -842,7 +843,7 @@ config LOWMEM_CAM_NUM
 
 config RELOCATABLE
        bool "Build a relocatable kernel (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && ADVANCED_OPTIONS && FLATMEM && FSL_BOOKE
+       depends on EXPERIMENTAL && ADVANCED_OPTIONS && FLATMEM && (FSL_BOOKE || PPC_47x)
        help
          This builds a kernel image that is capable of running at the
          location the kernel is loaded at (some alignment restrictions may
index e72dcf6a421d8581cc0e3b7fd231b2b3ebcf644c..067cb8480747104082d9d79aea10a1d71a33eb18 100644 (file)
@@ -167,6 +167,13 @@ config PPC_EARLY_DEBUG_LPAR
          Select this to enable early debugging for a machine with a HVC
          console on vterm 0.
 
+config PPC_EARLY_DEBUG_LPAR_HVSI
+       bool "LPAR HVSI Console"
+       depends on PPC_PSERIES
+       help
+         Select this to enable early debugging for a machine with a HVSI
+         console on a specified vterm.
+
 config PPC_EARLY_DEBUG_G5
        bool "Apple G5"
        depends on PPC_PMAC64
@@ -253,6 +260,14 @@ config PPC_EARLY_DEBUG_WSP
 
 endchoice
 
+config PPC_EARLY_DEBUG_HVSI_VTERMNO
+       hex "vterm number to use with early debug HVSI"
+       depends on PPC_EARLY_DEBUG_LPAR_HVSI
+       default "0x30000000"
+       help
+         You probably want 0x30000000 for your first serial port and
+         0x30000001 for your second one
+
 config PPC_EARLY_DEBUG_44x_PHYSLOW
        hex "Low 32 bits of early debug UART physical address"
        depends on PPC_EARLY_DEBUG_44x
index b94740f36b1a9f9e3378027b51bf080efa6a558e..57af16edc19231ad0b4511f30174607a57711494 100644 (file)
@@ -67,7 +67,7 @@ LDFLAGS_vmlinux-yy := -Bstatic
 LDFLAGS_vmlinux-$(CONFIG_PPC64)$(CONFIG_RELOCATABLE) := -pie
 LDFLAGS_vmlinux        := $(LDFLAGS_vmlinux-yy)
 
-CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=none  -mcall-aixdesc
+CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=no -mcall-aixdesc
 CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple
 KBUILD_CPPFLAGS        += -Iarch/$(ARCH)
 KBUILD_AFLAGS  += -Iarch/$(ARCH)
index 22dd6ae84da0b08de2cefd98856d1ee4da308edb..3dc75deafbb3482e252e6e11ae290cf7e3c92406 100644 (file)
                        interrupts = <0x1d 0x4>;
                };
 
+               HWRNG: hwrng@110000 {
+                       compatible = "amcc,ppc460ex-rng", "ppc4xx-rng";
+                       reg = <4 0x00110000 0x50>;
+               };
+
                MAL0: mcmal {
                        compatible = "ibm,mcmal-460ex", "ibm,mcmal2";
                        dcr-reg = <0x180 0x062>;
index e618fc4cbc9e911e76d56050978b37cc170beb0c..2000060386d7c009572ef3dc204634a08bf3be25 100644 (file)
                };
 
                CRYPTO: crypto@180000 {
-                       compatible = "amcc,ppc460gt-crypto", "amcc,ppc4xx-crypto";
+                       compatible = "amcc,ppc460gt-crypto", "amcc,ppc460ex-crypto",
+                               "amcc,ppc4xx-crypto";
                        reg = <4 0x00180000 0x80400>;
                        interrupt-parent = <&UIC0>;
                        interrupts = <0x1d 0x4>;
                };
 
+               HWRNG: hwrng@110000 {
+                       compatible = "amcc,ppc460ex-rng", "ppc4xx-rng";
+                       reg = <4 0x00110000 0x50>;
+               };
+
                MAL0: mcmal {
                        compatible = "ibm,mcmal-460gt", "ibm,mcmal2";
                        dcr-reg = <0x180 0x062>;
index 30cf0e098bb96f9d1aaa70c56a12fccabe17b694..647daf8e7291cf0562b3ad5bf72b8df424cab49f 100644 (file)
@@ -60,6 +60,8 @@
                compatible = "fsl,mpc8568-localbus", "fsl,pq3-localbus",
                             "simple-bus";
                reg = <0xe0005000 0x1000>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <0x0 0x0 0xfe000000 0x02000000
                          0x1 0x0 0xf8000000 0x00008000
diff --git a/arch/powerpc/boot/dts/p1010rdb.dts b/arch/powerpc/boot/dts/p1010rdb.dts
new file mode 100644 (file)
index 0000000..6b33b73
--- /dev/null
@@ -0,0 +1,280 @@
+/*
+ * P1010 RDB Device Tree Source
+ *
+ * Copyright 2011 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.
+ */
+
+/include/ "p1010si.dtsi"
+
+/ {
+       model = "fsl,P1010RDB";
+       compatible = "fsl,P1010RDB";
+
+       aliases {
+               serial0 = &serial0;
+               serial1 = &serial1;
+               ethernet0 = &enet0;
+               ethernet1 = &enet1;
+               ethernet2 = &enet2;
+               pci0 = &pci0;
+               pci1 = &pci1;
+       };
+
+       memory {
+               device_type = "memory";
+       };
+
+       ifc@ffe1e000 {
+               /* NOR, NAND Flashes and CPLD on board */
+               ranges = <0x0 0x0 0x0 0xee000000 0x02000000
+                         0x1 0x0 0x0 0xff800000 0x00010000
+                         0x3 0x0 0x0 0xffb00000 0x00000020>;
+
+               nor@0,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "cfi-flash";
+                       reg = <0x0 0x0 0x2000000>;
+                       bank-width = <2>;
+                       device-width = <1>;
+
+                       partition@40000 {
+                               /* 256KB for DTB Image */
+                               reg = <0x00040000 0x00040000>;
+                               label = "NOR DTB Image";
+                       };
+
+                       partition@80000 {
+                               /* 7 MB for Linux Kernel Image */
+                               reg = <0x00080000 0x00700000>;
+                               label = "NOR Linux Kernel Image";
+                       };
+
+                       partition@800000 {
+                               /* 20MB for JFFS2 based Root file System */
+                               reg = <0x00800000 0x01400000>;
+                               label = "NOR JFFS2 Root File System";
+                       };
+
+                       partition@1f00000 {
+                               /* This location must not be altered  */
+                               /* 512KB for u-boot Bootloader Image */
+                               /* 512KB for u-boot Environment Variables */
+                               reg = <0x01f00000 0x00100000>;
+                               label = "NOR U-Boot Image";
+                               read-only;
+                       };
+               };
+
+               nand@1,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,ifc-nand";
+                       reg = <0x1 0x0 0x10000>;
+
+                       partition@0 {
+                               /* This location must not be altered  */
+                               /* 1MB for u-boot Bootloader Image */
+                               reg = <0x0 0x00100000>;
+                               label = "NAND U-Boot Image";
+                               read-only;
+                       };
+
+                       partition@100000 {
+                               /* 1MB for DTB Image */
+                               reg = <0x00100000 0x00100000>;
+                               label = "NAND DTB Image";
+                       };
+
+                       partition@200000 {
+                               /* 4MB for Linux Kernel Image */
+                               reg = <0x00200000 0x00400000>;
+                               label = "NAND Linux Kernel Image";
+                       };
+
+                       partition@600000 {
+                               /* 4MB for Compressed Root file System Image */
+                               reg = <0x00600000 0x00400000>;
+                               label = "NAND Compressed RFS Image";
+                       };
+
+                       partition@a00000 {
+                               /* 15MB for JFFS2 based Root file System */
+                               reg = <0x00a00000 0x00f00000>;
+                               label = "NAND JFFS2 Root File System";
+                       };
+
+                       partition@1900000 {
+                               /* 7MB for User Area */
+                               reg = <0x01900000 0x00700000>;
+                               label = "NAND User area";
+                       };
+               };
+
+               cpld@3,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p1010rdb-cpld";
+                       reg = <0x3 0x0 0x0000020>;
+                       bank-width = <1>;
+                       device-width = <1>;
+               };
+       };
+
+       soc@ffe00000 {
+               spi@7000 {
+                       flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "spansion,s25sl12801";
+                               reg = <0>;
+                               spi-max-frequency = <50000000>;
+
+                               partition@0 {
+                                       /* 1MB for u-boot Bootloader Image */
+                                       /* 1MB for Environment */
+                                       reg = <0x0 0x00100000>;
+                                       label = "SPI Flash U-Boot Image";
+                                       read-only;
+                               };
+
+                               partition@100000 {
+                                       /* 512KB for DTB Image */
+                                       reg = <0x00100000 0x00080000>;
+                                       label = "SPI Flash DTB Image";
+                               };
+
+                               partition@180000 {
+                                       /* 4MB for Linux Kernel Image */
+                                       reg = <0x00180000 0x00400000>;
+                                       label = "SPI Flash Linux Kernel Image";
+                               };
+
+                               partition@580000 {
+                                       /* 4MB for Compressed RFS Image */
+                                       reg = <0x00580000 0x00400000>;
+                                       label = "SPI Flash Compressed RFSImage";
+                               };
+
+                               partition@980000 {
+                                       /* 6.5MB for JFFS2 based RFS */
+                                       reg = <0x00980000 0x00680000>;
+                                       label = "SPI Flash JFFS2 RFS";
+                               };
+                       };
+               };
+
+               can0@1c000 {
+                       fsl,flexcan-clock-source = "platform";
+               };
+
+               can1@1d000 {
+                       fsl,flexcan-clock-source = "platform";
+               };
+
+               usb@22000 {
+                       phy_type = "utmi";
+               };
+
+               mdio@24000 {
+                       phy0: ethernet-phy@0 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <3 1>;
+                               reg = <0x1>;
+                       };
+
+                       phy1: ethernet-phy@1 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <2 1>;
+                               reg = <0x0>;
+                       };
+
+                       phy2: ethernet-phy@2 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <2 1>;
+                               reg = <0x2>;
+                       };
+               };
+
+               enet0: ethernet@b0000 {
+                       phy-handle = <&phy0>;
+                       phy-connection-type = "rgmii-id";
+               };
+
+               enet1: ethernet@b1000 {
+                       phy-handle = <&phy1>;
+                       tbi-handle = <&tbi0>;
+                       phy-connection-type = "sgmii";
+               };
+
+               enet2: ethernet@b2000 {
+                       phy-handle = <&phy2>;
+                       tbi-handle = <&tbi1>;
+                       phy-connection-type = "sgmii";
+               };
+       };
+
+       pci0: pcie@ffe09000 {
+               ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
+                         0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
+               pcie@0 {
+                       reg = <0x0 0x0 0x0 0x0 0x0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+                       interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
+                       interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0x0 0x0 0x1 &mpic 0x4 0x1
+                       0000 0x0 0x0 0x2 &mpic 0x5 0x1
+                       0000 0x0 0x0 0x3 &mpic 0x6 0x1
+                       0000 0x0 0x0 0x4 &mpic 0x7 0x1
+                       >;
+
+                       ranges = <0x2000000 0x0 0xa0000000
+                                 0x2000000 0x0 0xa0000000
+                                 0x0 0x20000000
+
+                                 0x1000000 0x0 0x0
+                                 0x1000000 0x0 0x0
+                                 0x0 0x100000>;
+               };
+       };
+
+       pci1: pcie@ffe0a000 {
+               ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
+                         0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
+               pcie@0 {
+                       reg = <0x0 0x0 0x0 0x0 0x0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+                       interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
+                       interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0x0 0x0 0x1 &mpic 0x4 0x1
+                       0000 0x0 0x0 0x2 &mpic 0x5 0x1
+                       0000 0x0 0x0 0x3 &mpic 0x6 0x1
+                       0000 0x0 0x0 0x4 &mpic 0x7 0x1
+                       >;
+                       ranges = <0x2000000 0x0 0x80000000
+                                 0x2000000 0x0 0x80000000
+                                 0x0 0x20000000
+
+                                 0x1000000 0x0 0x0
+                                 0x1000000 0x0 0x0
+                                 0x0 0x100000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p1010si.dtsi b/arch/powerpc/boot/dts/p1010si.dtsi
new file mode 100644 (file)
index 0000000..7f51104
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * P1010si Device Tree Source
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+/dts-v1/;
+/ {
+       compatible = "fsl,P1010";
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,P1010@0 {
+                       device_type = "cpu";
+                       reg = <0x0>;
+                       next-level-cache = <&L2>;
+               };
+       };
+
+       ifc@ffe1e000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,ifc", "simple-bus";
+               reg = <0x0 0xffe1e000 0 0x2000>;
+               interrupts = <16 2 19 2>;
+               interrupt-parent = <&mpic>;
+       };
+
+       soc@ffe00000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "fsl,p1010-immr", "simple-bus";
+               ranges = <0x0  0x0 0xffe00000 0x100000>;
+               bus-frequency = <0>;            // Filled out by uboot.
+
+               ecm-law@0 {
+                       compatible = "fsl,ecm-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <12>;
+               };
+
+               ecm@1000 {
+                       compatible = "fsl,p1010-ecm", "fsl,ecm";
+                       reg = <0x1000 0x1000>;
+                       interrupts = <16 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               memory-controller@2000 {
+                       compatible = "fsl,p1010-memory-controller";
+                       reg = <0x2000 0x1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+               };
+
+               i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x3000 0x100>;
+                       interrupts = <43 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x3100 0x100>;
+                       interrupts = <43 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               serial0: serial@4500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x4500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <42 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               serial1: serial@4600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x4600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <42 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               spi@7000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,mpc8536-espi";
+                       reg = <0x7000 0x1000>;
+                       interrupts = <59 0x2>;
+                       interrupt-parent = <&mpic>;
+                       fsl,espi-num-chipselects = <1>;
+               };
+
+               gpio: gpio-controller@f000 {
+                       #gpio-cells = <2>;
+                       compatible = "fsl,mpc8572-gpio";
+                       reg = <0xf000 0x100>;
+                       interrupts = <47 0x2>;
+                       interrupt-parent = <&mpic>;
+                       gpio-controller;
+               };
+
+               sata@18000 {
+                       compatible = "fsl,pq-sata-v2";
+                       reg = <0x18000 0x1000>;
+                       cell-index = <1>;
+                       interrupts = <74 0x2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               sata@19000 {
+                       compatible = "fsl,pq-sata-v2";
+                       reg = <0x19000 0x1000>;
+                       cell-index = <2>;
+                       interrupts = <41 0x2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               can0@1c000 {
+                       compatible = "fsl,flexcan-v1.0";
+                       reg = <0x1c000 0x1000>;
+                       interrupts = <48 0x2>;
+                       interrupt-parent = <&mpic>;
+                       fsl,flexcan-clock-divider = <2>;
+               };
+
+               can1@1d000 {
+                       compatible = "fsl,flexcan-v1.0";
+                       reg = <0x1d000 0x1000>;
+                       interrupts = <61 0x2>;
+                       interrupt-parent = <&mpic>;
+                       fsl,flexcan-clock-divider = <2>;
+               };
+
+               L2: l2-cache-controller@20000 {
+                       compatible = "fsl,p1010-l2-cache-controller",
+                                       "fsl,p1014-l2-cache-controller";
+                       reg = <0x20000 0x1000>;
+                       cache-line-size = <32>; // 32 bytes
+                       cache-size = <0x40000>; // L2,256K
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+               };
+
+               dma@21300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p1010-dma", "fsl,eloplus-dma";
+                       reg = <0x21300 0x4>;
+                       ranges = <0x0 0x21100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,p1010-dma-channel", "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <20 2>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p1010-dma-channel", "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <21 2>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p1010-dma-channel", "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <22 2>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p1010-dma-channel", "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <23 2>;
+                       };
+               };
+
+               usb@22000 {
+                       compatible = "fsl-usb2-dr";
+                       reg = <0x22000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <28 0x2>;
+                       dr_mode = "host";
+               };
+
+               mdio@24000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,etsec2-mdio";
+                       reg = <0x24000 0x1000 0xb0030 0x4>;
+               };
+
+               mdio@25000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,etsec2-tbi";
+                       reg = <0x25000 0x1000 0xb1030 0x4>;
+                       tbi0: tbi-phy@11 {
+                               reg = <0x11>;
+                               device_type = "tbi-phy";
+                       };
+               };
+
+               mdio@26000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,etsec2-tbi";
+                       reg = <0x26000 0x1000 0xb1030 0x4>;
+                       tbi1: tbi-phy@11 {
+                               reg = <0x11>;
+                               device_type = "tbi-phy";
+                       };
+               };
+
+               sdhci@2e000 {
+                       compatible = "fsl,esdhc";
+                       reg = <0x2e000 0x1000>;
+                       interrupts = <72 0x8>;
+                       interrupt-parent = <&mpic>;
+                       /* Filled in by U-Boot */
+                       clock-frequency = <0>;
+                       fsl,sdhci-auto-cmd12;
+               };
+
+               enet0: ethernet@b0000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "fsl,etsec2";
+                       fsl,num_rx_queues = <0x8>;
+                       fsl,num_tx_queues = <0x8>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupt-parent = <&mpic>;
+
+                       queue-group@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0xb0000 0x1000>;
+                               fsl,rx-bit-map = <0xff>;
+                               fsl,tx-bit-map = <0xff>;
+                               interrupts = <29 2 30 2 34 2>;
+                       };
+
+               };
+
+               enet1: ethernet@b1000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "fsl,etsec2";
+                       fsl,num_rx_queues = <0x8>;
+                       fsl,num_tx_queues = <0x8>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupt-parent = <&mpic>;
+
+                       queue-group@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0xb1000 0x1000>;
+                               fsl,rx-bit-map = <0xff>;
+                               fsl,tx-bit-map = <0xff>;
+                               interrupts = <35 2 36 2 40 2>;
+                       };
+
+               };
+
+               enet2: ethernet@b2000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "fsl,etsec2";
+                       fsl,num_rx_queues = <0x8>;
+                       fsl,num_tx_queues = <0x8>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupt-parent = <&mpic>;
+
+                       queue-group@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0xb2000 0x1000>;
+                               fsl,rx-bit-map = <0xff>;
+                               fsl,tx-bit-map = <0xff>;
+                               interrupts = <31 2 32 2 33 2>;
+                       };
+
+               };
+
+               mpic: pic@40000 {
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi@41600 {
+                       compatible = "fsl,p1010-msi", "fsl,mpic-msi";
+                       reg = <0x41600 0x80>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0
+                               0xe1 0
+                               0xe2 0
+                               0xe3 0
+                               0xe4 0
+                               0xe5 0
+                               0xe6 0
+                               0xe7 0>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               global-utilities@e0000 {        //global utilities block
+                       compatible = "fsl,p1010-guts";
+                       reg = <0xe0000 0x1000>;
+                       fsl,has-rstcr;
+               };
+       };
+
+       pci0: pcie@ffe09000 {
+               compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0 0xffe09000 0 0x1000>;
+               bus-range = <0 255>;
+               clock-frequency = <33333333>;
+               interrupt-parent = <&mpic>;
+               interrupts = <16 2>;
+       };
+
+       pci1: pcie@ffe0a000 {
+               compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0 0xffe0a000 0 0x1000>;
+               bus-range = <0 255>;
+               clock-frequency = <33333333>;
+               interrupt-parent = <&mpic>;
+               interrupts = <16 2>;
+       };
+};
index 98d9426d4b85429d511192aba3b7a4bb5b2dd3dd..1be9743ab5e085e93e346c22aa7b7a0369e9099c 100644 (file)
                        fsl,magic-packet;
                        fsl,wake-on-filer;
                        local-mac-address = [ 00 00 00 00 00 00 ];
-                       fixed-link = <1 1 1000 0 0>;
                        phy-handle = <&phy0>;
                        phy-connection-type = "rgmii-id";
                        queue-group@0{
                        fsl,num_rx_queues = <0x8>;
                        fsl,num_tx_queues = <0x8>;
                        local-mac-address = [ 00 00 00 00 00 00 ];
-                       fixed-link = <1 1 1000 0 0>;
                        phy-handle = <&phy1>;
                        phy-connection-type = "rgmii-id";
                        queue-group@0{
diff --git a/arch/powerpc/boot/dts/p1023rds.dts b/arch/powerpc/boot/dts/p1023rds.dts
new file mode 100644 (file)
index 0000000..bfa96aa
--- /dev/null
@@ -0,0 +1,546 @@
+/*
+ * P1023 RDS Device Tree Source
+ *
+ * Copyright 2010-2011 Freescale Semiconductor Inc.
+ *
+ * Author: Roy Zang <tie-fei.zang@freescale.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/dts-v1/;
+
+/ {
+       model = "fsl,P1023";
+       compatible = "fsl,P1023RDS";
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       aliases {
+               serial0 = &serial0;
+               serial1 = &serial1;
+               pci0 = &pci0;
+               pci1 = &pci1;
+               pci2 = &pci2;
+
+               crypto = &crypto;
+               sec_jr0 = &sec_jr0;
+               sec_jr1 = &sec_jr1;
+               sec_jr2 = &sec_jr2;
+               sec_jr3 = &sec_jr3;
+               rtic_a = &rtic_a;
+               rtic_b = &rtic_b;
+               rtic_c = &rtic_c;
+               rtic_d = &rtic_d;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: PowerPC,P1023@0 {
+                       device_type = "cpu";
+                       reg = <0x0>;
+                       next-level-cache = <&L2>;
+               };
+
+               cpu1: PowerPC,P1023@1 {
+                       device_type = "cpu";
+                       reg = <0x1>;
+                       next-level-cache = <&L2>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+       };
+
+       soc@ff600000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "fsl,p1023-immr", "simple-bus";
+               ranges = <0x0 0x0 0xff600000 0x200000>;
+               bus-frequency = <0>;            // Filled out by uboot.
+
+               ecm-law@0 {
+                       compatible = "fsl,ecm-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <12>;
+               };
+
+               ecm@1000 {
+                       compatible = "fsl,p1023-ecm", "fsl,ecm";
+                       reg = <0x1000 0x1000>;
+                       interrupts = <16 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               memory-controller@2000 {
+                       compatible = "fsl,p1023-memory-controller";
+                       reg = <0x2000 0x1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+               };
+
+               i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x3000 0x100>;
+                       interrupts = <43 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+                       rtc@68 {
+                               compatible = "dallas,ds1374";
+                               reg = <0x68>;
+                       };
+               };
+
+               i2c@3100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x3100 0x100>;
+                       interrupts = <43 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               serial0: serial@4500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x4500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <42 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               serial1: serial@4600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x4600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <42 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               spi@7000 {
+                       cell-index = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,p1023-espi", "fsl,mpc8536-espi";
+                       reg = <0x7000 0x1000>;
+                       interrupts = <59 0x2>;
+                       interrupt-parent = <&mpic>;
+                       fsl,espi-num-chipselects = <4>;
+
+                       fsl_dataflash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "atmel,at45db081d";
+                               reg = <0>;
+                               spi-max-frequency = <40000000>; /* input clock */
+                               partition@u-boot {
+                                       /* 512KB for u-boot Bootloader Image */
+                                       label = "u-boot-spi";
+                                       reg = <0x00000000 0x00080000>;
+                                       read-only;
+                               };
+                               partition@dtb {
+                                       /* 512KB for DTB Image */
+                                       label = "dtb-spi";
+                                       reg = <0x00080000 0x00080000>;
+                                       read-only;
+                               };
+                       };
+               };
+
+               gpio: gpio-controller@f000 {
+                       #gpio-cells = <2>;
+                       compatible = "fsl,qoriq-gpio";
+                       reg = <0xf000 0x100>;
+                       interrupts = <47 0x2>;
+                       interrupt-parent = <&mpic>;
+                       gpio-controller;
+               };
+
+               L2: l2-cache-controller@20000 {
+                       compatible = "fsl,p1023-l2-cache-controller";
+                       reg = <0x20000 0x1000>;
+                       cache-line-size = <32>; // 32 bytes
+                       cache-size = <0x40000>; // L2,256K
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+               };
+
+               dma@21300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,eloplus-dma";
+                       reg = <0x21300 0x4>;
+                       ranges = <0x0 0x21100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <20 2>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <21 2>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <22 2>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <23 2>;
+                       };
+               };
+
+               usb@22000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl-usb2-dr";
+                       reg = <0x22000 0x1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <28 0x2>;
+                       dr_mode = "host";
+                       phy_type = "ulpi";
+               };
+
+               crypto: crypto@300000 {
+                       compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x30000 0x10000>;
+                       ranges = <0 0x30000 0x10000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <58 2>;
+
+                       sec_jr0: jr@1000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <45 2>;
+                       };
+
+                       sec_jr1: jr@2000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <45 2>;
+                       };
+
+                       sec_jr2: jr@3000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <57 2>;
+                       };
+
+                       sec_jr3: jr@4000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x4000 0x1000>;
+                               interrupts = <57 2>;
+                       };
+
+                       rtic@6000 {
+                               compatible = "fsl,sec-v4.2-rtic",
+                                            "fsl,sec-v4.0-rtic";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x6000 0x100>;
+                               ranges = <0x0 0x6100 0xe00>;
+
+                               rtic_a: rtic-a@0 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x00 0x20 0x100 0x80>;
+                               };
+
+                               rtic_b: rtic-b@20 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x20 0x20 0x200 0x80>;
+                               };
+
+                               rtic_c: rtic-c@40 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x40 0x20 0x300 0x80>;
+                               };
+
+                               rtic_d: rtic-d@60 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x60 0x20 0x500 0x80>;
+                               };
+                       };
+               };
+
+               power@e0070{
+                       compatible = "fsl,mpc8536-pmc", "fsl,mpc8548-pmc",
+                                    "fsl,p1022-pmc";
+                       reg = <0xe0070 0x20>;
+                       etsec1_clk: soc-clk@B0{
+                               fsl,pmcdr-mask = <0x00000080>;
+                       };
+                       etsec2_clk: soc-clk@B1{
+                               fsl,pmcdr-mask = <0x00000040>;
+                       };
+                       etsec3_clk: soc-clk@B2{
+                               fsl,pmcdr-mask = <0x00000020>;
+                       };
+               };
+
+               mpic: pic@40000 {
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi@41600 {
+                       compatible = "fsl,p1023-msi", "fsl,mpic-msi";
+                       reg = <0x41600 0x80>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0
+                               0xe1 0
+                               0xe2 0
+                               0xe3 0
+                               0xe4 0
+                               0xe5 0
+                               0xe6 0
+                               0xe7 0>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               global-utilities@e0000 {        //global utilities block
+                       compatible = "fsl,p1023-guts";
+                       reg = <0xe0000 0x1000>;
+                       fsl,has-rstcr;
+               };
+       };
+
+       localbus@ff605000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,p1023-elbc", "fsl,elbc", "simple-bus";
+               reg = <0 0xff605000 0 0x1000>;
+               interrupts = <19 2>;
+               interrupt-parent = <&mpic>;
+
+               /* NOR Flash, BCSR */
+               ranges = <0x0 0x0 0x0 0xee000000 0x02000000
+                         0x1 0x0 0x0 0xe0000000 0x00008000>;
+
+               nor@0,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "cfi-flash";
+                       reg = <0x0 0x0 0x02000000>;
+                       bank-width = <1>;
+                       device-width = <1>;
+                       partition@0 {
+                               label = "ramdisk";
+                               reg = <0x00000000 0x01c00000>;
+                       };
+                       partition@1c00000 {
+                               label = "kernel";
+                               reg = <0x01c00000 0x002e0000>;
+                       };
+                       partiton@1ee0000 {
+                               label = "dtb";
+                               reg = <0x01ee0000 0x00020000>;
+                       };
+                       partition@1f00000 {
+                               label = "firmware";
+                               reg = <0x01f00000 0x00080000>;
+                               read-only;
+                       };
+                       partition@1f80000 {
+                               label = "u-boot";
+                               reg = <0x01f80000 0x00080000>;
+                               read-only;
+                       };
+               };
+
+               fpga@1,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p1023rds-fpga";
+                       reg = <1 0 0x8000>;
+                       ranges = <0 1 0 0x8000>;
+
+                       bcsr@20 {
+                               compatible = "fsl,p1023rds-bcsr";
+                               reg = <0x20 0x20>;
+                       };
+               };
+       };
+
+       pci0: pcie@ff60a000 {
+               compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
+               cell-index = <1>;
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0 0xff60a000 0 0x1000>;
+               bus-range = <0 255>;
+               ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
+                         0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
+               clock-frequency = <33333333>;
+               interrupt-parent = <&mpic>;
+               interrupts = <16 2>;
+               pcie@0 {
+                       reg = <0x0 0x0 0x0 0x0 0x0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 0 1
+                               0000 0 0 2 &mpic 1 1
+                               0000 0 0 3 &mpic 2 1
+                               0000 0 0 4 &mpic 3 1
+                               >;
+                       ranges = <0x2000000 0x0 0xc0000000
+                                 0x2000000 0x0 0xc0000000
+                                 0x0 0x20000000
+
+                                 0x1000000 0x0 0x0
+                                 0x1000000 0x0 0x0
+                                 0x0 0x100000>;
+               };
+       };
+
+       pci1: pcie@ff609000 {
+               compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
+               cell-index = <2>;
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0 0xff609000 0 0x1000>;
+               bus-range = <0 255>;
+               ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
+                         0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
+               clock-frequency = <33333333>;
+               interrupt-parent = <&mpic>;
+               interrupts = <16 2>;
+               pcie@0 {
+                       reg = <0x0 0x0 0x0 0x0 0x0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 4 1
+                               0000 0 0 2 &mpic 5 1
+                               0000 0 0 3 &mpic 6 1
+                               0000 0 0 4 &mpic 7 1
+                               >;
+                       ranges = <0x2000000 0x0 0xa0000000
+                                 0x2000000 0x0 0xa0000000
+                                 0x0 0x20000000
+
+                                 0x1000000 0x0 0x0
+                                 0x1000000 0x0 0x0
+                                 0x0 0x100000>;
+               };
+       };
+
+       pci2: pcie@ff60b000 {
+               cell-index = <3>;
+               compatible = "fsl,p1023-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0 0xff60b000 0 0x1000>;
+               bus-range = <0 255>;
+               ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
+                         0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
+               clock-frequency = <33333333>;
+               interrupt-parent = <&mpic>;
+               interrupts = <16 2>;
+               pcie@0 {
+                       reg = <0x0 0x0 0x0 0x0 0x0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupt-parent = <&mpic>;
+                       interrupts = <16 2>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 8 1
+                               0000 0 0 2 &mpic 9 1
+                               0000 0 0 3 &mpic 10 1
+                               0000 0 0 4 &mpic 11 1
+                               >;
+                       ranges = <0x2000000 0x0 0x80000000
+                                 0x2000000 0x0 0x80000000
+                                 0x0 0x20000000
+
+                                 0x1000000 0x0 0x0
+                                 0x1000000 0x0 0x0
+                                 0x0 0x100000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p2040rdb.dts b/arch/powerpc/boot/dts/p2040rdb.dts
new file mode 100644 (file)
index 0000000..7d84e39
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * P2040RDB Device Tree Source
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/include/ "p2040si.dtsi"
+
+/ {
+       model = "fsl,P2040RDB";
+       compatible = "fsl,P2040RDB";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       memory {
+               device_type = "memory";
+       };
+
+       soc: soc@ffe000000 {
+               spi@110000 {
+                       flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "spansion,s25sl12801";
+                               reg = <0>;
+                               spi-max-frequency = <40000000>; /* input clock */
+                               partition@u-boot {
+                                       label = "u-boot";
+                                       reg = <0x00000000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@kernel {
+                                       label = "kernel";
+                                       reg = <0x00100000 0x00500000>;
+                                       read-only;
+                               };
+                               partition@dtb {
+                                       label = "dtb";
+                                       reg = <0x00600000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@fs {
+                                       label = "file system";
+                                       reg = <0x00700000 0x00900000>;
+                               };
+                       };
+               };
+
+               i2c@118000 {
+                       lm75b@48 {
+                               compatible = "nxp,lm75a";
+                               reg = <0x48>;
+                       };
+                       eeprom@50 {
+                               compatible = "at24,24c256";
+                               reg = <0x50>;
+                       };
+                       rtc@68 {
+                               compatible = "pericom,pt7c4338";
+                               reg = <0x68>;
+                       };
+               };
+
+               i2c@118100 {
+                       eeprom@50 {
+                               compatible = "at24,24c256";
+                               reg = <0x50>;
+                       };
+               };
+
+               usb0: usb@210000 {
+                       phy_type = "utmi";
+               };
+
+               usb1: usb@211000 {
+                       dr_mode = "host";
+                       phy_type = "utmi";
+               };
+       };
+
+       localbus@ffe124000 {
+               reg = <0xf 0xfe124000 0 0x1000>;
+               ranges = <0 0 0xf 0xe8000000 0x08000000>;
+
+               flash@0,0 {
+                       compatible = "cfi-flash";
+                       reg = <0 0 0x08000000>;
+                       bank-width = <2>;
+                       device-width = <2>;
+               };
+       };
+
+       pci0: pcie@ffe200000 {
+               reg = <0xf 0xfe200000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               reg = <0xf 0xfe201000 0 0x1000>;
+               ranges = <0x02000000 0x0 0xe0000000 0xc 0x20000000 0x0 0x20000000
+                         0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               reg = <0xf 0xfe202000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x40000000 0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p2040si.dtsi b/arch/powerpc/boot/dts/p2040si.dtsi
new file mode 100644 (file)
index 0000000..5fdbb24
--- /dev/null
@@ -0,0 +1,623 @@
+/*
+ * P2040 Silicon Device Tree Source
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/dts-v1/;
+
+/ {
+       compatible = "fsl,P2040";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       aliases {
+               ccsr = &soc;
+
+               serial0 = &serial0;
+               serial1 = &serial1;
+               serial2 = &serial2;
+               serial3 = &serial3;
+               pci0 = &pci0;
+               pci1 = &pci1;
+               pci2 = &pci2;
+               usb0 = &usb0;
+               usb1 = &usb1;
+               dma0 = &dma0;
+               dma1 = &dma1;
+               sdhc = &sdhc;
+               msi0 = &msi0;
+               msi1 = &msi1;
+               msi2 = &msi2;
+
+               crypto = &crypto;
+               sec_jr0 = &sec_jr0;
+               sec_jr1 = &sec_jr1;
+               sec_jr2 = &sec_jr2;
+               sec_jr3 = &sec_jr3;
+               rtic_a = &rtic_a;
+               rtic_b = &rtic_b;
+               rtic_c = &rtic_c;
+               rtic_d = &rtic_d;
+               sec_mon = &sec_mon;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: PowerPC,e500mc@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&L2_0>;
+                       L2_0: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu1: PowerPC,e500mc@1 {
+                       device_type = "cpu";
+                       reg = <1>;
+                       next-level-cache = <&L2_1>;
+                       L2_1: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu2: PowerPC,e500mc@2 {
+                       device_type = "cpu";
+                       reg = <2>;
+                       next-level-cache = <&L2_2>;
+                       L2_2: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu3: PowerPC,e500mc@3 {
+                       device_type = "cpu";
+                       reg = <3>;
+                       next-level-cache = <&L2_3>;
+                       L2_3: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+       };
+
+       soc: soc@ffe000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
+               reg = <0xf 0xfe000000 0 0x00001000>;
+
+               soc-sram-error {
+                       compatible = "fsl,soc-sram-error";
+                       interrupts = <16 2 1 29>;
+               };
+
+               corenet-law@0 {
+                       compatible = "fsl,corenet-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <32>;
+               };
+
+               memory-controller@8000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
+                       reg = <0x8000 0x1000>;
+                       interrupts = <16 2 1 23>;
+               };
+
+               cpc: l3-cache-controller@10000 {
+                       compatible = "fsl,p2040-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
+                       reg = <0x10000 0x1000>;
+                       interrupts = <16 2 1 27>;
+               };
+
+               corenet-cf@18000 {
+                       compatible = "fsl,corenet-cf";
+                       reg = <0x18000 0x1000>;
+                       interrupts = <16 2 1 31>;
+                       fsl,ccf-num-csdids = <32>;
+                       fsl,ccf-num-snoopids = <32>;
+               };
+
+               iommu@20000 {
+                       compatible = "fsl,pamu-v1.0", "fsl,pamu";
+                       reg = <0x20000 0x4000>;
+                       interrupts = <
+                               24 2 0 0
+                               16 2 1 30>;
+               };
+
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <4>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "fsl,mpic", "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi0: msi@41600 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41600 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0 0 0
+                               0xe1 0 0 0
+                               0xe2 0 0 0
+                               0xe3 0 0 0
+                               0xe4 0 0 0
+                               0xe5 0 0 0
+                               0xe6 0 0 0
+                               0xe7 0 0 0>;
+               };
+
+               msi1: msi@41800 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41800 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe8 0 0 0
+                               0xe9 0 0 0
+                               0xea 0 0 0
+                               0xeb 0 0 0
+                               0xec 0 0 0
+                               0xed 0 0 0
+                               0xee 0 0 0
+                               0xef 0 0 0>;
+               };
+
+               msi2: msi@41a00 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41a00 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xf0 0 0 0
+                               0xf1 0 0 0
+                               0xf2 0 0 0
+                               0xf3 0 0 0
+                               0xf4 0 0 0
+                               0xf5 0 0 0
+                               0xf6 0 0 0
+                               0xf7 0 0 0>;
+               };
+
+               guts: global-utilities@e0000 {
+                       compatible = "fsl,qoriq-device-config-1.0";
+                       reg = <0xe0000 0xe00>;
+                       fsl,has-rstcr;
+                       #sleep-cells = <1>;
+                       fsl,liodn-bits = <12>;
+               };
+
+               pins: global-utilities@e0e00 {
+                       compatible = "fsl,qoriq-pin-control-1.0";
+                       reg = <0xe0e00 0x200>;
+                       #sleep-cells = <2>;
+               };
+
+               clockgen: global-utilities@e1000 {
+                       compatible = "fsl,p2040-clockgen", "fsl,qoriq-clockgen-1.0";
+                       reg = <0xe1000 0x1000>;
+                       clock-frequency = <0>;
+               };
+
+               rcpm: global-utilities@e2000 {
+                       compatible = "fsl,qoriq-rcpm-1.0";
+                       reg = <0xe2000 0x1000>;
+                       #sleep-cells = <1>;
+               };
+
+               sfp: sfp@e8000 {
+                       compatible = "fsl,p2040-sfp", "fsl,qoriq-sfp-1.0";
+                       reg        = <0xe8000 0x1000>;
+               };
+
+               serdes: serdes@ea000 {
+                       compatible = "fsl,p2040-serdes";
+                       reg        = <0xea000 0x1000>;
+               };
+
+               dma0: dma@100300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p2040-dma", "fsl,eloplus-dma";
+                       reg = <0x100300 0x4>;
+                       ranges = <0x0 0x100100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <28 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <29 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <30 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <31 2 0 0>;
+                       };
+               };
+
+               dma1: dma@101300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p2040-dma", "fsl,eloplus-dma";
+                       reg = <0x101300 0x4>;
+                       ranges = <0x0 0x101100 0x200>;
+                       cell-index = <1>;
+                       dma-channel@0 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <32 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <33 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <34 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p2040-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <35 2 0 0>;
+                       };
+               };
+
+               spi@110000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,p2040-espi", "fsl,mpc8536-espi";
+                       reg = <0x110000 0x1000>;
+                       interrupts = <53 0x2 0 0>;
+                       fsl,espi-num-chipselects = <4>;
+
+               };
+
+               sdhc: sdhc@114000 {
+                       compatible = "fsl,p2040-esdhc", "fsl,esdhc";
+                       reg = <0x114000 0x1000>;
+                       interrupts = <48 2 0 0>;
+                       sdhci,auto-cmd12;
+                       clock-frequency = <0>;
+               };
+
+
+               i2c@118000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118000 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@118100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118100 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <2>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119000 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <3>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119100 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               serial0: serial@11c500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial1: serial@11c600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial2: serial@11d500 {
+                       cell-index = <2>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               serial3: serial@11d600 {
+                       cell-index = <3>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               gpio0: gpio@130000 {
+                       compatible = "fsl,p2040-gpio", "fsl,qoriq-gpio";
+                       reg = <0x130000 0x1000>;
+                       interrupts = <55 2 0 0>;
+                       #gpio-cells = <2>;
+                       gpio-controller;
+               };
+
+               usb0: usb@210000 {
+                       compatible = "fsl,p2040-usb2-mph",
+                                       "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
+                       reg = <0x210000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <44 0x2 0 0>;
+                       port0;
+               };
+
+               usb1: usb@211000 {
+                       compatible = "fsl,p2040-usb2-dr",
+                                       "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
+                       reg = <0x211000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <45 0x2 0 0>;
+               };
+
+               sata@220000 {
+                       compatible = "fsl,p2040-sata", "fsl,pq-sata-v2";
+                       reg = <0x220000 0x1000>;
+                       interrupts = <68 0x2 0 0>;
+               };
+
+               sata@221000 {
+                       compatible = "fsl,p2040-sata", "fsl,pq-sata-v2";
+                       reg = <0x221000 0x1000>;
+                       interrupts = <69 0x2 0 0>;
+               };
+
+               crypto: crypto@300000 {
+                       compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x300000 0x10000>;
+                       ranges = <0 0x300000 0x10000>;
+                       interrupts = <92 2 0 0>;
+
+                       sec_jr0: jr@1000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <88 2 0 0>;
+                       };
+
+                       sec_jr1: jr@2000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <89 2 0 0>;
+                       };
+
+                       sec_jr2: jr@3000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <90 2 0 0>;
+                       };
+
+                       sec_jr3: jr@4000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x4000 0x1000>;
+                               interrupts = <91 2 0 0>;
+                       };
+
+                       rtic@6000 {
+                               compatible = "fsl,sec-v4.2-rtic",
+                                            "fsl,sec-v4.0-rtic";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x6000 0x100>;
+                               ranges = <0x0 0x6100 0xe00>;
+
+                               rtic_a: rtic-a@0 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x00 0x20 0x100 0x80>;
+                               };
+
+                               rtic_b: rtic-b@20 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x20 0x20 0x200 0x80>;
+                               };
+
+                               rtic_c: rtic-c@40 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x40 0x20 0x300 0x80>;
+                               };
+
+                               rtic_d: rtic-d@60 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x60 0x20 0x500 0x80>;
+                               };
+                       };
+               };
+
+               sec_mon: sec_mon@314000 {
+                       compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+                       reg = <0x314000 0x1000>;
+                       interrupts = <93 2 0 0>;
+               };
+
+       };
+
+       localbus@ffe124000 {
+               compatible = "fsl,p2040-elbc", "fsl,elbc", "simple-bus";
+               interrupts = <25 2 0 0>;
+               #address-cells = <2>;
+               #size-cells = <1>;
+       };
+
+       pci0: pcie@ffe200000 {
+               compatible = "fsl,p2040-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi0>;
+               interrupts = <16 2 1 15>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 15>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 40 1 0 0
+                               0000 0 0 2 &mpic 1 1 0 0
+                               0000 0 0 3 &mpic 2 1 0 0
+                               0000 0 0 4 &mpic 3 1 0 0
+                               >;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               compatible = "fsl,p2040-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi1>;
+               interrupts = <16 2 1 14>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 14>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 41 1 0 0
+                               0000 0 0 2 &mpic 5 1 0 0
+                               0000 0 0 3 &mpic 6 1 0 0
+                               0000 0 0 4 &mpic 7 1 0 0
+                               >;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               compatible = "fsl,p2040-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 13>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 13>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 42 1 0 0
+                               0000 0 0 2 &mpic 9 1 0 0
+                               0000 0 0 3 &mpic 10 1 0 0
+                               0000 0 0 4 &mpic 11 1 0 0
+                               >;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p3041ds.dts b/arch/powerpc/boot/dts/p3041ds.dts
new file mode 100644 (file)
index 0000000..69cae67
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * P3041DS Device Tree Source
+ *
+ * Copyright 2010-2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/include/ "p3041si.dtsi"
+
+/ {
+       model = "fsl,P3041DS";
+       compatible = "fsl,P3041DS";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       memory {
+               device_type = "memory";
+       };
+
+       soc: soc@ffe000000 {
+               spi@110000 {
+                       flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "spansion,s25sl12801";
+                               reg = <0>;
+                               spi-max-frequency = <40000000>; /* input clock */
+                               partition@u-boot {
+                                       label = "u-boot";
+                                       reg = <0x00000000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@kernel {
+                                       label = "kernel";
+                                       reg = <0x00100000 0x00500000>;
+                                       read-only;
+                               };
+                               partition@dtb {
+                                       label = "dtb";
+                                       reg = <0x00600000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@fs {
+                                       label = "file system";
+                                       reg = <0x00700000 0x00900000>;
+                               };
+                       };
+               };
+
+               i2c@118100 {
+                       eeprom@51 {
+                               compatible = "at24,24c256";
+                               reg = <0x51>;
+                       };
+                       eeprom@52 {
+                               compatible = "at24,24c256";
+                               reg = <0x52>;
+                       };
+               };
+
+               i2c@119100 {
+                       rtc@68 {
+                               compatible = "dallas,ds3232";
+                               reg = <0x68>;
+                               interrupts = <0x1 0x1 0 0>;
+                       };
+               };
+       };
+
+       localbus@ffe124000 {
+               reg = <0xf 0xfe124000 0 0x1000>;
+               ranges = <0 0 0xf 0xe8000000 0x08000000
+                         2 0 0xf 0xffa00000 0x00040000
+                         3 0 0xf 0xffdf0000 0x00008000>;
+
+               flash@0,0 {
+                       compatible = "cfi-flash";
+                       reg = <0 0 0x08000000>;
+                       bank-width = <2>;
+                       device-width = <2>;
+               };
+
+               nand@2,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,elbc-fcm-nand";
+                       reg = <0x2 0x0 0x40000>;
+
+                       partition@0 {
+                               label = "NAND U-Boot Image";
+                               reg = <0x0 0x02000000>;
+                               read-only;
+                       };
+
+                       partition@2000000 {
+                               label = "NAND Root File System";
+                               reg = <0x02000000 0x10000000>;
+                       };
+
+                       partition@12000000 {
+                               label = "NAND Compressed RFS Image";
+                               reg = <0x12000000 0x08000000>;
+                       };
+
+                       partition@1a000000 {
+                               label = "NAND Linux Kernel Image";
+                               reg = <0x1a000000 0x04000000>;
+                       };
+
+                       partition@1e000000 {
+                               label = "NAND DTB Image";
+                               reg = <0x1e000000 0x01000000>;
+                       };
+
+                       partition@1f000000 {
+                               label = "NAND Writable User area";
+                               reg = <0x1f000000 0x21000000>;
+                       };
+               };
+
+               board-control@3,0 {
+                       compatible = "fsl,p3041ds-pixis";
+                       reg = <3 0 0x20>;
+               };
+       };
+
+       pci0: pcie@ffe200000 {
+               reg = <0xf 0xfe200000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               reg = <0xf 0xfe201000 0 0x1000>;
+               ranges = <0x02000000 0x0 0xe0000000 0xc 0x20000000 0x0 0x20000000
+                         0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               reg = <0xf 0xfe202000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x40000000 0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci3: pcie@ffe203000 {
+               reg = <0xf 0xfe203000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x60000000 0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8030000 0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p3041si.dtsi b/arch/powerpc/boot/dts/p3041si.dtsi
new file mode 100644 (file)
index 0000000..8b69580
--- /dev/null
@@ -0,0 +1,660 @@
+/*
+ * P3041 Silicon Device Tree Source
+ *
+ * Copyright 2010-2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/dts-v1/;
+
+/ {
+       compatible = "fsl,P3041";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       aliases {
+               ccsr = &soc;
+
+               serial0 = &serial0;
+               serial1 = &serial1;
+               serial2 = &serial2;
+               serial3 = &serial3;
+               pci0 = &pci0;
+               pci1 = &pci1;
+               pci2 = &pci2;
+               pci3 = &pci3;
+               usb0 = &usb0;
+               usb1 = &usb1;
+               dma0 = &dma0;
+               dma1 = &dma1;
+               sdhc = &sdhc;
+               msi0 = &msi0;
+               msi1 = &msi1;
+               msi2 = &msi2;
+
+               crypto = &crypto;
+               sec_jr0 = &sec_jr0;
+               sec_jr1 = &sec_jr1;
+               sec_jr2 = &sec_jr2;
+               sec_jr3 = &sec_jr3;
+               rtic_a = &rtic_a;
+               rtic_b = &rtic_b;
+               rtic_c = &rtic_c;
+               rtic_d = &rtic_d;
+               sec_mon = &sec_mon;
+
+/*
+               rio0 = &rapidio0;
+ */
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: PowerPC,e500mc@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&L2_0>;
+                       L2_0: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu1: PowerPC,e500mc@1 {
+                       device_type = "cpu";
+                       reg = <1>;
+                       next-level-cache = <&L2_1>;
+                       L2_1: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu2: PowerPC,e500mc@2 {
+                       device_type = "cpu";
+                       reg = <2>;
+                       next-level-cache = <&L2_2>;
+                       L2_2: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu3: PowerPC,e500mc@3 {
+                       device_type = "cpu";
+                       reg = <3>;
+                       next-level-cache = <&L2_3>;
+                       L2_3: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+       };
+
+       soc: soc@ffe000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
+               reg = <0xf 0xfe000000 0 0x00001000>;
+
+               soc-sram-error {
+                       compatible = "fsl,soc-sram-error";
+                       interrupts = <16 2 1 29>;
+               };
+
+               corenet-law@0 {
+                       compatible = "fsl,corenet-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <32>;
+               };
+
+               memory-controller@8000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
+                       reg = <0x8000 0x1000>;
+                       interrupts = <16 2 1 23>;
+               };
+
+               cpc: l3-cache-controller@10000 {
+                       compatible = "fsl,p3041-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
+                       reg = <0x10000 0x1000>;
+                       interrupts = <16 2 1 27>;
+               };
+
+               corenet-cf@18000 {
+                       compatible = "fsl,corenet-cf";
+                       reg = <0x18000 0x1000>;
+                       interrupts = <16 2 1 31>;
+                       fsl,ccf-num-csdids = <32>;
+                       fsl,ccf-num-snoopids = <32>;
+               };
+
+               iommu@20000 {
+                       compatible = "fsl,pamu-v1.0", "fsl,pamu";
+                       reg = <0x20000 0x4000>;
+                       interrupts = <
+                               24 2 0 0
+                               16 2 1 30>;
+               };
+
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <4>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "fsl,mpic", "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi0: msi@41600 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41600 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0 0 0
+                               0xe1 0 0 0
+                               0xe2 0 0 0
+                               0xe3 0 0 0
+                               0xe4 0 0 0
+                               0xe5 0 0 0
+                               0xe6 0 0 0
+                               0xe7 0 0 0>;
+               };
+
+               msi1: msi@41800 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41800 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe8 0 0 0
+                               0xe9 0 0 0
+                               0xea 0 0 0
+                               0xeb 0 0 0
+                               0xec 0 0 0
+                               0xed 0 0 0
+                               0xee 0 0 0
+                               0xef 0 0 0>;
+               };
+
+               msi2: msi@41a00 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41a00 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xf0 0 0 0
+                               0xf1 0 0 0
+                               0xf2 0 0 0
+                               0xf3 0 0 0
+                               0xf4 0 0 0
+                               0xf5 0 0 0
+                               0xf6 0 0 0
+                               0xf7 0 0 0>;
+               };
+
+               guts: global-utilities@e0000 {
+                       compatible = "fsl,qoriq-device-config-1.0";
+                       reg = <0xe0000 0xe00>;
+                       fsl,has-rstcr;
+                       #sleep-cells = <1>;
+                       fsl,liodn-bits = <12>;
+               };
+
+               pins: global-utilities@e0e00 {
+                       compatible = "fsl,qoriq-pin-control-1.0";
+                       reg = <0xe0e00 0x200>;
+                       #sleep-cells = <2>;
+               };
+
+               clockgen: global-utilities@e1000 {
+                       compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0";
+                       reg = <0xe1000 0x1000>;
+                       clock-frequency = <0>;
+               };
+
+               rcpm: global-utilities@e2000 {
+                       compatible = "fsl,qoriq-rcpm-1.0";
+                       reg = <0xe2000 0x1000>;
+                       #sleep-cells = <1>;
+               };
+
+               sfp: sfp@e8000 {
+                       compatible = "fsl,p3041-sfp", "fsl,qoriq-sfp-1.0";
+                       reg        = <0xe8000 0x1000>;
+               };
+
+               serdes: serdes@ea000 {
+                       compatible = "fsl,p3041-serdes";
+                       reg        = <0xea000 0x1000>;
+               };
+
+               dma0: dma@100300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p3041-dma", "fsl,eloplus-dma";
+                       reg = <0x100300 0x4>;
+                       ranges = <0x0 0x100100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <28 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <29 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <30 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <31 2 0 0>;
+                       };
+               };
+
+               dma1: dma@101300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p3041-dma", "fsl,eloplus-dma";
+                       reg = <0x101300 0x4>;
+                       ranges = <0x0 0x101100 0x200>;
+                       cell-index = <1>;
+                       dma-channel@0 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <32 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <33 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <34 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p3041-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <35 2 0 0>;
+                       };
+               };
+
+               spi@110000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,p3041-espi", "fsl,mpc8536-espi";
+                       reg = <0x110000 0x1000>;
+                       interrupts = <53 0x2 0 0>;
+                       fsl,espi-num-chipselects = <4>;
+               };
+
+               sdhc: sdhc@114000 {
+                       compatible = "fsl,p3041-esdhc", "fsl,esdhc";
+                       reg = <0x114000 0x1000>;
+                       interrupts = <48 2 0 0>;
+                       sdhci,auto-cmd12;
+                       clock-frequency = <0>;
+               };
+
+               i2c@118000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118000 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@118100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118100 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <2>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119000 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <3>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119100 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               serial0: serial@11c500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial1: serial@11c600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial2: serial@11d500 {
+                       cell-index = <2>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               serial3: serial@11d600 {
+                       cell-index = <3>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               gpio0: gpio@130000 {
+                       compatible = "fsl,p3041-gpio", "fsl,qoriq-gpio";
+                       reg = <0x130000 0x1000>;
+                       interrupts = <55 2 0 0>;
+                       #gpio-cells = <2>;
+                       gpio-controller;
+               };
+
+               usb0: usb@210000 {
+                       compatible = "fsl,p3041-usb2-mph",
+                                       "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
+                       reg = <0x210000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <44 0x2 0 0>;
+                       phy_type = "utmi";
+                       port0;
+               };
+
+               usb1: usb@211000 {
+                       compatible = "fsl,p3041-usb2-dr",
+                                       "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
+                       reg = <0x211000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <45 0x2 0 0>;
+                       dr_mode = "host";
+                       phy_type = "utmi";
+               };
+
+               sata@220000 {
+                       compatible = "fsl,p3041-sata", "fsl,pq-sata-v2";
+                       reg = <0x220000 0x1000>;
+                       interrupts = <68 0x2 0 0>;
+               };
+
+               sata@221000 {
+                       compatible = "fsl,p3041-sata", "fsl,pq-sata-v2";
+                       reg = <0x221000 0x1000>;
+                       interrupts = <69 0x2 0 0>;
+               };
+
+               crypto: crypto@300000 {
+                       compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg              = <0x300000 0x10000>;
+                       ranges           = <0 0x300000 0x10000>;
+                       interrupts       = <92 2 0 0>;
+
+                       sec_jr0: jr@1000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <88 2 0 0>;
+                       };
+
+                       sec_jr1: jr@2000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <89 2 0 0>;
+                       };
+
+                       sec_jr2: jr@3000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <90 2 0 0>;
+                       };
+
+                       sec_jr3: jr@4000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x4000 0x1000>;
+                               interrupts = <91 2 0 0>;
+                       };
+
+                       rtic@6000 {
+                               compatible = "fsl,sec-v4.2-rtic",
+                                            "fsl,sec-v4.0-rtic";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x6000 0x100>;
+                               ranges = <0x0 0x6100 0xe00>;
+
+                               rtic_a: rtic-a@0 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x00 0x20 0x100 0x80>;
+                               };
+
+                               rtic_b: rtic-b@20 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x20 0x20 0x200 0x80>;
+                               };
+
+                               rtic_c: rtic-c@40 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x40 0x20 0x300 0x80>;
+                               };
+
+                               rtic_d: rtic-d@60 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x60 0x20 0x500 0x80>;
+                               };
+                       };
+               };
+
+               sec_mon: sec_mon@314000 {
+                       compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+                       reg = <0x314000 0x1000>;
+                       interrupts = <93 2 0 0>;
+               };
+       };
+
+/*
+       rapidio0: rapidio@ffe0c0000
+*/
+
+       localbus@ffe124000 {
+               compatible = "fsl,p3041-elbc", "fsl,elbc", "simple-bus";
+               interrupts = <25 2 0 0>;
+               #address-cells = <2>;
+               #size-cells = <1>;
+       };
+
+       pci0: pcie@ffe200000 {
+               compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi0>;
+               interrupts = <16 2 1 15>;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 15>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 40 1 0 0
+                               0000 0 0 2 &mpic 1 1 0 0
+                               0000 0 0 3 &mpic 2 1 0 0
+                               0000 0 0 4 &mpic 3 1 0 0
+                               >;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi1>;
+               interrupts = <16 2 1 14>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 14>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 41 1 0 0
+                               0000 0 0 2 &mpic 5 1 0 0
+                               0000 0 0 3 &mpic 6 1 0 0
+                               0000 0 0 4 &mpic 7 1 0 0
+                               >;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 13>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 13>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 42 1 0 0
+                               0000 0 0 2 &mpic 9 1 0 0
+                               0000 0 0 3 &mpic 10 1 0 0
+                               0000 0 0 4 &mpic 11 1 0 0
+                               >;
+               };
+       };
+
+       pci3: pcie@ffe203000 {
+               compatible = "fsl,p3041-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 12>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 12>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 43 1 0 0
+                               0000 0 0 2 &mpic 0 1 0 0
+                               0000 0 0 3 &mpic 4 1 0 0
+                               0000 0 0 4 &mpic 8 1 0 0
+                               >;
+               };
+       };
+};
index 927f94d16e9b1520244ca4b5140d28b6d345b18d..eb11098bb687c421d33fdc238bec31a59b018c13 100644 (file)
  *
  * Copyright 2009-2011 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/dts-v1/;
+/include/ "p4080si.dtsi"
 
 / {
        model = "fsl,P4080DS";
        compatible = "fsl,P4080DS";
        #address-cells = <2>;
        #size-cells = <2>;
-
-       aliases {
-               ccsr = &soc;
-
-               serial0 = &serial0;
-               serial1 = &serial1;
-               serial2 = &serial2;
-               serial3 = &serial3;
-               pci0 = &pci0;
-               pci1 = &pci1;
-               pci2 = &pci2;
-               usb0 = &usb0;
-               usb1 = &usb1;
-               dma0 = &dma0;
-               dma1 = &dma1;
-               sdhc = &sdhc;
-
-               crypto = &crypto;
-               sec_jr0 = &sec_jr0;
-               sec_jr1 = &sec_jr1;
-               sec_jr2 = &sec_jr2;
-               sec_jr3 = &sec_jr3;
-               rtic_a = &rtic_a;
-               rtic_b = &rtic_b;
-               rtic_c = &rtic_c;
-               rtic_d = &rtic_d;
-               sec_mon = &sec_mon;
-
-               rio0 = &rapidio0;
-       };
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu0: PowerPC,4080@0 {
-                       device_type = "cpu";
-                       reg = <0>;
-                       next-level-cache = <&L2_0>;
-                       L2_0: l2-cache {
-                       };
-               };
-               cpu1: PowerPC,4080@1 {
-                       device_type = "cpu";
-                       reg = <1>;
-                       next-level-cache = <&L2_1>;
-                       L2_1: l2-cache {
-                       };
-               };
-               cpu2: PowerPC,4080@2 {
-                       device_type = "cpu";
-                       reg = <2>;
-                       next-level-cache = <&L2_2>;
-                       L2_2: l2-cache {
-                       };
-               };
-               cpu3: PowerPC,4080@3 {
-                       device_type = "cpu";
-                       reg = <3>;
-                       next-level-cache = <&L2_3>;
-                       L2_3: l2-cache {
-                       };
-               };
-               cpu4: PowerPC,4080@4 {
-                       device_type = "cpu";
-                       reg = <4>;
-                       next-level-cache = <&L2_4>;
-                       L2_4: l2-cache {
-                       };
-               };
-               cpu5: PowerPC,4080@5 {
-                       device_type = "cpu";
-                       reg = <5>;
-                       next-level-cache = <&L2_5>;
-                       L2_5: l2-cache {
-                       };
-               };
-               cpu6: PowerPC,4080@6 {
-                       device_type = "cpu";
-                       reg = <6>;
-                       next-level-cache = <&L2_6>;
-                       L2_6: l2-cache {
-                       };
-               };
-               cpu7: PowerPC,4080@7 {
-                       device_type = "cpu";
-                       reg = <7>;
-                       next-level-cache = <&L2_7>;
-                       L2_7: l2-cache {
-                       };
-               };
-       };
+       interrupt-parent = <&mpic>;
 
        memory {
                device_type = "memory";
        };
 
        soc: soc@ffe000000 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               device_type = "soc";
-               compatible = "simple-bus";
-               ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
-               reg = <0xf 0xfe000000 0 0x00001000>;
-
-               corenet-law@0 {
-                       compatible = "fsl,corenet-law";
-                       reg = <0x0 0x1000>;
-                       fsl,num-laws = <32>;
-               };
-
-               memory-controller@8000 {
-                       compatible = "fsl,p4080-memory-controller";
-                       reg = <0x8000 0x1000>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <0x12 2>;
-               };
-
-               memory-controller@9000 {
-                       compatible = "fsl,p4080-memory-controller";
-                       reg = <0x9000 0x1000>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <0x12 2>;
-               };
-
-               corenet-cf@18000 {
-                       compatible = "fsl,corenet-cf";
-                       reg = <0x18000 0x1000>;
-                       fsl,ccf-num-csdids = <32>;
-                       fsl,ccf-num-snoopids = <32>;
-               };
-
-               iommu@20000 {
-                       compatible = "fsl,p4080-pamu";
-                       reg = <0x20000 0x10000>;
-                       interrupts = <24 2>;
-                       interrupt-parent = <&mpic>;
-               };
-
-               mpic: pic@40000 {
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <0x40000 0x40000>;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-               };
-
-               dma0: dma@100300 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       compatible = "fsl,p4080-dma", "fsl,eloplus-dma";
-                       reg = <0x100300 0x4>;
-                       ranges = <0x0 0x100100 0x200>;
-                       cell-index = <0>;
-                       dma-channel@0 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x0 0x80>;
-                               cell-index = <0>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <28 2>;
-                       };
-                       dma-channel@80 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x80 0x80>;
-                               cell-index = <1>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <29 2>;
-                       };
-                       dma-channel@100 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x100 0x80>;
-                               cell-index = <2>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <30 2>;
-                       };
-                       dma-channel@180 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x180 0x80>;
-                               cell-index = <3>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <31 2>;
-                       };
-               };
-
-               dma1: dma@101300 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       compatible = "fsl,p4080-dma", "fsl,eloplus-dma";
-                       reg = <0x101300 0x4>;
-                       ranges = <0x0 0x101100 0x200>;
-                       cell-index = <1>;
-                       dma-channel@0 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x0 0x80>;
-                               cell-index = <0>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <32 2>;
-                       };
-                       dma-channel@80 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x80 0x80>;
-                               cell-index = <1>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <33 2>;
-                       };
-                       dma-channel@100 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x100 0x80>;
-                               cell-index = <2>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <34 2>;
-                       };
-                       dma-channel@180 {
-                               compatible = "fsl,p4080-dma-channel",
-                                               "fsl,eloplus-dma-channel";
-                               reg = <0x180 0x80>;
-                               cell-index = <3>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <35 2>;
-                       };
-               };
-
                spi@110000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,p4080-espi", "fsl,mpc8536-espi";
-                       reg = <0x110000 0x1000>;
-                       interrupts = <53 0x2>;
-                       interrupt-parent = <&mpic>;
-                       fsl,espi-num-chipselects = <4>;
-
                        flash@0 {
                                #address-cells = <1>;
                                #size-cells = <1>;
                        };
                };
 
-               sdhc: sdhc@114000 {
-                       compatible = "fsl,p4080-esdhc", "fsl,esdhc";
-                       reg = <0x114000 0x1000>;
-                       interrupts = <48 2>;
-                       interrupt-parent = <&mpic>;
-                       voltage-ranges = <3300 3300>;
-                       sdhci,auto-cmd12;
-               };
-
-               i2c@118000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       cell-index = <0>;
-                       compatible = "fsl-i2c";
-                       reg = <0x118000 0x100>;
-                       interrupts = <38 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
-               };
-
                i2c@118100 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       cell-index = <1>;
-                       compatible = "fsl-i2c";
-                       reg = <0x118100 0x100>;
-                       interrupts = <38 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
                        eeprom@51 {
                                compatible = "at24,24c256";
                                reg = <0x51>;
                        rtc@68 {
                                compatible = "dallas,ds3232";
                                reg = <0x68>;
-                               interrupts = <0 0x1>;
-                               interrupt-parent = <&mpic>;
+                               interrupts = <0x1 0x1 0 0>;
                        };
                };
 
-               i2c@119000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       cell-index = <2>;
-                       compatible = "fsl-i2c";
-                       reg = <0x119000 0x100>;
-                       interrupts = <39 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
-               };
-
-               i2c@119100 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       cell-index = <3>;
-                       compatible = "fsl-i2c";
-                       reg = <0x119100 0x100>;
-                       interrupts = <39 2>;
-                       interrupt-parent = <&mpic>;
-                       dfsrr;
-               };
-
-               serial0: serial@11c500 {
-                       cell-index = <0>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <0x11c500 0x100>;
-                       clock-frequency = <0>;
-                       interrupts = <36 2>;
-                       interrupt-parent = <&mpic>;
-               };
-
-               serial1: serial@11c600 {
-                       cell-index = <1>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <0x11c600 0x100>;
-                       clock-frequency = <0>;
-                       interrupts = <36 2>;
-                       interrupt-parent = <&mpic>;
-               };
-
-               serial2: serial@11d500 {
-                       cell-index = <2>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <0x11d500 0x100>;
-                       clock-frequency = <0>;
-                       interrupts = <37 2>;
-                       interrupt-parent = <&mpic>;
-               };
-
-               serial3: serial@11d600 {
-                       cell-index = <3>;
-                       device_type = "serial";
-                       compatible = "ns16550";
-                       reg = <0x11d600 0x100>;
-                       clock-frequency = <0>;
-                       interrupts = <37 2>;
-                       interrupt-parent = <&mpic>;
-               };
-
-               gpio0: gpio@130000 {
-                       compatible = "fsl,p4080-gpio";
-                       reg = <0x130000 0x1000>;
-                       interrupts = <55 2>;
-                       interrupt-parent = <&mpic>;
-                       #gpio-cells = <2>;
-                       gpio-controller;
-               };
-
                usb0: usb@210000 {
-                       compatible = "fsl,p4080-usb2-mph",
-                                       "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
-                       reg = <0x210000 0x1000>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <44 0x2>;
                        phy_type = "ulpi";
                };
 
                usb1: usb@211000 {
-                       compatible = "fsl,p4080-usb2-dr",
-                                       "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
-                       reg = <0x211000 0x1000>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <45 0x2>;
                        dr_mode = "host";
                        phy_type = "ulpi";
                };
-
-               crypto: crypto@300000 {
-                       compatible = "fsl,sec-v4.0";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       reg = <0x300000 0x10000>;
-                       ranges = <0 0x300000 0x10000>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <92 2>;
-
-                       sec_jr0: jr@1000 {
-                               compatible = "fsl,sec-v4.0-job-ring";
-                               reg = <0x1000 0x1000>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <88 2>;
-                       };
-
-                       sec_jr1: jr@2000 {
-                               compatible = "fsl,sec-v4.0-job-ring";
-                               reg = <0x2000 0x1000>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <89 2>;
-                       };
-
-                       sec_jr2: jr@3000 {
-                               compatible = "fsl,sec-v4.0-job-ring";
-                               reg = <0x3000 0x1000>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <90 2>;
-                       };
-
-                       sec_jr3: jr@4000 {
-                               compatible = "fsl,sec-v4.0-job-ring";
-                               reg = <0x4000 0x1000>;
-                               interrupt-parent = <&mpic>;
-                               interrupts = <91 2>;
-                       };
-
-                       rtic@6000 {
-                               compatible = "fsl,sec-v4.0-rtic";
-                               #address-cells = <1>;
-                               #size-cells = <1>;
-                               reg = <0x6000 0x100>;
-                               ranges = <0x0 0x6100 0xe00>;
-
-                               rtic_a: rtic-a@0 {
-                                       compatible = "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x00 0x20 0x100 0x80>;
-                               };
-
-                               rtic_b: rtic-b@20 {
-                                       compatible = "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x20 0x20 0x200 0x80>;
-                               };
-
-                               rtic_c: rtic-c@40 {
-                                       compatible = "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x40 0x20 0x300 0x80>;
-                               };
-
-                               rtic_d: rtic-d@60 {
-                                       compatible = "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x60 0x20 0x500 0x80>;
-                               };
-                       };
-               };
-
-               sec_mon: sec_mon@314000 {
-                       compatible = "fsl,sec-v4.0-mon";
-                       reg = <0x314000 0x1000>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <93 2>;
-               };
        };
 
        rapidio0: rapidio@ffe0c0000 {
-               #address-cells = <2>;
-               #size-cells = <2>;
-               compatible = "fsl,rapidio-delta";
                reg = <0xf 0xfe0c0000 0 0x20000>;
-               ranges = <0 0 0xf 0xf5000000 0 0x01000000>;
-               interrupt-parent = <&mpic>;
-               /* err_irq bell_outb_irq bell_inb_irq
-                       msg1_tx_irq msg1_rx_irq msg2_tx_irq msg2_rx_irq */
-               interrupts = <16 2 56 2 57 2 60 2 61 2 62 2 63 2>;
+               ranges = <0 0 0xc 0x20000000 0 0x01000000>;
        };
 
        localbus@ffe124000 {
-               compatible = "fsl,p4080-elbc", "fsl,elbc", "simple-bus";
                reg = <0xf 0xfe124000 0 0x1000>;
-               interrupts = <25 2>;
-               #address-cells = <2>;
-               #size-cells = <1>;
-
                ranges = <0 0 0xf 0xe8000000 0x08000000>;
 
                flash@0,0 {
        };
 
        pci0: pcie@ffe200000 {
-               compatible = "fsl,p4080-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-               #size-cells = <2>;
-               #address-cells = <3>;
                reg = <0xf 0xfe200000 0 0x1000>;
-               bus-range = <0x0 0xff>;
                ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000
                          0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>;
-               clock-frequency = <0x1fca055>;
-               interrupt-parent = <&mpic>;
-               interrupts = <16 2>;
-
-               interrupt-map-mask = <0xf800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x0 */
-                       0000 0 0 1 &mpic 40 1
-                       0000 0 0 2 &mpic 1 1
-                       0000 0 0 3 &mpic 2 1
-                       0000 0 0 4 &mpic 3 1
-                       >;
                pcie@0 {
-                       reg = <0 0 0 0 0>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       device_type = "pci";
                        ranges = <0x02000000 0 0xe0000000
                                  0x02000000 0 0xe0000000
                                  0 0x20000000
        };
 
        pci1: pcie@ffe201000 {
-               compatible = "fsl,p4080-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-               #size-cells = <2>;
-               #address-cells = <3>;
                reg = <0xf 0xfe201000 0 0x1000>;
-               bus-range = <0 0xff>;
                ranges = <0x02000000 0x0 0xe0000000 0xc 0x20000000 0x0 0x20000000
                          0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>;
-               clock-frequency = <0x1fca055>;
-               interrupt-parent = <&mpic>;
-               interrupts = <16 2>;
-               interrupt-map-mask = <0xf800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x0 */
-                       0000 0 0 1 &mpic 41 1
-                       0000 0 0 2 &mpic 5 1
-                       0000 0 0 3 &mpic 6 1
-                       0000 0 0 4 &mpic 7 1
-                       >;
                pcie@0 {
-                       reg = <0 0 0 0 0>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       device_type = "pci";
                        ranges = <0x02000000 0 0xe0000000
                                  0x02000000 0 0xe0000000
                                  0 0x20000000
        };
 
        pci2: pcie@ffe202000 {
-               compatible = "fsl,p4080-pcie";
-               device_type = "pci";
-               #interrupt-cells = <1>;
-               #size-cells = <2>;
-               #address-cells = <3>;
                reg = <0xf 0xfe202000 0 0x1000>;
-               bus-range = <0x0 0xff>;
                ranges = <0x02000000 0 0xe0000000 0xc 0x40000000 0 0x20000000
                          0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>;
-               clock-frequency = <0x1fca055>;
-               interrupt-parent = <&mpic>;
-               interrupts = <16 2>;
-               interrupt-map-mask = <0xf800 0 0 7>;
-               interrupt-map = <
-                       /* IDSEL 0x0 */
-                       0000 0 0 1 &mpic 42 1
-                       0000 0 0 2 &mpic 9 1
-                       0000 0 0 3 &mpic 10 1
-                       0000 0 0 4 &mpic 11 1
-                       >;
                pcie@0 {
-                       reg = <0 0 0 0 0>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       device_type = "pci";
                        ranges = <0x02000000 0 0xe0000000
                                  0x02000000 0 0xe0000000
                                  0 0x20000000
diff --git a/arch/powerpc/boot/dts/p4080si.dtsi b/arch/powerpc/boot/dts/p4080si.dtsi
new file mode 100644 (file)
index 0000000..b71051f
--- /dev/null
@@ -0,0 +1,661 @@
+/*
+ * P4080 Silicon Device Tree Source
+ *
+ * Copyright 2009-2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/dts-v1/;
+
+/ {
+       compatible = "fsl,P4080";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       aliases {
+               ccsr = &soc;
+
+               serial0 = &serial0;
+               serial1 = &serial1;
+               serial2 = &serial2;
+               serial3 = &serial3;
+               pci0 = &pci0;
+               pci1 = &pci1;
+               pci2 = &pci2;
+               usb0 = &usb0;
+               usb1 = &usb1;
+               dma0 = &dma0;
+               dma1 = &dma1;
+               sdhc = &sdhc;
+               msi0 = &msi0;
+               msi1 = &msi1;
+               msi2 = &msi2;
+
+               crypto = &crypto;
+               sec_jr0 = &sec_jr0;
+               sec_jr1 = &sec_jr1;
+               sec_jr2 = &sec_jr2;
+               sec_jr3 = &sec_jr3;
+               rtic_a = &rtic_a;
+               rtic_b = &rtic_b;
+               rtic_c = &rtic_c;
+               rtic_d = &rtic_d;
+               sec_mon = &sec_mon;
+
+               rio0 = &rapidio0;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: PowerPC,4080@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&L2_0>;
+                       L2_0: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu1: PowerPC,4080@1 {
+                       device_type = "cpu";
+                       reg = <1>;
+                       next-level-cache = <&L2_1>;
+                       L2_1: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu2: PowerPC,4080@2 {
+                       device_type = "cpu";
+                       reg = <2>;
+                       next-level-cache = <&L2_2>;
+                       L2_2: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu3: PowerPC,4080@3 {
+                       device_type = "cpu";
+                       reg = <3>;
+                       next-level-cache = <&L2_3>;
+                       L2_3: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu4: PowerPC,4080@4 {
+                       device_type = "cpu";
+                       reg = <4>;
+                       next-level-cache = <&L2_4>;
+                       L2_4: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu5: PowerPC,4080@5 {
+                       device_type = "cpu";
+                       reg = <5>;
+                       next-level-cache = <&L2_5>;
+                       L2_5: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu6: PowerPC,4080@6 {
+                       device_type = "cpu";
+                       reg = <6>;
+                       next-level-cache = <&L2_6>;
+                       L2_6: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu7: PowerPC,4080@7 {
+                       device_type = "cpu";
+                       reg = <7>;
+                       next-level-cache = <&L2_7>;
+                       L2_7: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+       };
+
+       soc: soc@ffe000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
+               reg = <0xf 0xfe000000 0 0x00001000>;
+
+               soc-sram-error {
+                       compatible = "fsl,soc-sram-error";
+                       interrupts = <16 2 1 29>;
+               };
+
+               corenet-law@0 {
+                       compatible = "fsl,corenet-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <32>;
+               };
+
+               memory-controller@8000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.4", "fsl,qoriq-memory-controller";
+                       reg = <0x8000 0x1000>;
+                       interrupts = <16 2 1 23>;
+               };
+
+               memory-controller@9000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.4","fsl,qoriq-memory-controller";
+                       reg = <0x9000 0x1000>;
+                       interrupts = <16 2 1 22>;
+               };
+
+               cpc: l3-cache-controller@10000 {
+                       compatible = "fsl,p4080-l3-cache-controller", "cache";
+                       reg = <0x10000 0x1000
+                              0x11000 0x1000>;
+                       interrupts = <16 2 1 27
+                                     16 2 1 26>;
+               };
+
+               corenet-cf@18000 {
+                       compatible = "fsl,corenet-cf";
+                       reg = <0x18000 0x1000>;
+                       interrupts = <16 2 1 31>;
+                       fsl,ccf-num-csdids = <32>;
+                       fsl,ccf-num-snoopids = <32>;
+               };
+
+               iommu@20000 {
+                       compatible = "fsl,pamu-v1.0", "fsl,pamu";
+                       reg = <0x20000 0x5000>;
+                       interrupts = <
+                               24 2 0 0
+                               16 2 1 30>;
+               };
+
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <4>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "fsl,mpic", "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi0: msi@41600 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41600 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0 0 0
+                               0xe1 0 0 0
+                               0xe2 0 0 0
+                               0xe3 0 0 0
+                               0xe4 0 0 0
+                               0xe5 0 0 0
+                               0xe6 0 0 0
+                               0xe7 0 0 0>;
+               };
+
+               msi1: msi@41800 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41800 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe8 0 0 0
+                               0xe9 0 0 0
+                               0xea 0 0 0
+                               0xeb 0 0 0
+                               0xec 0 0 0
+                               0xed 0 0 0
+                               0xee 0 0 0
+                               0xef 0 0 0>;
+               };
+
+               msi2: msi@41a00 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41a00 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xf0 0 0 0
+                               0xf1 0 0 0
+                               0xf2 0 0 0
+                               0xf3 0 0 0
+                               0xf4 0 0 0
+                               0xf5 0 0 0
+                               0xf6 0 0 0
+                               0xf7 0 0 0>;
+               };
+
+               guts: global-utilities@e0000 {
+                       compatible = "fsl,qoriq-device-config-1.0";
+                       reg = <0xe0000 0xe00>;
+                       fsl,has-rstcr;
+                       #sleep-cells = <1>;
+                       fsl,liodn-bits = <12>;
+               };
+
+               pins: global-utilities@e0e00 {
+                       compatible = "fsl,qoriq-pin-control-1.0";
+                       reg = <0xe0e00 0x200>;
+                       #sleep-cells = <2>;
+               };
+
+               clockgen: global-utilities@e1000 {
+                       compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0";
+                       reg = <0xe1000 0x1000>;
+                       clock-frequency = <0>;
+               };
+
+               rcpm: global-utilities@e2000 {
+                       compatible = "fsl,qoriq-rcpm-1.0";
+                       reg = <0xe2000 0x1000>;
+                       #sleep-cells = <1>;
+               };
+
+               sfp: sfp@e8000 {
+                       compatible = "fsl,p4080-sfp", "fsl,qoriq-sfp-1.0";
+                       reg        = <0xe8000 0x1000>;
+               };
+
+               serdes: serdes@ea000 {
+                       compatible = "fsl,p4080-serdes";
+                       reg        = <0xea000 0x1000>;
+               };
+
+               dma0: dma@100300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p4080-dma", "fsl,eloplus-dma";
+                       reg = <0x100300 0x4>;
+                       ranges = <0x0 0x100100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <28 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <29 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <30 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <31 2 0 0>;
+                       };
+               };
+
+               dma1: dma@101300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p4080-dma", "fsl,eloplus-dma";
+                       reg = <0x101300 0x4>;
+                       ranges = <0x0 0x101100 0x200>;
+                       cell-index = <1>;
+                       dma-channel@0 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <32 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <33 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <34 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p4080-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <35 2 0 0>;
+                       };
+               };
+
+               spi@110000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,p4080-espi", "fsl,mpc8536-espi";
+                       reg = <0x110000 0x1000>;
+                       interrupts = <53 0x2 0 0>;
+                       fsl,espi-num-chipselects = <4>;
+               };
+
+               sdhc: sdhc@114000 {
+                       compatible = "fsl,p4080-esdhc", "fsl,esdhc";
+                       reg = <0x114000 0x1000>;
+                       interrupts = <48 2 0 0>;
+                       voltage-ranges = <3300 3300>;
+                       sdhci,auto-cmd12;
+                       clock-frequency = <0>;
+               };
+
+               i2c@118000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118000 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@118100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118100 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <2>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119000 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <3>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119100 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               serial0: serial@11c500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial1: serial@11c600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial2: serial@11d500 {
+                       cell-index = <2>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               serial3: serial@11d600 {
+                       cell-index = <3>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               gpio0: gpio@130000 {
+                       compatible = "fsl,p4080-gpio", "fsl,qoriq-gpio";
+                       reg = <0x130000 0x1000>;
+                       interrupts = <55 2 0 0>;
+                       #gpio-cells = <2>;
+                       gpio-controller;
+               };
+
+               usb0: usb@210000 {
+                       compatible = "fsl,p4080-usb2-mph",
+                                       "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
+                       reg = <0x210000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <44 0x2 0 0>;
+               };
+
+               usb1: usb@211000 {
+                       compatible = "fsl,p4080-usb2-dr",
+                                       "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
+                       reg = <0x211000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <45 0x2 0 0>;
+               };
+
+               crypto: crypto@300000 {
+                       compatible = "fsl,sec-v4.0";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x300000 0x10000>;
+                       ranges = <0 0x300000 0x10000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <92 2 0 0>;
+
+                       sec_jr0: jr@1000 {
+                               compatible = "fsl,sec-v4.0-job-ring";
+                               reg = <0x1000 0x1000>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <88 2 0 0>;
+                       };
+
+                       sec_jr1: jr@2000 {
+                               compatible = "fsl,sec-v4.0-job-ring";
+                               reg = <0x2000 0x1000>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <89 2 0 0>;
+                       };
+
+                       sec_jr2: jr@3000 {
+                               compatible = "fsl,sec-v4.0-job-ring";
+                               reg = <0x3000 0x1000>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <90 2 0 0>;
+                       };
+
+                       sec_jr3: jr@4000 {
+                               compatible = "fsl,sec-v4.0-job-ring";
+                               reg = <0x4000 0x1000>;
+                               interrupt-parent = <&mpic>;
+                               interrupts = <91 2 0 0>;
+                       };
+
+                       rtic@6000 {
+                               compatible = "fsl,sec-v4.0-rtic";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x6000 0x100>;
+                               ranges = <0x0 0x6100 0xe00>;
+
+                               rtic_a: rtic-a@0 {
+                                       compatible = "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x00 0x20 0x100 0x80>;
+                               };
+
+                               rtic_b: rtic-b@20 {
+                                       compatible = "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x20 0x20 0x200 0x80>;
+                               };
+
+                               rtic_c: rtic-c@40 {
+                                       compatible = "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x40 0x20 0x300 0x80>;
+                               };
+
+                               rtic_d: rtic-d@60 {
+                                       compatible = "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x60 0x20 0x500 0x80>;
+                               };
+                       };
+               };
+
+               sec_mon: sec_mon@314000 {
+                       compatible = "fsl,sec-v4.0-mon";
+                       reg = <0x314000 0x1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <93 2 0 0>;
+               };
+       };
+
+       rapidio0: rapidio@ffe0c0000 {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               compatible = "fsl,rapidio-delta";
+               interrupts = <
+                       16 2 1 11 /* err_irq */
+                       56 2 0 0  /* bell_outb_irq */
+                       57 2 0 0  /* bell_inb_irq */
+                       60 2 0 0  /* msg1_tx_irq */
+                       61 2 0 0  /* msg1_rx_irq */
+                       62 2 0 0  /* msg2_tx_irq */
+                       63 2 0 0>; /* msg2_rx_irq */
+       };
+
+       localbus@ffe124000 {
+               compatible = "fsl,p4080-elbc", "fsl,elbc", "simple-bus";
+               interrupts = <25 2 0 0>;
+               #address-cells = <2>;
+               #size-cells = <1>;
+       };
+
+       pci0: pcie@ffe200000 {
+               compatible = "fsl,p4080-pcie";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi0>;
+               interrupts = <16 2 1 15>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 15>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 40 1 0 0
+                               0000 0 0 2 &mpic 1 1 0 0
+                               0000 0 0 3 &mpic 2 1 0 0
+                               0000 0 0 4 &mpic 3 1 0 0
+                               >;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               compatible = "fsl,p4080-pcie";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi1>;
+               interrupts = <16 2 1 14>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 14>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 41 1 0 0
+                               0000 0 0 2 &mpic 5 1 0 0
+                               0000 0 0 3 &mpic 6 1 0 0
+                               0000 0 0 4 &mpic 7 1 0 0
+                               >;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               compatible = "fsl,p4080-pcie";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 13>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 13>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 42 1 0 0
+                               0000 0 0 2 &mpic 9 1 0 0
+                               0000 0 0 3 &mpic 10 1 0 0
+                               0000 0 0 4 &mpic 11 1 0 0
+                               >;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p5020ds.dts b/arch/powerpc/boot/dts/p5020ds.dts
new file mode 100644 (file)
index 0000000..8366e2f
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * P5020DS Device Tree Source
+ *
+ * Copyright 2010-2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/include/ "p5020si.dtsi"
+
+/ {
+       model = "fsl,P5020DS";
+       compatible = "fsl,P5020DS";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       memory {
+               device_type = "memory";
+       };
+
+       soc: soc@ffe000000 {
+               spi@110000 {
+                       flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "spansion,s25sl12801";
+                               reg = <0>;
+                               spi-max-frequency = <40000000>; /* input clock */
+                               partition@u-boot {
+                                       label = "u-boot";
+                                       reg = <0x00000000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@kernel {
+                                       label = "kernel";
+                                       reg = <0x00100000 0x00500000>;
+                                       read-only;
+                               };
+                               partition@dtb {
+                                       label = "dtb";
+                                       reg = <0x00600000 0x00100000>;
+                                       read-only;
+                               };
+                               partition@fs {
+                                       label = "file system";
+                                       reg = <0x00700000 0x00900000>;
+                               };
+                       };
+               };
+
+               i2c@118100 {
+                       eeprom@51 {
+                               compatible = "at24,24c256";
+                               reg = <0x51>;
+                       };
+                       eeprom@52 {
+                               compatible = "at24,24c256";
+                               reg = <0x52>;
+                       };
+               };
+
+               i2c@119100 {
+                       rtc@68 {
+                               compatible = "dallas,ds3232";
+                               reg = <0x68>;
+                               interrupts = <0x1 0x1 0 0>;
+                       };
+               };
+       };
+
+       localbus@ffe124000 {
+               reg = <0xf 0xfe124000 0 0x1000>;
+               ranges = <0 0 0xf 0xe8000000 0x08000000
+                         2 0 0xf 0xffa00000 0x00040000
+                         3 0 0xf 0xffdf0000 0x00008000>;
+
+               flash@0,0 {
+                       compatible = "cfi-flash";
+                       reg = <0 0 0x08000000>;
+                       bank-width = <2>;
+                       device-width = <2>;
+               };
+
+               nand@2,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,elbc-fcm-nand";
+                       reg = <0x2 0x0 0x40000>;
+
+                       partition@0 {
+                               label = "NAND U-Boot Image";
+                               reg = <0x0 0x02000000>;
+                               read-only;
+                       };
+
+                       partition@2000000 {
+                               label = "NAND Root File System";
+                               reg = <0x02000000 0x10000000>;
+                       };
+
+                       partition@12000000 {
+                               label = "NAND Compressed RFS Image";
+                               reg = <0x12000000 0x08000000>;
+                       };
+
+                       partition@1a000000 {
+                               label = "NAND Linux Kernel Image";
+                               reg = <0x1a000000 0x04000000>;
+                       };
+
+                       partition@1e000000 {
+                               label = "NAND DTB Image";
+                               reg = <0x1e000000 0x01000000>;
+                       };
+
+                       partition@1f000000 {
+                               label = "NAND Writable User area";
+                               reg = <0x1f000000 0x21000000>;
+                       };
+               };
+
+               board-control@3,0 {
+                       compatible = "fsl,p5020ds-pixis";
+                       reg = <3 0 0x20>;
+               };
+       };
+
+       pci0: pcie@ffe200000 {
+               reg = <0xf 0xfe200000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>;
+
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               reg = <0xf 0xfe201000 0 0x1000>;
+               ranges = <0x02000000 0x0 0xe0000000 0xc 0x20000000 0x0 0x20000000
+                         0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               reg = <0xf 0xfe202000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x40000000 0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+
+       pci3: pcie@ffe203000 {
+               reg = <0xf 0xfe203000 0 0x1000>;
+               ranges = <0x02000000 0 0xe0000000 0xc 0x60000000 0 0x20000000
+                         0x01000000 0 0x00000000 0xf 0xf8030000 0 0x00010000>;
+               pcie@0 {
+                       ranges = <0x02000000 0 0xe0000000
+                                 0x02000000 0 0xe0000000
+                                 0 0x20000000
+
+                                 0x01000000 0 0x00000000
+                                 0x01000000 0 0x00000000
+                                 0 0x00010000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/p5020si.dtsi b/arch/powerpc/boot/dts/p5020si.dtsi
new file mode 100644 (file)
index 0000000..5e6048e
--- /dev/null
@@ -0,0 +1,652 @@
+/*
+ * P5020 Silicon Device Tree Source
+ *
+ * Copyright 2010-2011 Freescale Semiconductor Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/dts-v1/;
+
+/ {
+       compatible = "fsl,P5020";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&mpic>;
+
+       aliases {
+               ccsr = &soc;
+
+               serial0 = &serial0;
+               serial1 = &serial1;
+               serial2 = &serial2;
+               serial3 = &serial3;
+               pci0 = &pci0;
+               pci1 = &pci1;
+               pci2 = &pci2;
+               pci3 = &pci3;
+               usb0 = &usb0;
+               usb1 = &usb1;
+               dma0 = &dma0;
+               dma1 = &dma1;
+               sdhc = &sdhc;
+               msi0 = &msi0;
+               msi1 = &msi1;
+               msi2 = &msi2;
+
+               crypto = &crypto;
+               sec_jr0 = &sec_jr0;
+               sec_jr1 = &sec_jr1;
+               sec_jr2 = &sec_jr2;
+               sec_jr3 = &sec_jr3;
+               rtic_a = &rtic_a;
+               rtic_b = &rtic_b;
+               rtic_c = &rtic_c;
+               rtic_d = &rtic_d;
+               sec_mon = &sec_mon;
+
+/*
+               rio0 = &rapidio0;
+ */
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: PowerPC,e5500@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&L2_0>;
+                       L2_0: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+               cpu1: PowerPC,e5500@1 {
+                       device_type = "cpu";
+                       reg = <1>;
+                       next-level-cache = <&L2_1>;
+                       L2_1: l2-cache {
+                               next-level-cache = <&cpc>;
+                       };
+               };
+       };
+
+       soc: soc@ffe000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
+               reg = <0xf 0xfe000000 0 0x00001000>;
+
+               soc-sram-error {
+                       compatible = "fsl,soc-sram-error";
+                       interrupts = <16 2 1 29>;
+               };
+
+               corenet-law@0 {
+                       compatible = "fsl,corenet-law";
+                       reg = <0x0 0x1000>;
+                       fsl,num-laws = <32>;
+               };
+
+               memory-controller@8000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
+                       reg = <0x8000 0x1000>;
+                       interrupts = <16 2 1 23>;
+               };
+
+               memory-controller@9000 {
+                       compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
+                       reg = <0x9000 0x1000>;
+                       interrupts = <16 2 1 22>;
+               };
+
+               cpc: l3-cache-controller@10000 {
+                       compatible = "fsl,p5020-l3-cache-controller", "fsl,p4080-l3-cache-controller", "cache";
+                       reg = <0x10000 0x1000
+                              0x11000 0x1000>;
+                       interrupts = <16 2 1 27
+                                     16 2 1 26>;
+               };
+
+               corenet-cf@18000 {
+                       compatible = "fsl,corenet-cf";
+                       reg = <0x18000 0x1000>;
+                       interrupts = <16 2 1 31>;
+                       fsl,ccf-num-csdids = <32>;
+                       fsl,ccf-num-snoopids = <32>;
+               };
+
+               iommu@20000 {
+                       compatible = "fsl,pamu-v1.0", "fsl,pamu";
+                       reg = <0x20000 0x4000>;
+                       interrupts = <
+                               24 2 0 0
+                               16 2 1 30>;
+               };
+
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <4>;
+                       reg = <0x40000 0x40000>;
+                       compatible = "fsl,mpic", "chrp,open-pic";
+                       device_type = "open-pic";
+               };
+
+               msi0: msi@41600 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41600 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe0 0 0 0
+                               0xe1 0 0 0
+                               0xe2 0 0 0
+                               0xe3 0 0 0
+                               0xe4 0 0 0
+                               0xe5 0 0 0
+                               0xe6 0 0 0
+                               0xe7 0 0 0>;
+               };
+
+               msi1: msi@41800 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41800 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xe8 0 0 0
+                               0xe9 0 0 0
+                               0xea 0 0 0
+                               0xeb 0 0 0
+                               0xec 0 0 0
+                               0xed 0 0 0
+                               0xee 0 0 0
+                               0xef 0 0 0>;
+               };
+
+               msi2: msi@41a00 {
+                       compatible = "fsl,mpic-msi";
+                       reg = <0x41a00 0x200>;
+                       msi-available-ranges = <0 0x100>;
+                       interrupts = <
+                               0xf0 0 0 0
+                               0xf1 0 0 0
+                               0xf2 0 0 0
+                               0xf3 0 0 0
+                               0xf4 0 0 0
+                               0xf5 0 0 0
+                               0xf6 0 0 0
+                               0xf7 0 0 0>;
+               };
+
+               guts: global-utilities@e0000 {
+                       compatible = "fsl,qoriq-device-config-1.0";
+                       reg = <0xe0000 0xe00>;
+                       fsl,has-rstcr;
+                       #sleep-cells = <1>;
+                       fsl,liodn-bits = <12>;
+               };
+
+               pins: global-utilities@e0e00 {
+                       compatible = "fsl,qoriq-pin-control-1.0";
+                       reg = <0xe0e00 0x200>;
+                       #sleep-cells = <2>;
+               };
+
+               clockgen: global-utilities@e1000 {
+                       compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+                       reg = <0xe1000 0x1000>;
+                       clock-frequency = <0>;
+               };
+
+               rcpm: global-utilities@e2000 {
+                       compatible = "fsl,qoriq-rcpm-1.0";
+                       reg = <0xe2000 0x1000>;
+                       #sleep-cells = <1>;
+               };
+
+               sfp: sfp@e8000 {
+                       compatible = "fsl,p5020-sfp", "fsl,qoriq-sfp-1.0";
+                       reg        = <0xe8000 0x1000>;
+               };
+
+               serdes: serdes@ea000 {
+                       compatible = "fsl,p5020-serdes";
+                       reg        = <0xea000 0x1000>;
+               };
+
+               dma0: dma@100300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p5020-dma", "fsl,eloplus-dma";
+                       reg = <0x100300 0x4>;
+                       ranges = <0x0 0x100100 0x200>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <28 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <29 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <30 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <31 2 0 0>;
+                       };
+               };
+
+               dma1: dma@101300 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,p5020-dma", "fsl,eloplus-dma";
+                       reg = <0x101300 0x4>;
+                       ranges = <0x0 0x101100 0x200>;
+                       cell-index = <1>;
+                       dma-channel@0 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x0 0x80>;
+                               cell-index = <0>;
+                               interrupts = <32 2 0 0>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x80 0x80>;
+                               cell-index = <1>;
+                               interrupts = <33 2 0 0>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x100 0x80>;
+                               cell-index = <2>;
+                               interrupts = <34 2 0 0>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,p5020-dma-channel",
+                                               "fsl,eloplus-dma-channel";
+                               reg = <0x180 0x80>;
+                               cell-index = <3>;
+                               interrupts = <35 2 0 0>;
+                       };
+               };
+
+               spi@110000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,p5020-espi", "fsl,mpc8536-espi";
+                       reg = <0x110000 0x1000>;
+                       interrupts = <53 0x2 0 0>;
+                       fsl,espi-num-chipselects = <4>;
+               };
+
+               sdhc: sdhc@114000 {
+                       compatible = "fsl,p5020-esdhc", "fsl,esdhc";
+                       reg = <0x114000 0x1000>;
+                       interrupts = <48 2 0 0>;
+                       sdhci,auto-cmd12;
+                       clock-frequency = <0>;
+               };
+
+               i2c@118000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118000 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@118100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <1>;
+                       compatible = "fsl-i2c";
+                       reg = <0x118100 0x100>;
+                       interrupts = <38 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <2>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119000 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               i2c@119100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <3>;
+                       compatible = "fsl-i2c";
+                       reg = <0x119100 0x100>;
+                       interrupts = <39 2 0 0>;
+                       dfsrr;
+               };
+
+               serial0: serial@11c500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial1: serial@11c600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11c600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <36 2 0 0>;
+               };
+
+               serial2: serial@11d500 {
+                       cell-index = <2>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d500 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               serial3: serial@11d600 {
+                       cell-index = <3>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <0x11d600 0x100>;
+                       clock-frequency = <0>;
+                       interrupts = <37 2 0 0>;
+               };
+
+               gpio0: gpio@130000 {
+                       compatible = "fsl,p5020-gpio", "fsl,qoriq-gpio";
+                       reg = <0x130000 0x1000>;
+                       interrupts = <55 2 0 0>;
+                       #gpio-cells = <2>;
+                       gpio-controller;
+               };
+
+               usb0: usb@210000 {
+                       compatible = "fsl,p5020-usb2-mph",
+                                       "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
+                       reg = <0x210000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <44 0x2 0 0>;
+                       phy_type = "utmi";
+                       port0;
+               };
+
+               usb1: usb@211000 {
+                       compatible = "fsl,p5020-usb2-dr",
+                                       "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
+                       reg = <0x211000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <45 0x2 0 0>;
+                       dr_mode = "host";
+                       phy_type = "utmi";
+               };
+
+               sata@220000 {
+                       compatible = "fsl,p5020-sata", "fsl,pq-sata-v2";
+                       reg = <0x220000 0x1000>;
+                       interrupts = <68 0x2 0 0>;
+               };
+
+               sata@221000 {
+                       compatible = "fsl,p5020-sata", "fsl,pq-sata-v2";
+                       reg = <0x221000 0x1000>;
+                       interrupts = <69 0x2 0 0>;
+               };
+
+               crypto: crypto@300000 {
+                       compatible = "fsl,sec-v4.2", "fsl,sec-v4.0";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg              = <0x300000 0x10000>;
+                       ranges           = <0 0x300000 0x10000>;
+                       interrupts       = <92 2 0 0>;
+
+                       sec_jr0: jr@1000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <88 2 0 0>;
+                       };
+
+                       sec_jr1: jr@2000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <89 2 0 0>;
+                       };
+
+                       sec_jr2: jr@3000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <90 2 0 0>;
+                       };
+
+                       sec_jr3: jr@4000 {
+                               compatible = "fsl,sec-v4.2-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg = <0x4000 0x1000>;
+                               interrupts = <91 2 0 0>;
+                       };
+
+                       rtic@6000 {
+                               compatible = "fsl,sec-v4.2-rtic",
+                                            "fsl,sec-v4.0-rtic";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x6000 0x100>;
+                               ranges = <0x0 0x6100 0xe00>;
+
+                               rtic_a: rtic-a@0 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x00 0x20 0x100 0x80>;
+                               };
+
+                               rtic_b: rtic-b@20 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x20 0x20 0x200 0x80>;
+                               };
+
+                               rtic_c: rtic-c@40 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x40 0x20 0x300 0x80>;
+                               };
+
+                               rtic_d: rtic-d@60 {
+                                       compatible = "fsl,sec-v4.2-rtic-memory",
+                                                    "fsl,sec-v4.0-rtic-memory";
+                                       reg = <0x60 0x20 0x500 0x80>;
+                               };
+                       };
+               };
+
+               sec_mon: sec_mon@314000 {
+                       compatible = "fsl,sec-v4.2-mon", "fsl,sec-v4.0-mon";
+                       reg = <0x314000 0x1000>;
+                       interrupts = <93 2 0 0>;
+               };
+       };
+
+/*
+       rapidio0: rapidio@ffe0c0000
+*/
+
+       localbus@ffe124000 {
+               compatible = "fsl,p5020-elbc", "fsl,elbc", "simple-bus";
+               interrupts = <25 2 0 0>;
+               #address-cells = <2>;
+               #size-cells = <1>;
+       };
+
+       pci0: pcie@ffe200000 {
+               compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi0>;
+               interrupts = <16 2 1 15>;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 15>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 40 1 0 0
+                               0000 0 0 2 &mpic 1 1 0 0
+                               0000 0 0 3 &mpic 2 1 0 0
+                               0000 0 0 4 &mpic 3 1 0 0
+                               >;
+               };
+       };
+
+       pci1: pcie@ffe201000 {
+               compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi1>;
+               interrupts = <16 2 1 14>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 14>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 41 1 0 0
+                               0000 0 0 2 &mpic 5 1 0 0
+                               0000 0 0 3 &mpic 6 1 0 0
+                               0000 0 0 4 &mpic 7 1 0 0
+                               >;
+               };
+       };
+
+       pci2: pcie@ffe202000 {
+               compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 13>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 13>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 42 1 0 0
+                               0000 0 0 2 &mpic 9 1 0 0
+                               0000 0 0 3 &mpic 10 1 0 0
+                               0000 0 0 4 &mpic 11 1 0 0
+                               >;
+               };
+       };
+
+       pci3: pcie@ffe203000 {
+               compatible = "fsl,p5020-pcie", "fsl,qoriq-pcie-v2.2";
+               device_type = "pci";
+               #size-cells = <2>;
+               #address-cells = <3>;
+               bus-range = <0x0 0xff>;
+               clock-frequency = <0x1fca055>;
+               fsl,msi = <&msi2>;
+               interrupts = <16 2 1 12>;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       interrupts = <16 2 1 12>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x0 */
+                               0000 0 0 1 &mpic 43 1 0 0
+                               0000 0 0 2 &mpic 0 1 0 0
+                               0000 0 0 3 &mpic 4 1 0 0
+                               0000 0 0 4 &mpic 8 1 0 0
+                               >;
+               };
+       };
+};
index 739dd0da2416fa9f39d76b001ed808e626d1e13b..b1d329246b08dd59c1f328d1809e7504ac8eb902 100644 (file)
                        dcr-reg = <0x010 0x002>;
                };
 
+               CRYPTO: crypto@e0100000 {
+                       compatible = "amcc,ppc440epx-crypto","amcc,ppc4xx-crypto";
+                       reg = <0 0xE0100000 0x80400>;
+                       interrupt-parent = <&UIC0>;
+                       interrupts = <0x17 0x4>;
+               };
+
+               rng@e0120000 {
+                       compatible = "amcc,ppc440epx-rng","amcc,ppc4xx-rng";
+                       reg = <0 0xE0120000 0x150>;
+               };
+
                DMA0: dma {
                        compatible = "ibm,dma-440epx", "ibm,dma-4xx";
                        dcr-reg = <0x100 0x027>;
index feb4ef6bd14466bd65739306dc4d231170ea873c..38c35404bdc34224e39dad41de8a58bf174c23c3 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xe0005000 0x40>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <0 0 0xfc000000 0x04000000
                          2 0 0xc8000000 0x04000000
index 058438f9629b814263f30623aebab22b9731903d..1657ad0bf8a6a6d30d170706b3338edbce7f5b0e 100644 (file)
                                rx-fifo-size = <4096>;
                                tx-fifo-size = <2048>;
                                phy-mode = "rgmii";
-                               phy-map = <0x00000001>;
+                               phy-address = <1>;
                                rgmii-device = <&RGMII0>;
                                rgmii-channel = <0>;
                                zmii-device = <&ZMII0>;
                                rx-fifo-size = <4096>;
                                tx-fifo-size = <2048>;
                                phy-mode = "rgmii";
-                               phy-map = <0x00000003>;
+                               phy-address = <3>;
                                rgmii-device = <&RGMII0>;
                                rgmii-channel = <1>;
                                zmii-device = <&ZMII0>;
index 15ca731bc24e77147f1acb46bcd5edabb34382f9..0a4cedbdcb55d9e4e248782168b5d697f6866906 100644 (file)
                };
        };
 
+       localbus@e0005000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,mpc8540-localbus", "fsl,pq3-localbus",
+                            "simple-bus";
+               reg = <0xe0005000 0x1000>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+
+               ranges = <0x0 0x0 0xfe000000 0x02000000>;
+
+               nor@0,0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "cfi-flash";
+                       reg = <0x0 0x0 0x02000000>;
+                       bank-width = <4>;
+                       device-width = <2>;
+                       partition@0 {
+                               label = "kernel";
+                               reg = <0x00000000 0x00180000>;
+                       };
+                       partition@180000 {
+                               label = "root";
+                               reg = <0x00180000 0x01dc0000>;
+                       };
+                       partition@1f40000 {
+                               label = "env1";
+                               reg = <0x01f40000 0x00040000>;
+                       };
+                       partition@1f80000 {
+                               label = "env2";
+                               reg = <0x01f80000 0x00040000>;
+                       };
+                       partition@1fc0000 {
+                               label = "u-boot";
+                               reg = <0x01fc0000 0x00040000>;
+                               read-only;
+                       };
+               };
+       };
+
        pci0: pci@e0008000 {
                #interrupt-cells = <1>;
                #size-cells = <2>;
index 5dbb36edb038ade72749681345462b9e1e10aa41..9452c3c05114e523033eebb278d7f78811890a87 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xa0005000 0x100>;       // BRx, ORx, etc.
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <
                        0 0x0 0xfc000000 0x04000000     // NOR FLASH bank 1
index a050ae4271088db078c7f3f85587832925d87944..619776f72c904c611e9507d44db4bee1200e6688 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xe0005000 0x100>;       // BRx, ORx, etc.
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <
                        0 0x0 0xfc000000 0x04000000     // NOR FLASH bank 1
index 22ec39b5beeb8428ca65a1a71edfbe4dca0a2cb8..7665a16a8b9a70c9643f9a9a4f47a2fbf4f7b819 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xe0005000 0x100>;       // BRx, ORx, etc.
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <
                        0 0x0 0xfc000000 0x04000000     // NOR FLASH bank 1
index a0cf53fbd55cd22b37668c30bf1ef9a96c316afa..c41a80c55e47c2d194851a920f599f3ac93dd37a 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xef005000 0x100>;       // BRx, ORx, etc.
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <
                        0 0x0 0xfc000000 0x04000000     // NOR boot flash
index c5b29752651a6b17d72f2186f33a86649d40476e..c0efcbb451372ef57c49f5d61f1cbc0dee88eb63 100644 (file)
                #address-cells = <2>;
                #size-cells = <1>;
                reg = <0xef005000 0x100>;       // BRx, ORx, etc.
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
 
                ranges = <
                        0 0x0 0xf8000000 0x08000000     // NOR boot flash
index fcc44952874ee19aa6ab5b4375766aee5c7f3359..329e710feda26d99f731c38a1eee0aeb15edc6d4 100644 (file)
 
 BSS_STACK(4096);
 
+static u32 ibm4xx_memstart;
+
 static void iss_4xx_fixups(void)
 {
-       ibm4xx_sdram_fixup_memsize();
+       void *memory;
+       u32 reg[3];
+
+       memory = finddevice("/memory");
+       if (!memory)
+               fatal("Can't find memory node\n");
+       /* This assumes #address-cells = 2, #size-cells =1 and that */
+       getprop(memory, "reg", reg, sizeof(reg));
+       if (reg[2])
+               /* If the device tree specifies the memory range, use it */
+               ibm4xx_memstart = reg[1];
+       else
+               /* othersize, read it from the SDRAM controller */
+               ibm4xx_sdram_fixup_memsize();
+}
+
+static void *iss_4xx_vmlinux_alloc(unsigned long size)
+{
+       return (void *)ibm4xx_memstart;
 }
 
 #define SPRN_PIR       0x11E   /* Processor Indentification Register */
@@ -48,6 +68,7 @@ void platform_init(void)
 
        simple_alloc_init(_end, avail_ram, 128, 64);
        platform_ops.fixups = iss_4xx_fixups;
+       platform_ops.vmlinux_alloc = iss_4xx_vmlinux_alloc;
        platform_ops.exit = ibm44x_dbcr_reset;
        pir_reg = mfspr(SPRN_PIR);
        fdt_set_boot_cpuid_phys(_dtb_start, pir_reg);
index 92f863ac8443dd53e77456961cf3a153e335a4b2..a6eb6ad05b2dcc1176126d2082fba01e76437f6f 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SMP=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
+CONFIG_SPARSE_IRQ=y
 CONFIG_LOG_BUF_SHIFT=14
-CONFIG_SYSFS_DEPRECATED_V2=y
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_EXPERT=y
@@ -21,10 +21,11 @@ CONFIG_ISS4xx=y
 CONFIG_HZ_100=y
 CONFIG_MATH_EMULATION=y
 CONFIG_IRQ_ALL_CPUS=y
-CONFIG_SPARSE_IRQ=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="root=/dev/issblk0"
 # CONFIG_PCI is not set
+CONFIG_ADVANCED_OPTIONS=y
+CONFIG_RELOCATABLE=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -67,7 +68,6 @@ CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
 CONFIG_EXT3_FS_POSIX_ACL=y
 CONFIG_EXT3_FS_SECURITY=y
-CONFIG_INOTIFY=y
 CONFIG_PROC_KCORE=y
 CONFIG_TMPFS=y
 CONFIG_CRAMFS=y
diff --git a/arch/powerpc/configs/85xx/p1023rds_defconfig b/arch/powerpc/configs/85xx/p1023rds_defconfig
new file mode 100644 (file)
index 0000000..980ff8f
--- /dev/null
@@ -0,0 +1,173 @@
+CONFIG_PPC_85xx=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=2
+CONFIG_EXPERIMENTAL=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_AUDIT=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_EMBEDDED=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_P1023_RDS=y
+CONFIG_QUICC_ENGINE=y
+CONFIG_QE_GPIO=y
+CONFIG_CPM2=y
+CONFIG_MPC8xxx_GPIO=y
+CONFIG_HIGHMEM=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_MATH_EMULATION=y
+CONFIG_SWIOTLB=y
+CONFIG_PCI=y
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIEAER is not set
+# CONFIG_PCIEASPM is not set
+CONFIG_PCI_MSI=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=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_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_ARPD=y
+CONFIG_INET_ESP=y
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_IPV6=y
+CONFIG_IP_SCTP=m
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=131072
+CONFIG_MISC_DEVICES=y
+CONFIG_EEPROM_LEGACY=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_ATA=y
+CONFIG_SATA_FSL=y
+CONFIG_SATA_SIL24=y
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=y
+CONFIG_MARVELL_PHY=y
+CONFIG_DAVICOM_PHY=y
+CONFIG_CICADA_PHY=y
+CONFIG_VITESSE_PHY=y
+CONFIG_FIXED_PHY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_FS_ENET=y
+CONFIG_E1000E=y
+CONFIG_FSL_PQ_MDIO=y
+CONFIG_INPUT_FF_MEMLESS=m
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_SERIAL_QE=m
+CONFIG_HW_RANDOM=y
+CONFIG_NVRAM=y
+CONFIG_I2C=y
+CONFIG_I2C_CPM=m
+CONFIG_I2C_MPC=y
+# CONFIG_HWMON is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+CONFIG_EDAC=y
+CONFIG_EDAC_MM_EDAC=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_CMOS=y
+CONFIG_DMADEVICES=y
+CONFIG_FSL_DMA=y
+# CONFIG_NET_DMA is not set
+CONFIG_STAGING=y
+# CONFIG_STAGING_EXCLUDE_BUILD is not set
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=y
+CONFIG_NTFS_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_ADFS_FS=m
+CONFIG_AFFS_FS=m
+CONFIG_HFS_FS=m
+CONFIG_HFSPLUS_FS=m
+CONFIG_BEFS_FS=m
+CONFIG_BFS_FS=m
+CONFIG_EFS_FS=m
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+CONFIG_HPFS_FS=m
+CONFIG_QNX4FS_FS=m
+CONFIG_SYSV_FS=m
+CONFIG_UFS_FS=m
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_MAC_PARTITION=y
+CONFIG_CRC_T10DIF=y
+CONFIG_FRAME_WARN=8092
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_INFO=y
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_VIRQ_DEBUG=y
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
index 036bfb2d18cd100237b9cf2bc6c209ca0eba29c9..0db9ba0423ff9e2fea406de92234a05846681662 100644 (file)
@@ -89,6 +89,11 @@ CONFIG_I2C_MPC=y
 CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
 CONFIG_FB_FSL_DIU=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 CONFIG_SOUND=y
 CONFIG_SND=y
 CONFIG_SND_MIXER_OSS=y
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig
new file mode 100644 (file)
index 0000000..10562a5
--- /dev/null
@@ -0,0 +1,187 @@
+CONFIG_PPC_85xx=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=8
+CONFIG_EXPERIMENTAL=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_AUDIT=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_RCU_TRACE=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_EMBEDDED=y
+CONFIG_PERF_EVENTS=y
+CONFIG_SLAB=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_P2040_RDB=y
+CONFIG_P3041_DS=y
+CONFIG_P4080_DS=y
+CONFIG_P5020_DS=y
+CONFIG_HIGHMEM=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_KEXEC=y
+CONFIG_FORCE_MAX_ZONEORDER=13
+CONFIG_FSL_LBC=y
+CONFIG_PCI=y
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIEASPM is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_NET_KEY=y
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=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_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_ARPD=y
+CONFIG_INET_AH=y
+CONFIG_INET_ESP=y
+CONFIG_INET_IPCOMP=y
+# CONFIG_INET_LRO is not set
+CONFIG_IPV6=y
+CONFIG_IP_SCTP=m
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_M25P80=y
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=131072
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_FSL=y
+CONFIG_SATA_SIL24=y
+CONFIG_SATA_SIL=y
+CONFIG_PATA_SIL680=y
+CONFIG_NETDEVICES=y
+CONFIG_VITESSE_PHY=y
+CONFIG_FIXED_PHY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_E1000=y
+CONFIG_E1000E=y
+CONFIG_FSL_PQ_MDIO=y
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_PPC_EPAPR_HV_BYTECHAN=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_HW_RANDOM=y
+CONFIG_NVRAM=y
+CONFIG_I2C=y
+CONFIG_I2C_MPC=y
+CONFIG_SPI=y
+CONFIG_SPI_GPIO=y
+CONFIG_SPI_FSL_SPI=y
+CONFIG_SPI_FSL_ESPI=y
+# CONFIG_HWMON is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+CONFIG_USB_HID=m
+CONFIG_USB=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_MON=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_FSL=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
+CONFIG_USB_STORAGE=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_OF=y
+CONFIG_MMC_SDHCI_OF_ESDHC=y
+CONFIG_EDAC=y
+CONFIG_EDAC_MM_EDAC=y
+CONFIG_EDAC_MPC85XX=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_DS3232=y
+CONFIG_RTC_DRV_CMOS=y
+CONFIG_UIO=y
+CONFIG_STAGING=y
+# CONFIG_STAGING_EXCLUDE_BUILD is not set
+CONFIG_VIRT_DRIVERS=y
+CONFIG_FSL_HV_MANAGER=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=y
+CONFIG_NTFS_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_JFFS2_FS=y
+CONFIG_CRAMFS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_MAC_PARTITION=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=m
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEBUG_INFO=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig
new file mode 100644 (file)
index 0000000..d322835
--- /dev/null
@@ -0,0 +1,104 @@
+CONFIG_PPC64=y
+CONFIG_PPC_BOOK3E_64=y
+# CONFIG_VIRT_CPU_ACCOUNTING is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=2
+CONFIG_EXPERIMENTAL=y
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EXPERT=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_P5020_DS=y
+# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_BINFMT_MISC=m
+# CONFIG_PCI is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=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_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_ARPD=y
+CONFIG_INET_ESP=y
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_IPV6=y
+CONFIG_IP_SCTP=m
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=131072
+CONFIG_MISC_DEVICES=y
+CONFIG_EEPROM_LEGACY=y
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_INPUT_FF_MEMLESS=m
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_I2C=y
+# CONFIG_HWMON is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+CONFIG_DMADEVICES=y
+CONFIG_FSL_DMA=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_MAC_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_UTF8=m
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=m
+CONFIG_FRAME_WARN=1024
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_VIRQ_DEBUG=y
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_DEV_TALITOS=y
diff --git a/arch/powerpc/configs/e55xx_smp_defconfig b/arch/powerpc/configs/e55xx_smp_defconfig
deleted file mode 100644 (file)
index d322835..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-CONFIG_PPC64=y
-CONFIG_PPC_BOOK3E_64=y
-# CONFIG_VIRT_CPU_ACCOUNTING is not set
-CONFIG_SMP=y
-CONFIG_NR_CPUS=2
-CONFIG_EXPERIMENTAL=y
-CONFIG_SYSVIPC=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_SPARSE_IRQ=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EXPERT=y
-CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODVERSIONS=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_P5020_DS=y
-# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_BINFMT_MISC=m
-# CONFIG_PCI is not set
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_XFRM_USER=y
-CONFIG_NET_KEY=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=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_IP_MROUTE=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-CONFIG_ARPD=y
-CONFIG_INET_ESP=y
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
-CONFIG_IPV6=y
-CONFIG_IP_SCTP=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_PROC_DEVICETREE=y
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=131072
-CONFIG_MISC_DEVICES=y
-CONFIG_EEPROM_LEGACY=y
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=y
-CONFIG_NET_ETHERNET=y
-CONFIG_INPUT_FF_MEMLESS=m
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-CONFIG_SERIO_LIBPS2=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_EXTENDED=y
-CONFIG_SERIAL_8250_MANY_PORTS=y
-CONFIG_SERIAL_8250_DETECT_IRQ=y
-CONFIG_SERIAL_8250_RSA=y
-CONFIG_I2C=y
-# CONFIG_HWMON is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=y
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_USB_SUPPORT is not set
-CONFIG_DMADEVICES=y
-CONFIG_FSL_DMA=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-CONFIG_PROC_KCORE=y
-CONFIG_TMPFS=y
-# CONFIG_MISC_FILESYSTEMS is not set
-CONFIG_PARTITION_ADVANCED=y
-CONFIG_MAC_PARTITION=y
-CONFIG_NLS=y
-CONFIG_NLS_UTF8=m
-CONFIG_CRC_T10DIF=y
-CONFIG_CRC_ITU_T=m
-CONFIG_FRAME_WARN=1024
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DETECT_HUNG_TASK=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_VIRQ_DEBUG=y
-CONFIG_CRYPTO_PCBC=m
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRYPTO_DEV_TALITOS=y
index 96b89df7752a5d80f0ab4b08acc0020c6dd9fd4e..fcd85d2c72dc5289eccc0ae3efc973a99eb34ad5 100644 (file)
@@ -5,6 +5,7 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_AUDIT=y
+CONFIG_SPARSE_IRQ=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=14
@@ -25,7 +26,9 @@ CONFIG_MPC85xx_MDS=y
 CONFIG_MPC8536_DS=y
 CONFIG_MPC85xx_DS=y
 CONFIG_MPC85xx_RDB=y
+CONFIG_P1010_RDB=y
 CONFIG_P1022_DS=y
+CONFIG_P1023_RDS=y
 CONFIG_SOCRATES=y
 CONFIG_KSI8560=y
 CONFIG_XES_MPC85xx=y
@@ -44,7 +47,6 @@ CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_BINFMT_MISC=m
 CONFIG_MATH_EMULATION=y
-CONFIG_SPARSE_IRQ=y
 CONFIG_FORCE_MAX_ZONEORDER=12
 CONFIG_PCI=y
 CONFIG_PCI_MSI=y
@@ -65,8 +67,6 @@ CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
 CONFIG_NET_IPIP=y
-CONFIG_NET_IPGRE=y
-CONFIG_NET_IPGRE_BROADCAST=y
 CONFIG_IP_MROUTE=y
 CONFIG_IP_PIMSM_V1=y
 CONFIG_IP_PIMSM_V2=y
@@ -128,6 +128,10 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
 CONFIG_FB_FSL_DIU=y
 # CONFIG_VGA_CONSOLE is not set
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 CONFIG_SOUND=y
 CONFIG_SND=y
 # CONFIG_SND_SUPPORT_OLD_API is not set
@@ -170,7 +174,6 @@ CONFIG_FSL_DMA=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-CONFIG_INOTIFY=y
 CONFIG_ISO9660_FS=m
 CONFIG_JOLIET=y
 CONFIG_ZISOFS=y
@@ -205,7 +208,6 @@ CONFIG_DEBUG_FS=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_SYSCTL_SYSCALL_CHECK=y
 CONFIG_VIRQ_DEBUG=y
 CONFIG_CRYPTO_PCBC=m
index de65841aa04e904c946bb9fe03252418c37f7aae..908c941fc24c8aeb11e50ba62cc67f18526bbf5a 100644 (file)
@@ -7,6 +7,7 @@ CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_AUDIT=y
+CONFIG_SPARSE_IRQ=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=14
@@ -28,6 +29,7 @@ CONFIG_MPC8536_DS=y
 CONFIG_MPC85xx_DS=y
 CONFIG_MPC85xx_RDB=y
 CONFIG_P1022_DS=y
+CONFIG_P1023_RDS=y
 CONFIG_SOCRATES=y
 CONFIG_KSI8560=y
 CONFIG_XES_MPC85xx=y
@@ -46,7 +48,6 @@ CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_BINFMT_MISC=m
 CONFIG_MATH_EMULATION=y
-CONFIG_SPARSE_IRQ=y
 CONFIG_FORCE_MAX_ZONEORDER=12
 CONFIG_PCI=y
 CONFIG_PCI_MSI=y
@@ -67,8 +68,6 @@ CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
 CONFIG_NET_IPIP=y
-CONFIG_NET_IPGRE=y
-CONFIG_NET_IPGRE_BROADCAST=y
 CONFIG_IP_MROUTE=y
 CONFIG_IP_PIMSM_V1=y
 CONFIG_IP_PIMSM_V2=y
@@ -130,6 +129,10 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
 CONFIG_FB_FSL_DIU=y
 # CONFIG_VGA_CONSOLE is not set
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 CONFIG_SOUND=y
 CONFIG_SND=y
 # CONFIG_SND_SUPPORT_OLD_API is not set
@@ -172,7 +175,6 @@ CONFIG_FSL_DMA=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-CONFIG_INOTIFY=y
 CONFIG_ISO9660_FS=m
 CONFIG_JOLIET=y
 CONFIG_ZISOFS=y
index 76736017cd347b6255cc6b536f3c74d1dabb6064..84a685a505fe115a39ebfbe99ce3baa399bf85d3 100644 (file)
@@ -176,12 +176,19 @@ CONFIG_CHR_DEV_SG=y
 CONFIG_SCSI_MULTI_LUN=y
 CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_FC_ATTRS=y
+CONFIG_SCSI_SAS_ATTRS=m
+CONFIG_SCSI_CXGB3_ISCSI=m
+CONFIG_SCSI_CXGB4_ISCSI=m
+CONFIG_SCSI_BNX2_ISCSI=m
+CONFIG_BE2ISCSI=m
+CONFIG_SCSI_MPT2SAS=m
 CONFIG_SCSI_IBMVSCSI=y
 CONFIG_SCSI_IBMVFC=m
 CONFIG_SCSI_SYM53C8XX_2=y
 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
 CONFIG_SCSI_IPR=y
 CONFIG_SCSI_QLA_FC=m
+CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
 CONFIG_ATA=y
 CONFIG_SATA_SIL24=y
@@ -235,11 +242,13 @@ CONFIG_ACENIC_OMIT_TIGON_I=y
 CONFIG_E1000=y
 CONFIG_E1000E=y
 CONFIG_TIGON3=y
+CONFIG_BNX2=m
 CONFIG_SPIDER_NET=m
 CONFIG_GELIC_NET=m
 CONFIG_GELIC_WIRELESS=y
 CONFIG_CHELSIO_T1=m
 CONFIG_CHELSIO_T3=m
+CONFIG_CHELSIO_T4=m
 CONFIG_EHEA=m
 CONFIG_IXGBE=m
 CONFIG_IXGB=m
@@ -248,6 +257,8 @@ CONFIG_MYRI10GE=m
 CONFIG_NETXEN_NIC=m
 CONFIG_PASEMI_MAC=y
 CONFIG_MLX4_EN=m
+CONFIG_QLGE=m
+CONFIG_BE2NET=m
 CONFIG_ISERIES_VETH=m
 CONFIG_PPP=m
 CONFIG_PPP_ASYNC=m
@@ -330,6 +341,8 @@ CONFIG_INFINIBAND_USER_MAD=m
 CONFIG_INFINIBAND_USER_ACCESS=m
 CONFIG_INFINIBAND_MTHCA=m
 CONFIG_INFINIBAND_EHCA=m
+CONFIG_INFINIBAND_CXGB3=m
+CONFIG_INFINIBAND_CXGB4=m
 CONFIG_MLX4_INFINIBAND=m
 CONFIG_INFINIBAND_IPOIB=m
 CONFIG_INFINIBAND_IPOIB_CM=y
@@ -430,11 +443,12 @@ CONFIG_NLS_KOI8_U=m
 CONFIG_CRC_T10DIF=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_DETECT_HUNG_TASK=y
 CONFIG_DEBUG_MUTEXES=y
 # CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_LATENCYTOP=y
 CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_IRQSOFF_TRACER=y
 CONFIG_SCHED_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
 CONFIG_DEBUG_STACKOVERFLOW=y
index 80bc5de7ee1d3c87d3b627c49c4eb0ae8e3d6c66..96a58b709705ccae5e071aa474f19b7f1a506ce0 100644 (file)
@@ -149,6 +149,7 @@ CONFIG_SCSI_CXGB3_ISCSI=m
 CONFIG_SCSI_CXGB4_ISCSI=m
 CONFIG_SCSI_BNX2_ISCSI=m
 CONFIG_BE2ISCSI=m
+CONFIG_SCSI_MPT2SAS=m
 CONFIG_SCSI_IBMVSCSI=y
 CONFIG_SCSI_IBMVFC=m
 CONFIG_SCSI_SYM53C8XX_2=y
@@ -320,6 +321,8 @@ CONFIG_NLS_ISO8859_1=y
 CONFIG_CRC_T10DIF=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_DETECT_HUNG_TASK=y
 # CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_LATENCYTOP=y
 CONFIG_SYSCTL_SYSCALL_CHECK=y
index 9c70d0ca96d4d7afca0a1ecb86da0d47f4619891..efa74ac44a359b5b78d8dd7b564905fc5af02bb2 100644 (file)
@@ -18,7 +18,7 @@
 #include <asm/ppc-opcode.h>
 
 #define PPC_DBELL_MSG_BRDCAST  (0x04000000)
-#define PPC_DBELL_TYPE(x)      (((x) & 0xf) << 28)
+#define PPC_DBELL_TYPE(x)      (((x) & 0xf) << (63-36))
 enum ppc_dbell {
        PPC_DBELL = 0,          /* doorbell */
        PPC_DBELL_CRIT = 1,     /* critical doorbell */
diff --git a/arch/powerpc/include/asm/ehv_pic.h b/arch/powerpc/include/asm/ehv_pic.h
new file mode 100644 (file)
index 0000000..a9e1f4f
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * EHV_PIC private definitions and structure.
+ *
+ * Copyright 2008-2010 Freescale Semiconductor, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+#ifndef __EHV_PIC_H__
+#define __EHV_PIC_H__
+
+#include <linux/irq.h>
+
+#define NR_EHV_PIC_INTS 1024
+
+#define EHV_PIC_INFO(name) EHV_PIC_##name
+
+#define EHV_PIC_VECPRI_POLARITY_NEGATIVE 0
+#define EHV_PIC_VECPRI_POLARITY_POSITIVE 1
+#define EHV_PIC_VECPRI_SENSE_EDGE 0
+#define EHV_PIC_VECPRI_SENSE_LEVEL 0x2
+#define EHV_PIC_VECPRI_POLARITY_MASK 0x1
+#define EHV_PIC_VECPRI_SENSE_MASK 0x2
+
+struct ehv_pic {
+       /* The remapper for this EHV_PIC */
+       struct irq_host *irqhost;
+
+       /* The "linux" controller struct */
+       struct irq_chip hc_irq;
+
+       /* core int flag */
+       int coreint_flag;
+};
+
+void ehv_pic_init(void);
+unsigned int ehv_pic_get_irq(void);
+
+#endif /* __EHV_PIC_H__ */
diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
new file mode 100644 (file)
index 0000000..f3b0c2c
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * ePAPR hcall interface
+ *
+ * Copyright 2008-2011 Freescale Semiconductor, Inc.
+ *
+ * Author: Timur Tabi <timur@freescale.com>
+ *
+ * This file is provided under a dual BSD/GPL license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* A "hypercall" is an "sc 1" instruction.  This header file file provides C
+ * wrapper functions for the ePAPR hypervisor interface.  It is inteded
+ * for use by Linux device drivers and other operating systems.
+ *
+ * The hypercalls are implemented as inline assembly, rather than assembly
+ * language functions in a .S file, for optimization.  It allows
+ * the caller to issue the hypercall instruction directly, improving both
+ * performance and memory footprint.
+ */
+
+#ifndef _EPAPR_HCALLS_H
+#define _EPAPR_HCALLS_H
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/byteorder.h>
+
+#define EV_BYTE_CHANNEL_SEND           1
+#define EV_BYTE_CHANNEL_RECEIVE                2
+#define EV_BYTE_CHANNEL_POLL           3
+#define EV_INT_SET_CONFIG              4
+#define EV_INT_GET_CONFIG              5
+#define EV_INT_SET_MASK                        6
+#define EV_INT_GET_MASK                        7
+#define EV_INT_IACK                    9
+#define EV_INT_EOI                     10
+#define EV_INT_SEND_IPI                        11
+#define EV_INT_SET_TASK_PRIORITY       12
+#define EV_INT_GET_TASK_PRIORITY       13
+#define EV_DOORBELL_SEND               14
+#define EV_MSGSND                      15
+#define EV_IDLE                                16
+
+/* vendor ID: epapr */
+#define EV_LOCAL_VENDOR_ID             0       /* for private use */
+#define EV_EPAPR_VENDOR_ID             1
+#define EV_FSL_VENDOR_ID               2       /* Freescale Semiconductor */
+#define EV_IBM_VENDOR_ID               3       /* IBM */
+#define EV_GHS_VENDOR_ID               4       /* Green Hills Software */
+#define EV_ENEA_VENDOR_ID              5       /* Enea */
+#define EV_WR_VENDOR_ID                        6       /* Wind River Systems */
+#define EV_AMCC_VENDOR_ID              7       /* Applied Micro Circuits */
+#define EV_KVM_VENDOR_ID               42      /* KVM */
+
+/* The max number of bytes that a byte channel can send or receive per call */
+#define EV_BYTE_CHANNEL_MAX_BYTES      16
+
+
+#define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num))
+#define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num)
+
+/* epapr error codes */
+#define EV_EPERM               1       /* Operation not permitted */
+#define EV_ENOENT              2       /*  Entry Not Found */
+#define EV_EIO                 3       /* I/O error occured */
+#define EV_EAGAIN              4       /* The operation had insufficient
+                                        * resources to complete and should be
+                                        * retried
+                                        */
+#define EV_ENOMEM              5       /* There was insufficient memory to
+                                        * complete the operation */
+#define EV_EFAULT              6       /* Bad guest address */
+#define EV_ENODEV              7       /* No such device */
+#define EV_EINVAL              8       /* An argument supplied to the hcall
+                                          was out of range or invalid */
+#define EV_INTERNAL            9       /* An internal error occured */
+#define EV_CONFIG              10      /* A configuration error was detected */
+#define EV_INVALID_STATE       11      /* The object is in an invalid state */
+#define EV_UNIMPLEMENTED       12      /* Unimplemented hypercall */
+#define EV_BUFFER_OVERFLOW     13      /* Caller-supplied buffer too small */
+
+/*
+ * Hypercall register clobber list
+ *
+ * These macros are used to define the list of clobbered registers during a
+ * hypercall.  Technically, registers r0 and r3-r12 are always clobbered,
+ * but the gcc inline assembly syntax does not allow us to specify registers
+ * on the clobber list that are also on the input/output list.  Therefore,
+ * the lists of clobbered registers depends on the number of register
+ * parmeters ("+r" and "=r") passed to the hypercall.
+ *
+ * Each assembly block should use one of the HCALL_CLOBBERSx macros.  As a
+ * general rule, 'x' is the number of parameters passed to the assembly
+ * block *except* for r11.
+ *
+ * If you're not sure, just use the smallest value of 'x' that does not
+ * generate a compilation error.  Because these are static inline functions,
+ * the compiler will only check the clobber list for a function if you
+ * compile code that calls that function.
+ *
+ * r3 and r11 are not included in any clobbers list because they are always
+ * listed as output registers.
+ *
+ * XER, CTR, and LR are currently listed as clobbers because it's uncertain
+ * whether they will be clobbered.
+ *
+ * Note that r11 can be used as an output parameter.
+*/
+
+/* List of common clobbered registers.  Do not use this macro. */
+#define EV_HCALL_CLOBBERS "r0", "r12", "xer", "ctr", "lr", "cc"
+
+#define EV_HCALL_CLOBBERS8 EV_HCALL_CLOBBERS
+#define EV_HCALL_CLOBBERS7 EV_HCALL_CLOBBERS8, "r10"
+#define EV_HCALL_CLOBBERS6 EV_HCALL_CLOBBERS7, "r9"
+#define EV_HCALL_CLOBBERS5 EV_HCALL_CLOBBERS6, "r8"
+#define EV_HCALL_CLOBBERS4 EV_HCALL_CLOBBERS5, "r7"
+#define EV_HCALL_CLOBBERS3 EV_HCALL_CLOBBERS4, "r6"
+#define EV_HCALL_CLOBBERS2 EV_HCALL_CLOBBERS3, "r5"
+#define EV_HCALL_CLOBBERS1 EV_HCALL_CLOBBERS2, "r4"
+
+
+/*
+ * We use "uintptr_t" to define a register because it's guaranteed to be a
+ * 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit
+ * platform.
+ *
+ * All registers are either input/output or output only.  Registers that are
+ * initialized before making the hypercall are input/output.  All
+ * input/output registers are represented with "+r".  Output-only registers
+ * are represented with "=r".  Do not specify any unused registers.  The
+ * clobber list will tell the compiler that the hypercall modifies those
+ * registers, which is good enough.
+ */
+
+/**
+ * ev_int_set_config - configure the specified interrupt
+ * @interrupt: the interrupt number
+ * @config: configuration for this interrupt
+ * @priority: interrupt priority
+ * @destination: destination CPU number
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_set_config(unsigned int interrupt,
+       uint32_t config, unsigned int priority, uint32_t destination)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_SET_CONFIG);
+       r3  = interrupt;
+       r4  = config;
+       r5  = priority;
+       r6  = destination;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6)
+               : : EV_HCALL_CLOBBERS4
+       );
+
+       return r3;
+}
+
+/**
+ * ev_int_get_config - return the config of the specified interrupt
+ * @interrupt: the interrupt number
+ * @config: returned configuration for this interrupt
+ * @priority: returned interrupt priority
+ * @destination: returned destination CPU number
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_get_config(unsigned int interrupt,
+       uint32_t *config, unsigned int *priority, uint32_t *destination)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_GET_CONFIG);
+       r3 = interrupt;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5), "=r" (r6)
+               : : EV_HCALL_CLOBBERS4
+       );
+
+       *config = r4;
+       *priority = r5;
+       *destination = r6;
+
+       return r3;
+}
+
+/**
+ * ev_int_set_mask - sets the mask for the specified interrupt source
+ * @interrupt: the interrupt number
+ * @mask: 0=enable interrupts, 1=disable interrupts
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_set_mask(unsigned int interrupt,
+       unsigned int mask)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_SET_MASK);
+       r3 = interrupt;
+       r4 = mask;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       return r3;
+}
+
+/**
+ * ev_int_get_mask - returns the mask for the specified interrupt source
+ * @interrupt: the interrupt number
+ * @mask: returned mask for this interrupt (0=enabled, 1=disabled)
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_get_mask(unsigned int interrupt,
+       unsigned int *mask)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_GET_MASK);
+       r3 = interrupt;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       *mask = r4;
+
+       return r3;
+}
+
+/**
+ * ev_int_eoi - signal the end of interrupt processing
+ * @interrupt: the interrupt number
+ *
+ * This function signals the end of processing for the the specified
+ * interrupt, which must be the interrupt currently in service. By
+ * definition, this is also the highest-priority interrupt.
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_eoi(unsigned int interrupt)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_EOI);
+       r3 = interrupt;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/**
+ * ev_byte_channel_send - send characters to a byte stream
+ * @handle: byte stream handle
+ * @count: (input) num of chars to send, (output) num chars sent
+ * @buffer: pointer to a 16-byte buffer
+ *
+ * @buffer must be at least 16 bytes long, because all 16 bytes will be
+ * read from memory into registers, even if count < 16.
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_byte_channel_send(unsigned int handle,
+       unsigned int *count, const char buffer[EV_BYTE_CHANNEL_MAX_BYTES])
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r8 __asm__("r8");
+       const uint32_t *p = (const uint32_t *) buffer;
+
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_SEND);
+       r3 = handle;
+       r4 = *count;
+       r5 = be32_to_cpu(p[0]);
+       r6 = be32_to_cpu(p[1]);
+       r7 = be32_to_cpu(p[2]);
+       r8 = be32_to_cpu(p[3]);
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3),
+                 "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7), "+r" (r8)
+               : : EV_HCALL_CLOBBERS6
+       );
+
+       *count = r4;
+
+       return r3;
+}
+
+/**
+ * ev_byte_channel_receive - fetch characters from a byte channel
+ * @handle: byte channel handle
+ * @count: (input) max num of chars to receive, (output) num chars received
+ * @buffer: pointer to a 16-byte buffer
+ *
+ * The size of @buffer must be at least 16 bytes, even if you request fewer
+ * than 16 characters, because we always write 16 bytes to @buffer.  This is
+ * for performance reasons.
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_byte_channel_receive(unsigned int handle,
+       unsigned int *count, char buffer[EV_BYTE_CHANNEL_MAX_BYTES])
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r8 __asm__("r8");
+       uint32_t *p = (uint32_t *) buffer;
+
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_RECEIVE);
+       r3 = handle;
+       r4 = *count;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4),
+                 "=r" (r5), "=r" (r6), "=r" (r7), "=r" (r8)
+               : : EV_HCALL_CLOBBERS6
+       );
+
+       *count = r4;
+       p[0] = cpu_to_be32(r5);
+       p[1] = cpu_to_be32(r6);
+       p[2] = cpu_to_be32(r7);
+       p[3] = cpu_to_be32(r8);
+
+       return r3;
+}
+
+/**
+ * ev_byte_channel_poll - returns the status of the byte channel buffers
+ * @handle: byte channel handle
+ * @rx_count: returned count of bytes in receive queue
+ * @tx_count: returned count of free space in transmit queue
+ *
+ * This function reports the amount of data in the receive queue (i.e. the
+ * number of bytes you can read), and the amount of free space in the transmit
+ * queue (i.e. the number of bytes you can write).
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_byte_channel_poll(unsigned int handle,
+       unsigned int *rx_count, unsigned int *tx_count)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+
+       r11 = EV_HCALL_TOKEN(EV_BYTE_CHANNEL_POLL);
+       r3 = handle;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4), "=r" (r5)
+               : : EV_HCALL_CLOBBERS3
+       );
+
+       *rx_count = r4;
+       *tx_count = r5;
+
+       return r3;
+}
+
+/**
+ * ev_int_iack - acknowledge an interrupt
+ * @handle: handle to the target interrupt controller
+ * @vector: returned interrupt vector
+ *
+ * If handle is zero, the function returns the next interrupt source
+ * number to be handled irrespective of the hierarchy or cascading
+ * of interrupt controllers. If non-zero, specifies a handle to the
+ * interrupt controller that is the target of the acknowledge.
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_int_iack(unsigned int handle,
+       unsigned int *vector)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = EV_HCALL_TOKEN(EV_INT_IACK);
+       r3 = handle;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       *vector = r4;
+
+       return r3;
+}
+
+/**
+ * ev_doorbell_send - send a doorbell to another partition
+ * @handle: doorbell send handle
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_doorbell_send(unsigned int handle)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = EV_HCALL_TOKEN(EV_DOORBELL_SEND);
+       r3 = handle;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/**
+ * ev_idle -- wait for next interrupt on this core
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int ev_idle(void)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = EV_HCALL_TOKEN(EV_IDLE);
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "=r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+#endif
index 6d53f311d942a1f8f0fffaada0b70307a8e1e93c..ac13addb849582e7dc450d3e9b7a091c1ddcf4de 100644 (file)
 #define EX_R14         (4 * 8)
 #define EX_R15         (5 * 8)
 
-/* The TLB miss exception uses different slots */
+/*
+ * The TLB miss exception uses different slots.
+ *
+ * The bolted variant uses only the first six fields,
+ * which in combination with pgd and kernel_pgd fits in
+ * one 64-byte cache line.
+ */
 
 #define EX_TLB_R10     ( 0 * 8)
 #define EX_TLB_R11     ( 1 * 8)
-#define EX_TLB_R12     ( 2 * 8)
-#define EX_TLB_R13     ( 3 * 8)
-#define EX_TLB_R14     ( 4 * 8)
-#define EX_TLB_R15     ( 5 * 8)
-#define EX_TLB_R16     ( 6 * 8)
-#define EX_TLB_CR      ( 7 * 8)
+#define EX_TLB_R14     ( 2 * 8)
+#define EX_TLB_R15     ( 3 * 8)
+#define EX_TLB_R16     ( 4 * 8)
+#define EX_TLB_CR      ( 5 * 8)
+#define EX_TLB_R12     ( 6 * 8)
+#define EX_TLB_R13     ( 7 * 8)
 #define EX_TLB_DEAR    ( 8 * 8) /* Level 0 and 2 only */
 #define EX_TLB_ESR     ( 9 * 8) /* Level 0 and 2 only */
 #define EX_TLB_SRR0    (10 * 8)
 #define EX_TLB_SRR1    (11 * 8)
-#define EX_TLB_MMUCR0  (12 * 8) /* Level 0 */
-#define EX_TLB_MAS1    (12 * 8) /* Level 0 */
-#define EX_TLB_MAS2    (13 * 8) /* Level 0 */
 #ifdef CONFIG_BOOK3E_MMU_TLB_STATS
-#define EX_TLB_R8      (14 * 8)
-#define EX_TLB_R9      (15 * 8)
-#define EX_TLB_LR      (16 * 8)
-#define EX_TLB_SIZE    (17 * 8)
+#define EX_TLB_R8      (12 * 8)
+#define EX_TLB_R9      (13 * 8)
+#define EX_TLB_LR      (14 * 8)
+#define EX_TLB_SIZE    (15 * 8)
 #else
-#define EX_TLB_SIZE    (14 * 8)
+#define EX_TLB_SIZE    (12 * 8)
 #endif
 
 #define        START_EXCEPTION(label)                                          \
@@ -168,6 +171,16 @@ exc_##label##_book3e:
        ld      r9,EX_TLB_R9(r12);                                          \
        ld      r8,EX_TLB_R8(r12);                                          \
        mtlr    r16;
+#define TLB_MISS_PROLOG_STATS_BOLTED                                               \
+       mflr    r10;                                                        \
+       std     r8,PACA_EXTLB+EX_TLB_R8(r13);                               \
+       std     r9,PACA_EXTLB+EX_TLB_R9(r13);                               \
+       std     r10,PACA_EXTLB+EX_TLB_LR(r13);
+#define TLB_MISS_RESTORE_STATS_BOLTED                                              \
+       ld      r16,PACA_EXTLB+EX_TLB_LR(r13);                              \
+       ld      r9,PACA_EXTLB+EX_TLB_R9(r13);                               \
+       ld      r8,PACA_EXTLB+EX_TLB_R8(r13);                               \
+       mtlr    r16;
 #define TLB_MISS_STATS_D(name)                                             \
        addi    r9,r13,MMSTAT_DSTATS+name;                                  \
        bl      .tlb_stat_inc;
@@ -183,17 +196,20 @@ exc_##label##_book3e:
 61:    addi    r9,r13,MMSTAT_ISTATS+name;                                  \
 62:    bl      .tlb_stat_inc;
 #define TLB_MISS_STATS_SAVE_INFO                                           \
-       std     r14,EX_TLB_ESR(r12);    /* save ESR */                      \
-
-
+       std     r14,EX_TLB_ESR(r12);    /* save ESR */
+#define TLB_MISS_STATS_SAVE_INFO_BOLTED                                            \
+       std     r14,PACA_EXTLB+EX_TLB_ESR(r13); /* save ESR */
 #else
 #define TLB_MISS_PROLOG_STATS
 #define TLB_MISS_RESTORE_STATS
+#define TLB_MISS_PROLOG_STATS_BOLTED
+#define TLB_MISS_RESTORE_STATS_BOLTED
 #define TLB_MISS_STATS_D(name)
 #define TLB_MISS_STATS_I(name)
 #define TLB_MISS_STATS_X(name)
 #define TLB_MISS_STATS_Y(name)
 #define TLB_MISS_STATS_SAVE_INFO
+#define TLB_MISS_STATS_SAVE_INFO_BOLTED
 #endif
 
 #define SET_IVOR(vector_number, vector_offset) \
diff --git a/arch/powerpc/include/asm/fsl_hcalls.h b/arch/powerpc/include/asm/fsl_hcalls.h
new file mode 100644 (file)
index 0000000..922d9b5
--- /dev/null
@@ -0,0 +1,655 @@
+/*
+ * Freescale hypervisor call interface
+ *
+ * Copyright 2008-2010 Freescale Semiconductor, Inc.
+ *
+ * Author: Timur Tabi <timur@freescale.com>
+ *
+ * This file is provided under a dual BSD/GPL license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _FSL_HCALLS_H
+#define _FSL_HCALLS_H
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/byteorder.h>
+#include <asm/epapr_hcalls.h>
+
+#define FH_API_VERSION                 1
+
+#define FH_ERR_GET_INFO                        1
+#define FH_PARTITION_GET_DTPROP                2
+#define FH_PARTITION_SET_DTPROP                3
+#define FH_PARTITION_RESTART           4
+#define FH_PARTITION_GET_STATUS                5
+#define FH_PARTITION_START             6
+#define FH_PARTITION_STOP              7
+#define FH_PARTITION_MEMCPY            8
+#define FH_DMA_ENABLE                  9
+#define FH_DMA_DISABLE                 10
+#define FH_SEND_NMI                    11
+#define FH_VMPIC_GET_MSIR              12
+#define FH_SYSTEM_RESET                        13
+#define FH_GET_CORE_STATE              14
+#define FH_ENTER_NAP                   15
+#define FH_EXIT_NAP                    16
+#define FH_CLAIM_DEVICE                        17
+#define FH_PARTITION_STOP_DMA          18
+
+/* vendor ID: Freescale Semiconductor */
+#define FH_HCALL_TOKEN(num)            _EV_HCALL_TOKEN(EV_FSL_VENDOR_ID, num)
+
+/*
+ * We use "uintptr_t" to define a register because it's guaranteed to be a
+ * 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit
+ * platform.
+ *
+ * All registers are either input/output or output only.  Registers that are
+ * initialized before making the hypercall are input/output.  All
+ * input/output registers are represented with "+r".  Output-only registers
+ * are represented with "=r".  Do not specify any unused registers.  The
+ * clobber list will tell the compiler that the hypercall modifies those
+ * registers, which is good enough.
+ */
+
+/**
+ * fh_send_nmi - send NMI to virtual cpu(s).
+ * @vcpu_mask: send NMI to virtual cpu(s) specified by this mask.
+ *
+ * Returns 0 for success, or EINVAL for invalid vcpu_mask.
+ */
+static inline unsigned int fh_send_nmi(unsigned int vcpu_mask)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_SEND_NMI);
+       r3 = vcpu_mask;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/* Arbitrary limits to avoid excessive memory allocation in hypervisor */
+#define FH_DTPROP_MAX_PATHLEN 4096
+#define FH_DTPROP_MAX_PROPLEN 32768
+
+/**
+ * fh_partiton_get_dtprop - get a property from a guest device tree.
+ * @handle: handle of partition whose device tree is to be accessed
+ * @dtpath_addr: physical address of device tree path to access
+ * @propname_addr: physical address of name of property
+ * @propvalue_addr: physical address of property value buffer
+ * @propvalue_len: length of buffer on entry, length of property on return
+ *
+ * Returns zero on success, non-zero on error.
+ */
+static inline unsigned int fh_partition_get_dtprop(int handle,
+                                                  uint64_t dtpath_addr,
+                                                  uint64_t propname_addr,
+                                                  uint64_t propvalue_addr,
+                                                  uint32_t *propvalue_len)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r8 __asm__("r8");
+       register uintptr_t r9 __asm__("r9");
+       register uintptr_t r10 __asm__("r10");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_DTPROP);
+       r3 = handle;
+
+#ifdef CONFIG_PHYS_64BIT
+       r4 = dtpath_addr >> 32;
+       r6 = propname_addr >> 32;
+       r8 = propvalue_addr >> 32;
+#else
+       r4 = 0;
+       r6 = 0;
+       r8 = 0;
+#endif
+       r5 = (uint32_t)dtpath_addr;
+       r7 = (uint32_t)propname_addr;
+       r9 = (uint32_t)propvalue_addr;
+       r10 = *propvalue_len;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11),
+                 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
+                 "+r" (r8), "+r" (r9), "+r" (r10)
+               : : EV_HCALL_CLOBBERS8
+       );
+
+       *propvalue_len = r4;
+       return r3;
+}
+
+/**
+ * Set a property in a guest device tree.
+ * @handle: handle of partition whose device tree is to be accessed
+ * @dtpath_addr: physical address of device tree path to access
+ * @propname_addr: physical address of name of property
+ * @propvalue_addr: physical address of property value
+ * @propvalue_len: length of property
+ *
+ * Returns zero on success, non-zero on error.
+ */
+static inline unsigned int fh_partition_set_dtprop(int handle,
+                                                  uint64_t dtpath_addr,
+                                                  uint64_t propname_addr,
+                                                  uint64_t propvalue_addr,
+                                                  uint32_t propvalue_len)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r8 __asm__("r8");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r7 __asm__("r7");
+       register uintptr_t r9 __asm__("r9");
+       register uintptr_t r10 __asm__("r10");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_SET_DTPROP);
+       r3 = handle;
+
+#ifdef CONFIG_PHYS_64BIT
+       r4 = dtpath_addr >> 32;
+       r6 = propname_addr >> 32;
+       r8 = propvalue_addr >> 32;
+#else
+       r4 = 0;
+       r6 = 0;
+       r8 = 0;
+#endif
+       r5 = (uint32_t)dtpath_addr;
+       r7 = (uint32_t)propname_addr;
+       r9 = (uint32_t)propvalue_addr;
+       r10 = propvalue_len;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11),
+                 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7),
+                 "+r" (r8), "+r" (r9), "+r" (r10)
+               : : EV_HCALL_CLOBBERS8
+       );
+
+       return r3;
+}
+
+/**
+ * fh_partition_restart - reboot the current partition
+ * @partition: partition ID
+ *
+ * Returns an error code if reboot failed.  Does not return if it succeeds.
+ */
+static inline unsigned int fh_partition_restart(unsigned int partition)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_RESTART);
+       r3 = partition;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+#define FH_PARTITION_STOPPED   0
+#define FH_PARTITION_RUNNING   1
+#define FH_PARTITION_STARTING  2
+#define FH_PARTITION_STOPPING  3
+#define FH_PARTITION_PAUSING   4
+#define FH_PARTITION_PAUSED    5
+#define FH_PARTITION_RESUMING  6
+
+/**
+ * fh_partition_get_status - gets the status of a partition
+ * @partition: partition ID
+ * @status: returned status code
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_partition_get_status(unsigned int partition,
+       unsigned int *status)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_GET_STATUS);
+       r3 = partition;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       *status = r4;
+
+       return r3;
+}
+
+/**
+ * fh_partition_start - boots and starts execution of the specified partition
+ * @partition: partition ID
+ * @entry_point: guest physical address to start execution
+ *
+ * The hypervisor creates a 1-to-1 virtual/physical IMA mapping, so at boot
+ * time, guest physical address are the same as guest virtual addresses.
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_partition_start(unsigned int partition,
+       uint32_t entry_point, int load)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_START);
+       r3 = partition;
+       r4 = entry_point;
+       r5 = load;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5)
+               : : EV_HCALL_CLOBBERS3
+       );
+
+       return r3;
+}
+
+/**
+ * fh_partition_stop - stops another partition
+ * @partition: partition ID
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_partition_stop(unsigned int partition)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP);
+       r3 = partition;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/**
+ * struct fh_sg_list: definition of the fh_partition_memcpy S/G list
+ * @source: guest physical address to copy from
+ * @target: guest physical address to copy to
+ * @size: number of bytes to copy
+ * @reserved: reserved, must be zero
+ *
+ * The scatter/gather list for fh_partition_memcpy() is an array of these
+ * structures.  The array must be guest physically contiguous.
+ *
+ * This structure must be aligned on 32-byte boundary, so that no single
+ * strucuture can span two pages.
+ */
+struct fh_sg_list {
+       uint64_t source;   /**< guest physical address to copy from */
+       uint64_t target;   /**< guest physical address to copy to */
+       uint64_t size;     /**< number of bytes to copy */
+       uint64_t reserved; /**< reserved, must be zero */
+} __attribute__ ((aligned(32)));
+
+/**
+ * fh_partition_memcpy - copies data from one guest to another
+ * @source: the ID of the partition to copy from
+ * @target: the ID of the partition to copy to
+ * @sg_list: guest physical address of an array of &fh_sg_list structures
+ * @count: the number of entries in @sg_list
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_partition_memcpy(unsigned int source,
+       unsigned int target, phys_addr_t sg_list, unsigned int count)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_MEMCPY);
+       r3 = source;
+       r4 = target;
+       r5 = (uint32_t) sg_list;
+
+#ifdef CONFIG_PHYS_64BIT
+       r6 = sg_list >> 32;
+#else
+       r6 = 0;
+#endif
+       r7 = count;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11),
+                 "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6), "+r" (r7)
+               : : EV_HCALL_CLOBBERS5
+       );
+
+       return r3;
+}
+
+/**
+ * fh_dma_enable - enable DMA for the specified device
+ * @liodn: the LIODN of the I/O device for which to enable DMA
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_dma_enable(unsigned int liodn)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_DMA_ENABLE);
+       r3 = liodn;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/**
+ * fh_dma_disable - disable DMA for the specified device
+ * @liodn: the LIODN of the I/O device for which to disable DMA
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_dma_disable(unsigned int liodn)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_DMA_DISABLE);
+       r3 = liodn;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+
+/**
+ * fh_vmpic_get_msir - returns the MPIC-MSI register value
+ * @interrupt: the interrupt number
+ * @msir_val: returned MPIC-MSI register value
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_vmpic_get_msir(unsigned int interrupt,
+       unsigned int *msir_val)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = FH_HCALL_TOKEN(FH_VMPIC_GET_MSIR);
+       r3 = interrupt;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "=r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       *msir_val = r4;
+
+       return r3;
+}
+
+/**
+ * fh_system_reset - reset the system
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_system_reset(void)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_SYSTEM_RESET);
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "=r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+
+/**
+ * fh_err_get_info - get platform error information
+ * @queue id:
+ * 0 for guest error event queue
+ * 1 for global error event queue
+ *
+ * @pointer to store the platform error data:
+ * platform error data is returned in registers r4 - r11
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_err_get_info(int queue, uint32_t *bufsize,
+       uint32_t addr_hi, uint32_t addr_lo, int peek)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+       register uintptr_t r5 __asm__("r5");
+       register uintptr_t r6 __asm__("r6");
+       register uintptr_t r7 __asm__("r7");
+
+       r11 = FH_HCALL_TOKEN(FH_ERR_GET_INFO);
+       r3 = queue;
+       r4 = *bufsize;
+       r5 = addr_hi;
+       r6 = addr_lo;
+       r7 = peek;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4), "+r" (r5), "+r" (r6),
+                 "+r" (r7)
+               : : EV_HCALL_CLOBBERS5
+       );
+
+       *bufsize = r4;
+
+       return r3;
+}
+
+
+#define FH_VCPU_RUN    0
+#define FH_VCPU_IDLE   1
+#define FH_VCPU_NAP    2
+
+/**
+ * fh_get_core_state - get the state of a vcpu
+ *
+ * @handle: handle of partition containing the vcpu
+ * @vcpu: vcpu number within the partition
+ * @state:the current state of the vcpu, see FH_VCPU_*
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_get_core_state(unsigned int handle,
+       unsigned int vcpu, unsigned int *state)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = FH_HCALL_TOKEN(FH_GET_CORE_STATE);
+       r3 = handle;
+       r4 = vcpu;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       *state = r4;
+       return r3;
+}
+
+/**
+ * fh_enter_nap - enter nap on a vcpu
+ *
+ * Note that though the API supports entering nap on a vcpu other
+ * than the caller, this may not be implmented and may return EINVAL.
+ *
+ * @handle: handle of partition containing the vcpu
+ * @vcpu: vcpu number within the partition
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_enter_nap(unsigned int handle, unsigned int vcpu)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = FH_HCALL_TOKEN(FH_ENTER_NAP);
+       r3 = handle;
+       r4 = vcpu;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       return r3;
+}
+
+/**
+ * fh_exit_nap - exit nap on a vcpu
+ * @handle: handle of partition containing the vcpu
+ * @vcpu: vcpu number within the partition
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_exit_nap(unsigned int handle, unsigned int vcpu)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+       register uintptr_t r4 __asm__("r4");
+
+       r11 = FH_HCALL_TOKEN(FH_EXIT_NAP);
+       r3 = handle;
+       r4 = vcpu;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3), "+r" (r4)
+               : : EV_HCALL_CLOBBERS2
+       );
+
+       return r3;
+}
+/**
+ * fh_claim_device - claim a "claimable" shared device
+ * @handle: fsl,hv-device-handle of node to claim
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_claim_device(unsigned int handle)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_CLAIM_DEVICE);
+       r3 = handle;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+
+/**
+ * Run deferred DMA disabling on a partition's private devices
+ *
+ * This applies to devices which a partition owns either privately,
+ * or which are claimable and still actively owned by that partition,
+ * and which do not have the no-dma-disable property.
+ *
+ * @handle: partition (must be stopped) whose DMA is to be disabled
+ *
+ * Returns 0 for success, or an error code.
+ */
+static inline unsigned int fh_partition_stop_dma(unsigned int handle)
+{
+       register uintptr_t r11 __asm__("r11");
+       register uintptr_t r3 __asm__("r3");
+
+       r11 = FH_HCALL_TOKEN(FH_PARTITION_STOP_DMA);
+       r3 = handle;
+
+       __asm__ __volatile__ ("sc 1"
+               : "+r" (r11), "+r" (r3)
+               : : EV_HCALL_CLOBBERS1
+       );
+
+       return r3;
+}
+#endif
diff --git a/arch/powerpc/include/asm/hvsi.h b/arch/powerpc/include/asm/hvsi.h
new file mode 100644 (file)
index 0000000..d3f64f3
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef _HVSI_H
+#define _HVSI_H
+
+#define VS_DATA_PACKET_HEADER           0xff
+#define VS_CONTROL_PACKET_HEADER        0xfe
+#define VS_QUERY_PACKET_HEADER          0xfd
+#define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc
+
+/* control verbs */
+#define VSV_SET_MODEM_CTL    1 /* to service processor only */
+#define VSV_MODEM_CTL_UPDATE 2 /* from service processor only */
+#define VSV_CLOSE_PROTOCOL   3
+
+/* query verbs */
+#define VSV_SEND_VERSION_NUMBER 1
+#define VSV_SEND_MODEM_CTL_STATUS 2
+
+/* yes, these masks are not consecutive. */
+#define HVSI_TSDTR 0x01
+#define HVSI_TSCD  0x20
+
+#define HVSI_MAX_OUTGOING_DATA 12
+#define HVSI_VERSION 1
+
+struct hvsi_header {
+       uint8_t  type;
+       uint8_t  len;
+       uint16_t seqno;
+} __attribute__((packed));
+
+struct hvsi_data {
+       struct hvsi_header hdr;
+       uint8_t  data[HVSI_MAX_OUTGOING_DATA];
+} __attribute__((packed));
+
+struct hvsi_control {
+       struct hvsi_header hdr;
+       uint16_t verb;
+       /* optional depending on verb: */
+       uint32_t word;
+       uint32_t mask;
+} __attribute__((packed));
+
+struct hvsi_query {
+       struct hvsi_header hdr;
+       uint16_t verb;
+} __attribute__((packed));
+
+struct hvsi_query_response {
+       struct hvsi_header hdr;
+       uint16_t verb;
+       uint16_t query_seqno;
+       union {
+               uint8_t  version;
+               uint32_t mctrl_word;
+       } u;
+} __attribute__((packed));
+
+/* hvsi lib struct definitions */
+#define HVSI_INBUF_SIZE                255
+struct tty_struct;
+struct hvsi_priv {
+       unsigned int    inbuf_len;      /* data in input buffer */
+       unsigned char   inbuf[HVSI_INBUF_SIZE];
+       unsigned int    inbuf_cur;      /* Cursor in input buffer */
+       unsigned int    inbuf_pktlen;   /* packet lenght from cursor */
+       atomic_t        seqno;          /* packet sequence number */
+       unsigned int    opened:1;       /* driver opened */
+       unsigned int    established:1;  /* protocol established */
+       unsigned int    is_console:1;   /* used as a kernel console device */
+       unsigned int    mctrl_update:1; /* modem control updated */
+       unsigned short  mctrl;          /* modem control */
+       struct tty_struct *tty;         /* tty structure */
+       int (*get_chars)(uint32_t termno, char *buf, int count);
+       int (*put_chars)(uint32_t termno, const char *buf, int count);
+       uint32_t        termno;
+};
+
+/* hvsi lib functions */
+struct hvc_struct;
+extern void hvsilib_init(struct hvsi_priv *pv,
+                        int (*get_chars)(uint32_t termno, char *buf, int count),
+                        int (*put_chars)(uint32_t termno, const char *buf,
+                                         int count),
+                        int termno, int is_console);
+extern int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp);
+extern void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp);
+extern int hvsilib_read_mctrl(struct hvsi_priv *pv);
+extern int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr);
+extern void hvsilib_establish(struct hvsi_priv *pv);
+extern int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count);
+extern int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count);
+
+#endif /* _HVSI_H */
index 1bff591f7f72a5f12c0ceebb2aabbf13810be01e..c57a28e52b6459322df4c2b7d407f27ecaa18ee3 100644 (file)
@@ -330,5 +330,7 @@ extern int call_handle_irq(int irq, void *p1,
                           struct thread_info *tp, void *func);
 extern void do_IRQ(struct pt_regs *regs);
 
+int irq_choose_cpu(const struct cpumask *mask);
+
 #endif /* _ASM_IRQ_H */
 #endif /* __KERNEL__ */
diff --git a/arch/powerpc/include/asm/jump_label.h b/arch/powerpc/include/asm/jump_label.h
new file mode 100644 (file)
index 0000000..1f780b9
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef _ASM_POWERPC_JUMP_LABEL_H
+#define _ASM_POWERPC_JUMP_LABEL_H
+
+/*
+ * Copyright 2010 Michael Ellerman, IBM Corp.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+
+#include <asm/feature-fixups.h>
+
+#define JUMP_ENTRY_TYPE                stringify_in_c(FTR_ENTRY_LONG)
+#define JUMP_LABEL_NOP_SIZE    4
+
+static __always_inline bool arch_static_branch(struct jump_label_key *key)
+{
+       asm goto("1:\n\t"
+                "nop\n\t"
+                ".pushsection __jump_table,  \"aw\"\n\t"
+                ".align 4\n\t"
+                JUMP_ENTRY_TYPE "1b, %l[l_yes], %c0\n\t"
+                ".popsection \n\t"
+                : :  "i" (key) : : l_yes);
+       return false;
+l_yes:
+       return true;
+}
+
+#ifdef CONFIG_PPC64
+typedef u64 jump_label_t;
+#else
+typedef u32 jump_label_t;
+#endif
+
+struct jump_entry {
+       jump_label_t code;
+       jump_label_t target;
+       jump_label_t key;
+       jump_label_t pad;
+};
+
+#endif /* _ASM_POWERPC_JUMP_LABEL_H */
index 4138b21ae80afeb216da9cf6b7ab1e5ca8247a3a..698b3063868104118c39ed7ae9506f12e18a5de1 100644 (file)
 #ifndef __ASSEMBLY__
 #include <asm/cputable.h>
 
+#ifdef CONFIG_PPC_FSL_BOOK3E
+#include <asm/percpu.h>
+DECLARE_PER_CPU(int, next_tlbcam_idx);
+#endif
+
 static inline int mmu_has_feature(unsigned long feature)
 {
        return (cur_cpu_spec->mmu_features & feature);
 }
 
+static inline void mmu_clear_feature(unsigned long feature)
+{
+       cur_cpu_spec->mmu_features &= ~feature;
+}
+
 extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup;
 
-/* MMU initialization (64-bit only fo now) */
+/* MMU initialization */
 extern void early_init_mmu(void);
 extern void early_init_mmu_secondary(void);
 
index 89d2f99c1bf4720d98bcd0ab091d1f9ff0fadfa8..23cd6cc30bcf8fa54ed2b48faa530e495f611bb4 100644 (file)
@@ -17,7 +17,7 @@
 #ifdef CONFIG_PPC_PSERIES
 extern int pSeries_reconfig_notifier_register(struct notifier_block *);
 extern void pSeries_reconfig_notifier_unregister(struct notifier_block *);
-extern struct blocking_notifier_head pSeries_reconfig_chain;
+extern int pSeries_reconfig_notify(unsigned long action, void *p);
 /* Not the best place to put this, will be fixed when we move some
  * of the rtas suspend-me stuff to pseries */
 extern void pSeries_coalesce_init(void);
index a6da128599598c95e3ac83552b0c738b28134f62..516bfb3f47d9fef3916b1760c11c27888eaed4c3 100644 (file)
@@ -103,11 +103,12 @@ struct paca_struct {
 #endif /* CONFIG_PPC_STD_MMU_64 */
 
 #ifdef CONFIG_PPC_BOOK3E
-       pgd_t *pgd;                     /* Current PGD */
-       pgd_t *kernel_pgd;              /* Kernel PGD */
        u64 exgen[8] __attribute__((aligned(0x80)));
+       /* Keep pgd in the same cacheline as the start of extlb */
+       pgd_t *pgd __attribute__((aligned(0x80))); /* Current PGD */
+       pgd_t *kernel_pgd;              /* Kernel PGD */
        /* We can have up to 3 levels of reentrancy in the TLB miss handler */
-       u64 extlb[3][EX_TLB_SIZE / sizeof(u64)] __attribute__((aligned(0x80)));
+       u64 extlb[3][EX_TLB_SIZE / sizeof(u64)];
        u64 exmc[8];            /* used for machine checks */
        u64 excrit[8];          /* used for crit interrupts */
        u64 exdbg[8];           /* used for debug interrupts */
index 81576ee0cfb1d8751c78add8e46512d716ffe66f..c4205616dfb50c1598b7c0446efa86a8414fcec7 100644 (file)
@@ -357,7 +357,8 @@ void pgtable_cache_init(void);
 /*
  * find_linux_pte returns the address of a linux pte for a given
  * effective address and directory.  If not found, it returns zero.
- */static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea)
+ */
+static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea)
 {
        pgd_t *pg;
        pud_t *pu;
index d50c2b6d9bc31f4bff44e9e7b8edb085cbac367e..eb11a446720e0b4cbc2e2917e409781a4c43ad0f 100644 (file)
@@ -20,6 +20,7 @@
 
 #ifndef __ASSEMBLY__
 #include <linux/compiler.h>
+#include <linux/cache.h>
 #include <asm/ptrace.h>
 #include <asm/types.h>
 
@@ -156,6 +157,10 @@ struct thread_struct {
 #endif
        struct pt_regs  *regs;          /* Pointer to saved register state */
        mm_segment_t    fs;             /* for get_fs() validation */
+#ifdef CONFIG_BOOKE
+       /* BookE base exception scratch space; align on cacheline */
+       unsigned long   normsave[8] ____cacheline_aligned;
+#endif
 #ifdef CONFIG_PPC32
        void            *pgdir;         /* root of page-table tree */
 #endif
index ddbe57ae858420c47bfd9c13f687e2ec166de851..e8aaf6fce38b9840623daf9aabd62bd7f644f834 100644 (file)
 #define SPRN_SPRG_WSCRATCH2    SPRN_SPRG4W
 #define SPRN_SPRG_RSCRATCH3    SPRN_SPRG5R
 #define SPRN_SPRG_WSCRATCH3    SPRN_SPRG5W
-#define SPRN_SPRG_RSCRATCH_MC  SPRN_SPRG6R
-#define SPRN_SPRG_WSCRATCH_MC  SPRN_SPRG6W
+#define SPRN_SPRG_RSCRATCH_MC  SPRN_SPRG1
+#define SPRN_SPRG_WSCRATCH_MC  SPRN_SPRG1
 #define SPRN_SPRG_RSCRATCH4    SPRN_SPRG7R
 #define SPRN_SPRG_WSCRATCH4    SPRN_SPRG7W
 #ifdef CONFIG_E200
index dae19342f0b90f3d2083d92f0834ce0053817118..186e0fb835bd247d836eeacdc591a1450dd93ac5 100644 (file)
@@ -3,4 +3,8 @@
 
 #include <asm-generic/setup.h>
 
+#ifndef __ASSEMBLY__
+extern void ppc_printk_progress(char *s, unsigned short hex);
+#endif
+
 #endif /* _ASM_POWERPC_SETUP_H */
index 11eb404b5606c03c94b68189e3f32cb1859cd3dc..15a70b7f638bc48f3b81d27fc4dc5b19b659fa99 100644 (file)
@@ -30,7 +30,7 @@
 #include <asm/percpu.h>
 
 extern int boot_cpuid;
-extern int boot_cpu_count;
+extern int spinning_secondaries;
 
 extern void cpu_die(void);
 
@@ -119,7 +119,6 @@ extern const char *smp_ipi_name[];
 /* for irq controllers with only a single ipi */
 extern void smp_muxed_ipi_set_data(int cpu, unsigned long data);
 extern void smp_muxed_ipi_message_pass(int cpu, int msg);
-extern void smp_muxed_ipi_resend(void);
 extern irqreturn_t smp_ipi_demux(void);
 
 void smp_init_iSeries(void);
index 58580e94a2bb05b6d21e8c7f7bcfc12ef98b92cc..93e05d1b34b289534425946c95b9080cb9db211b 100644 (file)
@@ -40,6 +40,7 @@ extern void udbg_adb_init_early(void);
 
 extern void __init udbg_early_init(void);
 extern void __init udbg_init_debug_lpar(void);
+extern void __init udbg_init_debug_lpar_hvsi(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);
index e8b981897d44a268041cc07d7368b1952cd62cfe..ce4f7f17911782b3f2da5f3b3d2495f3fc8ccf99 100644 (file)
@@ -76,6 +76,7 @@ obj-$(CONFIG_MODULES)         += module.o module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)              += cpu_setup_44x.o
 obj-$(CONFIG_PPC_FSL_BOOK3E)   += cpu_setup_fsl_booke.o dbell.o
 obj-$(CONFIG_PPC_BOOK3E_64)    += dbell.o
+obj-$(CONFIG_JUMP_LABEL)       += jump_label.o
 
 extra-y                                := head_$(CONFIG_WORD_SIZE).o
 extra-$(CONFIG_40x)            := head_40x.o
index 54b935f2f5def0b33c0538863fb665143b207c2c..5f078bc2063e96c9b281283c553d65ac67dfaea5 100644 (file)
@@ -82,6 +82,9 @@ int main(void)
        DEFINE(KSP, offsetof(struct thread_struct, ksp));
        DEFINE(KSP_LIMIT, offsetof(struct thread_struct, ksp_limit));
        DEFINE(PT_REGS, offsetof(struct thread_struct, regs));
+#ifdef CONFIG_BOOKE
+       DEFINE(THREAD_NORMSAVES, offsetof(struct thread_struct, normsave[0]));
+#endif
        DEFINE(THREAD_FPEXC_MODE, offsetof(struct thread_struct, fpexc_mode));
        DEFINE(THREAD_FPR0, offsetof(struct thread_struct, fpr[0]));
        DEFINE(THREAD_FPSCR, offsetof(struct thread_struct, fpscr));
index 4e6ee944495a302b668362c7e958a642c60a8b8b..cc6a9d5d69ab08da9a87635c342f83d0083db8f3 100644 (file)
@@ -242,12 +242,8 @@ static void crash_kexec_wait_realmode(int cpu)
 
                while (paca[i].kexec_state < KEXEC_STATE_REAL_MODE) {
                        barrier();
-                       if (!cpu_possible(i)) {
+                       if (!cpu_possible(i) || !cpu_online(i) || (msecs <= 0))
                                break;
-                       }
-                       if (!cpu_online(i)) {
-                               break;
-                       }
                        msecs--;
                        mdelay(1);
                }
index d238c082c3c5fa3acaa3ec9e580e914117039c75..4f0959fbfbee02d4538427b7be1ab2a988adeb9d 100644 (file)
@@ -161,9 +161,7 @@ int dma_set_mask(struct device *dev, u64 dma_mask)
 
        if (ppc_md.dma_set_mask)
                return ppc_md.dma_set_mask(dev, dma_mask);
-       if (unlikely(dma_ops == NULL))
-               return -EIO;
-       if (dma_ops->set_dma_mask != NULL)
+       if ((dma_ops != NULL) && (dma_ops->set_dma_mask != NULL))
                return dma_ops->set_dma_mask(dev, dma_mask);
        if (!dev->dma_mask || !dma_supported(dev, dma_mask))
                return -EIO;
index d24d4400cc79330e2fda3fa8f59e86730dd46735..429983c06f9126e6991497a543d9c7c21912ff2e 100644 (file)
        std     r14,PACA_EXMC+EX_R14(r13);                                  \
        std     r15,PACA_EXMC+EX_R15(r13)
 
+#define PROLOG_ADDITION_DOORBELL_GEN                                       \
+       lbz     r11,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */      \
+       cmpwi   cr0,r11,0;              /* yes -> go out of line */         \
+       beq     masked_doorbell_book3e
+
+
 /* Core exception code for all exceptions except TLB misses.
  * XXX: Needs to make SPRN_SPRG_GEN depend on exception type
  */
@@ -522,7 +528,13 @@ kernel_dbg_exc:
        MASKABLE_EXCEPTION(0x260, perfmon, .performance_monitor_exception, ACK_NONE)
 
 /* Doorbell interrupt */
-       MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
+       START_EXCEPTION(doorbell)
+       NORMAL_EXCEPTION_PROLOG(0x2070, PROLOG_ADDITION_DOORBELL)
+       EXCEPTION_COMMON(0x2070, PACA_EXGEN, INTS_DISABLE_ALL)
+       CHECK_NAPPING()
+       addi    r3,r1,STACK_FRAME_OVERHEAD
+       bl      .doorbell_exception
+       b       .ret_from_except_lite
 
 /* Doorbell critical Interrupt */
        START_EXCEPTION(doorbell_crit);
@@ -545,8 +557,16 @@ kernel_dbg_exc:
  * An interrupt came in while soft-disabled; clear EE in SRR1,
  * clear paca->hard_enabled and return.
  */
+masked_doorbell_book3e:
+       mtcr    r10
+       /* Resend the doorbell to fire again when ints enabled */
+       mfspr   r10,SPRN_PIR
+       PPC_MSGSND(r10)
+       b       masked_interrupt_book3e_common
+
 masked_interrupt_book3e:
        mtcr    r10
+masked_interrupt_book3e_common:
        stb     r11,PACAHARDIRQEN(r13)
        mfspr   r10,SPRN_SRR1
        rldicl  r11,r10,48,1            /* clear MSR_EE */
index 5e12b741ba5fc15d5a7783dd5488dc8f315b9f77..f8e971ba94f5b66231da5194f125efd35020b5d6 100644 (file)
@@ -93,6 +93,30 @@ _ENTRY(_start);
 
        bl      early_init
 
+#ifdef CONFIG_RELOCATABLE
+       /*
+        * r25 will contain RPN/ERPN for the start address of memory
+        *
+        * Add the difference between KERNELBASE and PAGE_OFFSET to the
+        * start of physical memory to get kernstart_addr.
+        */
+       lis     r3,kernstart_addr@ha
+       la      r3,kernstart_addr@l(r3)
+
+       lis     r4,KERNELBASE@h
+       ori     r4,r4,KERNELBASE@l
+       lis     r5,PAGE_OFFSET@h
+       ori     r5,r5,PAGE_OFFSET@l
+       subf    r4,r5,r4
+
+       rlwinm  r6,r25,0,28,31  /* ERPN */
+       rlwinm  r7,r25,0,0,3    /* RPN - assuming 256 MB page size */
+       add     r7,r7,r4
+
+       stw     r6,0(r3)
+       stw     r7,4(r3)
+#endif
+
 /*
  * Decide what sort of machine this is and initialize the MMU.
  */
@@ -1001,9 +1025,6 @@ clear_utlb_entry:
        lis     r3,PAGE_OFFSET@h
        ori     r3,r3,PAGE_OFFSET@l
 
-       /* Kernel is at the base of RAM */
-       li r4, 0                        /* Load the kernel physical address */
-
        /* Load the kernel PID = 0 */
        li      r0,0
        mtspr   SPRN_PID,r0
@@ -1013,9 +1034,8 @@ clear_utlb_entry:
        clrrwi  r3,r3,12                /* Mask off the effective page number */
        ori     r3,r3,PPC47x_TLB0_VALID | PPC47x_TLB0_256M
 
-       /* Word 1 */
-       clrrwi  r4,r4,12                /* Mask off the real page number */
-                                       /* ERPN is 0 for first 4GB page */
+       /* Word 1 - use r25.  RPN is the same as the original entry */
+
        /* Word 2 */
        li      r5,0
        ori     r5,r5,PPC47x_TLB2_S_RWX
@@ -1026,7 +1046,7 @@ clear_utlb_entry:
        /* We write to way 0 and bolted 0 */
        lis     r0,0x8800
        tlbwe   r3,r0,0
-       tlbwe   r4,r0,1
+       tlbwe   r25,r0,1
        tlbwe   r5,r0,2
 
 /*
@@ -1124,7 +1144,13 @@ head_start_common:
        lis     r4,interrupt_base@h     /* IVPR only uses the high 16-bits */
        mtspr   SPRN_IVPR,r4
 
-       addis   r22,r22,KERNELBASE@h
+       /*
+        * If the kernel was loaded at a non-zero 256 MB page, we need to
+        * mask off the most significant 4 bits to get the relative address
+        * from the start of physical memory
+        */
+       rlwinm  r22,r22,0,4,31
+       addis   r22,r22,PAGE_OFFSET@h
        mtlr    r22
        isync
        blr
index ba504099844a1cd311cd6ae284bb1eaea092c985..3564c49c683e1b870da4b7aa455e7155058526d5 100644 (file)
@@ -255,7 +255,7 @@ generic_secondary_common_init:
        mtctr   r23
        bctrl
 
-3:     LOAD_REG_ADDR(r3, boot_cpu_count) /* Decrement boot_cpu_count */
+3:     LOAD_REG_ADDR(r3, spinning_secondaries) /* Decrement spinning_secondaries */
        lwarx   r4,0,r3
        subi    r4,r4,1
        stwcx.  r4,0,r3
index a0bf158c8b4781e9f70d18710a52b2a6d4e089e2..fc921bf62e159189eba0b2a5314a75022be9dd46 100644 (file)
        addi    reg,reg,val@l
 #endif
 
+/*
+ * Macro used to get to thread save registers.
+ * Note that entries 0-3 are used for the prolog code, and the remaining
+ * entries are available for specific exception use in the event a handler
+ * requires more than 4 scratch registers.
+ */
+#define THREAD_NORMSAVE(offset)        (THREAD_NORMSAVES + (offset * 4))
+
 #define NORMAL_EXCEPTION_PROLOG                                                     \
-       mtspr   SPRN_SPRG_WSCRATCH0,r10;/* save two registers to work with */\
-       mtspr   SPRN_SPRG_WSCRATCH1,r11;                                     \
-       mtspr   SPRN_SPRG_WSCRATCH2,r1;                                      \
-       mfcr    r10;                    /* save CR in r10 for now          */\
+       mtspr   SPRN_SPRG_WSCRATCH0, r10;       /* save one register */      \
+       mfspr   r10, SPRN_SPRG_THREAD;                                       \
+       stw     r11, THREAD_NORMSAVE(0)(r10);                                \
+       stw     r13, THREAD_NORMSAVE(2)(r10);                                \
+       mfcr    r13;                    /* save CR in r13 for now          */\
        mfspr   r11,SPRN_SRR1;          /* check whether user or kernel    */\
        andi.   r11,r11,MSR_PR;                                              \
+       mr      r11, r1;                                                     \
        beq     1f;                                                          \
-       mfspr   r1,SPRN_SPRG_THREAD;    /* if from user, start at top of   */\
-       lwz     r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack   */\
-       ALLOC_STACK_FRAME(r1, THREAD_SIZE);                                  \
-1:     subi    r1,r1,INT_FRAME_SIZE;   /* Allocate an exception frame     */\
-       mr      r11,r1;                                                      \
-       stw     r10,_CCR(r11);          /* save various registers          */\
+       /* if from user, start at top of this thread's kernel stack */       \
+       lwz     r11, THREAD_INFO-THREAD(r10);                                \
+       ALLOC_STACK_FRAME(r11, THREAD_SIZE);                                 \
+1 :    subi    r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */     \
+       stw     r13, _CCR(r11);         /* save various registers */         \
        stw     r12,GPR12(r11);                                              \
        stw     r9,GPR9(r11);                                                \
-       mfspr   r10,SPRN_SPRG_RSCRATCH0;                                        \
-       stw     r10,GPR10(r11);                                              \
-       mfspr   r12,SPRN_SPRG_RSCRATCH1;                                     \
+       mfspr   r13, SPRN_SPRG_RSCRATCH0;                                    \
+       stw     r13, GPR10(r11);                                             \
+       lwz     r12, THREAD_NORMSAVE(0)(r10);                                \
        stw     r12,GPR11(r11);                                              \
+       lwz     r13, THREAD_NORMSAVE(2)(r10); /* restore r13 */              \
        mflr    r10;                                                         \
        stw     r10,_LINK(r11);                                              \
-       mfspr   r10,SPRN_SPRG_RSCRATCH2;                                     \
        mfspr   r12,SPRN_SRR0;                                               \
-       stw     r10,GPR1(r11);                                               \
+       stw     r1GPR1(r11);                                               \
        mfspr   r9,SPRN_SRR1;                                                \
-       stw     r10,0(r11);                                                  \
+       stw     r1, 0(r11);                                                  \
+       mr      r1, r11;                                                     \
        rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
        stw     r0,GPR0(r11);                                                \
        lis     r10, STACK_FRAME_REGS_MARKER@ha;/* exception frame marker */ \
index fe37dd0dfd17e3366658d7c6b248860c49b867b8..50845924b7d9472ad88b1b5031468ab2493d560a 100644 (file)
@@ -346,11 +346,12 @@ interrupt_base:
        /* Data TLB Error Interrupt */
        START_EXCEPTION(DataTLBError)
        mtspr   SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */
-       mtspr   SPRN_SPRG_WSCRATCH1, r11
-       mtspr   SPRN_SPRG_WSCRATCH2, r12
-       mtspr   SPRN_SPRG_WSCRATCH3, r13
-       mfcr    r11
-       mtspr   SPRN_SPRG_WSCRATCH4, r11
+       mfspr   r10, SPRN_SPRG_THREAD
+       stw     r11, THREAD_NORMSAVE(0)(r10)
+       stw     r12, THREAD_NORMSAVE(1)(r10)
+       stw     r13, THREAD_NORMSAVE(2)(r10)
+       mfcr    r13
+       stw     r13, THREAD_NORMSAVE(3)(r10)
        mfspr   r10, SPRN_DEAR          /* Get faulting address */
 
        /* If we are faulting a kernel address, we have to use the
@@ -416,11 +417,12 @@ interrupt_base:
        /* The bailout.  Restore registers to pre-exception conditions
         * and call the heavyweights to help us out.
         */
-       mfspr   r11, SPRN_SPRG_RSCRATCH4
+       mfspr   r10, SPRN_SPRG_THREAD
+       lwz     r11, THREAD_NORMSAVE(3)(r10)
        mtcr    r11
-       mfspr   r13, SPRN_SPRG_RSCRATCH3
-       mfspr   r12, SPRN_SPRG_RSCRATCH2
-       mfspr   r11, SPRN_SPRG_RSCRATCH1
+       lwz     r13, THREAD_NORMSAVE(2)(r10)
+       lwz     r12, THREAD_NORMSAVE(1)(r10)
+       lwz     r11, THREAD_NORMSAVE(0)(r10)
        mfspr   r10, SPRN_SPRG_RSCRATCH0
        b       DataStorage
 
@@ -432,11 +434,12 @@ interrupt_base:
         */
        START_EXCEPTION(InstructionTLBError)
        mtspr   SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */
-       mtspr   SPRN_SPRG_WSCRATCH1, r11
-       mtspr   SPRN_SPRG_WSCRATCH2, r12
-       mtspr   SPRN_SPRG_WSCRATCH3, r13
-       mfcr    r11
-       mtspr   SPRN_SPRG_WSCRATCH4, r11
+       mfspr   r10, SPRN_SPRG_THREAD
+       stw     r11, THREAD_NORMSAVE(0)(r10)
+       stw     r12, THREAD_NORMSAVE(1)(r10)
+       stw     r13, THREAD_NORMSAVE(2)(r10)
+       mfcr    r13
+       stw     r13, THREAD_NORMSAVE(3)(r10)
        mfspr   r10, SPRN_SRR0          /* Get faulting address */
 
        /* If we are faulting a kernel address, we have to use the
@@ -496,11 +499,12 @@ interrupt_base:
        /* The bailout.  Restore registers to pre-exception conditions
         * and call the heavyweights to help us out.
         */
-       mfspr   r11, SPRN_SPRG_RSCRATCH4
+       mfspr   r10, SPRN_SPRG_THREAD
+       lwz     r11, THREAD_NORMSAVE(3)(r10)
        mtcr    r11
-       mfspr   r13, SPRN_SPRG_RSCRATCH3
-       mfspr   r12, SPRN_SPRG_RSCRATCH2
-       mfspr   r11, SPRN_SPRG_RSCRATCH1
+       lwz     r13, THREAD_NORMSAVE(2)(r10)
+       lwz     r12, THREAD_NORMSAVE(1)(r10)
+       lwz     r11, THREAD_NORMSAVE(0)(r10)
        mfspr   r10, SPRN_SPRG_RSCRATCH0
        b       InstructionStorage
 
@@ -621,11 +625,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_BIG_PHYS)
        tlbwe
 
        /* Done...restore registers and get out of here.  */
-       mfspr   r11, SPRN_SPRG_RSCRATCH4
+       mfspr   r10, SPRN_SPRG_THREAD
+       lwz     r11, THREAD_NORMSAVE(3)(r10)
        mtcr    r11
-       mfspr   r13, SPRN_SPRG_RSCRATCH3
-       mfspr   r12, SPRN_SPRG_RSCRATCH2
-       mfspr   r11, SPRN_SPRG_RSCRATCH1
+       lwz     r13, THREAD_NORMSAVE(2)(r10)
+       lwz     r12, THREAD_NORMSAVE(1)(r10)
+       lwz     r11, THREAD_NORMSAVE(0)(r10)
        mfspr   r10, SPRN_SPRG_RSCRATCH0
        rfi                                     /* Force context change */
 
index 47a1a983ff8840893a6a624fc109551b343e7a5f..3e2b95c6ae6733e807816bd4f49b339f2df9dd77 100644 (file)
@@ -26,6 +26,17 @@ _GLOBAL(e500_idle)
        ori     r4,r4,_TLF_NAPPING      /* so when we take an exception */
        stw     r4,TI_LOCAL_FLAGS(r3)   /* it will return to our caller */
 
+#ifdef CONFIG_E500MC
+       wrteei  1
+1:     wait
+
+       /*
+        * Guard against spurious wakeups (e.g. from a hypervisor) --
+        * any real interrupt will cause us to return to LR due to
+        * _TLF_NAPPING.
+        */
+       b       1b
+#else
        /* Check if we can nap or doze, put HID0 mask in r3 */
        lis     r3,0
 BEGIN_FTR_SECTION
@@ -72,6 +83,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_L2CSR|CPU_FTR_CAN_NAP)
        mtmsr   r7
        isync
 2:     b       2b
+#endif /* !E500MC */
 
 /*
  * Return from NAP/DOZE mode, restore some CPU specific registers,
index 5b428e3086662bcc802f9ce5049ada0c92aefa63..d281fb6f12f36e291c50c492774d8325c61b3081 100644 (file)
@@ -157,12 +157,6 @@ notrace void arch_local_irq_restore(unsigned long en)
        if (get_hard_enabled())
                return;
 
-#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP)
-       /* Check for pending doorbell interrupts and resend to ourself */
-       if (cpu_has_feature(CPU_FTR_DBELL))
-               smp_muxed_ipi_resend();
-#endif
-
        /*
         * Need to hard-enable interrupts here.  Since currently disabled,
         * no need to take further asm precautions against preemption; but
@@ -457,11 +451,18 @@ static inline void do_softirq_onstack(void)
        curtp = current_thread_info();
        irqtp = softirq_ctx[smp_processor_id()];
        irqtp->task = curtp->task;
+       irqtp->flags = 0;
        current->thread.ksp_limit = (unsigned long)irqtp +
                                    _ALIGN_UP(sizeof(struct thread_info), 16);
        call_do_softirq(irqtp);
        current->thread.ksp_limit = saved_sp_limit;
        irqtp->task = NULL;
+
+       /* Set any flag that may have been set on the
+        * alternate stack
+        */
+       if (irqtp->flags)
+               set_bits(irqtp->flags, &curtp->flags);
 }
 
 void do_softirq(void)
@@ -750,7 +751,7 @@ unsigned int irq_create_mapping(struct irq_host *host,
        if (irq_setup_virq(host, virq, hwirq))
                return NO_IRQ;
 
-       printk(KERN_DEBUG "irq: irq %lu on host %s mapped to virtual irq %u\n",
+       pr_debug("irq: irq %lu on host %s mapped to virtual irq %u\n",
                hwirq, host->of_node ? host->of_node->full_name : "null", virq);
 
        return virq;
@@ -882,6 +883,41 @@ unsigned int irq_find_mapping(struct irq_host *host,
 }
 EXPORT_SYMBOL_GPL(irq_find_mapping);
 
+#ifdef CONFIG_SMP
+int irq_choose_cpu(const struct cpumask *mask)
+{
+       int cpuid;
+
+       if (cpumask_equal(mask, cpu_all_mask)) {
+               static int irq_rover;
+               static DEFINE_RAW_SPINLOCK(irq_rover_lock);
+               unsigned long flags;
+
+               /* Round-robin distribution... */
+do_round_robin:
+               raw_spin_lock_irqsave(&irq_rover_lock, flags);
+
+               irq_rover = cpumask_next(irq_rover, cpu_online_mask);
+               if (irq_rover >= nr_cpu_ids)
+                       irq_rover = cpumask_first(cpu_online_mask);
+
+               cpuid = irq_rover;
+
+               raw_spin_unlock_irqrestore(&irq_rover_lock, flags);
+       } else {
+               cpuid = cpumask_first_and(mask, cpu_online_mask);
+               if (cpuid >= nr_cpu_ids)
+                       goto do_round_robin;
+       }
+
+       return get_hard_smp_processor_id(cpuid);
+}
+#else
+int irq_choose_cpu(const struct cpumask *mask)
+{
+       return hard_smp_processor_id();
+}
+#endif
 
 unsigned int irq_radix_revmap_lookup(struct irq_host *host,
                                     irq_hw_number_t hwirq)
diff --git a/arch/powerpc/kernel/jump_label.c b/arch/powerpc/kernel/jump_label.c
new file mode 100644 (file)
index 0000000..368d158
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010 Michael Ellerman, IBM Corp.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/jump_label.h>
+#include <asm/code-patching.h>
+
+void arch_jump_label_transform(struct jump_entry *entry,
+                              enum jump_label_type type)
+{
+       u32 *addr = (u32 *)(unsigned long)entry->code;
+
+       if (type == JUMP_LABEL_ENABLE)
+               patch_branch(addr, entry->target, 0);
+       else
+               patch_instruction(addr, PPC_INST_NOP);
+}
index e89df59cdc5a52b888a4d10088bccc516574812e..616921ef143917291051a71f4f0243e0f1ccc98f 100644 (file)
@@ -339,7 +339,7 @@ _GLOBAL(real_205_writeb)
 #endif /* CONFIG_PPC_PASEMI */
 
 
-#ifdef CONFIG_CPU_FREQ_PMAC64
+#if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
 /*
  * SCOM access functions for 970 (FX only for now)
  *
@@ -408,7 +408,7 @@ _GLOBAL(scom970_write)
        /* restore interrupts */
        mtmsrd  r5,1
        blr
-#endif /* CONFIG_CPU_FREQ_PMAC64 */
+#endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */
 
 
 /*
index 845a584788903cecde1b4a183b192cc2a747a2e9..fe21b515ca44f7027599fb73cea813e048194a95 100644 (file)
@@ -410,7 +410,7 @@ struct power_pmu mpc7450_pmu = {
        .cache_events           = &mpc7450_cache_events,
 };
 
-static int init_mpc7450_pmu(void)
+static int __init init_mpc7450_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
index 45ebb14c5c274d09471c0dddeae1e98abd4d3577..0187829c3382c2c1852a50cf7d27678413b70378 100644 (file)
@@ -1731,3 +1731,21 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose)
        if (mode == PCI_PROBE_NORMAL)
                hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
 }
+
+static void fixup_hide_host_resource_fsl(struct pci_dev *dev)
+{
+       int i, class = dev->class >> 8;
+
+       if ((class == PCI_CLASS_PROCESSOR_POWERPC ||
+            class == PCI_CLASS_BRIDGE_OTHER) &&
+               (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) &&
+               (dev->bus->parent == NULL)) {
+               for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+                       dev->resource[i].start = 0;
+                       dev->resource[i].end = 0;
+                       dev->resource[i].flags = 0;
+               }
+       }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl);
index 86585508e9c1cae27a43c5821e2f7d159af1b632..e2f24badf787bc5d709b2ad131d1b5f4b45a63b3 100644 (file)
@@ -50,25 +50,6 @@ static int pci_bus_count;
 struct pci_dev *isa_bridge_pcidev;
 EXPORT_SYMBOL_GPL(isa_bridge_pcidev);
 
-static void
-fixup_hide_host_resource_fsl(struct pci_dev *dev)
-{
-       int i, class = dev->class >> 8;
-
-       if ((class == PCI_CLASS_PROCESSOR_POWERPC ||
-            class == PCI_CLASS_BRIDGE_OTHER) &&
-               (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) &&
-               (dev->bus->parent == NULL)) {
-               for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-                       dev->resource[i].start = 0;
-                       dev->resource[i].end = 0;
-                       dev->resource[i].flags = 0;
-               }
-       }
-}
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl); 
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl); 
-
 static void
 fixup_cpc710_pci64(struct pci_dev* dev)
 {
index 14967de9887603c91d10650939a015eb0aa7a2ec..10a140f82cb87db296859f57ce18edfbb10f2ace 100644 (file)
@@ -1408,7 +1408,7 @@ power_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu
        return NOTIFY_OK;
 }
 
-int register_power_pmu(struct power_pmu *pmu)
+int __cpuinit register_power_pmu(struct power_pmu *pmu)
 {
        if (ppmu)
                return -EBUSY;          /* something's already registered */
index e9dbc2d35c9c99af7b9894864e9055ddfd9f6b23..b4f1dda4d0896359e35d23ac497fcc4d37a5e64d 100644 (file)
@@ -609,7 +609,7 @@ static struct power_pmu power4_pmu = {
        .cache_events           = &power4_cache_events,
 };
 
-static int init_power4_pmu(void)
+static int __init init_power4_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4"))
index f58a2bd41b591da659f2654f855f24060ebfde58..a8757baa28f34690a7e3b9b033569da86954529c 100644 (file)
@@ -677,7 +677,7 @@ static struct power_pmu power5p_pmu = {
        .cache_events           = &power5p_cache_events,
 };
 
-static int init_power5p_pmu(void)
+static int __init init_power5p_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
index b1acab6841421bfdd4bd26ec57a58a048d6fcd7d..e7f06eb7a861b3c47113b52ded65348912e20bca 100644 (file)
@@ -617,7 +617,7 @@ static struct power_pmu power5_pmu = {
        .cache_events           = &power5_cache_events,
 };
 
-static int init_power5_pmu(void)
+static int __init init_power5_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
index b24a3a23d073bcdc78613a6cd00a649c0c3c6494..03b95e2c6d6549616aef1e4f0cd2747c5bb11e00 100644 (file)
@@ -540,7 +540,7 @@ static struct power_pmu power6_pmu = {
        .cache_events           = &power6_cache_events,
 };
 
-static int init_power6_pmu(void)
+static int __init init_power6_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
index 6d9dccb2ea592067a0f20e297d5146b46bd0e123..de83d6060dda5765c427db94c2261da3e48f3fe3 100644 (file)
@@ -365,7 +365,7 @@ static struct power_pmu power7_pmu = {
        .cache_events           = &power7_cache_events,
 };
 
-static int init_power7_pmu(void)
+static int __init init_power7_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
index b121de9658eb6000c3735120756613628e81f3be..8c21902069646131238636e97c8fbb0cd32a3d15 100644 (file)
@@ -489,7 +489,7 @@ static struct power_pmu ppc970_pmu = {
        .cache_events           = &ppc970_cache_events,
 };
 
-static int init_ppc970_pmu(void)
+static int __init init_ppc970_pmu(void)
 {
        if (!cur_cpu_spec->oprofile_cpu_type ||
            (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
index ec2d0edeb134664c042c2c8d503caacd76b65bec..8f53954e75a3872f2ca78415634a7b8430f569c5 100644 (file)
@@ -654,6 +654,8 @@ void show_regs(struct pt_regs * regs)
        printbits(regs->msr, msr_bits);
        printk("  CR: %08lx  XER: %08lx\n", regs->ccr, regs->xer);
        trap = TRAP(regs);
+       if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
+               printk("CFAR: "REG"\n", regs->orig_gpr3);
        if (trap == 0x300 || trap == 0x600)
 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
                printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
@@ -835,8 +837,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
        unsigned long load_addr = regs->gpr[2]; /* saved by ELF_PLAT_INIT */
 #endif
 
-       set_fs(USER_DS);
-
        /*
         * If we exec out of a kernel thread then thread.regs will not be
         * set.  Do it now.
index 8c3112a57cf25ec751a118d8550bc95ed4c92575..174e1e96175e8b5a9153648442abb426764edc35 100644 (file)
@@ -69,6 +69,7 @@ unsigned long tce_alloc_start, tce_alloc_end;
 u64 ppc64_rma_size;
 #endif
 static phys_addr_t first_memblock_size;
+static int __initdata boot_cpu_count;
 
 static int __init early_parse_mem(char *p)
 {
@@ -769,6 +770,13 @@ void __init early_init_devtree(void *params)
         */
        of_scan_flat_dt(early_init_dt_scan_cpus, NULL);
 
+#if defined(CONFIG_SMP) && defined(CONFIG_PPC64)
+       /* We'll later wait for secondaries to check in; there are
+        * NCPUS-1 non-boot CPUs  :-)
+        */
+       spinning_secondaries = boot_cpu_count - 1;
+#endif
+
        DBG(" <- early_init_devtree()\n");
 }
 
@@ -862,16 +870,14 @@ static int prom_reconfig_notifier(struct notifier_block *nb,
        switch (action) {
        case PSERIES_RECONFIG_ADD:
                err = of_finish_dynamic_node(node);
-               if (err < 0) {
+               if (err < 0)
                        printk(KERN_ERR "finish_node returned %d\n", err);
-                       err = NOTIFY_BAD;
-               }
                break;
        default:
-               err = NOTIFY_DONE;
+               err = 0;
                break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block prom_reconfig_nb = {
index 22051ef04bd9eabbfdd634d206e33e6653880c6e..b1d738d128901b1b51fb6086817dce07bc9c977a 100644 (file)
@@ -707,29 +707,14 @@ static int powerpc_debugfs_init(void)
 arch_initcall(powerpc_debugfs_init);
 #endif
 
-static int ppc_dflt_bus_notify(struct notifier_block *nb,
-                               unsigned long action, void *data)
+void ppc_printk_progress(char *s, unsigned short hex)
 {
-       struct device *dev = data;
-
-       /* We are only intereted in device addition */
-       if (action != BUS_NOTIFY_ADD_DEVICE)
-               return 0;
-
-       set_dma_ops(dev, &dma_direct_ops);
-
-       return NOTIFY_DONE;
+       pr_info("%s\n", s);
 }
 
-static struct notifier_block ppc_dflt_plat_bus_notifier = {
-       .notifier_call = ppc_dflt_bus_notify,
-       .priority = INT_MAX,
-};
-
-static int __init setup_bus_notifier(void)
+void arch_setup_pdev_archdata(struct platform_device *pdev)
 {
-       bus_register_notifier(&platform_bus_type, &ppc_dflt_plat_bus_notifier);
-       return 0;
+       pdev->archdata.dma_mask = DMA_BIT_MASK(32);
+       pdev->dev.dma_mask = &pdev->archdata.dma_mask;
+       set_dma_ops(&pdev->dev, &dma_direct_ops);
 }
-
-arch_initcall(setup_bus_notifier);
index 620d792b52e471cbd6658dba347f10e95660bf36..209135af0a40e957fd15a166df417520df408f9e 100644 (file)
@@ -48,8 +48,8 @@ extern void bootx_init(unsigned long r4, unsigned long phys);
 
 int boot_cpuid = -1;
 EXPORT_SYMBOL_GPL(boot_cpuid);
-int __initdata boot_cpu_count;
 int boot_cpuid_phys;
+EXPORT_SYMBOL_GPL(boot_cpuid_phys);
 
 int smp_hw_index[NR_CPUS];
 
@@ -127,6 +127,8 @@ notrace void __init machine_init(unsigned long dt_ptr)
        /* Do some early initialization based on the flat device tree */
        early_init_devtree(__va(dt_ptr));
 
+       early_init_mmu();
+
        probe_machine();
 
        setup_kdump_trampoline();
index 532054f24ecbc0e992c4b5e167ef34c3fdb22638..aebef1320ed737b75437c920d9e233cfcf4ea0ae 100644 (file)
@@ -74,7 +74,7 @@
 #endif
 
 int boot_cpuid = 0;
-int __initdata boot_cpu_count;
+int __initdata spinning_secondaries;
 u64 ppc64_pft_size;
 
 /* Pick defaults since we might want to patch instructions
@@ -254,11 +254,11 @@ void smp_release_cpus(void)
        for (i = 0; i < 100000; i++) {
                mb();
                HMT_low();
-               if (boot_cpu_count == 0)
+               if (spinning_secondaries == 0)
                        break;
                udelay(1);
        }
-       DBG("boot_cpu_count = %d\n", boot_cpu_count);
+       DBG("spinning_secondaries = %d\n", spinning_secondaries);
 
        DBG(" <- smp_release_cpus()\n");
 }
index 09a85a9045d60f5a03a848da386ad44f5b69436a..f932f8a0cf0c590eedd636938652fdef5f93d22e 100644 (file)
@@ -202,14 +202,6 @@ void smp_muxed_ipi_message_pass(int cpu, int msg)
        smp_ops->cause_ipi(cpu, info->data);
 }
 
-void smp_muxed_ipi_resend(void)
-{
-       struct cpu_messages *info = &__get_cpu_var(ipi_message);
-
-       if (info->messages)
-               smp_ops->cause_ipi(smp_processor_id(), info->data);
-}
-
 irqreturn_t smp_ipi_demux(void)
 {
        struct cpu_messages *info = &__get_cpu_var(ipi_message);
@@ -238,16 +230,26 @@ irqreturn_t smp_ipi_demux(void)
 }
 #endif /* CONFIG_PPC_SMP_MUXED_IPI */
 
+static inline void do_message_pass(int cpu, int msg)
+{
+       if (smp_ops->message_pass)
+               smp_ops->message_pass(cpu, msg);
+#ifdef CONFIG_PPC_SMP_MUXED_IPI
+       else
+               smp_muxed_ipi_message_pass(cpu, msg);
+#endif
+}
+
 void smp_send_reschedule(int cpu)
 {
        if (likely(smp_ops))
-               smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE);
+               do_message_pass(cpu, PPC_MSG_RESCHEDULE);
 }
 EXPORT_SYMBOL_GPL(smp_send_reschedule);
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-       smp_ops->message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
+       do_message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
@@ -255,7 +257,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
        unsigned int cpu;
 
        for_each_cpu(cpu, mask)
-               smp_ops->message_pass(cpu, PPC_MSG_CALL_FUNCTION);
+               do_message_pass(cpu, PPC_MSG_CALL_FUNCTION);
 }
 
 #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
@@ -269,7 +271,7 @@ void smp_send_debugger_break(void)
 
        for_each_online_cpu(cpu)
                if (cpu != me)
-                       smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
+                       do_message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
 }
 #endif
 
@@ -304,6 +306,10 @@ struct thread_info *current_set[NR_CPUS];
 static void __devinit smp_store_cpu_info(int id)
 {
        per_cpu(cpu_pvr, id) = mfspr(SPRN_PVR);
+#ifdef CONFIG_PPC_FSL_BOOK3E
+       per_cpu(next_tlbcam_idx, id)
+               = (mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY) - 1;
+#endif
 }
 
 void __init smp_prepare_cpus(unsigned int max_cpus)
index 23d65abbedced22a867d90dc6a52330e9e2018c8..faa82c1f3f68d9d7cbfbeb8e2024761ffe538fd5 100644 (file)
@@ -31,6 +31,9 @@ void __init udbg_early_init(void)
 #if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
        /* For LPAR machines that have an HVC console on vterm 0 */
        udbg_init_debug_lpar();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_LPAR_HVSI)
+       /* For LPAR machines that have an HVSI console on vterm 0 */
+       udbg_init_debug_lpar_hvsi();
 #elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
        /* For use on Apple G5 machines */
        udbg_init_pmac_realmode();
@@ -68,6 +71,8 @@ void __init udbg_early_init(void)
 
 #ifdef CONFIG_PPC_EARLY_DEBUG
        console_loglevel = 10;
+
+       register_early_udbg_console();
 #endif
 }
 
index 024acab588fd5bcf54b58dd194429727bc122ffd..f60e006d90c3520c41905b2140fd522707214921 100644 (file)
@@ -186,10 +186,11 @@ void __init MMU_init_hw(void)
 unsigned long __init mmu_mapin_ram(unsigned long top)
 {
        unsigned long addr;
+       unsigned long memstart = memstart_addr & ~(PPC_PIN_SIZE - 1);
 
        /* Pin in enough TLBs to cover any lowmem not covered by the
         * initial 256M mapping established in head_44x.S */
-       for (addr = PPC_PIN_SIZE; addr < lowmem_end_addr;
+       for (addr = memstart + PPC_PIN_SIZE; addr < lowmem_end_addr;
             addr += PPC_PIN_SIZE) {
                if (mmu_has_feature(MMU_FTR_TYPE_47x))
                        ppc47x_pin_tlb(addr + PAGE_OFFSET, addr);
@@ -218,19 +219,25 @@ unsigned long __init mmu_mapin_ram(unsigned long top)
 void setup_initial_memory_limit(phys_addr_t first_memblock_base,
                                phys_addr_t first_memblock_size)
 {
+       u64 size;
+
+#ifndef CONFIG_RELOCATABLE
        /* We don't currently support the first MEMBLOCK not mapping 0
         * physical on those processors
         */
        BUG_ON(first_memblock_base != 0);
+#endif
 
        /* 44x has a 256M TLB entry pinned at boot */
-       memblock_set_current_limit(min_t(u64, first_memblock_size, PPC_PIN_SIZE));
+       size = (min_t(u64, first_memblock_size, PPC_PIN_SIZE));
+       memblock_set_current_limit(first_memblock_base + size);
 }
 
 #ifdef CONFIG_SMP
 void __cpuinit mmu_init_secondary(int cpu)
 {
        unsigned long addr;
+       unsigned long memstart = memstart_addr & ~(PPC_PIN_SIZE - 1);
 
        /* Pin in enough TLBs to cover any lowmem not covered by the
         * initial 256M mapping established in head_44x.S
@@ -241,7 +248,7 @@ void __cpuinit mmu_init_secondary(int cpu)
         * stack. current (r2) isn't initialized, smp_processor_id()
         * will not work, current thread info isn't accessible, ...
         */
-       for (addr = PPC_PIN_SIZE; addr < lowmem_end_addr;
+       for (addr = memstart + PPC_PIN_SIZE; addr < lowmem_end_addr;
             addr += PPC_PIN_SIZE) {
                if (mmu_has_feature(MMU_FTR_TYPE_47x))
                        ppc47x_pin_tlb(addr + PAGE_OFFSET, addr);
index 5de0f254dbb5cb38fc39b2879fd2f6c40e36c3c6..c77fef56dad68ad342486546ba8af68f2f5636ed 100644 (file)
@@ -191,38 +191,6 @@ void __init *early_get_page(void)
                return __va(memblock_alloc(PAGE_SIZE, PAGE_SIZE));
 }
 
-/* Free up now-unused memory */
-static void free_sec(unsigned long start, unsigned long end, const char *name)
-{
-       unsigned long cnt = 0;
-
-       while (start < end) {
-               ClearPageReserved(virt_to_page(start));
-               init_page_count(virt_to_page(start));
-               free_page(start);
-               cnt++;
-               start += PAGE_SIZE;
-       }
-       if (cnt) {
-               printk(" %ldk %s", cnt << (PAGE_SHIFT - 10), name);
-               totalram_pages += cnt;
-       }
-}
-
-void free_initmem(void)
-{
-#define FREESEC(TYPE) \
-       free_sec((unsigned long)(&__ ## TYPE ## _begin), \
-                (unsigned long)(&__ ## TYPE ## _end), \
-                #TYPE);
-
-       printk ("Freeing unused kernel memory:");
-       FREESEC(init);
-       printk("\n");
-       ppc_md.progress = NULL;
-#undef FREESEC
-}
-
 #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */
 void setup_initial_memory_limit(phys_addr_t first_memblock_base,
                                phys_addr_t first_memblock_size)
index f6dbb4c20e645ad071d87e6f5244c214e565e667..e94b57fb79a09be65781fbefe4d3e46d194d9f2a 100644 (file)
@@ -83,22 +83,6 @@ EXPORT_SYMBOL_GPL(memstart_addr);
 phys_addr_t kernstart_addr;
 EXPORT_SYMBOL_GPL(kernstart_addr);
 
-void free_initmem(void)
-{
-       unsigned long addr;
-
-       addr = (unsigned long)__init_begin;
-       for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
-               memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
-               ClearPageReserved(virt_to_page(addr));
-               init_page_count(virt_to_page(addr));
-               free_page(addr);
-               totalram_pages++;
-       }
-       printk ("Freeing unused kernel memory: %luk freed\n",
-               ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10);
-}
-
 static void pgd_ctor(void *addr)
 {
        memset(addr, 0, PGD_TABLE_SIZE);
index 29d4dde65c45f9b6f075d2d575fac1d05e2bbdc7..c781bbcf7338b3c23894048c6597535bd994564f 100644 (file)
@@ -249,7 +249,7 @@ static int __init mark_nonram_nosave(void)
  */
 void __init paging_init(void)
 {
-       unsigned long total_ram = memblock_phys_mem_size();
+       unsigned long long total_ram = memblock_phys_mem_size();
        phys_addr_t top_of_ram = memblock_end_of_DRAM();
        unsigned long max_zone_pfns[MAX_NR_ZONES];
 
@@ -269,7 +269,7 @@ void __init paging_init(void)
        kmap_prot = PAGE_KERNEL;
 #endif /* CONFIG_HIGHMEM */
 
-       printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n",
+       printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n",
               (unsigned long long)top_of_ram, total_ram);
        printk(KERN_DEBUG "Memory hole size: %ldMB\n",
               (long int)((top_of_ram - total_ram) >> 20));
@@ -337,8 +337,9 @@ void __init mem_init(void)
 
                highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;
                for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
+                       phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT;
                        struct page *page = pfn_to_page(pfn);
-                       if (memblock_is_reserved(pfn << PAGE_SHIFT))
+                       if (memblock_is_reserved(paddr))
                                continue;
                        ClearPageReserved(page);
                        init_page_count(page);
@@ -352,6 +353,15 @@ void __init mem_init(void)
        }
 #endif /* CONFIG_HIGHMEM */
 
+#if defined(CONFIG_PPC_FSL_BOOK3E) && !defined(CONFIG_SMP)
+       /*
+        * If smp is enabled, next_tlbcam_idx is initialized in the cpu up
+        * functions.... do it here for the non-smp case.
+        */
+       per_cpu(next_tlbcam_idx, smp_processor_id()) =
+               (mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY) - 1;
+#endif
+
        printk(KERN_INFO "Memory: %luk/%luk available (%luk kernel code, "
               "%luk reserved, %luk data, %luk bss, %luk init)\n",
                nr_free_pages() << (PAGE_SHIFT-10),
@@ -382,6 +392,25 @@ void __init mem_init(void)
        mem_init_done = 1;
 }
 
+void free_initmem(void)
+{
+       unsigned long addr;
+
+       ppc_md.progress = ppc_printk_progress;
+
+       addr = (unsigned long)__init_begin;
+       for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
+               memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
+               ClearPageReserved(virt_to_page(addr));
+               init_page_count(virt_to_page(addr));
+               free_page(addr);
+               totalram_pages++;
+       }
+       pr_info("Freeing unused kernel memory: %luk freed\n",
+               ((unsigned long)__init_end -
+               (unsigned long)__init_begin) >> 10);
+}
+
 #ifdef CONFIG_BLK_DEV_INITRD
 void __init free_initrd_mem(unsigned long start, unsigned long end)
 {
index 27b863c14941a9406ced93e2f534825171d2bf85..9a445f64accd086fa549f0cd750ac999b7669eab 100644 (file)
@@ -177,3 +177,7 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
        flush_range(vma->vm_mm, start, end);
 }
 EXPORT_SYMBOL(flush_tlb_range);
+
+void __init early_init_mmu(void)
+{
+}
index af08922094177a6750ea63e655d384b8f91daec1..4ebb34bc01d6d7eacfd0f23b90f9c27f8f609b7f 100644 (file)
 #define VPTE_PGD_SHIFT (VPTE_PUD_SHIFT + PUD_INDEX_SIZE)
 #define VPTE_INDEX_SIZE (VPTE_PGD_SHIFT + PGD_INDEX_SIZE)
 
+/**********************************************************************
+ *                                                                    *
+ * TLB miss handling for Book3E with a bolted linear mapping          *
+ * No virtual page table, no nested TLB misses                        *
+ *                                                                    *
+ **********************************************************************/
+
+.macro tlb_prolog_bolted addr
+       mtspr   SPRN_SPRG_TLB_SCRATCH,r13
+       mfspr   r13,SPRN_SPRG_PACA
+       std     r10,PACA_EXTLB+EX_TLB_R10(r13)
+       mfcr    r10
+       std     r11,PACA_EXTLB+EX_TLB_R11(r13)
+       std     r16,PACA_EXTLB+EX_TLB_R16(r13)
+       mfspr   r16,\addr               /* get faulting address */
+       std     r14,PACA_EXTLB+EX_TLB_R14(r13)
+       ld      r14,PACAPGD(r13)
+       std     r15,PACA_EXTLB+EX_TLB_R15(r13)
+       std     r10,PACA_EXTLB+EX_TLB_CR(r13)
+       TLB_MISS_PROLOG_STATS_BOLTED
+.endm
+
+.macro tlb_epilog_bolted
+       ld      r14,PACA_EXTLB+EX_TLB_CR(r13)
+       ld      r10,PACA_EXTLB+EX_TLB_R10(r13)
+       ld      r11,PACA_EXTLB+EX_TLB_R11(r13)
+       mtcr    r14
+       ld      r14,PACA_EXTLB+EX_TLB_R14(r13)
+       ld      r15,PACA_EXTLB+EX_TLB_R15(r13)
+       TLB_MISS_RESTORE_STATS_BOLTED
+       ld      r16,PACA_EXTLB+EX_TLB_R16(r13)
+       mfspr   r13,SPRN_SPRG_TLB_SCRATCH
+.endm
+
+/* Data TLB miss */
+       START_EXCEPTION(data_tlb_miss_bolted)
+       tlb_prolog_bolted SPRN_DEAR
+
+       /* We need _PAGE_PRESENT and  _PAGE_ACCESSED set */
+
+       /* We do the user/kernel test for the PID here along with the RW test
+        */
+       /* We pre-test some combination of permissions to avoid double
+        * faults:
+        *
+        * We move the ESR:ST bit into the position of _PAGE_BAP_SW in the PTE
+        * ESR_ST   is 0x00800000
+        * _PAGE_BAP_SW is 0x00000010
+        * So the shift is >> 19. This tests for supervisor writeability.
+        * If the page happens to be supervisor writeable and not user
+        * writeable, we will take a new fault later, but that should be
+        * a rare enough case.
+        *
+        * We also move ESR_ST in _PAGE_DIRTY position
+        * _PAGE_DIRTY is 0x00001000 so the shift is >> 11
+        *
+        * MAS1 is preset for all we need except for TID that needs to
+        * be cleared for kernel translations
+        */
+
+       mfspr   r11,SPRN_ESR
+
+       srdi    r15,r16,60              /* get region */
+       rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
+       bne-    dtlb_miss_fault_bolted
+
+       rlwinm  r10,r11,32-19,27,27
+       rlwimi  r10,r11,32-16,19,19
+       cmpwi   r15,0
+       ori     r10,r10,_PAGE_PRESENT
+       oris    r11,r10,_PAGE_ACCESSED@h
+
+       TLB_MISS_STATS_SAVE_INFO_BOLTED
+       bne     tlb_miss_kernel_bolted
+
+tlb_miss_common_bolted:
+/*
+ * This is the guts of the TLB miss handler for bolted-linear.
+ * We are entered with:
+ *
+ * r16 = faulting address
+ * r15 = crap (free to use)
+ * r14 = page table base
+ * r13 = PACA
+ * r11 = PTE permission mask
+ * r10 = crap (free to use)
+ */
+       rldicl  r15,r16,64-PGDIR_SHIFT+3,64-PGD_INDEX_SIZE-3
+       cmpldi  cr0,r14,0
+       clrrdi  r15,r15,3
+       beq     tlb_miss_fault_bolted
+
+BEGIN_MMU_FTR_SECTION
+       /* Set the TLB reservation and search for existing entry. Then load
+        * the entry.
+        */
+       PPC_TLBSRX_DOT(0,r16)
+       ldx     r14,r14,r15
+       beq     normal_tlb_miss_done
+MMU_FTR_SECTION_ELSE
+       ldx     r14,r14,r15
+ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_USE_TLBRSRV)
+
+#ifndef CONFIG_PPC_64K_PAGES
+       rldicl  r15,r16,64-PUD_SHIFT+3,64-PUD_INDEX_SIZE-3
+       clrrdi  r15,r15,3
+
+       cmpldi  cr0,r14,0
+       beq     tlb_miss_fault_bolted
+
+       ldx     r14,r14,r15
+#endif /* CONFIG_PPC_64K_PAGES */
+
+       rldicl  r15,r16,64-PMD_SHIFT+3,64-PMD_INDEX_SIZE-3
+       clrrdi  r15,r15,3
+
+       cmpldi  cr0,r14,0
+       beq     tlb_miss_fault_bolted
+
+       ldx     r14,r14,r15
+
+       rldicl  r15,r16,64-PAGE_SHIFT+3,64-PTE_INDEX_SIZE-3
+       clrrdi  r15,r15,3
+
+       cmpldi  cr0,r14,0
+       beq     tlb_miss_fault_bolted
+
+       ldx     r14,r14,r15
+
+       /* Check if required permissions are met */
+       andc.   r15,r11,r14
+       rldicr  r15,r14,64-(PTE_RPN_SHIFT-PAGE_SHIFT),63-PAGE_SHIFT
+       bne-    tlb_miss_fault_bolted
+
+       /* Now we build the MAS:
+        *
+        * MAS 0   :    Fully setup with defaults in MAS4 and TLBnCFG
+        * MAS 1   :    Almost fully setup
+        *               - PID already updated by caller if necessary
+        *               - TSIZE need change if !base page size, not
+        *                 yet implemented for now
+        * MAS 2   :    Defaults not useful, need to be redone
+        * MAS 3+7 :    Needs to be done
+        */
+       clrrdi  r11,r16,12              /* Clear low crap in EA */
+       clrldi  r15,r15,12              /* Clear crap at the top */
+       rlwimi  r11,r14,32-19,27,31     /* Insert WIMGE */
+       rlwimi  r15,r14,32-8,22,25      /* Move in U bits */
+       mtspr   SPRN_MAS2,r11
+       andi.   r11,r14,_PAGE_DIRTY
+       rlwimi  r15,r14,32-2,26,31      /* Move in BAP bits */
+
+       /* Mask out SW and UW if !DIRTY (XXX optimize this !) */
+       bne     1f
+       li      r11,MAS3_SW|MAS3_UW
+       andc    r15,r15,r11
+1:
+       mtspr   SPRN_MAS7_MAS3,r15
+       tlbwe
+
+       TLB_MISS_STATS_X(MMSTAT_TLB_MISS_NORM_OK)
+       tlb_epilog_bolted
+       rfi
+
+itlb_miss_kernel_bolted:
+       li      r11,_PAGE_PRESENT|_PAGE_BAP_SX  /* Base perm */
+       oris    r11,r11,_PAGE_ACCESSED@h
+tlb_miss_kernel_bolted:
+       mfspr   r10,SPRN_MAS1
+       ld      r14,PACA_KERNELPGD(r13)
+       cmpldi  cr0,r15,8               /* Check for vmalloc region */
+       rlwinm  r10,r10,0,16,1          /* Clear TID */
+       mtspr   SPRN_MAS1,r10
+       beq+    tlb_miss_common_bolted
+
+tlb_miss_fault_bolted:
+       /* We need to check if it was an instruction miss */
+       andi.   r10,r11,_PAGE_EXEC|_PAGE_BAP_SX
+       bne     itlb_miss_fault_bolted
+dtlb_miss_fault_bolted:
+       TLB_MISS_STATS_D(MMSTAT_TLB_MISS_NORM_FAULT)
+       tlb_epilog_bolted
+       b       exc_data_storage_book3e
+itlb_miss_fault_bolted:
+       TLB_MISS_STATS_I(MMSTAT_TLB_MISS_NORM_FAULT)
+       tlb_epilog_bolted
+       b       exc_instruction_storage_book3e
+
+/* Instruction TLB miss */
+       START_EXCEPTION(instruction_tlb_miss_bolted)
+       tlb_prolog_bolted SPRN_SRR0
+
+       rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
+       srdi    r15,r16,60              /* get region */
+       TLB_MISS_STATS_SAVE_INFO_BOLTED
+       bne-    itlb_miss_fault_bolted
+
+       li      r11,_PAGE_PRESENT|_PAGE_EXEC    /* Base perm */
+
+       /* We do the user/kernel test for the PID here along with the RW test
+        */
+
+       cmpldi  cr0,r15,0                       /* Check for user region */
+       oris    r11,r11,_PAGE_ACCESSED@h
+       beq     tlb_miss_common_bolted
+       b       itlb_miss_kernel_bolted
 
 /**********************************************************************
  *                                                                    *
index 0bdad3aecc670aa6379adc093cdb49054322a1a0..d32ec643c231fa6b038d579b7112e590c03daf92 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/preempt.h>
 #include <linux/spinlock.h>
 #include <linux/memblock.h>
+#include <linux/of_fdt.h>
 
 #include <asm/tlbflush.h>
 #include <asm/tlb.h>
@@ -102,6 +103,12 @@ unsigned long linear_map_top;      /* Top of linear mapping */
 
 #endif /* CONFIG_PPC64 */
 
+#ifdef CONFIG_PPC_FSL_BOOK3E
+/* next_tlbcam_idx is used to round-robin tlbcam entry assignment */
+DEFINE_PER_CPU(int, next_tlbcam_idx);
+EXPORT_PER_CPU_SYMBOL(next_tlbcam_idx);
+#endif
+
 /*
  * Base TLB flushing operations:
  *
@@ -266,6 +273,17 @@ EXPORT_SYMBOL(flush_tlb_page);
 
 #endif /* CONFIG_SMP */
 
+#ifdef CONFIG_PPC_47x
+void __init early_init_mmu_47x(void)
+{
+#ifdef CONFIG_SMP
+       unsigned long root = of_get_flat_dt_root();
+       if (of_get_flat_dt_prop(root, "cooperative-partition", NULL))
+               mmu_clear_feature(MMU_FTR_USE_TLBIVAX_BCAST);
+#endif /* CONFIG_SMP */
+}
+#endif /* CONFIG_PPC_47x */
+
 /*
  * Flush kernel TLB entries in the given range
  */
@@ -443,14 +461,27 @@ static void setup_page_sizes(void)
        }
 }
 
-static void setup_mmu_htw(void)
+static void __patch_exception(int exc, unsigned long addr)
 {
        extern unsigned int interrupt_base_book3e;
-       extern unsigned int exc_data_tlb_miss_htw_book3e;
-       extern unsigned int exc_instruction_tlb_miss_htw_book3e;
+       unsigned int *ibase = &interrupt_base_book3e;
+       /* Our exceptions vectors start with a NOP and -then- a branch
+        * to deal with single stepping from userspace which stops on
+        * the second instruction. Thus we need to patch the second
+        * instruction of the exception, not the first one
+        */
 
-       unsigned int *ibase = &interrupt_base_book3e;
+       patch_branch(ibase + (exc / 4) + 1, addr, 0);
+}
+
+#define patch_exception(exc, name) do { \
+       extern unsigned int name; \
+       __patch_exception((exc), (unsigned long)&name); \
+} while (0)
 
+static void setup_mmu_htw(void)
+{
        /* Check if HW tablewalk is present, and if yes, enable it by:
         *
         * - patching the TLB miss handlers to branch to the
@@ -462,19 +493,12 @@ static void setup_mmu_htw(void)
 
        if ((tlb0cfg & TLBnCFG_IND) &&
            (tlb0cfg & TLBnCFG_PT)) {
-               /* Our exceptions vectors start with a NOP and -then- a branch
-                * to deal with single stepping from userspace which stops on
-                * the second instruction. Thus we need to patch the second
-                * instruction of the exception, not the first one
-                */
-               patch_branch(ibase + (0x1c0 / 4) + 1,
-                            (unsigned long)&exc_data_tlb_miss_htw_book3e, 0);
-               patch_branch(ibase + (0x1e0 / 4) + 1,
-                            (unsigned long)&exc_instruction_tlb_miss_htw_book3e, 0);
+               patch_exception(0x1c0, exc_data_tlb_miss_htw_book3e);
+               patch_exception(0x1e0, exc_instruction_tlb_miss_htw_book3e);
                book3e_htw_enabled = 1;
        }
-       pr_info("MMU: Book3E Page Tables %s\n",
-               book3e_htw_enabled ? "Enabled" : "Disabled");
+       pr_info("MMU: Book3E HW tablewalk %s\n",
+               book3e_htw_enabled ? "enabled" : "not supported");
 }
 
 /*
@@ -549,6 +573,9 @@ static void __early_init_mmu(int boot_cpu)
                /* limit memory so we dont have linear faults */
                memblock_enforce_memory_limit(linear_map_top);
                memblock_analyze();
+
+               patch_exception(0x1c0, exc_data_tlb_miss_bolted_book3e);
+               patch_exception(0x1e0, exc_instruction_tlb_miss_bolted_book3e);
        }
 #endif
 
@@ -584,4 +611,11 @@ void setup_initial_memory_limit(phys_addr_t first_memblock_base,
        /* Finally limit subsequent allocations */
        memblock_set_current_limit(first_memblock_base + ppc64_rma_size);
 }
+#else /* ! CONFIG_PPC64 */
+void __init early_init_mmu(void)
+{
+#ifdef CONFIG_PPC_47x
+       early_init_mmu_47x();
+#endif
+}
 #endif /* CONFIG_PPC64 */
index b6976e1726e4c43585e87e689a4b6c0250bf39b3..498534cd5265b2ca8c48e9f6f094ed6fa15993a8 100644 (file)
@@ -67,6 +67,16 @@ config MPC85xx_RDB
        help
          This option enables support for the MPC85xx RDB (P2020 RDB) board
 
+config P1010_RDB
+       bool "Freescale P1010RDB"
+       select DEFAULT_UIMAGE
+       help
+         This option enables support for the MPC85xx RDB (P1010 RDB) board
+
+         P1010RDB contains P1010Si, which provides CPU performance up to 800
+         MHz and 1600 DMIPS, additional functionality and faster interfaces
+         (DDR3/3L, SATA II, and PCI  Express).
+
 config P1022_DS
        bool "Freescale P1022 DS"
        select DEFAULT_UIMAGE
@@ -75,6 +85,12 @@ config P1022_DS
        help
          This option enables support for the Freescale P1022DS reference board.
 
+config P1023_RDS
+       bool "Freescale P1023 RDS"
+       select DEFAULT_UIMAGE
+       help
+         This option enables support for the P1023 RDS board
+
 config SOCRATES
        bool "Socrates"
        select DEFAULT_UIMAGE
@@ -155,6 +171,18 @@ config SBC8560
        help
          This option enables support for the Wind River SBC8560 board
 
+config P2040_RDB
+       bool "Freescale P2040 RDB"
+       select DEFAULT_UIMAGE
+       select PPC_E500MC
+       select PHYS_64BIT
+       select SWIOTLB
+       select MPC8xxx_GPIO
+       select HAS_RAPIDIO
+       select PPC_EPAPR_HV_PIC
+       help
+         This option enables support for the P2040 RDB board
+
 config P3041_DS
        bool "Freescale P3041 DS"
        select DEFAULT_UIMAGE
@@ -163,6 +191,7 @@ config P3041_DS
        select SWIOTLB
        select MPC8xxx_GPIO
        select HAS_RAPIDIO
+       select PPC_EPAPR_HV_PIC
        help
          This option enables support for the P3041 DS board
 
@@ -174,6 +203,7 @@ config P4080_DS
        select SWIOTLB
        select MPC8xxx_GPIO
        select HAS_RAPIDIO
+       select PPC_EPAPR_HV_PIC
        help
          This option enables support for the P4080 DS board
 
@@ -188,6 +218,7 @@ config P5020_DS
        select SWIOTLB
        select MPC8xxx_GPIO
        select HAS_RAPIDIO
+       select PPC_EPAPR_HV_PIC
        help
          This option enables support for the P5020 DS board
 
index dd70db77d63eb5d8d9a5bf08d1d28d649a61c887..a971b32c5c0a3c43175b10172aebaedbc7d12b9e 100644 (file)
@@ -10,7 +10,10 @@ obj-$(CONFIG_MPC8536_DS)  += mpc8536_ds.o
 obj-$(CONFIG_MPC85xx_DS)  += mpc85xx_ds.o
 obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o
 obj-$(CONFIG_MPC85xx_RDB) += mpc85xx_rdb.o
+obj-$(CONFIG_P1010_RDB)   += p1010rdb.o
 obj-$(CONFIG_P1022_DS)    += p1022_ds.o
+obj-$(CONFIG_P1023_RDS)   += p1023_rds.o
+obj-$(CONFIG_P2040_RDB)   += p2040_rdb.o corenet_ds.o
 obj-$(CONFIG_P3041_DS)    += p3041_ds.o corenet_ds.o
 obj-$(CONFIG_P4080_DS)    += p4080_ds.o corenet_ds.o
 obj-$(CONFIG_P5020_DS)    += p5020_ds.o corenet_ds.o
index 2ab338c9ac37fb7cfdd6ba4554877e17ec0552c5..802ad110b75719780ea29547f9ef85c6b0863a8d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Maintained by Kumar Gala (see MAINTAINERS for contact information)
  *
- * Copyright 2009 Freescale Semiconductor Inc.
+ * Copyright 2009-2011 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
@@ -22,6 +22,7 @@
 #include <asm/time.h>
 #include <asm/machdep.h>
 #include <asm/pci-bridge.h>
+#include <asm/ppc-pci.h>
 #include <mm/mmu_decl.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
@@ -61,10 +62,6 @@ void __init corenet_ds_pic_init(void)
        mpic_init(mpic);
 }
 
-#ifdef CONFIG_PCI
-static int primary_phb_addr;
-#endif
-
 /*
  * Setup the architecture
  */
@@ -85,18 +82,19 @@ void __init corenet_ds_setup_arch(void)
 #endif
 
 #ifdef CONFIG_PCI
-       for_each_compatible_node(np, "pci", "fsl,p4080-pcie") {
-               struct resource rsrc;
-               of_address_to_resource(np, 0, &rsrc);
-               if ((rsrc.start & 0xfffff) == primary_phb_addr)
-                       fsl_add_bridge(np, 1);
-               else
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,p4080-pcie") ||
+                   of_device_is_compatible(np, "fsl,qoriq-pcie-v2.2")) {
                        fsl_add_bridge(np, 0);
-
-               hose = pci_find_hose_for_OF_device(np);
-               max = min(max, hose->dma_window_base_cur +
-                               hose->dma_window_size);
+                       hose = pci_find_hose_for_OF_device(np);
+                       max = min(max, hose->dma_window_base_cur +
+                                       hose->dma_window_size);
+               }
        }
+
+#ifdef CONFIG_PPC64
+       pci_devs_phb_init();
+#endif
 #endif
 
 #ifdef CONFIG_SWIOTLB
@@ -116,6 +114,19 @@ static const struct of_device_id of_device_ids[] __devinitconst = {
        {
                .compatible     = "fsl,rapidio-delta",
        },
+       {
+               .compatible     = "fsl,p4080-pcie",
+       },
+       {
+               .compatible     = "fsl,qoriq-pcie-v2.2",
+       },
+       /* The following two are for the Freescale hypervisor */
+       {
+               .name           = "hypervisor",
+       },
+       {
+               .name           = "handles",
+       },
        {}
 };
 
index c7b97f70312e792d8cd59d761982fd112827ca3b..1b9a8cf1873ab5df082029b3fa8358bb46efd8da 100644 (file)
@@ -83,7 +83,8 @@ void __init mpc85xx_ds_pic_init(void)
        if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS-CAMP")) {
                mpic = mpic_alloc(np, r.start,
                        MPIC_PRIMARY |
-                       MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS,
+                       MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
+                       MPIC_SINGLE_DEST_CPU,
                        0, 256, " OpenPIC  ");
        } else {
                mpic = mpic_alloc(np, r.start,
index 088f30b0c0883557ebe2d56a1bc2cf9ea2606753..f5ff9110c97eab335f3be66570e1adc4b2b84260 100644 (file)
@@ -58,10 +58,11 @@ void __init mpc85xx_rdb_pic_init(void)
                return;
        }
 
-       if (of_flat_dt_is_compatible(root, "fsl,85XXRDB-CAMP")) {
+       if (of_flat_dt_is_compatible(root, "fsl,MPC85XXRDB-CAMP")) {
                mpic = mpic_alloc(np, r.start,
                        MPIC_PRIMARY |
-                       MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS,
+                       MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
+                       MPIC_SINGLE_DEST_CPU,
                        0, 256, " OpenPIC  ");
        } else {
                mpic = mpic_alloc(np, r.start,
diff --git a/arch/powerpc/platforms/85xx/p1010rdb.c b/arch/powerpc/platforms/85xx/p1010rdb.c
new file mode 100644 (file)
index 0000000..d7387fa
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * P1010RDB Board Setup
+ *
+ * Copyright 2011 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.
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/of_platform.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/mpic.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/fsl_pci.h>
+
+void __init p1010_rdb_pic_init(void)
+{
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np;
+
+       np = of_find_node_by_type(NULL, "open-pic");
+       if (np == NULL) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return;
+       }
+
+       if (of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Failed to map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+
+       mpic = mpic_alloc(np, r.start, MPIC_PRIMARY | MPIC_WANTS_RESET |
+         MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU,
+         0, 256, " OpenPIC  ");
+
+       BUG_ON(mpic == NULL);
+       of_node_put(np);
+
+       mpic_init(mpic);
+
+}
+
+
+/*
+ * Setup the architecture
+ */
+static void __init p1010_rdb_setup_arch(void)
+{
+#ifdef CONFIG_PCI
+       struct device_node *np;
+#endif
+
+       if (ppc_md.progress)
+               ppc_md.progress("p1010_rdb_setup_arch()", 0);
+
+#ifdef CONFIG_PCI
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,p1010-pcie"))
+                       fsl_add_bridge(np, 0);
+       }
+
+#endif
+
+       printk(KERN_INFO "P1010 RDB board from Freescale Semiconductor\n");
+}
+
+static struct of_device_id __initdata p1010rdb_ids[] = {
+       { .type = "soc", },
+       { .compatible = "soc", },
+       { .compatible = "simple-bus", },
+       {},
+};
+
+static int __init p1010rdb_publish_devices(void)
+{
+       return of_platform_bus_probe(NULL, p1010rdb_ids, NULL);
+}
+machine_device_initcall(p1010_rdb, p1010rdb_publish_devices);
+machine_arch_initcall(p1010_rdb, swiotlb_setup_bus_notifier);
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init p1010_rdb_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (of_flat_dt_is_compatible(root, "fsl,P1010RDB"))
+               return 1;
+       return 0;
+}
+
+define_machine(p1010_rdb) {
+       .name                   = "P1010 RDB",
+       .probe                  = p1010_rdb_probe,
+       .setup_arch             = p1010_rdb_setup_arch,
+       .init_IRQ               = p1010_rdb_pic_init,
+#ifdef CONFIG_PCI
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+#endif
+       .get_irq                = mpic_get_irq,
+       .restart                = fsl_rstcr_restart,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+};
index 7eb5c40c069fafb296b436c99241b721be33895f..266b3aadfe5e2671d9ab11d1100dfcfcef52829b 100644 (file)
@@ -129,6 +129,7 @@ static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base)
 static void p1022ds_set_monitor_port(int monitor_port)
 {
        struct device_node *pixis_node;
+       void __iomem *pixis;
        u8 __iomem *brdcfg1;
 
        pixis_node = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-pixis");
@@ -137,12 +138,12 @@ static void p1022ds_set_monitor_port(int monitor_port)
                return;
        }
 
-       brdcfg1 = of_iomap(pixis_node, 0);
-       if (!brdcfg1) {
+       pixis = of_iomap(pixis_node, 0);
+       if (!pixis) {
                pr_err("p1022ds: could not map ngPIXIS registers\n");
                return;
        }
-       brdcfg1 += 9;   /* BRDCFG1 is at offset 9 in the ngPIXIS */
+       brdcfg1 = pixis + 9;    /* BRDCFG1 is at offset 9 in the ngPIXIS */
 
        switch (monitor_port) {
        case 0: /* DVI */
@@ -158,6 +159,8 @@ static void p1022ds_set_monitor_port(int monitor_port)
        default:
                pr_err("p1022ds: unsupported monitor port %i\n", monitor_port);
        }
+
+       iounmap(pixis);
 }
 
 /**
@@ -192,8 +195,13 @@ void p1022ds_set_pixel_clock(unsigned int pixclock)
        do_div(temp, pixclock);
        freq = temp;
 
-       /* pixclk is the ratio of the platform clock to the pixel clock */
+       /*
+        * 'pxclk' is the ratio of the platform clock to the pixel clock.
+        * This number is programmed into the CLKDVDR register, and the valid
+        * range of values is 2-255.
+        */
        pxclk = DIV_ROUND_CLOSEST(fsl_get_sys_freq(), freq);
+       pxclk = clamp_t(u32, pxclk, 2, 255);
 
        /* Disable the pixel clock, and set it to non-inverted and no delay */
        clrbits32(&guts->clkdvdr,
@@ -201,6 +209,8 @@ void p1022ds_set_pixel_clock(unsigned int pixclock)
 
        /* Enable the clock and set the pxclk */
        setbits32(&guts->clkdvdr, CLKDVDR_PXCKEN | (pxclk << 16));
+
+       iounmap(guts);
 }
 
 /**
diff --git a/arch/powerpc/platforms/85xx/p1023_rds.c b/arch/powerpc/platforms/85xx/p1023_rds.c
new file mode 100644 (file)
index 0000000..835e0b3
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2010-2011 Freescale Semiconductor, Inc.
+ *
+ * Author: Roy Zang <tie-fei.zang@freescale.com>
+ *
+ * Description:
+ * P1023 RDS Board Setup
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/fsl_devices.h>
+#include <linux/of_platform.h>
+#include <linux/of_device.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/mpic.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/fsl_pci.h>
+
+/* ************************************************************************
+ *
+ * Setup the architecture
+ *
+ */
+#ifdef CONFIG_SMP
+void __init mpc85xx_smp_init(void);
+#endif
+
+static void __init mpc85xx_rds_setup_arch(void)
+{
+       struct device_node *np;
+
+       if (ppc_md.progress)
+               ppc_md.progress("p1023_rds_setup_arch()", 0);
+
+       /* Map BCSR area */
+       np = of_find_node_by_name(NULL, "bcsr");
+       if (np != NULL) {
+               static u8 __iomem *bcsr_regs;
+
+               bcsr_regs = of_iomap(np, 0);
+               of_node_put(np);
+
+               if (!bcsr_regs) {
+                       printk(KERN_ERR
+                              "BCSR: Failed to map bcsr register space\n");
+                       return;
+               } else {
+#define BCSR15_I2C_BUS0_SEG_CLR                0x07
+#define BCSR15_I2C_BUS0_SEG2           0x02
+/*
+ * Note: Accessing exclusively i2c devices.
+ *
+ * The i2c controller selects initially ID EEPROM in the u-boot;
+ * but if menu configuration selects RTC support in the kernel,
+ * the i2c controller switches to select RTC chip in the kernel.
+ */
+#ifdef CONFIG_RTC_CLASS
+                       /* Enable RTC chip on the segment #2 of i2c */
+                       clrbits8(&bcsr_regs[15], BCSR15_I2C_BUS0_SEG_CLR);
+                       setbits8(&bcsr_regs[15], BCSR15_I2C_BUS0_SEG2);
+#endif
+
+                       iounmap(bcsr_regs);
+               }
+       }
+
+#ifdef CONFIG_PCI
+       for_each_compatible_node(np, "pci", "fsl,p1023-pcie")
+               fsl_add_bridge(np, 0);
+#endif
+
+#ifdef CONFIG_SMP
+       mpc85xx_smp_init();
+#endif
+}
+
+static struct of_device_id p1023_ids[] = {
+       { .type = "soc", },
+       { .compatible = "soc", },
+       { .compatible = "simple-bus", },
+       {},
+};
+
+
+static int __init p1023_publish_devices(void)
+{
+       of_platform_bus_probe(NULL, p1023_ids, NULL);
+
+       return 0;
+}
+
+machine_device_initcall(p1023_rds, p1023_publish_devices);
+
+static void __init mpc85xx_rds_pic_init(void)
+{
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np = NULL;
+
+       np = of_find_node_by_type(NULL, "open-pic");
+       if (!np) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return;
+       }
+
+       if (of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Failed to map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+
+       mpic = mpic_alloc(np, r.start,
+               MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN |
+               MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU,
+               0, 256, " OpenPIC  ");
+
+       BUG_ON(mpic == NULL);
+       of_node_put(np);
+
+       mpic_init(mpic);
+}
+
+static int __init p1023_rds_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       return of_flat_dt_is_compatible(root, "fsl,P1023RDS");
+
+}
+
+define_machine(p1023_rds) {
+       .name                   = "P1023 RDS",
+       .probe                  = p1023_rds_probe,
+       .setup_arch             = mpc85xx_rds_setup_arch,
+       .init_IRQ               = mpc85xx_rds_pic_init,
+       .get_irq                = mpic_get_irq,
+       .restart                = fsl_rstcr_restart,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+#ifdef CONFIG_PCI
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+#endif
+};
+
diff --git a/arch/powerpc/platforms/85xx/p2040_rdb.c b/arch/powerpc/platforms/85xx/p2040_rdb.c
new file mode 100644 (file)
index 0000000..32b56ac
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * P2040 RDB Setup
+ *
+ * Copyright 2011 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/kdev_t.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/phy.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/mpic.h>
+
+#include <linux/of_platform.h>
+#include <sysdev/fsl_soc.h>
+#include <sysdev/fsl_pci.h>
+#include <asm/ehv_pic.h>
+
+#include "corenet_ds.h"
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init p2040_rdb_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+#ifdef CONFIG_SMP
+       extern struct smp_ops_t smp_85xx_ops;
+#endif
+
+       if (of_flat_dt_is_compatible(root, "fsl,P2040RDB"))
+               return 1;
+
+       /* Check if we're running under the Freescale hypervisor */
+       if (of_flat_dt_is_compatible(root, "fsl,P2040RDB-hv")) {
+               ppc_md.init_IRQ = ehv_pic_init;
+               ppc_md.get_irq = ehv_pic_get_irq;
+               ppc_md.restart = fsl_hv_restart;
+               ppc_md.power_off = fsl_hv_halt;
+               ppc_md.halt = fsl_hv_halt;
+#ifdef CONFIG_SMP
+               /*
+                * Disable the timebase sync operations because we can't write
+                * to the timebase registers under the hypervisor.
+                 */
+               smp_85xx_ops.give_timebase = NULL;
+               smp_85xx_ops.take_timebase = NULL;
+#endif
+               return 1;
+       }
+
+       return 0;
+}
+
+define_machine(p2040_rdb) {
+       .name                   = "P2040 RDB",
+       .probe                  = p2040_rdb_probe,
+       .setup_arch             = corenet_ds_setup_arch,
+       .init_IRQ               = corenet_ds_pic_init,
+#ifdef CONFIG_PCI
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+#endif
+       .get_irq                = mpic_get_coreint_irq,
+       .restart                = fsl_rstcr_restart,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+       .power_save             = e500_idle,
+};
+
+machine_device_initcall(p2040_rdb, corenet_ds_publish_devices);
+
+#ifdef CONFIG_SWIOTLB
+machine_arch_initcall(p2040_rdb, swiotlb_setup_bus_notifier);
+#endif
index 0ed52e18298cc70697eac16884fac7b36ccb53ad..96d99a374dcf30e9e897c88f23e79242a73fd67c 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/of_platform.h>
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
+#include <asm/ehv_pic.h>
 
 #include "corenet_ds.h"
 
 static int __init p3041_ds_probe(void)
 {
        unsigned long root = of_get_flat_dt_root();
+#ifdef CONFIG_SMP
+       extern struct smp_ops_t smp_85xx_ops;
+#endif
+
+       if (of_flat_dt_is_compatible(root, "fsl,P3041DS"))
+               return 1;
+
+       /* Check if we're running under the Freescale hypervisor */
+       if (of_flat_dt_is_compatible(root, "fsl,P3041DS-hv")) {
+               ppc_md.init_IRQ = ehv_pic_init;
+               ppc_md.get_irq = ehv_pic_get_irq;
+               ppc_md.restart = fsl_hv_restart;
+               ppc_md.power_off = fsl_hv_halt;
+               ppc_md.halt = fsl_hv_halt;
+#ifdef CONFIG_SMP
+               /*
+                * Disable the timebase sync operations because we can't write
+                * to the timebase registers under the hypervisor.
+                 */
+               smp_85xx_ops.give_timebase = NULL;
+               smp_85xx_ops.take_timebase = NULL;
+#endif
+               return 1;
+       }
 
-       return of_flat_dt_is_compatible(root, "fsl,P3041DS");
+       return 0;
 }
 
 define_machine(p3041_ds) {
@@ -55,6 +80,7 @@ define_machine(p3041_ds) {
        .restart                = fsl_rstcr_restart,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
+       .power_save             = e500_idle,
 };
 
 machine_device_initcall(p3041_ds, corenet_ds_publish_devices);
index 84170460497ba19e3607c0efc9f4f3b4c2038508..d1b21d7663e3ae6a9e8eafeb46ca2e4d2ec5d15f 100644 (file)
 #include <linux/of_platform.h>
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
+#include <asm/ehv_pic.h>
 
 #include "corenet_ds.h"
 
-#ifdef CONFIG_PCI
-static int primary_phb_addr;
-#endif
-
 /*
  * Called very early, device-tree isn't unflattened
  */
 static int __init p4080_ds_probe(void)
 {
        unsigned long root = of_get_flat_dt_root();
+#ifdef CONFIG_SMP
+       extern struct smp_ops_t smp_85xx_ops;
+#endif
 
-       if (of_flat_dt_is_compatible(root, "fsl,P4080DS")) {
-#ifdef CONFIG_PCI
-               /* treat PCIe1 as primary,
-                * shouldn't matter as we have no ISA on the board
-                */
-               primary_phb_addr = 0x0000;
+       if (of_flat_dt_is_compatible(root, "fsl,P4080DS"))
+               return 1;
+
+       /* Check if we're running under the Freescale hypervisor */
+       if (of_flat_dt_is_compatible(root, "fsl,P4080DS-hv")) {
+               ppc_md.init_IRQ = ehv_pic_init;
+               ppc_md.get_irq = ehv_pic_get_irq;
+               ppc_md.restart = fsl_hv_restart;
+               ppc_md.power_off = fsl_hv_halt;
+               ppc_md.halt = fsl_hv_halt;
+#ifdef CONFIG_SMP
+               /*
+                * Disable the timebase sync operations because we can't write
+                * to the timebase registers under the hypervisor.
+                 */
+               smp_85xx_ops.give_timebase = NULL;
+               smp_85xx_ops.take_timebase = NULL;
 #endif
                return 1;
-       } else {
-               return 0;
        }
+
+       return 0;
 }
 
 define_machine(p4080_ds) {
@@ -68,7 +79,10 @@ define_machine(p4080_ds) {
        .restart                = fsl_rstcr_restart,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
+       .power_save             = e500_idle,
 };
 
 machine_device_initcall(p4080_ds, corenet_ds_publish_devices);
+#ifdef CONFIG_SWIOTLB
 machine_arch_initcall(p4080_ds, swiotlb_setup_bus_notifier);
+#endif
index 7467b712ee00621ed014f53093801d89f2e7ba59..e8cba5004fd822063c97e8a5ec1d4bbf9a1cb4d5 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/of_platform.h>
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
+#include <asm/ehv_pic.h>
 
 #include "corenet_ds.h"
 
 static int __init p5020_ds_probe(void)
 {
        unsigned long root = of_get_flat_dt_root();
+#ifdef CONFIG_SMP
+       extern struct smp_ops_t smp_85xx_ops;
+#endif
+
+       if (of_flat_dt_is_compatible(root, "fsl,P5020DS"))
+               return 1;
+
+       /* Check if we're running under the Freescale hypervisor */
+       if (of_flat_dt_is_compatible(root, "fsl,P5020DS-hv")) {
+               ppc_md.init_IRQ = ehv_pic_init;
+               ppc_md.get_irq = ehv_pic_get_irq;
+               ppc_md.restart = fsl_hv_restart;
+               ppc_md.power_off = fsl_hv_halt;
+               ppc_md.halt = fsl_hv_halt;
+#ifdef CONFIG_SMP
+               /*
+                * Disable the timebase sync operations because we can't write
+                * to the timebase registers under the hypervisor.
+                 */
+               smp_85xx_ops.give_timebase = NULL;
+               smp_85xx_ops.take_timebase = NULL;
+#endif
+               return 1;
+       }
 
-       return of_flat_dt_is_compatible(root, "fsl,P5020DS");
+       return 0;
 }
 
 define_machine(p5020_ds) {
@@ -60,6 +85,11 @@ define_machine(p5020_ds) {
        .restart                = fsl_rstcr_restart,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
+#ifdef CONFIG_PPC64
+       .power_save             = book3e_idle,
+#else
+       .power_save             = e500_idle,
+#endif
 };
 
 machine_device_initcall(p5020_ds, corenet_ds_publish_devices);
index d6a93a10c0f5c431d65c096c1fcf7dcfe8c0b289..5b9b901f64432b2a2fd124b981d9ab1630b44c95 100644 (file)
@@ -2,7 +2,7 @@
  * Author: Andy Fleming <afleming@freescale.com>
  *        Kumar Gala <galak@kernel.crashing.org>
  *
- * Copyright 2006-2008 Freescale Semiconductor Inc.
+ * Copyright 2006-2008, 2011 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
@@ -111,14 +111,6 @@ smp_85xx_kick_cpu(int nr)
        return 0;
 }
 
-static void __init
-smp_85xx_setup_cpu(int cpu_nr)
-{
-       mpic_setup_this_cpu();
-       if (cpu_has_feature(CPU_FTR_DBELL))
-               doorbell_setup_this_cpu();
-}
-
 struct smp_ops_t smp_85xx_ops = {
        .kick_cpu = smp_85xx_kick_cpu,
 #ifdef CONFIG_KEXEC
@@ -224,24 +216,36 @@ static void mpc85xx_smp_machine_kexec(struct kimage *image)
 }
 #endif /* CONFIG_KEXEC */
 
+static void __init
+smp_85xx_setup_cpu(int cpu_nr)
+{
+       if (smp_85xx_ops.probe == smp_mpic_probe)
+               mpic_setup_this_cpu();
+
+       if (cpu_has_feature(CPU_FTR_DBELL))
+               doorbell_setup_this_cpu();
+}
+
 void __init mpc85xx_smp_init(void)
 {
        struct device_node *np;
 
+       smp_85xx_ops.setup_cpu = smp_85xx_setup_cpu;
+
        np = of_find_node_by_type(NULL, "open-pic");
        if (np) {
                smp_85xx_ops.probe = smp_mpic_probe;
-               smp_85xx_ops.setup_cpu = smp_85xx_setup_cpu;
                smp_85xx_ops.message_pass = smp_mpic_message_pass;
        }
 
        if (cpu_has_feature(CPU_FTR_DBELL)) {
-               smp_85xx_ops.message_pass = smp_muxed_ipi_message_pass;
+               /*
+                * If left NULL, .message_pass defaults to
+                * smp_muxed_ipi_message_pass
+                */
                smp_85xx_ops.cause_ipi = doorbell_cause_ipi;
        }
 
-       BUG_ON(!smp_85xx_ops.message_pass);
-
        smp_ops = &smp_85xx_ops;
 
 #ifdef CONFIG_KEXEC
index a896511690c24de2962ae02679f723fc0f3f3f59..74e018ef724b0acc0aed5574e0bc483f2be37b83 100644 (file)
 #include <sysdev/fsl_pci.h>
 #include <sysdev/fsl_soc.h>
 #include <sysdev/simple_gpio.h>
+#include <asm/fsl_guts.h>
 
 #include "mpc86xx.h"
 
 static struct device_node *pixis_node;
 static unsigned char *pixis_bdcfg0, *pixis_arch;
 
+/* DIU Pixel Clock bits of the CLKDVDR Global Utilities register */
+#define CLKDVDR_PXCKEN         0x80000000
+#define CLKDVDR_PXCKINV                0x10000000
+#define CLKDVDR_PXCKDLY                0x06000000
+#define CLKDVDR_PXCLK_MASK     0x001F0000
+
 #ifdef CONFIG_SUSPEND
 static irqreturn_t mpc8610_sw9_irq(int irq, void *data)
 {
@@ -205,72 +212,54 @@ void mpc8610hpcd_set_monitor_port(int monitor_port)
                             bdcfg[monitor_port]);
 }
 
+/**
+ * mpc8610hpcd_set_pixel_clock: program the DIU's clock
+ *
+ * @pixclock: the wavelength, in picoseconds, of the clock
+ */
 void mpc8610hpcd_set_pixel_clock(unsigned int pixclock)
 {
-       u32 __iomem *clkdvdr;
-       u32 temp;
-       /* variables for pixel clock calcs */
-       ulong  bestval, bestfreq, speed_ccb, minpixclock, maxpixclock;
-       ulong pixval;
-       long err;
-       int i;
-
-       clkdvdr = ioremap(get_immrbase() + 0xe0800, sizeof(u32));
-       if (!clkdvdr) {
-               printk(KERN_ERR "Err: can't map clock divider register!\n");
+       struct device_node *guts_np = NULL;
+       struct ccsr_guts_86xx __iomem *guts;
+       unsigned long freq;
+       u64 temp;
+       u32 pxclk;
+
+       /* Map the global utilities registers. */
+       guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts");
+       if (!guts_np) {
+               pr_err("mpc8610hpcd: missing global utilties device node\n");
                return;
        }
 
-       /* Pixel Clock configuration */
-       speed_ccb = fsl_get_sys_freq();
-
-       /* Calculate the pixel clock with the smallest error */
-       /* calculate the following in steps to avoid overflow */
-       pr_debug("DIU pixclock in ps - %d\n", pixclock);
-       temp = 1000000000/pixclock;
-       temp *= 1000;
-       pixclock = temp;
-       pr_debug("DIU pixclock freq - %u\n", pixclock);
-
-       temp = pixclock * 5 / 100;
-       pr_debug("deviation = %d\n", temp);
-       minpixclock = pixclock - temp;
-       maxpixclock = pixclock + temp;
-       pr_debug("DIU minpixclock - %lu\n", minpixclock);
-       pr_debug("DIU maxpixclock - %lu\n", maxpixclock);
-       pixval = speed_ccb/pixclock;
-       pr_debug("DIU pixval = %lu\n", pixval);
-
-       err = 100000000;
-       bestval = pixval;
-       pr_debug("DIU bestval = %lu\n", bestval);
-
-       bestfreq = 0;
-       for (i = -1; i <= 1; i++) {
-               temp = speed_ccb / ((pixval+i) + 1);
-               pr_debug("DIU test pixval i= %d, pixval=%lu, temp freq. = %u\n",
-                                                       i, pixval, temp);
-               if ((temp < minpixclock) || (temp > maxpixclock))
-                       pr_debug("DIU exceeds monitor range (%lu to %lu)\n",
-                               minpixclock, maxpixclock);
-               else if (abs(temp - pixclock) < err) {
-                 pr_debug("Entered the else if block %d\n", i);
-                       err = abs(temp - pixclock);
-                       bestval = pixval+i;
-                       bestfreq = temp;
-               }
+       guts = of_iomap(guts_np, 0);
+       of_node_put(guts_np);
+       if (!guts) {
+               pr_err("mpc8610hpcd: could not map global utilties device\n");
+               return;
        }
 
-       pr_debug("DIU chose = %lx\n", bestval);
-       pr_debug("DIU error = %ld\n NomPixClk ", err);
-       pr_debug("DIU: Best Freq = %lx\n", bestfreq);
-       /* Modify PXCLK in GUTS CLKDVDR */
-       pr_debug("DIU: Current value of CLKDVDR = 0x%08x\n", (*clkdvdr));
-       temp = (*clkdvdr) & 0x2000FFFF;
-       *clkdvdr = temp;                /* turn off clock */
-       *clkdvdr = temp | 0x80000000 | (((bestval) & 0x1F) << 16);
-       pr_debug("DIU: Modified value of CLKDVDR = 0x%08x\n", (*clkdvdr));
-       iounmap(clkdvdr);
+       /* Convert pixclock from a wavelength to a frequency */
+       temp = 1000000000000ULL;
+       do_div(temp, pixclock);
+       freq = temp;
+
+       /*
+        * 'pxclk' is the ratio of the platform clock to the pixel clock.
+        * On the MPC8610, the value programmed into CLKDVDR is the ratio
+        * minus one.  The valid range of values is 2-31.
+        */
+       pxclk = DIV_ROUND_CLOSEST(fsl_get_sys_freq(), freq) - 1;
+       pxclk = clamp_t(u32, pxclk, 2, 31);
+
+       /* Disable the pixel clock, and set it to non-inverted and no delay */
+       clrbits32(&guts->clkdvdr,
+                 CLKDVDR_PXCKEN | CLKDVDR_PXCKDLY | CLKDVDR_PXCLK_MASK);
+
+       /* Enable the clock and set the pxclk */
+       setbits32(&guts->clkdvdr, CLKDVDR_PXCKEN | (pxclk << 16));
+
+       iounmap(guts);
 }
 
 ssize_t mpc8610hpcd_show_monitor_port(int monitor_port, char *buf)
index f970ca2b180c96339110802d92ebb065eee4c4be..d0af7fb2f3441c6113671b5ee51f95d3a717a8e4 100644 (file)
@@ -78,6 +78,10 @@ config MPIC
        bool
        default n
 
+config PPC_EPAPR_HV_PIC
+       bool
+       default n
+
 config MPIC_WEIRD
        bool
        default n
@@ -266,7 +270,7 @@ config TAU_AVERAGE
 
 config QUICC_ENGINE
        bool "Freescale QUICC Engine (QE) Support"
-       depends on FSL_SOC
+       depends on FSL_SOC && PPC32
        select PPC_LIB_RHEAP
        select CRC32
        help
index 2165b65876f9e9c70d9495377da92c5f13a4aa3e..e06e39589a09e2b63e786c787484509c6149c311 100644 (file)
@@ -1,7 +1,6 @@
 config PPC64
        bool "64-bit kernel"
        default n
-       select PPC_HAVE_PMU_SUPPORT
        help
          This option selects whether a 32-bit or a 64-bit kernel
          will be built.
@@ -69,6 +68,7 @@ choice
 config PPC_BOOK3S_64
        bool "Server processors"
        select PPC_FPU
+       select PPC_HAVE_PMU_SUPPORT
 
 config PPC_BOOK3E_64
        bool "Embedded processors"
index e3265adde5d32baab9051eca1dea610357c73b7f..2df48c2287bdcfaad589e3ba44c19bce98ba9f73 100644 (file)
@@ -75,7 +75,7 @@ static void __devinit smp_iSeries_setup_cpu(int nr)
 }
 
 static struct smp_ops_t iSeries_smp_ops = {
-       .message_pass = smp_muxed_ipi_message_pass,
+       .message_pass = NULL,   /* Use smp_muxed_ipi_message_pass */
        .cause_ipi    = smp_iSeries_cause_ipi,
        .probe        = smp_iSeries_probe,
        .kick_cpu     = smp_iSeries_kick_cpu,
index fe34c3d9bb741739411dc5f156e17c3aa1215c33..5b3388b9f9117b4a6114f7724797038ad3d28869 100644 (file)
@@ -338,35 +338,16 @@ define_machine(maple) {
 #ifdef CONFIG_EDAC
 /*
  * Register a platform device for CPC925 memory controller on
- * Motorola ATCA-6101 blade.
+ * all boards with U3H (CPC925) bridge.
  */
-#define MAPLE_CPC925_MODEL     "Motorola,ATCA-6101"
 static int __init maple_cpc925_edac_setup(void)
 {
        struct platform_device *pdev;
        struct device_node *np = NULL;
        struct resource r;
-       const unsigned char *model;
        int ret;
-
-       np = of_find_node_by_path("/");
-       if (!np) {
-               printk(KERN_ERR "%s: Unable to get root node\n", __func__);
-               return -ENODEV;
-       }
-
-       model = (const unsigned char *)of_get_property(np, "model", NULL);
-       if (!model) {
-               printk(KERN_ERR "%s: Unabel to get model info\n", __func__);
-               of_node_put(np);
-               return -ENODEV;
-       }
-
-       ret = strcmp(model, MAPLE_CPC925_MODEL);
-       of_node_put(np);
-
-       if (ret != 0)
-               return 0;
+       volatile void __iomem *mem;
+       u32 rev;
 
        np = of_find_node_by_type(NULL, "memory-controller");
        if (!np) {
@@ -384,6 +365,22 @@ static int __init maple_cpc925_edac_setup(void)
                return -ENODEV;
        }
 
+       mem = ioremap(r.start, resource_size(&r));
+       if (!mem) {
+               printk(KERN_ERR "%s: Unable to map memory-controller memory\n",
+                               __func__);
+               return -ENOMEM;
+       }
+
+       rev = __raw_readl(mem);
+       iounmap(mem);
+
+       if (rev < 0x34 || rev > 0x3f) { /* U3H */
+               printk(KERN_ERR "%s: Non-CPC925(U3H) bridge revision: %02x\n",
+                       __func__, rev);
+               return 0;
+       }
+
        pdev = platform_device_register_simple("cpc925_edac", 0, &r, 1);
        if (IS_ERR(pdev))
                return PTR_ERR(pdev);
index aa45281bd296824d1927f1982e365fb8dd6e724b..a028f08309d64fcec51fd7b86f3d3b49d8bf263b 100644 (file)
@@ -355,9 +355,6 @@ static int initializing = 1;
 static int pmac_late_init(void)
 {
        initializing = 0;
-       /* this is udbg (which is __init) and we can later use it during
-        * cpu hotplug (in smp_core99_kick_cpu) */
-       ppc_md.progress = NULL;
        return 0;
 }
 machine_late_initcall(powermac, pmac_late_init);
index db092d7c4c5b3ee41062af909af2e3a355bc06b7..d15fca32297878970e8b1130098fcaef18a7c7e3 100644 (file)
@@ -447,7 +447,7 @@ void __init smp_psurge_give_timebase(void)
 
 /* PowerSurge-style Macs */
 struct smp_ops_t psurge_smp_ops = {
-       .message_pass   = smp_muxed_ipi_message_pass,
+       .message_pass   = NULL, /* Use smp_muxed_ipi_message_pass */
        .cause_ipi      = smp_psurge_cause_ipi,
        .probe          = smp_psurge_probe,
        .kick_cpu       = smp_psurge_kick_cpu,
index 57ceb92b2288a36e2e35f719b959ac0294974b2a..e9be25bc571bbb254b91ceea6639ff6ee0f053ef 100644 (file)
@@ -262,12 +262,11 @@ int dlpar_attach_node(struct device_node *dn)
        if (!dn->parent)
                return -ENOMEM;
 
-       rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                         PSERIES_RECONFIG_ADD, dn);
-       if (rc == NOTIFY_BAD) {
+       rc = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, dn);
+       if (rc) {
                printk(KERN_ERR "Failed to add device node %s\n",
                       dn->full_name);
-               return -ENOMEM; /* For now, safe to assume kmalloc failure */
+               return rc;
        }
 
        of_attach_node(dn);
@@ -297,8 +296,7 @@ int dlpar_detach_node(struct device_node *dn)
                remove_proc_entry(dn->pde->name, parent->pde);
 #endif
 
-       blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                           PSERIES_RECONFIG_REMOVE, dn);
+       pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, dn);
        of_detach_node(dn);
        of_node_put(dn); /* Must decrement the refcount */
 
index 46f13a3c5d09eb5c88e01c1356b018a67622b546..bc0288501f17c41388b998f7ac722337ad4c7821 100644 (file)
@@ -330,21 +330,17 @@ static void pseries_remove_processor(struct device_node *np)
 static int pseries_smp_notifier(struct notifier_block *nb,
                                unsigned long action, void *node)
 {
-       int err = NOTIFY_OK;
+       int err = 0;
 
        switch (action) {
        case PSERIES_RECONFIG_ADD:
-               if (pseries_add_processor(node))
-                       err = NOTIFY_BAD;
+               err = pseries_add_processor(node);
                break;
        case PSERIES_RECONFIG_REMOVE:
                pseries_remove_processor(node);
                break;
-       default:
-               err = NOTIFY_DONE;
-               break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block pseries_smp_nb = {
index 9d6a8effeda2dfb7947102d0031830a11735b200..11d8e0544ac0f52a09f0f8692d7a3c265f00a353 100644 (file)
@@ -205,27 +205,21 @@ static int pseries_drconf_memory(unsigned long *base, unsigned int action)
 static int pseries_memory_notifier(struct notifier_block *nb,
                                unsigned long action, void *node)
 {
-       int err = NOTIFY_OK;
+       int err = 0;
 
        switch (action) {
        case PSERIES_RECONFIG_ADD:
-               if (pseries_add_memory(node))
-                       err = NOTIFY_BAD;
+               err = pseries_add_memory(node);
                break;
        case PSERIES_RECONFIG_REMOVE:
-               if (pseries_remove_memory(node))
-                       err = NOTIFY_BAD;
+               err = pseries_remove_memory(node);
                break;
        case PSERIES_DRCONF_MEM_ADD:
        case PSERIES_DRCONF_MEM_REMOVE:
-               if (pseries_drconf_memory(node, action))
-                       err = NOTIFY_BAD;
-               break;
-       default:
-               err = NOTIFY_DONE;
+               err = pseries_drconf_memory(node, action);
                break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block pseries_mem_nb = {
index 3f6a89b09816ee667b323214e3f8efbb949efad7..041e87ca189314cebd032320cf7df53c6fcf2888 100644 (file)
@@ -73,7 +73,7 @@ int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
        if (ret == H_SUCCESS)
                return count;
        if (ret == H_BUSY)
-               return 0;
+               return -EAGAIN;
        return -EIO;
 }
 
index 39e6e0a7b2faf259db0f59e169f2fce9ab6fb1a0..f7205d344efd7577c8069bfc565dc21506101e4f 100644 (file)
@@ -52,197 +52,6 @@ EXPORT_SYMBOL(plpar_hcall_norets);
 
 extern void pSeries_find_serial_port(void);
 
-
-static int vtermno;    /* virtual terminal# for udbg  */
-
-#define __ALIGNED__ __attribute__((__aligned__(sizeof(long))))
-static void udbg_hvsi_putc(char c)
-{
-       /* packet's seqno isn't used anyways */
-       uint8_t packet[] __ALIGNED__ = { 0xff, 5, 0, 0, c };
-       int rc;
-
-       if (c == '\n')
-               udbg_hvsi_putc('\r');
-
-       do {
-               rc = plpar_put_term_char(vtermno, sizeof(packet), packet);
-       } while (rc == H_BUSY);
-}
-
-static long hvsi_udbg_buf_len;
-static uint8_t hvsi_udbg_buf[256];
-
-static int udbg_hvsi_getc_poll(void)
-{
-       unsigned char ch;
-       int rc, i;
-
-       if (hvsi_udbg_buf_len == 0) {
-               rc = plpar_get_term_char(vtermno, &hvsi_udbg_buf_len, hvsi_udbg_buf);
-               if (rc != H_SUCCESS || hvsi_udbg_buf[0] != 0xff) {
-                       /* bad read or non-data packet */
-                       hvsi_udbg_buf_len = 0;
-               } else {
-                       /* remove the packet header */
-                       for (i = 4; i < hvsi_udbg_buf_len; i++)
-                               hvsi_udbg_buf[i-4] = hvsi_udbg_buf[i];
-                       hvsi_udbg_buf_len -= 4;
-               }
-       }
-
-       if (hvsi_udbg_buf_len <= 0 || hvsi_udbg_buf_len > 256) {
-               /* no data ready */
-               hvsi_udbg_buf_len = 0;
-               return -1;
-       }
-
-       ch = hvsi_udbg_buf[0];
-       /* shift remaining data down */
-       for (i = 1; i < hvsi_udbg_buf_len; i++) {
-               hvsi_udbg_buf[i-1] = hvsi_udbg_buf[i];
-       }
-       hvsi_udbg_buf_len--;
-
-       return ch;
-}
-
-static int udbg_hvsi_getc(void)
-{
-       int ch;
-       for (;;) {
-               ch = udbg_hvsi_getc_poll();
-               if (ch == -1) {
-                       /* This shouldn't be needed...but... */
-                       volatile unsigned long delay;
-                       for (delay=0; delay < 2000000; delay++)
-                               ;
-               } else {
-                       return ch;
-               }
-       }
-}
-
-static void udbg_putcLP(char c)
-{
-       char buf[16];
-       unsigned long rc;
-
-       if (c == '\n')
-               udbg_putcLP('\r');
-
-       buf[0] = c;
-       do {
-               rc = plpar_put_term_char(vtermno, 1, buf);
-       } while(rc == H_BUSY);
-}
-
-/* Buffered chars getc */
-static long inbuflen;
-static long inbuf[2];  /* must be 2 longs */
-
-static int udbg_getc_pollLP(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 = plpar_get_term_char(vtermno, &inbuflen, buf);
-               if (rc != H_SUCCESS)
-                       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_getcLP(void)
-{
-       int ch;
-       for (;;) {
-               ch = udbg_getc_pollLP();
-               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_lpar(void)
-{
-       vtermno = 0;
-       udbg_putc = udbg_putcLP;
-       udbg_getc = udbg_getcLP;
-       udbg_getc_poll = udbg_getc_pollLP;
-
-       register_early_udbg_console();
-}
-
-/* returns 0 if couldn't find or use /chosen/stdout as console */
-void __init find_udbg_vterm(void)
-{
-       struct device_node *stdout_node;
-       const u32 *termno;
-       const char *name;
-
-       /* find the boot console from /chosen/stdout */
-       if (!of_chosen)
-               return;
-       name = of_get_property(of_chosen, "linux,stdout-path", NULL);
-       if (name == NULL)
-               return;
-       stdout_node = of_find_node_by_path(name);
-       if (!stdout_node)
-               return;
-       name = of_get_property(stdout_node, "name", NULL);
-       if (!name) {
-               printk(KERN_WARNING "stdout node missing 'name' property!\n");
-               goto out;
-       }
-
-       /* Check if it's a virtual terminal */
-       if (strncmp(name, "vty", 3) != 0)
-               goto out;
-       termno = of_get_property(stdout_node, "reg", NULL);
-       if (termno == NULL)
-               goto out;
-       vtermno = termno[0];
-
-       if (of_device_is_compatible(stdout_node, "hvterm1")) {
-               udbg_putc = udbg_putcLP;
-               udbg_getc = udbg_getcLP;
-               udbg_getc_poll = udbg_getc_pollLP;
-               add_preferred_console("hvc", termno[0] & 0xff, NULL);
-       } else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) {
-               vtermno = termno[0];
-               udbg_putc = udbg_hvsi_putc;
-               udbg_getc = udbg_hvsi_getc;
-               udbg_getc_poll = udbg_hvsi_getc_poll;
-               add_preferred_console("hvsi", termno[0] & 0xff, NULL);
-       }
-out:
-       of_node_put(stdout_node);
-}
-
 void vpa_init(int cpu)
 {
        int hwcpu = get_hard_smp_processor_id(cpu);
index e9f6d2859c3cf3dd67b5a27a34fd77992d56b4cc..24c7162f11d9ff7c431540ea44beb667d9e44849 100644 (file)
@@ -47,7 +47,8 @@ extern void pSeries_final_fixup(void);
 /* Poweron flag used for enabling auto ups restart */
 extern unsigned long rtas_poweron_auto;
 
-extern void find_udbg_vterm(void);
+/* Provided by HVC VIO */
+extern void hvc_vio_init_early(void);
 
 /* Dynamic logical Partitioning/Mobility */
 extern void dlpar_free_cc_nodes(struct device_node *);
index 1de2cbb92303c880cf9c41b4635baf03f13d1a6b..168651acdd83e003dae22f9bdee6147e89c1b1f5 100644 (file)
@@ -97,7 +97,7 @@ static struct device_node *derive_parent(const char *path)
        return parent;
 }
 
-BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);
+static BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);
 
 int pSeries_reconfig_notifier_register(struct notifier_block *nb)
 {
@@ -109,6 +109,14 @@ void pSeries_reconfig_notifier_unregister(struct notifier_block *nb)
        blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb);
 }
 
+int pSeries_reconfig_notify(unsigned long action, void *p)
+{
+       int err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
+                                               action, p);
+
+       return notifier_to_errno(err);
+}
+
 static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
 {
        struct device_node *np;
@@ -132,11 +140,9 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist
                goto out_err;
        }
 
-       err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                 PSERIES_RECONFIG_ADD, np);
-       if (err == NOTIFY_BAD) {
+       err = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, np);
+       if (err) {
                printk(KERN_ERR "Failed to add device node %s\n", path);
-               err = -ENOMEM; /* For now, safe to assume kmalloc failure */
                goto out_err;
        }
 
@@ -173,8 +179,7 @@ static int pSeries_reconfig_remove_node(struct device_node *np)
 
        remove_node_proc_entries(np);
 
-       blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                           PSERIES_RECONFIG_REMOVE, np);
+       pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, np);
        of_detach_node(np);
 
        of_node_put(parent);
@@ -472,11 +477,10 @@ static int do_update_property(char *buf, size_t bufsize)
                else
                        action = PSERIES_DRCONF_MEM_REMOVE;
 
-               rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                                 action, value);
-               if (rc == NOTIFY_BAD) {
-                       rc = prom_update_property(np, oldprop, newprop);
-                       return -ENOMEM;
+               rc = pSeries_reconfig_notify(action, value);
+               if (rc) {
+                       prom_update_property(np, oldprop, newprop);
+                       return rc;
                }
        }
 
index 593acceeff963551511262ee3c46deb815bd41f6..d00e52926b71e3ae76a08d809881008a620ed626 100644 (file)
@@ -512,9 +512,10 @@ static void __init pSeries_init_early(void)
 {
        pr_debug(" -> pSeries_init_early()\n");
 
+#ifdef CONFIG_HVC_CONSOLE
        if (firmware_has_feature(FW_FEATURE_LPAR))
-               find_udbg_vterm();
-
+               hvc_vio_init_early();
+#endif
        if (firmware_has_feature(FW_FEATURE_DABR))
                ppc_md.set_dabr = pseries_set_dabr;
        else if (firmware_has_feature(FW_FEATURE_XDABR))
index cd70be5ff27efb3255b6ad6ab9e1b2d9e27c2c12..1672db2d1b0e33fd39d98ab1a40f73a60e94e3cf 100644 (file)
@@ -206,7 +206,7 @@ static struct smp_ops_t pSeries_mpic_smp_ops = {
 };
 
 static struct smp_ops_t pSeries_xics_smp_ops = {
-       .message_pass   = smp_muxed_ipi_message_pass,
+       .message_pass   = NULL, /* Use smp_muxed_ipi_message_pass */
        .cause_ipi      = NULL, /* Filled at runtime by xics_smp_probe() */
        .probe          = xics_smp_probe,
        .kick_cpu       = smp_pSeries_kick_cpu,
index 9d20fa9d3710e0a07670188af71ac8e573dd4ac3..71bd105f38636b0435fae0590deec38cd02ddf1e 100644 (file)
@@ -75,7 +75,7 @@ static int __init smp_a2_probe(void)
 }
 
 static struct smp_ops_t a2_smp_ops = {
-       .message_pass   = smp_muxed_ipi_message_pass,
+       .message_pass   = NULL, /* Use smp_muxed_ipi_message_pass */
        .cause_ipi      = doorbell_cause_ipi,
        .probe          = smp_a2_probe,
        .kick_cpu       = smp_a2_kick_cpu,
index 0efa990e3344947d74df4c2806187fd1a0d2b7b7..cf736ca0cf051bd9192fd190bea664c1a64b5427 100644 (file)
@@ -4,6 +4,7 @@ ccflags-$(CONFIG_PPC64)         := -mno-minimal-toc
 
 mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o
 obj-$(CONFIG_MPIC)             += mpic.o $(mpic-msi-obj-y)
+obj-$(CONFIG_PPC_EPAPR_HV_PIC) += ehv_pic.o
 fsl-msi-obj-$(CONFIG_PCI_MSI)  += fsl_msi.o
 obj-$(CONFIG_PPC_MSI_BITMAP)   += msi_bitmap.o
 
diff --git a/arch/powerpc/sysdev/ehv_pic.c b/arch/powerpc/sysdev/ehv_pic.c
new file mode 100644 (file)
index 0000000..af1a5df
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ *  Driver for ePAPR Embedded Hypervisor PIC
+ *
+ *  Copyright 2008-2011 Freescale Semiconductor, Inc.
+ *
+ *  Author: Ashish Kalra <ashish.kalra@freescale.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.
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/smp.h>
+#include <linux/interrupt.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/of.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/smp.h>
+#include <asm/machdep.h>
+#include <asm/ehv_pic.h>
+#include <asm/fsl_hcalls.h>
+
+#include "../../../kernel/irq/settings.h"
+
+static struct ehv_pic *global_ehv_pic;
+static DEFINE_SPINLOCK(ehv_pic_lock);
+
+static u32 hwirq_intspec[NR_EHV_PIC_INTS];
+static u32 __iomem *mpic_percpu_base_vaddr;
+
+#define IRQ_TYPE_MPIC_DIRECT 4
+#define MPIC_EOI  0x00B0
+
+/*
+ * Linux descriptor level callbacks
+ */
+
+void ehv_pic_unmask_irq(struct irq_data *d)
+{
+       unsigned int src = virq_to_hw(d->irq);
+
+       ev_int_set_mask(src, 0);
+}
+
+void ehv_pic_mask_irq(struct irq_data *d)
+{
+       unsigned int src = virq_to_hw(d->irq);
+
+       ev_int_set_mask(src, 1);
+}
+
+void ehv_pic_end_irq(struct irq_data *d)
+{
+       unsigned int src = virq_to_hw(d->irq);
+
+       ev_int_eoi(src);
+}
+
+void ehv_pic_direct_end_irq(struct irq_data *d)
+{
+       out_be32(mpic_percpu_base_vaddr + MPIC_EOI / 4, 0);
+}
+
+int ehv_pic_set_affinity(struct irq_data *d, const struct cpumask *dest,
+                        bool force)
+{
+       unsigned int src = virq_to_hw(d->irq);
+       unsigned int config, prio, cpu_dest;
+       int cpuid = irq_choose_cpu(dest);
+       unsigned long flags;
+
+       spin_lock_irqsave(&ehv_pic_lock, flags);
+       ev_int_get_config(src, &config, &prio, &cpu_dest);
+       ev_int_set_config(src, config, prio, cpuid);
+       spin_unlock_irqrestore(&ehv_pic_lock, flags);
+
+       return 0;
+}
+
+static unsigned int ehv_pic_type_to_vecpri(unsigned int type)
+{
+       /* Now convert sense value */
+
+       switch (type & IRQ_TYPE_SENSE_MASK) {
+       case IRQ_TYPE_EDGE_RISING:
+               return EHV_PIC_INFO(VECPRI_SENSE_EDGE) |
+                      EHV_PIC_INFO(VECPRI_POLARITY_POSITIVE);
+
+       case IRQ_TYPE_EDGE_FALLING:
+       case IRQ_TYPE_EDGE_BOTH:
+               return EHV_PIC_INFO(VECPRI_SENSE_EDGE) |
+                      EHV_PIC_INFO(VECPRI_POLARITY_NEGATIVE);
+
+       case IRQ_TYPE_LEVEL_HIGH:
+               return EHV_PIC_INFO(VECPRI_SENSE_LEVEL) |
+                      EHV_PIC_INFO(VECPRI_POLARITY_POSITIVE);
+
+       case IRQ_TYPE_LEVEL_LOW:
+       default:
+               return EHV_PIC_INFO(VECPRI_SENSE_LEVEL) |
+                      EHV_PIC_INFO(VECPRI_POLARITY_NEGATIVE);
+       }
+}
+
+int ehv_pic_set_irq_type(struct irq_data *d, unsigned int flow_type)
+{
+       unsigned int src = virq_to_hw(d->irq);
+       struct irq_desc *desc = irq_to_desc(d->irq);
+       unsigned int vecpri, vold, vnew, prio, cpu_dest;
+       unsigned long flags;
+
+       if (flow_type == IRQ_TYPE_NONE)
+               flow_type = IRQ_TYPE_LEVEL_LOW;
+
+       irq_settings_clr_level(desc);
+       irq_settings_set_trigger_mask(desc, flow_type);
+       if (flow_type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
+               irq_settings_set_level(desc);
+
+       vecpri = ehv_pic_type_to_vecpri(flow_type);
+
+       spin_lock_irqsave(&ehv_pic_lock, flags);
+       ev_int_get_config(src, &vold, &prio, &cpu_dest);
+       vnew = vold & ~(EHV_PIC_INFO(VECPRI_POLARITY_MASK) |
+                       EHV_PIC_INFO(VECPRI_SENSE_MASK));
+       vnew |= vecpri;
+
+       /*
+        * TODO : Add specific interface call for platform to set
+        * individual interrupt priorities.
+        * platform currently using static/default priority for all ints
+        */
+
+       prio = 8;
+
+       ev_int_set_config(src, vecpri, prio, cpu_dest);
+
+       spin_unlock_irqrestore(&ehv_pic_lock, flags);
+       return 0;
+}
+
+static struct irq_chip ehv_pic_irq_chip = {
+       .irq_mask       = ehv_pic_mask_irq,
+       .irq_unmask     = ehv_pic_unmask_irq,
+       .irq_eoi        = ehv_pic_end_irq,
+       .irq_set_type   = ehv_pic_set_irq_type,
+};
+
+static struct irq_chip ehv_pic_direct_eoi_irq_chip = {
+       .irq_mask       = ehv_pic_mask_irq,
+       .irq_unmask     = ehv_pic_unmask_irq,
+       .irq_eoi        = ehv_pic_direct_end_irq,
+       .irq_set_type   = ehv_pic_set_irq_type,
+};
+
+/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
+unsigned int ehv_pic_get_irq(void)
+{
+       int irq;
+
+       BUG_ON(global_ehv_pic == NULL);
+
+       if (global_ehv_pic->coreint_flag)
+               irq = mfspr(SPRN_EPR); /* if core int mode */
+       else
+               ev_int_iack(0, &irq); /* legacy mode */
+
+       if (irq == 0xFFFF)    /* 0xFFFF --> no irq is pending */
+               return NO_IRQ;
+
+       /*
+        * this will also setup revmap[] in the slow path for the first
+        * time, next calls will always use fast path by indexing revmap
+        */
+       return irq_linear_revmap(global_ehv_pic->irqhost, irq);
+}
+
+static int ehv_pic_host_match(struct irq_host *h, struct device_node *node)
+{
+       /* Exact match, unless ehv_pic node is NULL */
+       return h->of_node == NULL || h->of_node == node;
+}
+
+static int ehv_pic_host_map(struct irq_host *h, unsigned int virq,
+                        irq_hw_number_t hw)
+{
+       struct ehv_pic *ehv_pic = h->host_data;
+       struct irq_chip *chip;
+
+       /* Default chip */
+       chip = &ehv_pic->hc_irq;
+
+       if (mpic_percpu_base_vaddr)
+               if (hwirq_intspec[hw] & IRQ_TYPE_MPIC_DIRECT)
+                       chip = &ehv_pic_direct_eoi_irq_chip;
+
+       irq_set_chip_data(virq, chip);
+       /*
+        * using handle_fasteoi_irq as our irq handler, this will
+        * only call the eoi callback and suitable for the MPIC
+        * controller which set ISR/IPR automatically and clear the
+        * highest priority active interrupt in ISR/IPR when we do
+        * a specific eoi
+        */
+       irq_set_chip_and_handler(virq, chip, handle_fasteoi_irq);
+
+       /* Set default irq type */
+       irq_set_irq_type(virq, IRQ_TYPE_NONE);
+
+       return 0;
+}
+
+static int ehv_pic_host_xlate(struct irq_host *h, struct device_node *ct,
+                          const u32 *intspec, unsigned int intsize,
+                          irq_hw_number_t *out_hwirq, unsigned int *out_flags)
+
+{
+       /*
+        * interrupt sense values coming from the guest device tree
+        * interrupt specifiers can have four possible sense and
+        * level encoding information and they need to
+        * be translated between firmware type & linux type.
+        */
+
+       static unsigned char map_of_senses_to_linux_irqtype[4] = {
+               IRQ_TYPE_EDGE_FALLING,
+               IRQ_TYPE_EDGE_RISING,
+               IRQ_TYPE_LEVEL_LOW,
+               IRQ_TYPE_LEVEL_HIGH,
+       };
+
+       *out_hwirq = intspec[0];
+       if (intsize > 1) {
+               hwirq_intspec[intspec[0]] = intspec[1];
+               *out_flags = map_of_senses_to_linux_irqtype[intspec[1] &
+                                                       ~IRQ_TYPE_MPIC_DIRECT];
+       } else {
+               *out_flags = IRQ_TYPE_NONE;
+       }
+
+       return 0;
+}
+
+static struct irq_host_ops ehv_pic_host_ops = {
+       .match = ehv_pic_host_match,
+       .map = ehv_pic_host_map,
+       .xlate = ehv_pic_host_xlate,
+};
+
+void __init ehv_pic_init(void)
+{
+       struct device_node *np, *np2;
+       struct ehv_pic *ehv_pic;
+       int coreint_flag = 1;
+
+       np = of_find_compatible_node(NULL, NULL, "epapr,hv-pic");
+       if (!np) {
+               pr_err("ehv_pic_init: could not find epapr,hv-pic node\n");
+               return;
+       }
+
+       if (!of_find_property(np, "has-external-proxy", NULL))
+               coreint_flag = 0;
+
+       ehv_pic = kzalloc(sizeof(struct ehv_pic), GFP_KERNEL);
+       if (!ehv_pic) {
+               of_node_put(np);
+               return;
+       }
+
+       ehv_pic->irqhost = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR,
+               NR_EHV_PIC_INTS, &ehv_pic_host_ops, 0);
+
+       if (!ehv_pic->irqhost) {
+               of_node_put(np);
+               return;
+       }
+
+       np2 = of_find_compatible_node(NULL, NULL, "fsl,hv-mpic-per-cpu");
+       if (np2) {
+               mpic_percpu_base_vaddr = of_iomap(np2, 0);
+               if (!mpic_percpu_base_vaddr)
+                       pr_err("ehv_pic_init: of_iomap failed\n");
+
+               of_node_put(np2);
+       }
+
+       ehv_pic->irqhost->host_data = ehv_pic;
+       ehv_pic->hc_irq = ehv_pic_irq_chip;
+       ehv_pic->hc_irq.irq_set_affinity = ehv_pic_set_affinity;
+       ehv_pic->coreint_flag = coreint_flag;
+
+       global_ehv_pic = ehv_pic;
+       irq_set_default_host(global_ehv_pic->irqhost);
+}
index ba5cb3fa7074ea713945f2e6f52f18b233cb1e7e..3bba8bdb58b08053d614c597002895dfa9809105 100644 (file)
@@ -38,10 +38,17 @@ static int fsl_pcie_bus_fixup, is_mpc83xx_pci;
 
 static void __init quirk_fsl_pcie_header(struct pci_dev *dev)
 {
+       u8 progif;
+
        /* if we aren't a PCIe don't bother */
        if (!pci_find_capability(dev, PCI_CAP_ID_EXP))
                return;
 
+       /* if we aren't in host mode don't bother */
+       pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
+       if (progif & 0x1)
+               return;
+
        dev->class = PCI_CLASS_BRIDGE_PCI << 8;
        fsl_pcie_bus_fixup = 1;
        return;
@@ -323,6 +330,7 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
        struct pci_controller *hose;
        struct resource rsrc;
        const int *bus_range;
+       u8 progif;
 
        if (!of_device_is_available(dev)) {
                pr_warning("%s: disabled\n", dev->full_name);
@@ -353,6 +361,18 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
 
        setup_indirect_pci(hose, rsrc.start, rsrc.start + 0x4,
                PPC_INDIRECT_TYPE_BIG_ENDIAN);
+
+       early_read_config_byte(hose, 0, 0, PCI_CLASS_PROG, &progif);
+       if ((progif & 1) == 1) {
+               /* unmap cfg_data & cfg_addr separately if not on same page */
+               if (((unsigned long)hose->cfg_data & PAGE_MASK) !=
+                   ((unsigned long)hose->cfg_addr & PAGE_MASK))
+                       iounmap(hose->cfg_data);
+               iounmap(hose->cfg_addr);
+               pcibios_free_controller(hose);
+               return 0;
+       }
+
        setup_pci_cmd(hose);
 
        /* check PCI express link status */
@@ -380,70 +400,11 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
 
        return 0;
 }
-
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8569E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8569, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020, quirk_fsl_pcie_header);
 #endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */
 
-#if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x)
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8308, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8314E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8314, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8315E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8315, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8377E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8377, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8378E, quirk_fsl_pcie_header);
-DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8378, quirk_fsl_pcie_header);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, quirk_fsl_pcie_header);
 
+#if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x)
 struct mpc83xx_pcie_priv {
        void __iomem *cfg_type0;
        void __iomem *cfg_type1;
index 19e5015e039be1636aad915214a4f938964eb5a2..265313e8396b0d576871a1a10a58ae23940d4d74 100644 (file)
@@ -41,6 +41,7 @@
 #include <sysdev/fsl_soc.h>
 #include <mm/mmu_decl.h>
 #include <asm/cpm2.h>
+#include <asm/fsl_hcalls.h>    /* For the Freescale hypervisor */
 
 extern void init_fcc_ioports(struct fs_platform_info*);
 extern void init_fec_ioports(struct fs_platform_info*);
@@ -252,3 +253,29 @@ void fsl_rstcr_restart(char *cmd)
 struct platform_diu_data_ops diu_ops;
 EXPORT_SYMBOL(diu_ops);
 #endif
+
+/*
+ * Restart the current partition
+ *
+ * This function should be assigned to the ppc_md.restart function pointer,
+ * to initiate a partition restart when we're running under the Freescale
+ * hypervisor.
+ */
+void fsl_hv_restart(char *cmd)
+{
+       pr_info("hv restart\n");
+       fh_partition_restart(-1);
+}
+
+/*
+ * Halt the current partition
+ *
+ * This function should be assigned to the ppc_md.power_off and ppc_md.halt
+ * function pointers, to shut down the partition when we're running under
+ * the Freescale hypervisor.
+ */
+void fsl_hv_halt(void)
+{
+       pr_info("hv exit\n");
+       fh_partition_stop(-1);
+}
index 53609489a62b844fd1d3dd445051dc4653d5db5e..2ece02beb8ffed1a0828877d02adf251d779ed96 100644 (file)
@@ -36,5 +36,8 @@ struct platform_diu_data_ops {
 extern struct platform_diu_data_ops diu_ops;
 #endif
 
+void fsl_hv_restart(char *cmd);
+void fsl_hv_halt(void);
+
 #endif
 #endif
index 58d7a534f877662c7d31078535778680e66c53d7..d5d3ff3d757e6085d146ce1fb020e254fe331db1 100644 (file)
@@ -598,42 +598,6 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic)
 
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
-#ifdef CONFIG_SMP
-static int irq_choose_cpu(const struct cpumask *mask)
-{
-       int cpuid;
-
-       if (cpumask_equal(mask, cpu_all_mask)) {
-               static int irq_rover = 0;
-               static DEFINE_RAW_SPINLOCK(irq_rover_lock);
-               unsigned long flags;
-
-               /* Round-robin distribution... */
-       do_round_robin:
-               raw_spin_lock_irqsave(&irq_rover_lock, flags);
-
-               irq_rover = cpumask_next(irq_rover, cpu_online_mask);
-               if (irq_rover >= nr_cpu_ids)
-                       irq_rover = cpumask_first(cpu_online_mask);
-
-               cpuid = irq_rover;
-
-               raw_spin_unlock_irqrestore(&irq_rover_lock, flags);
-       } else {
-               cpuid = cpumask_first_and(mask, cpu_online_mask);
-               if (cpuid >= nr_cpu_ids)
-                       goto do_round_robin;
-       }
-
-       return get_hard_smp_processor_id(cpuid);
-}
-#else
-static int irq_choose_cpu(const struct cpumask *mask)
-{
-       return hard_smp_processor_id();
-}
-#endif
-
 /* Find an mpic associated with a given linux interrupt */
 static struct mpic *mpic_find(unsigned int irq)
 {
@@ -849,7 +813,7 @@ static void mpic_unmask_tm(struct irq_data *d)
        struct mpic *mpic = mpic_from_irq_data(d);
        unsigned int src = virq_to_hw(d->irq) - mpic->timer_vecs[0];
 
-       DBG("%s: enable_tm: %d (tm %d)\n", mpic->name, irq, src);
+       DBG("%s: enable_tm: %d (tm %d)\n", mpic->name, d->irq, src);
        mpic_tm_write(src, mpic_tm_read(src) & ~MPIC_VECPRI_MASK);
        mpic_tm_read(src);
 }
index deda60a7f99641646ae83f0221508d93b51273e1..2ec4f3bb8160b09a202461a6e67711ea15bc7c0d 100644 (file)
@@ -650,12 +650,74 @@ struct ppc4xx_pciex_hwops
        int (*core_init)(struct device_node *np);
        int (*port_init_hw)(struct ppc4xx_pciex_port *port);
        int (*setup_utl)(struct ppc4xx_pciex_port *port);
+       void (*check_link)(struct ppc4xx_pciex_port *port);
 };
 
 static struct ppc4xx_pciex_hwops *ppc4xx_pciex_hwops;
 
 #ifdef CONFIG_44x
 
+static int __init ppc4xx_pciex_wait_on_sdr(struct ppc4xx_pciex_port *port,
+                                          unsigned int sdr_offset,
+                                          unsigned int mask,
+                                          unsigned int value,
+                                          int timeout_ms)
+{
+       u32 val;
+
+       while(timeout_ms--) {
+               val = mfdcri(SDR0, port->sdr_base + sdr_offset);
+               if ((val & mask) == value) {
+                       pr_debug("PCIE%d: Wait on SDR %x success with tm %d (%08x)\n",
+                                port->index, sdr_offset, timeout_ms, val);
+                       return 0;
+               }
+               msleep(1);
+       }
+       return -1;
+}
+
+static int __init ppc4xx_pciex_port_reset_sdr(struct ppc4xx_pciex_port *port)
+{
+       /* Wait for reset to complete */
+       if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS, 1 << 20, 0, 10)) {
+               printk(KERN_WARNING "PCIE%d: PGRST failed\n",
+                      port->index);
+               return -1;
+       }
+       return 0;
+}
+
+static void __init ppc4xx_pciex_check_link_sdr(struct ppc4xx_pciex_port *port)
+{
+       printk(KERN_INFO "PCIE%d: Checking link...\n", port->index);
+
+       /* Check for card presence detect if supported, if not, just wait for
+        * link unconditionally.
+        *
+        * note that we don't fail if there is no link, we just filter out
+        * config space accesses. That way, it will be easier to implement
+        * hotplug later on.
+        */
+       if (!port->has_ibpre ||
+           !ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
+                                     1 << 28, 1 << 28, 100)) {
+               printk(KERN_INFO
+                      "PCIE%d: Device detected, waiting for link...\n",
+                      port->index);
+               if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
+                                            0x1000, 0x1000, 2000))
+                       printk(KERN_WARNING
+                              "PCIE%d: Link up failed\n", port->index);
+               else {
+                       printk(KERN_INFO
+                              "PCIE%d: link is up !\n", port->index);
+                       port->link = 1;
+               }
+       } else
+               printk(KERN_INFO "PCIE%d: No device detected.\n", port->index);
+}
+
 /* Check various reset bits of the 440SPe PCIe core */
 static int __init ppc440spe_pciex_check_reset(struct device_node *np)
 {
@@ -806,7 +868,7 @@ static int ppc440spe_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
        dcri_clrset(SDR0, port->sdr_base + PESDRn_RCSSET,
                        (1 << 24) | (1 << 16), 1 << 12);
 
-       return 0;
+       return ppc4xx_pciex_port_reset_sdr(port);
 }
 
 static int ppc440speA_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
@@ -856,6 +918,7 @@ static struct ppc4xx_pciex_hwops ppc440speA_pcie_hwops __initdata =
        .core_init      = ppc440spe_pciex_core_init,
        .port_init_hw   = ppc440speA_pciex_init_port_hw,
        .setup_utl      = ppc440speA_pciex_init_utl,
+       .check_link     = ppc4xx_pciex_check_link_sdr,
 };
 
 static struct ppc4xx_pciex_hwops ppc440speB_pcie_hwops __initdata =
@@ -863,6 +926,7 @@ static struct ppc4xx_pciex_hwops ppc440speB_pcie_hwops __initdata =
        .core_init      = ppc440spe_pciex_core_init,
        .port_init_hw   = ppc440speB_pciex_init_port_hw,
        .setup_utl      = ppc440speB_pciex_init_utl,
+       .check_link     = ppc4xx_pciex_check_link_sdr,
 };
 
 static int __init ppc460ex_pciex_core_init(struct device_node *np)
@@ -944,7 +1008,7 @@ static int ppc460ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
 
        port->has_ibpre = 1;
 
-       return 0;
+       return ppc4xx_pciex_port_reset_sdr(port);
 }
 
 static int ppc460ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
@@ -972,6 +1036,7 @@ static struct ppc4xx_pciex_hwops ppc460ex_pcie_hwops __initdata =
        .core_init      = ppc460ex_pciex_core_init,
        .port_init_hw   = ppc460ex_pciex_init_port_hw,
        .setup_utl      = ppc460ex_pciex_init_utl,
+       .check_link     = ppc4xx_pciex_check_link_sdr,
 };
 
 static int __init ppc460sx_pciex_core_init(struct device_node *np)
@@ -1075,7 +1140,7 @@ static int ppc460sx_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
 
        port->has_ibpre = 1;
 
-       return 0;
+       return ppc4xx_pciex_port_reset_sdr(port);
 }
 
 static int ppc460sx_pciex_init_utl(struct ppc4xx_pciex_port *port)
@@ -1089,6 +1154,7 @@ static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {
        .core_init      = ppc460sx_pciex_core_init,
        .port_init_hw   = ppc460sx_pciex_init_port_hw,
        .setup_utl      = ppc460sx_pciex_init_utl,
+       .check_link     = ppc4xx_pciex_check_link_sdr,
 };
 
 #endif /* CONFIG_44x */
@@ -1154,7 +1220,7 @@ static int ppc405ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
 
        port->has_ibpre = 1;
 
-       return 0;
+       return ppc4xx_pciex_port_reset_sdr(port);
 }
 
 static int ppc405ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
@@ -1183,11 +1249,11 @@ static struct ppc4xx_pciex_hwops ppc405ex_pcie_hwops __initdata =
        .core_init      = ppc405ex_pciex_core_init,
        .port_init_hw   = ppc405ex_pciex_init_port_hw,
        .setup_utl      = ppc405ex_pciex_init_utl,
+       .check_link     = ppc4xx_pciex_check_link_sdr,
 };
 
 #endif /* CONFIG_40x */
 
-
 /* Check that the core has been initied and if not, do it */
 static int __init ppc4xx_pciex_check_core_init(struct device_node *np)
 {
@@ -1261,26 +1327,6 @@ static void __init ppc4xx_pciex_port_init_mapping(struct ppc4xx_pciex_port *port
        dcr_write(port->dcrs, DCRO_PEGPL_MSGMSK, 0);
 }
 
-static int __init ppc4xx_pciex_wait_on_sdr(struct ppc4xx_pciex_port *port,
-                                          unsigned int sdr_offset,
-                                          unsigned int mask,
-                                          unsigned int value,
-                                          int timeout_ms)
-{
-       u32 val;
-
-       while(timeout_ms--) {
-               val = mfdcri(SDR0, port->sdr_base + sdr_offset);
-               if ((val & mask) == value) {
-                       pr_debug("PCIE%d: Wait on SDR %x success with tm %d (%08x)\n",
-                                port->index, sdr_offset, timeout_ms, val);
-                       return 0;
-               }
-               msleep(1);
-       }
-       return -1;
-}
-
 static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
 {
        int rc = 0;
@@ -1291,40 +1337,8 @@ static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
        if (rc != 0)
                return rc;
 
-       printk(KERN_INFO "PCIE%d: Checking link...\n",
-              port->index);
-
-       /* Wait for reset to complete */
-       if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS, 1 << 20, 0, 10)) {
-               printk(KERN_WARNING "PCIE%d: PGRST failed\n",
-                      port->index);
-               return -1;
-       }
-
-       /* Check for card presence detect if supported, if not, just wait for
-        * link unconditionally.
-        *
-        * note that we don't fail if there is no link, we just filter out
-        * config space accesses. That way, it will be easier to implement
-        * hotplug later on.
-        */
-       if (!port->has_ibpre ||
-           !ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-                                     1 << 28, 1 << 28, 100)) {
-               printk(KERN_INFO
-                      "PCIE%d: Device detected, waiting for link...\n",
-                      port->index);
-               if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-                                            0x1000, 0x1000, 2000))
-                       printk(KERN_WARNING
-                              "PCIE%d: Link up failed\n", port->index);
-               else {
-                       printk(KERN_INFO
-                              "PCIE%d: link is up !\n", port->index);
-                       port->link = 1;
-               }
-       } else
-               printk(KERN_INFO "PCIE%d: No device detected.\n", port->index);
+       if (ppc4xx_pciex_hwops->check_link)
+               ppc4xx_pciex_hwops->check_link(port);
 
        /*
         * Initialize mapping: disable all regions and configure
@@ -1347,14 +1361,17 @@ static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
        /*
         * Check for VC0 active and assert RDY.
         */
-       if (port->link &&
-           ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS,
-                                    1 << 16, 1 << 16, 5000)) {
-               printk(KERN_INFO "PCIE%d: VC0 not active\n", port->index);
-               port->link = 0;
+       if (port->sdr_base) {
+               if (port->link &&
+                   ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS,
+                                            1 << 16, 1 << 16, 5000)) {
+                       printk(KERN_INFO "PCIE%d: VC0 not active\n", port->index);
+                       port->link = 0;
+               }
+
+               dcri_clrset(SDR0, port->sdr_base + PESDRn_RCSSET, 0, 1 << 20);
        }
 
-       dcri_clrset(SDR0, port->sdr_base + PESDRn_RCSSET, 0, 1 << 20);
        msleep(100);
 
        return 0;
index 9e7a4f5b5c2ee6f2b11c026d09e3c40c10a887aa..95b9e7eefadc9b5b14493977524139d29bb16f61 100644 (file)
@@ -128,4 +128,6 @@ source "drivers/clocksource/Kconfig"
 
 source "drivers/iommu/Kconfig"
 
+source "drivers/virt/Kconfig"
+
 endmenu
index 939fcdeb2d31a02f77ec7b5cecbd4cb0921da370..7fa433a7030c4e00d300e000702ce7775dbc74b2 100644 (file)
@@ -124,3 +124,6 @@ obj-y                               += clk/
 obj-$(CONFIG_HWSPINLOCK)       += hwspinlock/
 obj-$(CONFIG_NFC)              += nfc/
 obj-$(CONFIG_IOMMU_SUPPORT)    += iommu/
+
+# Virtualization drivers
+obj-$(CONFIG_VIRT_DRIVERS)     += virt/
index 6040717b62bb4bfc521f76756f3bdba7145d11da..0cad9c7f6bb50f68bdb0a371e44d51530a02ec06 100644 (file)
@@ -31,6 +31,25 @@ struct device platform_bus = {
 };
 EXPORT_SYMBOL_GPL(platform_bus);
 
+/**
+ * arch_setup_pdev_archdata - Allow manipulation of archdata before its used
+ * @dev: platform device
+ *
+ * This is called before platform_device_add() such that any pdev_archdata may
+ * be setup before the platform_notifier is called.  So if a user needs to
+ * manipulate any relevant information in the pdev_archdata they can do:
+ *
+ *     platform_devic_alloc()
+ *     ... manipulate ...
+ *     platform_device_add()
+ *
+ * And if they don't care they can just call platform_device_register() and
+ * everything will just work out.
+ */
+void __weak arch_setup_pdev_archdata(struct platform_device *pdev)
+{
+}
+
 /**
  * platform_get_resource - get a resource for a device
  * @dev: platform device
@@ -173,6 +192,7 @@ struct platform_device *platform_device_alloc(const char *name, int id)
                pa->pdev.id = id;
                device_initialize(&pa->pdev.dev);
                pa->pdev.dev.release = platform_device_release;
+               arch_setup_pdev_archdata(&pa->pdev);
        }
 
        return pa ? &pa->pdev : NULL;
@@ -334,6 +354,7 @@ EXPORT_SYMBOL_GPL(platform_device_del);
 int platform_device_register(struct platform_device *pdev)
 {
        device_initialize(&pdev->dev);
+       arch_setup_pdev_archdata(pdev);
        return platform_device_add(pdev);
 }
 EXPORT_SYMBOL_GPL(platform_device_register);
index e898215b88af90df9bf77332b7bb08270bbbf1da..e24a2a1b666661aab161c508bc6696bd3fe7979f 100644 (file)
@@ -189,5 +189,10 @@ depends on ARM
 source "drivers/cpufreq/Kconfig.arm"
 endmenu
 
+menu "PowerPC CPU frequency scaling drivers"
+depends on PPC32 || PPC64
+source "drivers/cpufreq/Kconfig.powerpc"
+endmenu
+
 endif
 endmenu
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
new file mode 100644 (file)
index 0000000..e76992f
--- /dev/null
@@ -0,0 +1,7 @@
+config CPU_FREQ_MAPLE
+       bool "Support for Maple 970FX Evaluation Board"
+       depends on PPC_MAPLE
+       select CPU_FREQ_TABLE
+       help
+         This adds support for frequency switching on Maple 970FX
+         Evaluation Board and compatible boards (IBM JS2x blades).
index ab75e573c69f443fcfc68eea1ce4817bbf5b9c8e..a48bc02cd76539219f90ab9b4da5d4a1f7a9bfdf 100644 (file)
@@ -43,3 +43,7 @@ obj-$(CONFIG_UX500_SOC_DB8500)                += db8500-cpufreq.o
 obj-$(CONFIG_ARM_S3C64XX_CPUFREQ)      += s3c64xx-cpufreq.o
 obj-$(CONFIG_ARM_S5PV210_CPUFREQ)      += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_EXYNOS4210_CPUFREQ)   += exynos4210-cpufreq.o
+
+##################################################################################
+# PowerPC platform drivers
+obj-$(CONFIG_CPU_FREQ_MAPLE)           += maple-cpufreq.o
diff --git a/drivers/cpufreq/maple-cpufreq.c b/drivers/cpufreq/maple-cpufreq.c
new file mode 100644 (file)
index 0000000..89b178a
--- /dev/null
@@ -0,0 +1,309 @@
+/*
+ *  Copyright (C) 2011 Dmitry Eremin-Solenikov
+ *  Copyright (C) 2002 - 2005 Benjamin Herrenschmidt <benh@kernel.crashing.org>
+ *  and                       Markus Demleitner <msdemlei@cl.uni-heidelberg.de>
+ *
+ * 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 driver adds basic cpufreq support for SMU & 970FX based G5 Macs,
+ * that is iMac G5 and latest single CPU desktop.
+ */
+
+#undef DEBUG
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/cpufreq.h>
+#include <linux/init.h>
+#include <linux/completion.h>
+#include <linux/mutex.h>
+#include <linux/time.h>
+#include <linux/of.h>
+
+#define DBG(fmt...) pr_debug(fmt)
+
+/* see 970FX user manual */
+
+#define SCOM_PCR 0x0aa001                      /* PCR scom addr */
+
+#define PCR_HILO_SELECT                0x80000000U     /* 1 = PCR, 0 = PCRH */
+#define PCR_SPEED_FULL         0x00000000U     /* 1:1 speed value */
+#define PCR_SPEED_HALF         0x00020000U     /* 1:2 speed value */
+#define PCR_SPEED_QUARTER      0x00040000U     /* 1:4 speed value */
+#define PCR_SPEED_MASK         0x000e0000U     /* speed mask */
+#define PCR_SPEED_SHIFT                17
+#define PCR_FREQ_REQ_VALID     0x00010000U     /* freq request valid */
+#define PCR_VOLT_REQ_VALID     0x00008000U     /* volt request valid */
+#define PCR_TARGET_TIME_MASK   0x00006000U     /* target time */
+#define PCR_STATLAT_MASK       0x00001f00U     /* STATLAT value */
+#define PCR_SNOOPLAT_MASK      0x000000f0U     /* SNOOPLAT value */
+#define PCR_SNOOPACC_MASK      0x0000000fU     /* SNOOPACC value */
+
+#define SCOM_PSR 0x408001                      /* PSR scom addr */
+/* warning: PSR is a 64 bits register */
+#define PSR_CMD_RECEIVED       0x2000000000000000U   /* command received */
+#define PSR_CMD_COMPLETED      0x1000000000000000U   /* command completed */
+#define PSR_CUR_SPEED_MASK     0x0300000000000000U   /* current speed */
+#define PSR_CUR_SPEED_SHIFT    (56)
+
+/*
+ * The G5 only supports two frequencies (Quarter speed is not supported)
+ */
+#define CPUFREQ_HIGH                  0
+#define CPUFREQ_LOW                   1
+
+static struct cpufreq_frequency_table maple_cpu_freqs[] = {
+       {CPUFREQ_HIGH,          0},
+       {CPUFREQ_LOW,           0},
+       {0,                     CPUFREQ_TABLE_END},
+};
+
+static struct freq_attr *maple_cpu_freqs_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
+/* Power mode data is an array of the 32 bits PCR values to use for
+ * the various frequencies, retrieved from the device-tree
+ */
+static int maple_pmode_cur;
+
+static DEFINE_MUTEX(maple_switch_mutex);
+
+static const u32 *maple_pmode_data;
+static int maple_pmode_max;
+
+/*
+ * SCOM based frequency switching for 970FX rev3
+ */
+static int maple_scom_switch_freq(int speed_mode)
+{
+       unsigned long flags;
+       int to;
+
+       local_irq_save(flags);
+
+       /* Clear PCR high */
+       scom970_write(SCOM_PCR, 0);
+       /* Clear PCR low */
+       scom970_write(SCOM_PCR, PCR_HILO_SELECT | 0);
+       /* Set PCR low */
+       scom970_write(SCOM_PCR, PCR_HILO_SELECT |
+                     maple_pmode_data[speed_mode]);
+
+       /* Wait for completion */
+       for (to = 0; to < 10; to++) {
+               unsigned long psr = scom970_read(SCOM_PSR);
+
+               if ((psr & PSR_CMD_RECEIVED) == 0 &&
+                   (((psr >> PSR_CUR_SPEED_SHIFT) ^
+                     (maple_pmode_data[speed_mode] >> PCR_SPEED_SHIFT)) & 0x3)
+                   == 0)
+                       break;
+               if (psr & PSR_CMD_COMPLETED)
+                       break;
+               udelay(100);
+       }
+
+       local_irq_restore(flags);
+
+       maple_pmode_cur = speed_mode;
+       ppc_proc_freq = maple_cpu_freqs[speed_mode].frequency * 1000ul;
+
+       return 0;
+}
+
+static int maple_scom_query_freq(void)
+{
+       unsigned long psr = scom970_read(SCOM_PSR);
+       int i;
+
+       for (i = 0; i <= maple_pmode_max; i++)
+               if ((((psr >> PSR_CUR_SPEED_SHIFT) ^
+                     (maple_pmode_data[i] >> PCR_SPEED_SHIFT)) & 0x3) == 0)
+                       break;
+       return i;
+}
+
+/*
+ * Common interface to the cpufreq core
+ */
+
+static int maple_cpufreq_verify(struct cpufreq_policy *policy)
+{
+       return cpufreq_frequency_table_verify(policy, maple_cpu_freqs);
+}
+
+static int maple_cpufreq_target(struct cpufreq_policy *policy,
+       unsigned int target_freq, unsigned int relation)
+{
+       unsigned int newstate = 0;
+       struct cpufreq_freqs freqs;
+       int rc;
+
+       if (cpufreq_frequency_table_target(policy, maple_cpu_freqs,
+                       target_freq, relation, &newstate))
+               return -EINVAL;
+
+       if (maple_pmode_cur == newstate)
+               return 0;
+
+       mutex_lock(&maple_switch_mutex);
+
+       freqs.old = maple_cpu_freqs[maple_pmode_cur].frequency;
+       freqs.new = maple_cpu_freqs[newstate].frequency;
+       freqs.cpu = 0;
+
+       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+       rc = maple_scom_switch_freq(newstate);
+       cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+
+       mutex_unlock(&maple_switch_mutex);
+
+       return rc;
+}
+
+static unsigned int maple_cpufreq_get_speed(unsigned int cpu)
+{
+       return maple_cpu_freqs[maple_pmode_cur].frequency;
+}
+
+static int maple_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+       policy->cpuinfo.transition_latency = 12000;
+       policy->cur = maple_cpu_freqs[maple_scom_query_freq()].frequency;
+       /* secondary CPUs are tied to the primary one by the
+        * cpufreq core if in the secondary policy we tell it that
+        * it actually must be one policy together with all others. */
+       cpumask_copy(policy->cpus, cpu_online_mask);
+       cpufreq_frequency_table_get_attr(maple_cpu_freqs, policy->cpu);
+
+       return cpufreq_frequency_table_cpuinfo(policy,
+               maple_cpu_freqs);
+}
+
+
+static struct cpufreq_driver maple_cpufreq_driver = {
+       .name           = "maple",
+       .owner          = THIS_MODULE,
+       .flags          = CPUFREQ_CONST_LOOPS,
+       .init           = maple_cpufreq_cpu_init,
+       .verify         = maple_cpufreq_verify,
+       .target         = maple_cpufreq_target,
+       .get            = maple_cpufreq_get_speed,
+       .attr           = maple_cpu_freqs_attr,
+};
+
+static int __init maple_cpufreq_init(void)
+{
+       struct device_node *cpus;
+       struct device_node *cpunode;
+       unsigned int psize;
+       unsigned long max_freq;
+       const u32 *valp;
+       u32 pvr_hi;
+       int rc = -ENODEV;
+
+       /*
+        * Behave here like powermac driver which checks machine compatibility
+        * to ease merging of two drivers in future.
+        */
+       if (!of_machine_is_compatible("Momentum,Maple") &&
+           !of_machine_is_compatible("Momentum,Apache"))
+               return 0;
+
+       cpus = of_find_node_by_path("/cpus");
+       if (cpus == NULL) {
+               DBG("No /cpus node !\n");
+               return -ENODEV;
+       }
+
+       /* Get first CPU node */
+       for (cpunode = NULL;
+            (cpunode = of_get_next_child(cpus, cpunode)) != NULL;) {
+               const u32 *reg = of_get_property(cpunode, "reg", NULL);
+               if (reg == NULL || (*reg) != 0)
+                       continue;
+               if (!strcmp(cpunode->type, "cpu"))
+                       break;
+       }
+       if (cpunode == NULL) {
+               printk(KERN_ERR "cpufreq: Can't find any CPU 0 node\n");
+               goto bail_cpus;
+       }
+
+       /* Check 970FX for now */
+       /* we actually don't care on which CPU to access PVR */
+       pvr_hi = PVR_VER(mfspr(SPRN_PVR));
+       if (pvr_hi != 0x3c && pvr_hi != 0x44) {
+               printk(KERN_ERR "cpufreq: Unsupported CPU version (%x)\n",
+                               pvr_hi);
+               goto bail_noprops;
+       }
+
+       /* Look for the powertune data in the device-tree */
+       /*
+        * On Maple this property is provided by PIBS in dual-processor config,
+        * not provided by PIBS in CPU0 config and also not provided by SLOF,
+        * so YMMV
+        */
+       maple_pmode_data = of_get_property(cpunode, "power-mode-data", &psize);
+       if (!maple_pmode_data) {
+               DBG("No power-mode-data !\n");
+               goto bail_noprops;
+       }
+       maple_pmode_max = psize / sizeof(u32) - 1;
+
+       /*
+        * From what I see, clock-frequency is always the maximal frequency.
+        * The current driver can not slew sysclk yet, so we really only deal
+        * with powertune steps for now. We also only implement full freq and
+        * half freq in this version. So far, I haven't yet seen a machine
+        * supporting anything else.
+        */
+       valp = of_get_property(cpunode, "clock-frequency", NULL);
+       if (!valp)
+               return -ENODEV;
+       max_freq = (*valp)/1000;
+       maple_cpu_freqs[0].frequency = max_freq;
+       maple_cpu_freqs[1].frequency = max_freq/2;
+
+       /* Force apply current frequency to make sure everything is in
+        * sync (voltage is right for example). Firmware may leave us with
+        * a strange setting ...
+        */
+       msleep(10);
+       maple_pmode_cur = -1;
+       maple_scom_switch_freq(maple_scom_query_freq());
+
+       printk(KERN_INFO "Registering Maple CPU frequency driver\n");
+       printk(KERN_INFO "Low: %d Mhz, High: %d Mhz, Cur: %d MHz\n",
+               maple_cpu_freqs[1].frequency/1000,
+               maple_cpu_freqs[0].frequency/1000,
+               maple_cpu_freqs[maple_pmode_cur].frequency/1000);
+
+       rc = cpufreq_register_driver(&maple_cpufreq_driver);
+
+       of_node_put(cpunode);
+       of_node_put(cpus);
+
+       return rc;
+
+bail_noprops:
+       of_node_put(cpunode);
+bail_cpus:
+       of_node_put(cpus);
+
+       return rc;
+}
+
+module_init(maple_cpufreq_init);
+
+
+MODULE_LICENSE("GPL");
index e75af391e286889d66c8bc54c61eba325a4986c3..ed5a6d3c26aaf66b33850c7298d80f57b1f147e7 100644 (file)
@@ -162,7 +162,7 @@ struct platform_device *of_device_alloc(struct device_node *np,
        }
 
        dev->dev.of_node = of_node_get(np);
-#if defined(CONFIG_PPC) || defined(CONFIG_MICROBLAZE)
+#if defined(CONFIG_MICROBLAZE)
        dev->dev.dma_mask = &dev->archdata.dma_mask;
 #endif
        dev->dev.parent = parent;
@@ -201,7 +201,7 @@ struct platform_device *of_platform_device_create_pdata(
        if (!dev)
                return NULL;
 
-#if defined(CONFIG_PPC) || defined(CONFIG_MICROBLAZE)
+#if defined(CONFIG_MICROBLAZE)
        dev->archdata.dma_mask = 0xffffffffUL;
 #endif
        dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
index 6f2c9809f1fbdc1dadf08df0b912412e9ef5d822..e371753ba921d24f33622172a497b1d115b315c6 100644 (file)
@@ -19,6 +19,11 @@ config HVC_CONSOLE
          console. This driver allows each pSeries partition to have a console
          which is accessed via the HMC.
 
+config HVC_OLD_HVSI
+       bool "Old driver for pSeries serial port (/dev/hvsi*)"
+       depends on HVC_CONSOLE
+       default n
+
 config HVC_ISERIES
        bool "iSeries Hypervisor Virtual Console support"
        depends on PPC_ISERIES
index 40a25d93fe52c830cfd4f344b1b22e2aaa5c557c..e29205316376394db8dfc7f2f340c65433daddee 100644 (file)
@@ -1,4 +1,5 @@
-obj-$(CONFIG_HVC_CONSOLE)      += hvc_vio.o hvsi.o
+obj-$(CONFIG_HVC_CONSOLE)      += hvc_vio.o hvsi_lib.o
+obj-$(CONFIG_HVC_OLD_HVSI)     += hvsi.o
 obj-$(CONFIG_HVC_ISERIES)      += hvc_iseries.o
 obj-$(CONFIG_HVC_RTAS)         += hvc_rtas.o
 obj-$(CONFIG_HVC_TILE)         += hvc_tile.o
index e9cba13ee800672275f40e7722b6e5b87b73c278..e1aaf4f309b3c2730dd435642bfa68cc4c6ad85b 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/delay.h>
 #include <linux/freezer.h>
 #include <linux/slab.h>
+#include <linux/serial_core.h>
 
 #include <asm/uaccess.h>
 
@@ -163,8 +164,10 @@ static void hvc_console_print(struct console *co, const char *b,
                } else {
                        r = cons_ops[index]->put_chars(vtermnos[index], c, i);
                        if (r <= 0) {
-                               /* throw away chars on error */
-                               i = 0;
+                               /* throw away characters on error
+                                * but spin in case of -EAGAIN */
+                               if (r != -EAGAIN)
+                                       i = 0;
                        } else if (r > 0) {
                                i -= r;
                                if (i > 0)
@@ -184,7 +187,7 @@ static struct tty_driver *hvc_console_device(struct console *c, int *index)
 }
 
 static int __init hvc_console_setup(struct console *co, char *options)
-{
+{      
        if (co->index < 0 || co->index >= MAX_NR_HVC_CONSOLES)
                return -ENODEV;
 
@@ -448,7 +451,7 @@ static int hvc_push(struct hvc_struct *hp)
 
        n = hp->ops->put_chars(hp->vtermno, hp->outbuf, hp->n_outbuf);
        if (n <= 0) {
-               if (n == 0) {
+               if (n == 0 || n == -EAGAIN) {
                        hp->do_wakeup = 1;
                        return 0;
                }
@@ -745,6 +748,58 @@ static int khvcd(void *unused)
        return 0;
 }
 
+static int hvc_tiocmget(struct tty_struct *tty)
+{
+       struct hvc_struct *hp = tty->driver_data;
+
+       if (!hp || !hp->ops->tiocmget)
+               return -EINVAL;
+       return hp->ops->tiocmget(hp);
+}
+
+static int hvc_tiocmset(struct tty_struct *tty,
+                       unsigned int set, unsigned int clear)
+{
+       struct hvc_struct *hp = tty->driver_data;
+
+       if (!hp || !hp->ops->tiocmset)
+               return -EINVAL;
+       return hp->ops->tiocmset(hp, set, clear);
+}
+
+#ifdef CONFIG_CONSOLE_POLL
+int hvc_poll_init(struct tty_driver *driver, int line, char *options)
+{
+       return 0;
+}
+
+static int hvc_poll_get_char(struct tty_driver *driver, int line)
+{
+       struct tty_struct *tty = driver->ttys[0];
+       struct hvc_struct *hp = tty->driver_data;
+       int n;
+       char ch;
+
+       n = hp->ops->get_chars(hp->vtermno, &ch, 1);
+
+       if (n == 0)
+               return NO_POLL_CHAR;
+
+       return ch;
+}
+
+static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch)
+{
+       struct tty_struct *tty = driver->ttys[0];
+       struct hvc_struct *hp = tty->driver_data;
+       int n;
+
+       do {
+               n = hp->ops->put_chars(hp->vtermno, &ch, 1);
+       } while (n <= 0);
+}
+#endif
+
 static const struct tty_operations hvc_ops = {
        .open = hvc_open,
        .close = hvc_close,
@@ -753,6 +808,13 @@ static const struct tty_operations hvc_ops = {
        .unthrottle = hvc_unthrottle,
        .write_room = hvc_write_room,
        .chars_in_buffer = hvc_chars_in_buffer,
+       .tiocmget = hvc_tiocmget,
+       .tiocmset = hvc_tiocmset,
+#ifdef CONFIG_CONSOLE_POLL
+       .poll_init = hvc_poll_init,
+       .poll_get_char = hvc_poll_get_char,
+       .poll_put_char = hvc_poll_put_char,
+#endif
 };
 
 struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
index 54381eba4e4ae753ae6d7ff9d116ed82b7fbe979..c335a1492a54a0a73906feaea74c9bbf78fa3c14 100644 (file)
@@ -73,6 +73,10 @@ struct hv_ops {
        int (*notifier_add)(struct hvc_struct *hp, int irq);
        void (*notifier_del)(struct hvc_struct *hp, int irq);
        void (*notifier_hangup)(struct hvc_struct *hp, int irq);
+
+       /* tiocmget/set implementation */
+       int (*tiocmget)(struct hvc_struct *hp);
+       int (*tiocmset)(struct hvc_struct *hp, unsigned int set, unsigned int clear);
 };
 
 /* Register a vterm and a slot index for use as a console (console_init) */
index e6eea1485244b6e4e52a845f48522b6f8e5f7599..130aace67f3103c2e8bb6209de58d6ee65c031a0 100644 (file)
  * 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
+ *
+ * TODO:
+ *
+ *   - handle error in sending hvsi protocol packets
+ *   - retry nego on subsequent sends ?
  */
 
+#undef DEBUG
+
 #include <linux/types.h>
 #include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/console.h>
 
 #include <asm/hvconsole.h>
 #include <asm/vio.h>
 #include <asm/prom.h>
 #include <asm/firmware.h>
+#include <asm/hvsi.h>
+#include <asm/udbg.h>
 
 #include "hvc_console.h"
 
@@ -43,59 +55,236 @@ static const char hvc_driver_name[] = "hvc_console";
 
 static struct vio_device_id hvc_driver_table[] __devinitdata = {
        {"serial", "hvterm1"},
+#ifndef HVC_OLD_HVSI
+       {"serial", "hvterm-protocol"},
+#endif
        { "", "" }
 };
 MODULE_DEVICE_TABLE(vio, hvc_driver_table);
 
-static int filtered_get_chars(uint32_t vtermno, char *buf, int count)
+typedef enum hv_protocol {
+       HV_PROTOCOL_RAW,
+       HV_PROTOCOL_HVSI
+} hv_protocol_t;
+
+struct hvterm_priv {
+       u32                     termno; /* HV term number */
+       hv_protocol_t           proto;  /* Raw data or HVSI packets */
+       struct hvsi_priv        hvsi;   /* HVSI specific data */
+       spinlock_t              buf_lock;
+       char                    buf[SIZE_VIO_GET_CHARS];
+       int                     left;
+       int                     offset;
+};
+static struct hvterm_priv *hvterm_privs[MAX_NR_HVC_CONSOLES];
+/* For early boot console */
+static struct hvterm_priv hvterm_priv0;
+
+static int hvterm_raw_get_chars(uint32_t vtermno, char *buf, int count)
 {
-       unsigned long got;
-       int i;
+       struct hvterm_priv *pv = hvterm_privs[vtermno];
+       unsigned long i;
+       unsigned long flags;
+       int got;
 
-       /*
-        * Vio firmware will read up to SIZE_VIO_GET_CHARS at its own discretion
-        * so we play safe and avoid the situation where got > count which could
-        * overload the flip buffer.
-        */
-       if (count < SIZE_VIO_GET_CHARS)
-               return -EAGAIN;
+       if (WARN_ON(!pv))
+               return 0;
 
-       got = hvc_get_chars(vtermno, buf, count);
+       spin_lock_irqsave(&pv->buf_lock, flags);
 
-       /*
-        * Work around a HV bug where it gives us a null
-        * after every \r.  -- paulus
-        */
-       for (i = 1; i < got; ++i) {
-               if (buf[i] == 0 && buf[i-1] == '\r') {
-                       --got;
-                       if (i < got)
-                               memmove(&buf[i], &buf[i+1],
-                                       got - i);
+       if (pv->left == 0) {
+               pv->offset = 0;
+               pv->left = hvc_get_chars(pv->termno, pv->buf, count);
+
+               /*
+                * Work around a HV bug where it gives us a null
+                * after every \r.  -- paulus
+                */
+               for (i = 1; i < pv->left; ++i) {
+                       if (pv->buf[i] == 0 && pv->buf[i-1] == '\r') {
+                               --pv->left;
+                               if (i < pv->left) {
+                                       memmove(&pv->buf[i], &pv->buf[i+1],
+                                               pv->left - i);
+                               }
+                       }
                }
        }
+
+       got = min(count, pv->left);
+       memcpy(buf, &pv->buf[pv->offset], got);
+       pv->offset += got;
+       pv->left -= got;
+
+       spin_unlock_irqrestore(&pv->buf_lock, flags);
+
        return got;
 }
 
-static const struct hv_ops hvc_get_put_ops = {
-       .get_chars = filtered_get_chars,
-       .put_chars = hvc_put_chars,
+static int hvterm_raw_put_chars(uint32_t vtermno, const char *buf, int count)
+{
+       struct hvterm_priv *pv = hvterm_privs[vtermno];
+
+       if (WARN_ON(!pv))
+               return 0;
+
+       return hvc_put_chars(pv->termno, buf, count);
+}
+
+static const struct hv_ops hvterm_raw_ops = {
+       .get_chars = hvterm_raw_get_chars,
+       .put_chars = hvterm_raw_put_chars,
        .notifier_add = notifier_add_irq,
        .notifier_del = notifier_del_irq,
        .notifier_hangup = notifier_hangup_irq,
 };
 
+static int hvterm_hvsi_get_chars(uint32_t vtermno, char *buf, int count)
+{
+       struct hvterm_priv *pv = hvterm_privs[vtermno];
+
+       if (WARN_ON(!pv))
+               return 0;
+
+       return hvsilib_get_chars(&pv->hvsi, buf, count);
+}
+
+static int hvterm_hvsi_put_chars(uint32_t vtermno, const char *buf, int count)
+{
+       struct hvterm_priv *pv = hvterm_privs[vtermno];
+
+       if (WARN_ON(!pv))
+               return 0;
+
+       return hvsilib_put_chars(&pv->hvsi, buf, count);
+}
+
+static int hvterm_hvsi_open(struct hvc_struct *hp, int data)
+{
+       struct hvterm_priv *pv = hvterm_privs[hp->vtermno];
+       int rc;
+
+       pr_devel("HVSI@%x: open !\n", pv->termno);
+
+       rc = notifier_add_irq(hp, data);
+       if (rc)
+               return rc;
+
+       return hvsilib_open(&pv->hvsi, hp);
+}
+
+static void hvterm_hvsi_close(struct hvc_struct *hp, int data)
+{
+       struct hvterm_priv *pv = hvterm_privs[hp->vtermno];
+
+       pr_devel("HVSI@%x: do close !\n", pv->termno);
+
+       hvsilib_close(&pv->hvsi, hp);
+
+       notifier_del_irq(hp, data);
+}
+
+void hvterm_hvsi_hangup(struct hvc_struct *hp, int data)
+{
+       struct hvterm_priv *pv = hvterm_privs[hp->vtermno];
+
+       pr_devel("HVSI@%x: do hangup !\n", pv->termno);
+
+       hvsilib_close(&pv->hvsi, hp);
+
+       notifier_hangup_irq(hp, data);
+}
+
+static int hvterm_hvsi_tiocmget(struct hvc_struct *hp)
+{
+       struct hvterm_priv *pv = hvterm_privs[hp->vtermno];
+
+       if (!pv)
+               return -EINVAL;
+       return pv->hvsi.mctrl;
+}
+
+static int hvterm_hvsi_tiocmset(struct hvc_struct *hp, unsigned int set,
+                               unsigned int clear)
+{
+       struct hvterm_priv *pv = hvterm_privs[hp->vtermno];
+
+       pr_devel("HVSI@%x: Set modem control, set=%x,clr=%x\n",
+                pv->termno, set, clear);
+
+       if (set & TIOCM_DTR)
+               hvsilib_write_mctrl(&pv->hvsi, 1);
+       else if (clear & TIOCM_DTR)
+               hvsilib_write_mctrl(&pv->hvsi, 0);
+
+       return 0;
+}
+
+static const struct hv_ops hvterm_hvsi_ops = {
+       .get_chars = hvterm_hvsi_get_chars,
+       .put_chars = hvterm_hvsi_put_chars,
+       .notifier_add = hvterm_hvsi_open,
+       .notifier_del = hvterm_hvsi_close,
+       .notifier_hangup = hvterm_hvsi_hangup,
+       .tiocmget = hvterm_hvsi_tiocmget,
+       .tiocmset = hvterm_hvsi_tiocmset,
+};
+
 static int __devinit hvc_vio_probe(struct vio_dev *vdev,
-                               const struct vio_device_id *id)
+                                  const struct vio_device_id *id)
 {
+       const struct hv_ops *ops;
        struct hvc_struct *hp;
+       struct hvterm_priv *pv;
+       hv_protocol_t proto;
+       int i, termno = -1;
 
        /* probed with invalid parameters. */
        if (!vdev || !id)
                return -EPERM;
 
-       hp = hvc_alloc(vdev->unit_address, vdev->irq, &hvc_get_put_ops,
-                       MAX_VIO_PUT_CHARS);
+       if (of_device_is_compatible(vdev->dev.of_node, "hvterm1")) {
+               proto = HV_PROTOCOL_RAW;
+               ops = &hvterm_raw_ops;
+       } else if (of_device_is_compatible(vdev->dev.of_node, "hvterm-protocol")) {
+               proto = HV_PROTOCOL_HVSI;
+               ops = &hvterm_hvsi_ops;
+       } else {
+               pr_err("hvc_vio: Unkown protocol for %s\n", vdev->dev.of_node->full_name);
+               return -ENXIO;
+       }
+
+       pr_devel("hvc_vio_probe() device %s, using %s protocol\n",
+                vdev->dev.of_node->full_name,
+                proto == HV_PROTOCOL_RAW ? "raw" : "hvsi");
+
+       /* Is it our boot one ? */
+       if (hvterm_privs[0] == &hvterm_priv0 &&
+           vdev->unit_address == hvterm_priv0.termno) {
+               pv = hvterm_privs[0];
+               termno = 0;
+               pr_devel("->boot console, using termno 0\n");
+       }
+       /* nope, allocate a new one */
+       else {
+               for (i = 0; i < MAX_NR_HVC_CONSOLES && termno < 0; i++)
+                       if (!hvterm_privs[i])
+                               termno = i;
+               pr_devel("->non-boot console, using termno %d\n", termno);
+               if (termno < 0)
+                       return -ENODEV;
+               pv = kzalloc(sizeof(struct hvterm_priv), GFP_KERNEL);
+               if (!pv)
+                       return -ENOMEM;
+               pv->termno = vdev->unit_address;
+               pv->proto = proto;
+               spin_lock_init(&pv->buf_lock);
+               hvterm_privs[termno] = pv;
+               hvsilib_init(&pv->hvsi, hvc_get_chars, hvc_put_chars,
+                            pv->termno, 0);
+       }
+
+       hp = hvc_alloc(termno, vdev->irq, ops, MAX_VIO_PUT_CHARS);
        if (IS_ERR(hp))
                return PTR_ERR(hp);
        dev_set_drvdata(&vdev->dev, hp);
@@ -106,8 +295,16 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev,
 static int __devexit hvc_vio_remove(struct vio_dev *vdev)
 {
        struct hvc_struct *hp = dev_get_drvdata(&vdev->dev);
+       int rc, termno;
 
-       return hvc_remove(hp);
+       termno = hp->vtermno;
+       rc = hvc_remove(hp);
+       if (rc == 0) {
+               if (hvterm_privs[termno] != &hvterm_priv0)
+                       kfree(hvterm_privs[termno]);
+               hvterm_privs[termno] = NULL;
+       }
+       return rc;
 }
 
 static struct vio_driver hvc_vio_driver = {
@@ -140,34 +337,149 @@ static void __exit hvc_vio_exit(void)
 }
 module_exit(hvc_vio_exit);
 
-/* the device tree order defines our numbering */
-static int hvc_find_vtys(void)
+static void udbg_hvc_putc(char c)
 {
-       struct device_node *vty;
-       int num_found = 0;
+       int count = -1;
 
-       for (vty = of_find_node_by_name(NULL, "vty"); vty != NULL;
-                       vty = of_find_node_by_name(vty, "vty")) {
-               const uint32_t *vtermno;
+       if (c == '\n')
+               udbg_hvc_putc('\r');
 
-               /* We have statically defined space for only a certain number
-                * of console adapters.
-                */
-               if (num_found >= MAX_NR_HVC_CONSOLES) {
-                       of_node_put(vty);
+       do {
+               switch(hvterm_priv0.proto) {
+               case HV_PROTOCOL_RAW:
+                       count = hvterm_raw_put_chars(0, &c, 1);
+                       break;
+               case HV_PROTOCOL_HVSI:
+                       count = hvterm_hvsi_put_chars(0, &c, 1);
                        break;
                }
+       } while(count == 0);
+}
+
+static int udbg_hvc_getc_poll(void)
+{
+       int rc = 0;
+       char c;
 
-               vtermno = of_get_property(vty, "reg", NULL);
-               if (!vtermno)
-                       continue;
+       switch(hvterm_priv0.proto) {
+       case HV_PROTOCOL_RAW:
+               rc = hvterm_raw_get_chars(0, &c, 1);
+               break;
+       case HV_PROTOCOL_HVSI:
+               rc = hvterm_hvsi_get_chars(0, &c, 1);
+               break;
+       }
+       if (!rc)
+               return -1;
+       return c;
+}
 
-               if (of_device_is_compatible(vty, "hvterm1")) {
-                       hvc_instantiate(*vtermno, num_found, &hvc_get_put_ops);
-                       ++num_found;
+static int udbg_hvc_getc(void)
+{
+       int ch;
+       for (;;) {
+               ch = udbg_hvc_getc_poll();
+               if (ch == -1) {
+                       /* This shouldn't be needed...but... */
+                       volatile unsigned long delay;
+                       for (delay=0; delay < 2000000; delay++)
+                               ;
+               } else {
+                       return ch;
                }
        }
+}
+
+void __init hvc_vio_init_early(void)
+{
+       struct device_node *stdout_node;
+       const u32 *termno;
+       const char *name;
+       const struct hv_ops *ops;
+
+       /* find the boot console from /chosen/stdout */
+       if (!of_chosen)
+               return;
+       name = of_get_property(of_chosen, "linux,stdout-path", NULL);
+       if (name == NULL)
+               return;
+       stdout_node = of_find_node_by_path(name);
+       if (!stdout_node)
+               return;
+       name = of_get_property(stdout_node, "name", NULL);
+       if (!name) {
+               printk(KERN_WARNING "stdout node missing 'name' property!\n");
+               goto out;
+       }
+
+       /* Check if it's a virtual terminal */
+       if (strncmp(name, "vty", 3) != 0)
+               goto out;
+       termno = of_get_property(stdout_node, "reg", NULL);
+       if (termno == NULL)
+               goto out;
+       hvterm_priv0.termno = *termno;
+       spin_lock_init(&hvterm_priv0.buf_lock);
+       hvterm_privs[0] = &hvterm_priv0;
+
+       /* Check the protocol */
+       if (of_device_is_compatible(stdout_node, "hvterm1")) {
+               hvterm_priv0.proto = HV_PROTOCOL_RAW;
+               ops = &hvterm_raw_ops;
+       }
+       else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) {
+               hvterm_priv0.proto = HV_PROTOCOL_HVSI;
+               ops = &hvterm_hvsi_ops;
+               hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars,
+                            hvterm_priv0.termno, 1);
+               /* HVSI, perform the handshake now */
+               hvsilib_establish(&hvterm_priv0.hvsi);
+       } else
+               goto out;
+       udbg_putc = udbg_hvc_putc;
+       udbg_getc = udbg_hvc_getc;
+       udbg_getc_poll = udbg_hvc_getc_poll;
+#ifdef HVC_OLD_HVSI
+       /* When using the old HVSI driver don't register the HVC
+        * backend for HVSI, only do udbg
+        */
+       if (hvterm_priv0.proto == HV_PROTOCOL_HVSI)
+               goto out;
+#endif
+       add_preferred_console("hvc", 0, NULL);
+       hvc_instantiate(0, 0, ops);
+out:
+       of_node_put(stdout_node);
+}
 
-       return num_found;
+/* call this from early_init() for a working debug console on
+ * vterm capable LPAR machines
+ */
+#ifdef CONFIG_PPC_EARLY_DEBUG_LPAR
+void __init udbg_init_debug_lpar(void)
+{
+       hvterm_privs[0] = &hvterm_priv0;
+       hvterm_priv0.termno = 0;
+       hvterm_priv0.proto = HV_PROTOCOL_RAW;
+       spin_lock_init(&hvterm_priv0.buf_lock);
+       udbg_putc = udbg_hvc_putc;
+       udbg_getc = udbg_hvc_getc;
+       udbg_getc_poll = udbg_hvc_getc_poll;
+}
+#endif /* CONFIG_PPC_EARLY_DEBUG_LPAR */
+
+#ifdef CONFIG_PPC_EARLY_DEBUG_LPAR_HVSI
+void __init udbg_init_debug_lpar_hvsi(void)
+{
+       hvterm_privs[0] = &hvterm_priv0;
+       hvterm_priv0.termno = CONFIG_PPC_EARLY_DEBUG_HVSI_VTERMNO;
+       hvterm_priv0.proto = HV_PROTOCOL_HVSI;
+       spin_lock_init(&hvterm_priv0.buf_lock);
+       udbg_putc = udbg_hvc_putc;
+       udbg_getc = udbg_hvc_getc;
+       udbg_getc_poll = udbg_hvc_getc_poll;
+       hvsilib_init(&hvterm_priv0.hvsi, hvc_get_chars, hvc_put_chars,
+                    hvterm_priv0.termno, 1);
+       hvsilib_establish(&hvterm_priv0.hvsi);
 }
-console_initcall(hvc_find_vtys);
+#endif /* CONFIG_PPC_EARLY_DEBUG_LPAR_HVSI */
index 8a8d6373f164decd6023719d40236ff5229d3ddf..c94e2f5853d87b7d72efc86bbb51113f6d0a98c7 100644 (file)
@@ -49,6 +49,7 @@
 #include <asm/uaccess.h>
 #include <asm/vio.h>
 #include <asm/param.h>
+#include <asm/hvsi.h>
 
 #define HVSI_MAJOR     229
 #define HVSI_MINOR     128
@@ -109,68 +110,6 @@ enum HVSI_PROTOCOL_STATE {
 };
 #define HVSI_CONSOLE 0x1
 
-#define VS_DATA_PACKET_HEADER           0xff
-#define VS_CONTROL_PACKET_HEADER        0xfe
-#define VS_QUERY_PACKET_HEADER          0xfd
-#define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc
-
-/* control verbs */
-#define VSV_SET_MODEM_CTL    1 /* to service processor only */
-#define VSV_MODEM_CTL_UPDATE 2 /* from service processor only */
-#define VSV_CLOSE_PROTOCOL   3
-
-/* query verbs */
-#define VSV_SEND_VERSION_NUMBER 1
-#define VSV_SEND_MODEM_CTL_STATUS 2
-
-/* yes, these masks are not consecutive. */
-#define HVSI_TSDTR 0x01
-#define HVSI_TSCD  0x20
-
-struct hvsi_header {
-       uint8_t  type;
-       uint8_t  len;
-       uint16_t seqno;
-} __attribute__((packed));
-
-struct hvsi_data {
-       uint8_t  type;
-       uint8_t  len;
-       uint16_t seqno;
-       uint8_t  data[HVSI_MAX_OUTGOING_DATA];
-} __attribute__((packed));
-
-struct hvsi_control {
-       uint8_t  type;
-       uint8_t  len;
-       uint16_t seqno;
-       uint16_t verb;
-       /* optional depending on verb: */
-       uint32_t word;
-       uint32_t mask;
-} __attribute__((packed));
-
-struct hvsi_query {
-       uint8_t  type;
-       uint8_t  len;
-       uint16_t seqno;
-       uint16_t verb;
-} __attribute__((packed));
-
-struct hvsi_query_response {
-       uint8_t  type;
-       uint8_t  len;
-       uint16_t seqno;
-       uint16_t verb;
-       uint16_t query_seqno;
-       union {
-               uint8_t  version;
-               uint32_t mctrl_word;
-       } u;
-} __attribute__((packed));
-
-
-
 static inline int is_console(struct hvsi_struct *hp)
 {
        return hp->flags & HVSI_CONSOLE;
@@ -356,18 +295,18 @@ static int hvsi_version_respond(struct hvsi_struct *hp, uint16_t query_seqno)
        struct hvsi_query_response packet __ALIGNED__;
        int wrote;
 
-       packet.type = VS_QUERY_RESPONSE_PACKET_HEADER;
-       packet.len = sizeof(struct hvsi_query_response);
-       packet.seqno = atomic_inc_return(&hp->seqno);
+       packet.hdr.type = VS_QUERY_RESPONSE_PACKET_HEADER;
+       packet.hdr.len = sizeof(struct hvsi_query_response);
+       packet.hdr.seqno = atomic_inc_return(&hp->seqno);
        packet.verb = VSV_SEND_VERSION_NUMBER;
        packet.u.version = HVSI_VERSION;
        packet.query_seqno = query_seqno+1;
 
-       pr_debug("%s: sending %i bytes\n", __func__, packet.len);
-       dbg_dump_hex((uint8_t*)&packet, packet.len);
+       pr_debug("%s: sending %i bytes\n", __func__, packet.hdr.len);
+       dbg_dump_hex((uint8_t*)&packet, packet.hdr.len);
 
-       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.len);
-       if (wrote != packet.len) {
+       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.hdr.len);
+       if (wrote != packet.hdr.len) {
                printk(KERN_ERR "hvsi%i: couldn't send query response!\n",
                        hp->index);
                return -EIO;
@@ -382,7 +321,7 @@ static void hvsi_recv_query(struct hvsi_struct *hp, uint8_t *packet)
 
        switch (hp->state) {
                case HVSI_WAIT_FOR_VER_QUERY:
-                       hvsi_version_respond(hp, query->seqno);
+                       hvsi_version_respond(hp, query->hdr.seqno);
                        __set_state(hp, HVSI_OPEN);
                        break;
                default:
@@ -640,16 +579,16 @@ static int hvsi_query(struct hvsi_struct *hp, uint16_t verb)
        struct hvsi_query packet __ALIGNED__;
        int wrote;
 
-       packet.type = VS_QUERY_PACKET_HEADER;
-       packet.len = sizeof(struct hvsi_query);
-       packet.seqno = atomic_inc_return(&hp->seqno);
+       packet.hdr.type = VS_QUERY_PACKET_HEADER;
+       packet.hdr.len = sizeof(struct hvsi_query);
+       packet.hdr.seqno = atomic_inc_return(&hp->seqno);
        packet.verb = verb;
 
-       pr_debug("%s: sending %i bytes\n", __func__, packet.len);
-       dbg_dump_hex((uint8_t*)&packet, packet.len);
+       pr_debug("%s: sending %i bytes\n", __func__, packet.hdr.len);
+       dbg_dump_hex((uint8_t*)&packet, packet.hdr.len);
 
-       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.len);
-       if (wrote != packet.len) {
+       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.hdr.len);
+       if (wrote != packet.hdr.len) {
                printk(KERN_ERR "hvsi%i: couldn't send query (%i)!\n", hp->index,
                        wrote);
                return -EIO;
@@ -683,20 +622,20 @@ static int hvsi_set_mctrl(struct hvsi_struct *hp, uint16_t mctrl)
        struct hvsi_control packet __ALIGNED__;
        int wrote;
 
-       packet.type = VS_CONTROL_PACKET_HEADER,
-       packet.seqno = atomic_inc_return(&hp->seqno);
-       packet.len = sizeof(struct hvsi_control);
+       packet.hdr.type = VS_CONTROL_PACKET_HEADER,
+       packet.hdr.seqno = atomic_inc_return(&hp->seqno);
+       packet.hdr.len = sizeof(struct hvsi_control);
        packet.verb = VSV_SET_MODEM_CTL;
        packet.mask = HVSI_TSDTR;
 
        if (mctrl & TIOCM_DTR)
                packet.word = HVSI_TSDTR;
 
-       pr_debug("%s: sending %i bytes\n", __func__, packet.len);
-       dbg_dump_hex((uint8_t*)&packet, packet.len);
+       pr_debug("%s: sending %i bytes\n", __func__, packet.hdr.len);
+       dbg_dump_hex((uint8_t*)&packet, packet.hdr.len);
 
-       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.len);
-       if (wrote != packet.len) {
+       wrote = hvc_put_chars(hp->vtermno, (char *)&packet, packet.hdr.len);
+       if (wrote != packet.hdr.len) {
                printk(KERN_ERR "hvsi%i: couldn't set DTR!\n", hp->index);
                return -EIO;
        }
@@ -766,13 +705,13 @@ static int hvsi_put_chars(struct hvsi_struct *hp, const char *buf, int count)
 
        BUG_ON(count > HVSI_MAX_OUTGOING_DATA);
 
-       packet.type = VS_DATA_PACKET_HEADER;
-       packet.seqno = atomic_inc_return(&hp->seqno);
-       packet.len = count + sizeof(struct hvsi_header);
+       packet.hdr.type = VS_DATA_PACKET_HEADER;
+       packet.hdr.seqno = atomic_inc_return(&hp->seqno);
+       packet.hdr.len = count + sizeof(struct hvsi_header);
        memcpy(&packet.data, buf, count);
 
-       ret = hvc_put_chars(hp->vtermno, (char *)&packet, packet.len);
-       if (ret == packet.len) {
+       ret = hvc_put_chars(hp->vtermno, (char *)&packet, packet.hdr.len);
+       if (ret == packet.hdr.len) {
                /* return the number of chars written, not the packet length */
                return count;
        }
@@ -783,15 +722,15 @@ static void hvsi_close_protocol(struct hvsi_struct *hp)
 {
        struct hvsi_control packet __ALIGNED__;
 
-       packet.type = VS_CONTROL_PACKET_HEADER;
-       packet.seqno = atomic_inc_return(&hp->seqno);
-       packet.len = 6;
+       packet.hdr.type = VS_CONTROL_PACKET_HEADER;
+       packet.hdr.seqno = atomic_inc_return(&hp->seqno);
+       packet.hdr.len = 6;
        packet.verb = VSV_CLOSE_PROTOCOL;
 
-       pr_debug("%s: sending %i bytes\n", __func__, packet.len);
-       dbg_dump_hex((uint8_t*)&packet, packet.len);
+       pr_debug("%s: sending %i bytes\n", __func__, packet.hdr.len);
+       dbg_dump_hex((uint8_t*)&packet, packet.hdr.len);
 
-       hvc_put_chars(hp->vtermno, (char *)&packet, packet.len);
+       hvc_put_chars(hp->vtermno, (char *)&packet, packet.hdr.len);
 }
 
 static int hvsi_open(struct tty_struct *tty, struct file *filp)
diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c
new file mode 100644 (file)
index 0000000..bd9b098
--- /dev/null
@@ -0,0 +1,426 @@
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/console.h>
+#include <asm/hvsi.h>
+
+#include "hvc_console.h"
+
+static int hvsi_send_packet(struct hvsi_priv *pv, struct hvsi_header *packet)
+{
+       packet->seqno = atomic_inc_return(&pv->seqno);
+
+       /* Assumes that always succeeds, works in practice */
+       return pv->put_chars(pv->termno, (char *)packet, packet->len);
+}
+
+static void hvsi_start_handshake(struct hvsi_priv *pv)
+{
+       struct hvsi_query q;
+
+       /* Reset state */
+       pv->established = 0;
+       atomic_set(&pv->seqno, 0);
+
+       pr_devel("HVSI@%x: Handshaking started\n", pv->termno);
+
+       /* Send version query */
+       q.hdr.type = VS_QUERY_PACKET_HEADER;
+       q.hdr.len = sizeof(struct hvsi_query);
+       q.verb = VSV_SEND_VERSION_NUMBER;
+       hvsi_send_packet(pv, &q.hdr);
+}
+
+static int hvsi_send_close(struct hvsi_priv *pv)
+{
+       struct hvsi_control ctrl;
+
+       pv->established = 0;
+
+       ctrl.hdr.type = VS_CONTROL_PACKET_HEADER;
+       ctrl.hdr.len = sizeof(struct hvsi_control);
+       ctrl.verb = VSV_CLOSE_PROTOCOL;
+       return hvsi_send_packet(pv, &ctrl.hdr);
+}
+
+static void hvsi_cd_change(struct hvsi_priv *pv, int cd)
+{
+       if (cd)
+               pv->mctrl |= TIOCM_CD;
+       else {
+               pv->mctrl &= ~TIOCM_CD;
+
+               /* We copy the existing hvsi driver semantics
+                * here which are to trigger a hangup when
+                * we get a carrier loss.
+                * Closing our connection to the server will
+                * do just that.
+                */
+               if (!pv->is_console && pv->opened) {
+                       pr_devel("HVSI@%x Carrier lost, hanging up !\n",
+                                pv->termno);
+                       hvsi_send_close(pv);
+               }
+       }
+}
+
+static void hvsi_got_control(struct hvsi_priv *pv)
+{
+       struct hvsi_control *pkt = (struct hvsi_control *)pv->inbuf;
+
+       switch (pkt->verb) {
+       case VSV_CLOSE_PROTOCOL:
+               /* We restart the handshaking */
+               hvsi_start_handshake(pv);
+               break;
+       case VSV_MODEM_CTL_UPDATE:
+               /* Transition of carrier detect */
+               hvsi_cd_change(pv, pkt->word & HVSI_TSCD);
+               break;
+       }
+}
+
+static void hvsi_got_query(struct hvsi_priv *pv)
+{
+       struct hvsi_query *pkt = (struct hvsi_query *)pv->inbuf;
+       struct hvsi_query_response r;
+
+       /* We only handle version queries */
+       if (pkt->verb != VSV_SEND_VERSION_NUMBER)
+               return;
+
+       pr_devel("HVSI@%x: Got version query, sending response...\n",
+                pv->termno);
+
+       /* Send version response */
+       r.hdr.type = VS_QUERY_RESPONSE_PACKET_HEADER;
+       r.hdr.len = sizeof(struct hvsi_query_response);
+       r.verb = VSV_SEND_VERSION_NUMBER;
+       r.u.version = HVSI_VERSION;
+       r.query_seqno = pkt->hdr.seqno;
+       hvsi_send_packet(pv, &r.hdr);
+
+       /* Assume protocol is open now */
+       pv->established = 1;
+}
+
+static void hvsi_got_response(struct hvsi_priv *pv)
+{
+       struct hvsi_query_response *r =
+               (struct hvsi_query_response *)pv->inbuf;
+
+       switch(r->verb) {
+       case VSV_SEND_MODEM_CTL_STATUS:
+               hvsi_cd_change(pv, r->u.mctrl_word & HVSI_TSCD);
+               pv->mctrl_update = 1;
+               break;
+       }
+}
+
+static int hvsi_check_packet(struct hvsi_priv *pv)
+{
+       u8 len, type;
+
+       /* Check header validity. If it's invalid, we ditch
+        * the whole buffer and hope we eventually resync
+        */
+       if (pv->inbuf[0] < 0xfc) {
+               pv->inbuf_len = pv->inbuf_pktlen = 0;
+               return 0;
+       }
+       type = pv->inbuf[0];
+       len = pv->inbuf[1];
+
+       /* Packet incomplete ? */
+       if (pv->inbuf_len < len)
+               return 0;
+
+       pr_devel("HVSI@%x: Got packet type %x len %d bytes:\n",
+                pv->termno, type, len);
+
+       /* We have a packet, yay ! Handle it */
+       switch(type) {
+       case VS_DATA_PACKET_HEADER:
+               pv->inbuf_pktlen = len - 4;
+               pv->inbuf_cur = 4;
+               return 1;
+       case VS_CONTROL_PACKET_HEADER:
+               hvsi_got_control(pv);
+               break;
+       case VS_QUERY_PACKET_HEADER:
+               hvsi_got_query(pv);
+               break;
+       case VS_QUERY_RESPONSE_PACKET_HEADER:
+               hvsi_got_response(pv);
+               break;
+       }
+
+       /* Swallow packet and retry */
+       pv->inbuf_len -= len;
+       memmove(pv->inbuf, &pv->inbuf[len], pv->inbuf_len);
+       return 1;
+}
+
+static int hvsi_get_packet(struct hvsi_priv *pv)
+{
+       /* If we have room in the buffer, ask HV for more */
+       if (pv->inbuf_len < HVSI_INBUF_SIZE)
+               pv->inbuf_len += pv->get_chars(pv->termno,
+                                            &pv->inbuf[pv->inbuf_len],
+                                            HVSI_INBUF_SIZE - pv->inbuf_len);
+       /*
+        * If we have at least 4 bytes in the buffer, check for
+        * a full packet and retry
+        */
+       if (pv->inbuf_len >= 4)
+               return hvsi_check_packet(pv);
+       return 0;
+}
+
+int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count)
+{
+       unsigned int tries, read = 0;
+
+       if (WARN_ON(!pv))
+               return 0;
+
+       /* If we aren't open, don't do anything in order to avoid races
+        * with connection establishment. The hvc core will call this
+        * before we have returned from notifier_add(), and we need to
+        * avoid multiple users playing with the receive buffer
+        */
+       if (!pv->opened)
+               return 0;
+
+       /* We try twice, once with what data we have and once more
+        * after we try to fetch some more from the hypervisor
+        */
+       for (tries = 1; count && tries < 2; tries++) {
+               /* Consume existing data packet */
+               if (pv->inbuf_pktlen) {
+                       unsigned int l = min(count, (int)pv->inbuf_pktlen);
+                       memcpy(&buf[read], &pv->inbuf[pv->inbuf_cur], l);
+                       pv->inbuf_cur += l;
+                       pv->inbuf_pktlen -= l;
+                       count -= l;
+                       read += l;
+               }
+               if (count == 0)
+                       break;
+
+               /* Data packet fully consumed, move down remaning data */
+               if (pv->inbuf_cur) {
+                       pv->inbuf_len -= pv->inbuf_cur;
+                       memmove(pv->inbuf, &pv->inbuf[pv->inbuf_cur],
+                               pv->inbuf_len);
+                       pv->inbuf_cur = 0;
+               }
+
+               /* Try to get another packet */
+               if (hvsi_get_packet(pv))
+                       tries--;
+       }
+       if (!pv->established) {
+               pr_devel("HVSI@%x: returning -EPIPE\n", pv->termno);
+               return -EPIPE;
+       }
+       return read;
+}
+
+int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count)
+{
+       struct hvsi_data dp;
+       int rc, adjcount = min(count, HVSI_MAX_OUTGOING_DATA);
+
+       if (WARN_ON(!pv))
+               return 0;
+
+       dp.hdr.type = VS_DATA_PACKET_HEADER;
+       dp.hdr.len = adjcount + sizeof(struct hvsi_header);
+       memcpy(dp.data, buf, adjcount);
+       rc = hvsi_send_packet(pv, &dp.hdr);
+       if (rc <= 0)
+               return rc;
+       return adjcount;
+}
+
+static void maybe_msleep(unsigned long ms)
+{
+       /* During early boot, IRQs are disabled, use mdelay */
+       if (irqs_disabled())
+               mdelay(ms);
+       else
+               msleep(ms);
+}
+
+int hvsilib_read_mctrl(struct hvsi_priv *pv)
+{
+       struct hvsi_query q;
+       int rc, timeout;
+
+       pr_devel("HVSI@%x: Querying modem control status...\n",
+                pv->termno);
+
+       pv->mctrl_update = 0;
+       q.hdr.type = VS_QUERY_PACKET_HEADER;
+       q.hdr.len = sizeof(struct hvsi_query);
+       q.hdr.seqno = atomic_inc_return(&pv->seqno);
+       q.verb = VSV_SEND_MODEM_CTL_STATUS;
+       rc = hvsi_send_packet(pv, &q.hdr);
+       if (rc <= 0) {
+               pr_devel("HVSI@%x: Error %d...\n", pv->termno, rc);
+               return rc;
+       }
+
+       /* Try for up to 200ms */
+       for (timeout = 0; timeout < 20; timeout++) {
+               if (!pv->established)
+                       return -ENXIO;
+               if (pv->mctrl_update)
+                       return 0;
+               if (!hvsi_get_packet(pv))
+                       maybe_msleep(10);
+       }
+       return -EIO;
+}
+
+int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr)
+{
+       struct hvsi_control ctrl;
+       unsigned short mctrl;
+
+       mctrl = pv->mctrl;
+       if (dtr)
+               mctrl |= TIOCM_DTR;
+       else
+               mctrl &= ~TIOCM_DTR;
+       if (mctrl == pv->mctrl)
+               return 0;
+       pv->mctrl = mctrl;
+
+       pr_devel("HVSI@%x: %s DTR...\n", pv->termno,
+                dtr ? "Setting" : "Clearing");
+
+       ctrl.hdr.type = VS_CONTROL_PACKET_HEADER,
+       ctrl.hdr.len = sizeof(struct hvsi_control);
+       ctrl.verb = VSV_SET_MODEM_CTL;
+       ctrl.mask = HVSI_TSDTR;
+       ctrl.word = dtr ? HVSI_TSDTR : 0;
+       return hvsi_send_packet(pv, &ctrl.hdr);
+}
+
+void hvsilib_establish(struct hvsi_priv *pv)
+{
+       int timeout;
+
+       pr_devel("HVSI@%x: Establishing...\n", pv->termno);
+
+       /* Try for up to 200ms, there can be a packet to
+        * start the process waiting for us...
+        */
+       for (timeout = 0; timeout < 20; timeout++) {
+               if (pv->established)
+                       goto established;
+               if (!hvsi_get_packet(pv))
+                       maybe_msleep(10);
+       }
+
+       /* Failed, send a close connection packet just
+        * in case
+        */
+       pr_devel("HVSI@%x:   ... sending close\n", pv->termno);
+
+       hvsi_send_close(pv);
+
+       /* Then restart handshake */
+
+       pr_devel("HVSI@%x:   ... restarting handshake\n", pv->termno);
+
+       hvsi_start_handshake(pv);
+
+       pr_devel("HVSI@%x:   ... waiting handshake\n", pv->termno);
+
+       /* Try for up to 200s */
+       for (timeout = 0; timeout < 20; timeout++) {
+               if (pv->established)
+                       goto established;
+               if (!hvsi_get_packet(pv))
+                       maybe_msleep(10);
+       }
+
+       if (!pv->established) {
+               pr_devel("HVSI@%x: Timeout handshaking, giving up !\n",
+                        pv->termno);
+               return;
+       }
+ established:
+       /* Query modem control lines */
+
+       pr_devel("HVSI@%x:   ... established, reading mctrl\n", pv->termno);
+
+       hvsilib_read_mctrl(pv);
+
+       /* Set our own DTR */
+
+       pr_devel("HVSI@%x:   ... setting mctrl\n", pv->termno);
+
+       hvsilib_write_mctrl(pv, 1);
+
+       /* Set the opened flag so reads are allowed */
+       wmb();
+       pv->opened = 1;
+}
+
+int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp)
+{
+       pr_devel("HVSI@%x: open !\n", pv->termno);
+
+       /* Keep track of the tty data structure */
+       pv->tty = tty_kref_get(hp->tty);
+
+       hvsilib_establish(pv);
+
+       return 0;
+}
+
+void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp)
+{
+       unsigned long flags;
+
+       pr_devel("HVSI@%x: close !\n", pv->termno);
+
+       if (!pv->is_console) {
+               pr_devel("HVSI@%x: Not a console, tearing down\n",
+                        pv->termno);
+
+               /* Clear opened, synchronize with khvcd */
+               spin_lock_irqsave(&hp->lock, flags);
+               pv->opened = 0;
+               spin_unlock_irqrestore(&hp->lock, flags);
+
+               /* Clear our own DTR */
+               if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL))
+                       hvsilib_write_mctrl(pv, 0);
+
+               /* Tear down the connection */
+               hvsi_send_close(pv);
+       }
+
+       if (pv->tty)
+               tty_kref_put(pv->tty);
+       pv->tty = NULL;
+}
+
+void hvsilib_init(struct hvsi_priv *pv,
+                 int (*get_chars)(uint32_t termno, char *buf, int count),
+                 int (*put_chars)(uint32_t termno, const char *buf,
+                                  int count),
+                 int termno, int is_console)
+{
+       memset(pv, 0, sizeof(*pv));
+       pv->get_chars = get_chars;
+       pv->put_chars = put_chars;
+       pv->termno = termno;
+       pv->is_console = is_console;
+}
diff --git a/drivers/virt/Kconfig b/drivers/virt/Kconfig
new file mode 100644 (file)
index 0000000..2dcdbc9
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# Virtualization support drivers
+#
+
+menuconfig VIRT_DRIVERS
+       bool "Virtualization drivers"
+       ---help---
+         Say Y here to get to see options for device drivers that support
+         virtualization environments.
+
+         If you say N, all options in this submenu will be skipped and disabled.
+
+if VIRT_DRIVERS
+
+config FSL_HV_MANAGER
+       tristate "Freescale hypervisor management driver"
+       depends on FSL_SOC
+       help
+          The Freescale hypervisor management driver provides several services
+         to drivers and applications related to the Freescale hypervisor:
+
+          1) An ioctl interface for querying and managing partitions.
+
+          2) A file interface to reading incoming doorbells.
+
+          3) An interrupt handler for shutting down the partition upon
+            receiving the shutdown doorbell from a manager partition.
+
+          4) A kernel interface for receiving callbacks when a managed
+            partition shuts down.
+
+endif
diff --git a/drivers/virt/Makefile b/drivers/virt/Makefile
new file mode 100644 (file)
index 0000000..c47f04d
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for drivers that support virtualization
+#
+
+obj-$(CONFIG_FSL_HV_MANAGER)   += fsl_hypervisor.o
diff --git a/drivers/virt/fsl_hypervisor.c b/drivers/virt/fsl_hypervisor.c
new file mode 100644 (file)
index 0000000..3d91621
--- /dev/null
@@ -0,0 +1,938 @@
+/*
+ * Freescale Hypervisor Management Driver
+
+ * Copyright (C) 2008-2011 Freescale Semiconductor, Inc.
+ * Author: Timur Tabi <timur@freescale.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.
+ *
+ * The Freescale hypervisor management driver provides several services to
+ * drivers and applications related to the Freescale hypervisor:
+ *
+ * 1. An ioctl interface for querying and managing partitions.
+ *
+ * 2. A file interface to reading incoming doorbells.
+ *
+ * 3. An interrupt handler for shutting down the partition upon receiving the
+ *    shutdown doorbell from a manager partition.
+ *
+ * 4. A kernel interface for receiving callbacks when a managed partition
+ *    shuts down.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/err.h>
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/mm.h>
+#include <linux/pagemap.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/of.h>
+#include <linux/reboot.h>
+#include <linux/uaccess.h>
+#include <linux/notifier.h>
+#include <linux/interrupt.h>
+
+#include <linux/io.h>
+#include <asm/fsl_hcalls.h>
+
+#include <linux/fsl_hypervisor.h>
+
+static BLOCKING_NOTIFIER_HEAD(failover_subscribers);
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_PARTITION_RESTART
+ *
+ * Restart a running partition
+ */
+static long ioctl_restart(struct fsl_hv_ioctl_restart __user *p)
+{
+       struct fsl_hv_ioctl_restart param;
+
+       /* Get the parameters from the user */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_restart)))
+               return -EFAULT;
+
+       param.ret = fh_partition_restart(param.partition);
+
+       if (copy_to_user(&p->ret, &param.ret, sizeof(__u32)))
+               return -EFAULT;
+
+       return 0;
+}
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_PARTITION_STATUS
+ *
+ * Query the status of a partition
+ */
+static long ioctl_status(struct fsl_hv_ioctl_status __user *p)
+{
+       struct fsl_hv_ioctl_status param;
+       u32 status;
+
+       /* Get the parameters from the user */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_status)))
+               return -EFAULT;
+
+       param.ret = fh_partition_get_status(param.partition, &status);
+       if (!param.ret)
+               param.status = status;
+
+       if (copy_to_user(p, &param, sizeof(struct fsl_hv_ioctl_status)))
+               return -EFAULT;
+
+       return 0;
+}
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_PARTITION_START
+ *
+ * Start a stopped partition.
+ */
+static long ioctl_start(struct fsl_hv_ioctl_start __user *p)
+{
+       struct fsl_hv_ioctl_start param;
+
+       /* Get the parameters from the user */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_start)))
+               return -EFAULT;
+
+       param.ret = fh_partition_start(param.partition, param.entry_point,
+                                      param.load);
+
+       if (copy_to_user(&p->ret, &param.ret, sizeof(__u32)))
+               return -EFAULT;
+
+       return 0;
+}
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_PARTITION_STOP
+ *
+ * Stop a running partition
+ */
+static long ioctl_stop(struct fsl_hv_ioctl_stop __user *p)
+{
+       struct fsl_hv_ioctl_stop param;
+
+       /* Get the parameters from the user */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_stop)))
+               return -EFAULT;
+
+       param.ret = fh_partition_stop(param.partition);
+
+       if (copy_to_user(&p->ret, &param.ret, sizeof(__u32)))
+               return -EFAULT;
+
+       return 0;
+}
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_MEMCPY
+ *
+ * The FH_MEMCPY hypercall takes an array of address/address/size structures
+ * to represent the data being copied.  As a convenience to the user, this
+ * ioctl takes a user-create buffer and a pointer to a guest physically
+ * contiguous buffer in the remote partition, and creates the
+ * address/address/size array for the hypercall.
+ */
+static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)
+{
+       struct fsl_hv_ioctl_memcpy param;
+
+       struct page **pages = NULL;
+       void *sg_list_unaligned = NULL;
+       struct fh_sg_list *sg_list = NULL;
+
+       unsigned int num_pages;
+       unsigned long lb_offset; /* Offset within a page of the local buffer */
+
+       unsigned int i;
+       long ret = 0;
+       int num_pinned; /* return value from get_user_pages() */
+       phys_addr_t remote_paddr; /* The next address in the remote buffer */
+       uint32_t count; /* The number of bytes left to copy */
+
+       /* Get the parameters from the user */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_memcpy)))
+               return -EFAULT;
+
+       /*
+        * One partition must be local, the other must be remote.  In other
+        * words, if source and target are both -1, or are both not -1, then
+        * return an error.
+        */
+       if ((param.source == -1) == (param.target == -1))
+               return -EINVAL;
+
+       /*
+        * The array of pages returned by get_user_pages() covers only
+        * page-aligned memory.  Since the user buffer is probably not
+        * page-aligned, we need to handle the discrepancy.
+        *
+        * We calculate the offset within a page of the S/G list, and make
+        * adjustments accordingly.  This will result in a page list that looks
+        * like this:
+        *
+        *      ----    <-- first page starts before the buffer
+        *     |    |
+        *     |////|-> ----
+        *     |////|  |    |
+        *      ----   |    |
+        *             |    |
+        *      ----   |    |
+        *     |////|  |    |
+        *     |////|  |    |
+        *     |////|  |    |
+        *      ----   |    |
+        *             |    |
+        *      ----   |    |
+        *     |////|  |    |
+        *     |////|  |    |
+        *     |////|  |    |
+        *      ----   |    |
+        *             |    |
+        *      ----   |    |
+        *     |////|  |    |
+        *     |////|-> ----
+        *     |    |   <-- last page ends after the buffer
+        *      ----
+        *
+        * The distance between the start of the first page and the start of the
+        * buffer is lb_offset.  The hashed (///) areas are the parts of the
+        * page list that contain the actual buffer.
+        *
+        * The advantage of this approach is that the number of pages is
+        * equal to the number of entries in the S/G list that we give to the
+        * hypervisor.
+        */
+       lb_offset = param.local_vaddr & (PAGE_SIZE - 1);
+       num_pages = (param.count + lb_offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+       /* Allocate the buffers we need */
+
+       /*
+        * 'pages' is an array of struct page pointers that's initialized by
+        * get_user_pages().
+        */
+       pages = kzalloc(num_pages * sizeof(struct page *), GFP_KERNEL);
+       if (!pages) {
+               pr_debug("fsl-hv: could not allocate page list\n");
+               return -ENOMEM;
+       }
+
+       /*
+        * sg_list is the list of fh_sg_list objects that we pass to the
+        * hypervisor.
+        */
+       sg_list_unaligned = kmalloc(num_pages * sizeof(struct fh_sg_list) +
+               sizeof(struct fh_sg_list) - 1, GFP_KERNEL);
+       if (!sg_list_unaligned) {
+               pr_debug("fsl-hv: could not allocate S/G list\n");
+               ret = -ENOMEM;
+               goto exit;
+       }
+       sg_list = PTR_ALIGN(sg_list_unaligned, sizeof(struct fh_sg_list));
+
+       /* Get the physical addresses of the source buffer */
+       down_read(&current->mm->mmap_sem);
+       num_pinned = get_user_pages(current, current->mm,
+               param.local_vaddr - lb_offset, num_pages,
+               (param.source == -1) ? READ : WRITE,
+               0, pages, NULL);
+       up_read(&current->mm->mmap_sem);
+
+       if (num_pinned != num_pages) {
+               /* get_user_pages() failed */
+               pr_debug("fsl-hv: could not lock source buffer\n");
+               ret = (num_pinned < 0) ? num_pinned : -EFAULT;
+               goto exit;
+       }
+
+       /*
+        * Build the fh_sg_list[] array.  The first page is special
+        * because it's misaligned.
+        */
+       if (param.source == -1) {
+               sg_list[0].source = page_to_phys(pages[0]) + lb_offset;
+               sg_list[0].target = param.remote_paddr;
+       } else {
+               sg_list[0].source = param.remote_paddr;
+               sg_list[0].target = page_to_phys(pages[0]) + lb_offset;
+       }
+       sg_list[0].size = min_t(uint64_t, param.count, PAGE_SIZE - lb_offset);
+
+       remote_paddr = param.remote_paddr + sg_list[0].size;
+       count = param.count - sg_list[0].size;
+
+       for (i = 1; i < num_pages; i++) {
+               if (param.source == -1) {
+                       /* local to remote */
+                       sg_list[i].source = page_to_phys(pages[i]);
+                       sg_list[i].target = remote_paddr;
+               } else {
+                       /* remote to local */
+                       sg_list[i].source = remote_paddr;
+                       sg_list[i].target = page_to_phys(pages[i]);
+               }
+               sg_list[i].size = min_t(uint64_t, count, PAGE_SIZE);
+
+               remote_paddr += sg_list[i].size;
+               count -= sg_list[i].size;
+       }
+
+       param.ret = fh_partition_memcpy(param.source, param.target,
+               virt_to_phys(sg_list), num_pages);
+
+exit:
+       if (pages) {
+               for (i = 0; i < num_pages; i++)
+                       if (pages[i])
+                               put_page(pages[i]);
+       }
+
+       kfree(sg_list_unaligned);
+       kfree(pages);
+
+       if (!ret)
+               if (copy_to_user(&p->ret, &param.ret, sizeof(__u32)))
+                       return -EFAULT;
+
+       return ret;
+}
+
+/*
+ * Ioctl interface for FSL_HV_IOCTL_DOORBELL
+ *
+ * Ring a doorbell
+ */
+static long ioctl_doorbell(struct fsl_hv_ioctl_doorbell __user *p)
+{
+       struct fsl_hv_ioctl_doorbell param;
+
+       /* Get the parameters from the user. */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_doorbell)))
+               return -EFAULT;
+
+       param.ret = ev_doorbell_send(param.doorbell);
+
+       if (copy_to_user(&p->ret, &param.ret, sizeof(__u32)))
+               return -EFAULT;
+
+       return 0;
+}
+
+static long ioctl_dtprop(struct fsl_hv_ioctl_prop __user *p, int set)
+{
+       struct fsl_hv_ioctl_prop param;
+       char __user *upath, *upropname;
+       void __user *upropval;
+       char *path = NULL, *propname = NULL;
+       void *propval = NULL;
+       int ret = 0;
+
+       /* Get the parameters from the user. */
+       if (copy_from_user(&param, p, sizeof(struct fsl_hv_ioctl_prop)))
+               return -EFAULT;
+
+       upath = (char __user *)(uintptr_t)param.path;
+       upropname = (char __user *)(uintptr_t)param.propname;
+       upropval = (void __user *)(uintptr_t)param.propval;
+
+       path = strndup_user(upath, FH_DTPROP_MAX_PATHLEN);
+       if (IS_ERR(path)) {
+               ret = PTR_ERR(path);
+               goto out;
+       }
+
+       propname = strndup_user(upropname, FH_DTPROP_MAX_PATHLEN);
+       if (IS_ERR(propname)) {
+               ret = PTR_ERR(propname);
+               goto out;
+       }
+
+       if (param.proplen > FH_DTPROP_MAX_PROPLEN) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       propval = kmalloc(param.proplen, GFP_KERNEL);
+       if (!propval) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       if (set) {
+               if (copy_from_user(propval, upropval, param.proplen)) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+
+               param.ret = fh_partition_set_dtprop(param.handle,
+                                                   virt_to_phys(path),
+                                                   virt_to_phys(propname),
+                                                   virt_to_phys(propval),
+                                                   param.proplen);
+       } else {
+               param.ret = fh_partition_get_dtprop(param.handle,
+                                                   virt_to_phys(path),
+                                                   virt_to_phys(propname),
+                                                   virt_to_phys(propval),
+                                                   &param.proplen);
+
+               if (param.ret == 0) {
+                       if (copy_to_user(upropval, propval, param.proplen) ||
+                           put_user(param.proplen, &p->proplen)) {
+                               ret = -EFAULT;
+                               goto out;
+                       }
+               }
+       }
+
+       if (put_user(param.ret, &p->ret))
+               ret = -EFAULT;
+
+out:
+       kfree(path);
+       kfree(propval);
+       kfree(propname);
+
+       return ret;
+}
+
+/*
+ * Ioctl main entry point
+ */
+static long fsl_hv_ioctl(struct file *file, unsigned int cmd,
+                        unsigned long argaddr)
+{
+       void __user *arg = (void __user *)argaddr;
+       long ret;
+
+       switch (cmd) {
+       case FSL_HV_IOCTL_PARTITION_RESTART:
+               ret = ioctl_restart(arg);
+               break;
+       case FSL_HV_IOCTL_PARTITION_GET_STATUS:
+               ret = ioctl_status(arg);
+               break;
+       case FSL_HV_IOCTL_PARTITION_START:
+               ret = ioctl_start(arg);
+               break;
+       case FSL_HV_IOCTL_PARTITION_STOP:
+               ret = ioctl_stop(arg);
+               break;
+       case FSL_HV_IOCTL_MEMCPY:
+               ret = ioctl_memcpy(arg);
+               break;
+       case FSL_HV_IOCTL_DOORBELL:
+               ret = ioctl_doorbell(arg);
+               break;
+       case FSL_HV_IOCTL_GETPROP:
+               ret = ioctl_dtprop(arg, 0);
+               break;
+       case FSL_HV_IOCTL_SETPROP:
+               ret = ioctl_dtprop(arg, 1);
+               break;
+       default:
+               pr_debug("fsl-hv: bad ioctl dir=%u type=%u cmd=%u size=%u\n",
+                        _IOC_DIR(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd),
+                        _IOC_SIZE(cmd));
+               return -ENOTTY;
+       }
+
+       return ret;
+}
+
+/* Linked list of processes that have us open */
+static struct list_head db_list;
+
+/* spinlock for db_list */
+static DEFINE_SPINLOCK(db_list_lock);
+
+/* The size of the doorbell event queue.  This must be a power of two. */
+#define QSIZE  16
+
+/* Returns the next head/tail pointer, wrapping around the queue if necessary */
+#define nextp(x) (((x) + 1) & (QSIZE - 1))
+
+/* Per-open data structure */
+struct doorbell_queue {
+       struct list_head list;
+       spinlock_t lock;
+       wait_queue_head_t wait;
+       unsigned int head;
+       unsigned int tail;
+       uint32_t q[QSIZE];
+};
+
+/* Linked list of ISRs that we registered */
+struct list_head isr_list;
+
+/* Per-ISR data structure */
+struct doorbell_isr {
+       struct list_head list;
+       unsigned int irq;
+       uint32_t doorbell;      /* The doorbell handle */
+       uint32_t partition;     /* The partition handle, if used */
+};
+
+/*
+ * Add a doorbell to all of the doorbell queues
+ */
+static void fsl_hv_queue_doorbell(uint32_t doorbell)
+{
+       struct doorbell_queue *dbq;
+       unsigned long flags;
+
+       /* Prevent another core from modifying db_list */
+       spin_lock_irqsave(&db_list_lock, flags);
+
+       list_for_each_entry(dbq, &db_list, list) {
+               if (dbq->head != nextp(dbq->tail)) {
+                       dbq->q[dbq->tail] = doorbell;
+                       /*
+                        * This memory barrier eliminates the need to grab
+                        * the spinlock for dbq.
+                        */
+                       smp_wmb();
+                       dbq->tail = nextp(dbq->tail);
+                       wake_up_interruptible(&dbq->wait);
+               }
+       }
+
+       spin_unlock_irqrestore(&db_list_lock, flags);
+}
+
+/*
+ * Interrupt handler for all doorbells
+ *
+ * We use the same interrupt handler for all doorbells.  Whenever a doorbell
+ * is rung, and we receive an interrupt, we just put the handle for that
+ * doorbell (passed to us as *data) into all of the queues.
+ */
+static irqreturn_t fsl_hv_isr(int irq, void *data)
+{
+       fsl_hv_queue_doorbell((uintptr_t) data);
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * State change thread function
+ *
+ * The state change notification arrives in an interrupt, but we can't call
+ * blocking_notifier_call_chain() in an interrupt handler.  We could call
+ * atomic_notifier_call_chain(), but that would require the clients' call-back
+ * function to run in interrupt context.  Since we don't want to impose that
+ * restriction on the clients, we use a threaded IRQ to process the
+ * notification in kernel context.
+ */
+static irqreturn_t fsl_hv_state_change_thread(int irq, void *data)
+{
+       struct doorbell_isr *dbisr = data;
+
+       blocking_notifier_call_chain(&failover_subscribers, dbisr->partition,
+                                    NULL);
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * Interrupt handler for state-change doorbells
+ */
+static irqreturn_t fsl_hv_state_change_isr(int irq, void *data)
+{
+       unsigned int status;
+       struct doorbell_isr *dbisr = data;
+       int ret;
+
+       /* It's still a doorbell, so add it to all the queues. */
+       fsl_hv_queue_doorbell(dbisr->doorbell);
+
+       /* Determine the new state, and if it's stopped, notify the clients. */
+       ret = fh_partition_get_status(dbisr->partition, &status);
+       if (!ret && (status == FH_PARTITION_STOPPED))
+               return IRQ_WAKE_THREAD;
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * Returns a bitmask indicating whether a read will block
+ */
+static unsigned int fsl_hv_poll(struct file *filp, struct poll_table_struct *p)
+{
+       struct doorbell_queue *dbq = filp->private_data;
+       unsigned long flags;
+       unsigned int mask;
+
+       spin_lock_irqsave(&dbq->lock, flags);
+
+       poll_wait(filp, &dbq->wait, p);
+       mask = (dbq->head == dbq->tail) ? 0 : (POLLIN | POLLRDNORM);
+
+       spin_unlock_irqrestore(&dbq->lock, flags);
+
+       return mask;
+}
+
+/*
+ * Return the handles for any incoming doorbells
+ *
+ * If there are doorbell handles in the queue for this open instance, then
+ * return them to the caller as an array of 32-bit integers.  Otherwise,
+ * block until there is at least one handle to return.
+ */
+static ssize_t fsl_hv_read(struct file *filp, char __user *buf, size_t len,
+                          loff_t *off)
+{
+       struct doorbell_queue *dbq = filp->private_data;
+       uint32_t __user *p = (uint32_t __user *) buf; /* for put_user() */
+       unsigned long flags;
+       ssize_t count = 0;
+
+       /* Make sure we stop when the user buffer is full. */
+       while (len >= sizeof(uint32_t)) {
+               uint32_t dbell; /* Local copy of doorbell queue data */
+
+               spin_lock_irqsave(&dbq->lock, flags);
+
+               /*
+                * If the queue is empty, then either we're done or we need
+                * to block.  If the application specified O_NONBLOCK, then
+                * we return the appropriate error code.
+                */
+               if (dbq->head == dbq->tail) {
+                       spin_unlock_irqrestore(&dbq->lock, flags);
+                       if (count)
+                               break;
+                       if (filp->f_flags & O_NONBLOCK)
+                               return -EAGAIN;
+                       if (wait_event_interruptible(dbq->wait,
+                                                    dbq->head != dbq->tail))
+                               return -ERESTARTSYS;
+                       continue;
+               }
+
+               /*
+                * Even though we have an smp_wmb() in the ISR, the core
+                * might speculatively execute the "dbell = ..." below while
+                * it's evaluating the if-statement above.  In that case, the
+                * value put into dbell could be stale if the core accepts the
+                * speculation. To prevent that, we need a read memory barrier
+                * here as well.
+                */
+               smp_rmb();
+
+               /* Copy the data to a temporary local buffer, because
+                * we can't call copy_to_user() from inside a spinlock
+                */
+               dbell = dbq->q[dbq->head];
+               dbq->head = nextp(dbq->head);
+
+               spin_unlock_irqrestore(&dbq->lock, flags);
+
+               if (put_user(dbell, p))
+                       return -EFAULT;
+               p++;
+               count += sizeof(uint32_t);
+               len -= sizeof(uint32_t);
+       }
+
+       return count;
+}
+
+/*
+ * Open the driver and prepare for reading doorbells.
+ *
+ * Every time an application opens the driver, we create a doorbell queue
+ * for that file handle.  This queue is used for any incoming doorbells.
+ */
+static int fsl_hv_open(struct inode *inode, struct file *filp)
+{
+       struct doorbell_queue *dbq;
+       unsigned long flags;
+       int ret = 0;
+
+       dbq = kzalloc(sizeof(struct doorbell_queue), GFP_KERNEL);
+       if (!dbq) {
+               pr_err("fsl-hv: out of memory\n");
+               return -ENOMEM;
+       }
+
+       spin_lock_init(&dbq->lock);
+       init_waitqueue_head(&dbq->wait);
+
+       spin_lock_irqsave(&db_list_lock, flags);
+       list_add(&dbq->list, &db_list);
+       spin_unlock_irqrestore(&db_list_lock, flags);
+
+       filp->private_data = dbq;
+
+       return ret;
+}
+
+/*
+ * Close the driver
+ */
+static int fsl_hv_close(struct inode *inode, struct file *filp)
+{
+       struct doorbell_queue *dbq = filp->private_data;
+       unsigned long flags;
+
+       int ret = 0;
+
+       spin_lock_irqsave(&db_list_lock, flags);
+       list_del(&dbq->list);
+       spin_unlock_irqrestore(&db_list_lock, flags);
+
+       kfree(dbq);
+
+       return ret;
+}
+
+static const struct file_operations fsl_hv_fops = {
+       .owner = THIS_MODULE,
+       .open = fsl_hv_open,
+       .release = fsl_hv_close,
+       .poll = fsl_hv_poll,
+       .read = fsl_hv_read,
+       .unlocked_ioctl = fsl_hv_ioctl,
+};
+
+static struct miscdevice fsl_hv_misc_dev = {
+       MISC_DYNAMIC_MINOR,
+       "fsl-hv",
+       &fsl_hv_fops
+};
+
+static irqreturn_t fsl_hv_shutdown_isr(int irq, void *data)
+{
+       orderly_poweroff(false);
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * Returns the handle of the parent of the given node
+ *
+ * The handle is the value of the 'hv-handle' property
+ */
+static int get_parent_handle(struct device_node *np)
+{
+       struct device_node *parent;
+       const uint32_t *prop;
+       uint32_t handle;
+       int len;
+
+       parent = of_get_parent(np);
+       if (!parent)
+               /* It's not really possible for this to fail */
+               return -ENODEV;
+
+       /*
+        * The proper name for the handle property is "hv-handle", but some
+        * older versions of the hypervisor used "reg".
+        */
+       prop = of_get_property(parent, "hv-handle", &len);
+       if (!prop)
+               prop = of_get_property(parent, "reg", &len);
+
+       if (!prop || (len != sizeof(uint32_t))) {
+               /* This can happen only if the node is malformed */
+               of_node_put(parent);
+               return -ENODEV;
+       }
+
+       handle = be32_to_cpup(prop);
+       of_node_put(parent);
+
+       return handle;
+}
+
+/*
+ * Register a callback for failover events
+ *
+ * This function is called by device drivers to register their callback
+ * functions for fail-over events.
+ */
+int fsl_hv_failover_register(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&failover_subscribers, nb);
+}
+EXPORT_SYMBOL(fsl_hv_failover_register);
+
+/*
+ * Unregister a callback for failover events
+ */
+int fsl_hv_failover_unregister(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_unregister(&failover_subscribers, nb);
+}
+EXPORT_SYMBOL(fsl_hv_failover_unregister);
+
+/*
+ * Return TRUE if we're running under FSL hypervisor
+ *
+ * This function checks to see if we're running under the Freescale
+ * hypervisor, and returns zero if we're not, or non-zero if we are.
+ *
+ * First, it checks if MSR[GS]==1, which means we're running under some
+ * hypervisor.  Then it checks if there is a hypervisor node in the device
+ * tree.  Currently, that means there needs to be a node in the root called
+ * "hypervisor" and which has a property named "fsl,hv-version".
+ */
+static int has_fsl_hypervisor(void)
+{
+       struct device_node *node;
+       int ret;
+
+       if (!(mfmsr() & MSR_GS))
+               return 0;
+
+       node = of_find_node_by_path("/hypervisor");
+       if (!node)
+               return 0;
+
+       ret = of_find_property(node, "fsl,hv-version", NULL) != NULL;
+
+       of_node_put(node);
+
+       return ret;
+}
+
+/*
+ * Freescale hypervisor management driver init
+ *
+ * This function is called when this module is loaded.
+ *
+ * Register ourselves as a miscellaneous driver.  This will register the
+ * fops structure and create the right sysfs entries for udev.
+ */
+static int __init fsl_hypervisor_init(void)
+{
+       struct device_node *np;
+       struct doorbell_isr *dbisr, *n;
+       int ret;
+
+       pr_info("Freescale hypervisor management driver\n");
+
+       if (!has_fsl_hypervisor()) {
+               pr_info("fsl-hv: no hypervisor found\n");
+               return -ENODEV;
+       }
+
+       ret = misc_register(&fsl_hv_misc_dev);
+       if (ret) {
+               pr_err("fsl-hv: cannot register device\n");
+               return ret;
+       }
+
+       INIT_LIST_HEAD(&db_list);
+       INIT_LIST_HEAD(&isr_list);
+
+       for_each_compatible_node(np, NULL, "epapr,hv-receive-doorbell") {
+               unsigned int irq;
+               const uint32_t *handle;
+
+               handle = of_get_property(np, "interrupts", NULL);
+               irq = irq_of_parse_and_map(np, 0);
+               if (!handle || (irq == NO_IRQ)) {
+                       pr_err("fsl-hv: no 'interrupts' property in %s node\n",
+                               np->full_name);
+                       continue;
+               }
+
+               dbisr = kzalloc(sizeof(*dbisr), GFP_KERNEL);
+               if (!dbisr)
+                       goto out_of_memory;
+
+               dbisr->irq = irq;
+               dbisr->doorbell = be32_to_cpup(handle);
+
+               if (of_device_is_compatible(np, "fsl,hv-shutdown-doorbell")) {
+                       /* The shutdown doorbell gets its own ISR */
+                       ret = request_irq(irq, fsl_hv_shutdown_isr, 0,
+                                         np->name, NULL);
+               } else if (of_device_is_compatible(np,
+                       "fsl,hv-state-change-doorbell")) {
+                       /*
+                        * The state change doorbell triggers a notification if
+                        * the state of the managed partition changes to
+                        * "stopped". We need a separate interrupt handler for
+                        * that, and we also need to know the handle of the
+                        * target partition, not just the handle of the
+                        * doorbell.
+                        */
+                       dbisr->partition = ret = get_parent_handle(np);
+                       if (ret < 0) {
+                               pr_err("fsl-hv: node %s has missing or "
+                                      "malformed parent\n", np->full_name);
+                               kfree(dbisr);
+                               continue;
+                       }
+                       ret = request_threaded_irq(irq, fsl_hv_state_change_isr,
+                                                  fsl_hv_state_change_thread,
+                                                  0, np->name, dbisr);
+               } else
+                       ret = request_irq(irq, fsl_hv_isr, 0, np->name, dbisr);
+
+               if (ret < 0) {
+                       pr_err("fsl-hv: could not request irq %u for node %s\n",
+                              irq, np->full_name);
+                       kfree(dbisr);
+                       continue;
+               }
+
+               list_add(&dbisr->list, &isr_list);
+
+               pr_info("fsl-hv: registered handler for doorbell %u\n",
+                       dbisr->doorbell);
+       }
+
+       return 0;
+
+out_of_memory:
+       list_for_each_entry_safe(dbisr, n, &isr_list, list) {
+               free_irq(dbisr->irq, dbisr);
+               list_del(&dbisr->list);
+               kfree(dbisr);
+       }
+
+       misc_deregister(&fsl_hv_misc_dev);
+
+       return -ENOMEM;
+}
+
+/*
+ * Freescale hypervisor management driver termination
+ *
+ * This function is called when this driver is unloaded.
+ */
+static void __exit fsl_hypervisor_exit(void)
+{
+       struct doorbell_isr *dbisr, *n;
+
+       list_for_each_entry_safe(dbisr, n, &isr_list, list) {
+               free_irq(dbisr->irq, dbisr);
+               list_del(&dbisr->list);
+               kfree(dbisr);
+       }
+
+       misc_deregister(&fsl_hv_misc_dev);
+}
+
+module_init(fsl_hypervisor_init);
+module_exit(fsl_hypervisor_exit);
+
+MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
+MODULE_DESCRIPTION("Freescale hypervisor management driver");
+MODULE_LICENSE("GPL v2");
index 01f6362750570e19e01c01d5fbc22f50f63cbed6..619b5657af77b232541a56a6e3cd06d7f2693210 100644 (file)
@@ -135,6 +135,7 @@ header-y += firewire-cdev.h
 header-y += firewire-constants.h
 header-y += flat.h
 header-y += fs.h
+header-y += fsl_hypervisor.h
 header-y += fuse.h
 header-y += futex.h
 header-y += gameport.h
diff --git a/include/linux/fsl_hypervisor.h b/include/linux/fsl_hypervisor.h
new file mode 100644 (file)
index 0000000..1cebaee
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Freescale hypervisor ioctl and kernel interface
+ *
+ * Copyright (C) 2008-2011 Freescale Semiconductor, Inc.
+ * Author: Timur Tabi <timur@freescale.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Freescale Semiconductor nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") as published by the Free Software
+ * Foundation, either version 2 of that License or (at your option) any
+ * later version.
+ *
+ * This software is provided by Freescale Semiconductor "as is" and any
+ * express or implied warranties, including, but not limited to, the implied
+ * warranties of merchantability and fitness for a particular purpose are
+ * disclaimed. In no event shall Freescale Semiconductor be liable for any
+ * direct, indirect, incidental, special, exemplary, or consequential damages
+ * (including, but not limited to, procurement of substitute goods or services;
+ * loss of use, data, or profits; or business interruption) however caused and
+ * on any theory of liability, whether in contract, strict liability, or tort
+ * (including negligence or otherwise) arising in any way out of the use of this
+ * software, even if advised of the possibility of such damage.
+ *
+ * This file is used by the Freescale hypervisor management driver.  It can
+ * also be included by applications that need to communicate with the driver
+ * via the ioctl interface.
+ */
+
+#ifndef FSL_HYPERVISOR_H
+#define FSL_HYPERVISOR_H
+
+#include <linux/types.h>
+
+/**
+ * struct fsl_hv_ioctl_restart - restart a partition
+ * @ret: return error code from the hypervisor
+ * @partition: the ID of the partition to restart, or -1 for the
+ *             calling partition
+ *
+ * Used by FSL_HV_IOCTL_PARTITION_RESTART
+ */
+struct fsl_hv_ioctl_restart {
+       __u32 ret;
+       __u32 partition;
+};
+
+/**
+ * struct fsl_hv_ioctl_status - get a partition's status
+ * @ret: return error code from the hypervisor
+ * @partition: the ID of the partition to query, or -1 for the
+ *             calling partition
+ * @status: The returned status of the partition
+ *
+ * Used by FSL_HV_IOCTL_PARTITION_GET_STATUS
+ *
+ * Values of 'status':
+ *    0 = Stopped
+ *    1 = Running
+ *    2 = Starting
+ *    3 = Stopping
+ */
+struct fsl_hv_ioctl_status {
+       __u32 ret;
+       __u32 partition;
+       __u32 status;
+};
+
+/**
+ * struct fsl_hv_ioctl_start - start a partition
+ * @ret: return error code from the hypervisor
+ * @partition: the ID of the partition to control
+ * @entry_point: The offset within the guest IMA to start execution
+ * @load: If non-zero, reload the partition's images before starting
+ *
+ * Used by FSL_HV_IOCTL_PARTITION_START
+ */
+struct fsl_hv_ioctl_start {
+       __u32 ret;
+       __u32 partition;
+       __u32 entry_point;
+       __u32 load;
+};
+
+/**
+ * struct fsl_hv_ioctl_stop - stop a partition
+ * @ret: return error code from the hypervisor
+ * @partition: the ID of the partition to stop, or -1 for the calling
+ *             partition
+ *
+ * Used by FSL_HV_IOCTL_PARTITION_STOP
+ */
+struct fsl_hv_ioctl_stop {
+       __u32 ret;
+       __u32 partition;
+};
+
+/**
+ * struct fsl_hv_ioctl_memcpy - copy memory between partitions
+ * @ret: return error code from the hypervisor
+ * @source: the partition ID of the source partition, or -1 for this
+ *          partition
+ * @target: the partition ID of the target partition, or -1 for this
+ *          partition
+ * @reserved: reserved, must be set to 0
+ * @local_addr: user-space virtual address of a buffer in the local
+ *              partition
+ * @remote_addr: guest physical address of a buffer in the
+ *           remote partition
+ * @count: the number of bytes to copy.  Both the local and remote
+ *         buffers must be at least 'count' bytes long
+ *
+ * Used by FSL_HV_IOCTL_MEMCPY
+ *
+ * The 'local' partition is the partition that calls this ioctl.  The
+ * 'remote' partition is a different partition.  The data is copied from
+ * the 'source' paritition' to the 'target' partition.
+ *
+ * The buffer in the remote partition must be guest physically
+ * contiguous.
+ *
+ * This ioctl does not support copying memory between two remote
+ * partitions or within the same partition, so either 'source' or
+ * 'target' (but not both) must be -1.  In other words, either
+ *
+ *      source == local and target == remote
+ * or
+ *      source == remote and target == local
+ */
+struct fsl_hv_ioctl_memcpy {
+       __u32 ret;
+       __u32 source;
+       __u32 target;
+       __u32 reserved; /* padding to ensure local_vaddr is aligned */
+       __u64 local_vaddr;
+       __u64 remote_paddr;
+       __u64 count;
+};
+
+/**
+ * struct fsl_hv_ioctl_doorbell - ring a doorbell
+ * @ret: return error code from the hypervisor
+ * @doorbell: the handle of the doorbell to ring doorbell
+ *
+ * Used by FSL_HV_IOCTL_DOORBELL
+ */
+struct fsl_hv_ioctl_doorbell {
+       __u32 ret;
+       __u32 doorbell;
+};
+
+/**
+ * struct fsl_hv_ioctl_prop - get/set a device tree property
+ * @ret: return error code from the hypervisor
+ * @handle: handle of partition whose tree to access
+ * @path: virtual address of path name of node to access
+ * @propname: virtual address of name of property to access
+ * @propval: virtual address of property data buffer
+ * @proplen: Size of property data buffer
+ * @reserved: reserved, must be set to 0
+ *
+ * Used by FSL_HV_IOCTL_DOORBELL
+ */
+struct fsl_hv_ioctl_prop {
+       __u32 ret;
+       __u32 handle;
+       __u64 path;
+       __u64 propname;
+       __u64 propval;
+       __u32 proplen;
+       __u32 reserved; /* padding to ensure structure is aligned */
+};
+
+/* The ioctl type, documented in ioctl-number.txt */
+#define FSL_HV_IOCTL_TYPE      0xAF
+
+/* Restart another partition */
+#define FSL_HV_IOCTL_PARTITION_RESTART \
+       _IOWR(FSL_HV_IOCTL_TYPE, 1, struct fsl_hv_ioctl_restart)
+
+/* Get a partition's status */
+#define FSL_HV_IOCTL_PARTITION_GET_STATUS \
+       _IOWR(FSL_HV_IOCTL_TYPE, 2, struct fsl_hv_ioctl_status)
+
+/* Boot another partition */
+#define FSL_HV_IOCTL_PARTITION_START \
+       _IOWR(FSL_HV_IOCTL_TYPE, 3, struct fsl_hv_ioctl_start)
+
+/* Stop this or another partition */
+#define FSL_HV_IOCTL_PARTITION_STOP \
+       _IOWR(FSL_HV_IOCTL_TYPE, 4, struct fsl_hv_ioctl_stop)
+
+/* Copy data from one partition to another */
+#define FSL_HV_IOCTL_MEMCPY \
+       _IOWR(FSL_HV_IOCTL_TYPE, 5, struct fsl_hv_ioctl_memcpy)
+
+/* Ring a doorbell */
+#define FSL_HV_IOCTL_DOORBELL \
+       _IOWR(FSL_HV_IOCTL_TYPE, 6, struct fsl_hv_ioctl_doorbell)
+
+/* Get a property from another guest's device tree */
+#define FSL_HV_IOCTL_GETPROP \
+       _IOWR(FSL_HV_IOCTL_TYPE, 7, struct fsl_hv_ioctl_prop)
+
+/* Set a property in another guest's device tree */
+#define FSL_HV_IOCTL_SETPROP \
+       _IOWR(FSL_HV_IOCTL_TYPE, 8, struct fsl_hv_ioctl_prop)
+
+#ifdef __KERNEL__
+
+/**
+ * fsl_hv_event_register() - register a callback for failover events
+ * @nb: pointer to caller-supplied notifier_block structure
+ *
+ * This function is called by device drivers to register their callback
+ * functions for fail-over events.
+ *
+ * The caller should allocate a notifier_block object and initialize the
+ * 'priority' and 'notifier_call' fields.
+ */
+int fsl_hv_failover_register(struct notifier_block *nb);
+
+/**
+ * fsl_hv_event_unregister() - unregister a callback for failover events
+ * @nb: the same 'nb' used in previous fsl_hv_failover_register call
+ */
+int fsl_hv_failover_unregister(struct notifier_block *nb);
+
+#endif
+
+#endif
index ede1a80e3358aeb4c63fc2185b2e53cedc4f4fde..27bb05aae70d48eea4b151522d204e4e00b014e8 100644 (file)
@@ -42,6 +42,7 @@ extern void platform_device_unregister(struct platform_device *);
 extern struct bus_type platform_bus_type;
 extern struct device platform_bus;
 
+extern void arch_setup_pdev_archdata(struct platform_device *);
 extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
 extern int platform_get_irq(struct platform_device *, unsigned int);
 extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);