Commit 5f3d2f2e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

Pull powerpc updates from Benjamin Herrenschmidt:
 "Some highlights in addition to the usual batch of fixes:

   - 64TB address space support for 64-bit processes by Aneesh Kumar

   - Gavin Shan did a major cleanup & re-organization of our EEH support
     code (IBM fancy PCI error handling & recovery infrastructure) which
     paves the way for supporting different platform backends, along
     with some rework of the PCIe code for the PowerNV platform in order
     to remove home made resource allocations and instead use the
     generic code (which is possible after some small improvements to it
     done by Gavin).

   - Uprobes support by Ananth N Mavinakayanahalli

   - A pile of embedded updates from Freescale folks, including new SoC
     and board supports, more KVM stuff including preparing for 64-bit
     BookE KVM support, ePAPR 1.1 updates, etc..."

Fixup trivial conflicts in drivers/scsi/ipr.c

* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (146 commits)
  powerpc/iommu: Fix multiple issues with IOMMU pools code
  powerpc: Fix VMX fix for memcpy case
  driver/mtd:IFC NAND:Initialise internal SRAM before any write
  powerpc/fsl-pci: use 'Header Type' to identify PCIE mode
  powerpc/eeh: Don't release eeh_mutex in eeh_phb_pe_get
  powerpc: Remove tlb batching hack for nighthawk
  powerpc: Set paca->data_offset = 0 for boot cpu
  powerpc/perf: Sample only if SIAR-Valid bit is set in P7+
  powerpc/fsl-pci: fix warning when CONFIG_SWIOTLB is disabled
  powerpc/mpc85xx: Update interrupt handling for IFC controller
  powerpc/85xx: Enable USB support in p1023rds_defconfig
  powerpc/smp: Do not disable IPI interrupts during suspend
  powerpc/eeh: Fix crash on converting OF node to edev
  powerpc/eeh: Lock module while handling EEH event
  powerpc/kprobe: Don't emulate store when kprobe stwu r1
  powerpc/kprobe: Complete kprobe and migrate exception frame
  powerpc/kprobe: Introduce a new thread flag
  powerpc: Remove unused __get_user64() and __put_user64()
  powerpc/eeh: Global mutex to protect PE tree
  powerpc/eeh: Remove EEH PE for normal PCI hotplug
  ...
parents 283dbd82 d900bd73
IFM camera sensor interface on mpc5200 LocalPlus bus
Required properties:
- compatible: "ifm,o2d-csi"
- reg: specifies sensor chip select number and associated address range
- interrupts: external interrupt line number and interrupt sense mode
of the interrupt line signaling frame valid events
- gpios: three gpio-specifiers for "capture", "reset" and "master enable"
GPIOs (strictly in this order).
- ifm,csi-clk-handle: the phandle to a node in the DT describing the sensor
clock generator. This node is usually a general purpose timer controller.
- ifm,csi-addr-bus-width: address bus width (valid values are 16, 24, 25)
- ifm,csi-data-bus-width: data bus width (valid values are 8 and 16)
- ifm,csi-wait-cycles: sensor bus wait cycles
Optional properties:
- ifm,csi-byte-swap: if this property is present, the byte swapping on
the bus will be enabled.
Example:
csi@3,0 {
compatible = "ifm,o2d-csi";
reg = <3 0 0x00100000>; /* CS 3, 1 MiB range */
interrupts = <1 1 2>; /* IRQ1, edge falling */
ifm,csi-clk-handle = <&timer7>;
gpios = <&gpio_simple 23 0 /* image_capture */
&gpio_simple 26 0 /* image_reset */
&gpio_simple 29 0>; /* image_master_en */
ifm,csi-addr-bus-width = <24>;
ifm,csi-data-bus-width = <8>;
ifm,csi-wait-cycles = <0>;
};
The base address of the used chip select is specified in the
ranges property of the parent localbus node, for example:
ranges = <0 0 0xff000000 0x01000000
3 0 0xe3000000 0x00100000>;
...@@ -12,9 +12,12 @@ Properties: ...@@ -12,9 +12,12 @@ Properties:
- #size-cells : Either one or two, depending on how large each chipselect - #size-cells : Either one or two, depending on how large each chipselect
can be. can be.
- reg : Offset and length of the register set for the device - reg : Offset and length of the register set for the device
- interrupts : IFC has two interrupts. The first one is the "common" - interrupts: IFC may have one or two interrupts. If two interrupt
interrupt(CM_EVTER_STAT), and second is the NAND interrupt specifiers are present, the first is the "common"
(NAND_EVTER_STAT). interrupt (CM_EVTER_STAT), and the second is the NAND
interrupt (NAND_EVTER_STAT). If there is only one,
that interrupt reports both types of event.
- ranges : Each range corresponds to a single chipselect, and covers - ranges : Each range corresponds to a single chipselect, and covers
the entire access window as configured. the entire access window as configured.
......
...@@ -215,7 +215,8 @@ config ARCH_HIBERNATION_POSSIBLE ...@@ -215,7 +215,8 @@ config ARCH_HIBERNATION_POSSIBLE
config ARCH_SUSPEND_POSSIBLE config ARCH_SUSPEND_POSSIBLE
def_bool y def_bool y
depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \ depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \
(PPC_85xx && !SMP) || PPC_86xx || PPC_PSERIES || 44x || 40x (PPC_85xx && !PPC_E500MC) || PPC_86xx || PPC_PSERIES \
|| 44x || 40x
config PPC_DCR_NATIVE config PPC_DCR_NATIVE
bool bool
...@@ -239,6 +240,9 @@ config PPC_OF_PLATFORM_PCI ...@@ -239,6 +240,9 @@ config PPC_OF_PLATFORM_PCI
config ARCH_SUPPORTS_DEBUG_PAGEALLOC config ARCH_SUPPORTS_DEBUG_PAGEALLOC
def_bool y def_bool y
config ARCH_SUPPORTS_UPROBES
def_bool y
config PPC_ADV_DEBUG_REGS config PPC_ADV_DEBUG_REGS
bool bool
depends on 40x || BOOKE depends on 40x || BOOKE
...@@ -325,7 +329,8 @@ config SWIOTLB ...@@ -325,7 +329,8 @@ config SWIOTLB
config HOTPLUG_CPU config HOTPLUG_CPU
bool "Support for enabling/disabling CPUs" bool "Support for enabling/disabling CPUs"
depends on SMP && HOTPLUG && EXPERIMENTAL && (PPC_PSERIES || PPC_PMAC || PPC_POWERNV) depends on SMP && HOTPLUG && EXPERIMENTAL && (PPC_PSERIES || \
PPC_PMAC || PPC_POWERNV || (PPC_85xx && !PPC_E500MC))
---help--- ---help---
Say Y here to be able to disable and re-enable individual Say Y here to be able to disable and re-enable individual
CPUs at runtime on SMP machines. CPUs at runtime on SMP machines.
...@@ -557,6 +562,14 @@ config SCHED_SMT ...@@ -557,6 +562,14 @@ config SCHED_SMT
when dealing with POWER5 cpus at a cost of slightly increased when dealing with POWER5 cpus at a cost of slightly increased
overhead in some places. If unsure say N here. overhead in some places. If unsure say N here.
config PPC_DENORMALISATION
bool "PowerPC denormalisation exception handling"
depends on PPC_BOOK3S_64
default "n"
---help---
Add support for handling denormalisation of single precision
values. Useful for bare metal only. If unsure say Y here.
config CMDLINE_BOOL config CMDLINE_BOOL
bool "Default bootloader kernel arguments" bool "Default bootloader kernel arguments"
......
...@@ -107,6 +107,7 @@ src-boot := $(addprefix $(obj)/, $(src-boot)) ...@@ -107,6 +107,7 @@ src-boot := $(addprefix $(obj)/, $(src-boot))
obj-boot := $(addsuffix .o, $(basename $(src-boot))) obj-boot := $(addsuffix .o, $(basename $(src-boot)))
obj-wlib := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-wlib)))) obj-wlib := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-wlib))))
obj-plat := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-plat)))) obj-plat := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-plat))))
obj-plat: $(libfdt)
quiet_cmd_copy_zlib = COPY $@ quiet_cmd_copy_zlib = COPY $@
cmd_copy_zlib = sed "s@__used@@;s@<linux/\([^>]*\).*@\"\1\"@" $< > $@ cmd_copy_zlib = sed "s@__used@@;s@<linux/\([^>]*\).*@\"\1\"@" $< > $@
......
/*
* e500mc Power ISA Device Tree Source (include)
*
* Copyright 2012 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.
*/
/ {
cpus {
power-isa-version = "2.06";
power-isa-b; // Base
power-isa-e; // Embedded
power-isa-atb; // Alternate Time Base
power-isa-cs; // Cache Specification
power-isa-ds; // Decorated Storage
power-isa-e.ed; // Embedded.Enhanced Debug
power-isa-e.pd; // Embedded.External PID
power-isa-e.hv; // Embedded.Hypervisor
power-isa-e.le; // Embedded.Little-Endian
power-isa-e.pm; // Embedded.Performance Monitor
power-isa-e.pc; // Embedded.Processor Control
power-isa-ecl; // Embedded Cache Locking
power-isa-exp; // External Proxy
power-isa-fp; // Floating Point
power-isa-fp.r; // Floating Point.Record
power-isa-mmc; // Memory Coherence
power-isa-scpm; // Store Conditional Page Mobility
power-isa-wt; // Wait
mmu-type = "power-embedded";
};
};
/*
* e500v2 Power ISA Device Tree Source (include)
*
* Copyright 2012 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.
*/
/ {
cpus {
power-isa-version = "2.03";
power-isa-b; // Base
power-isa-e; // Embedded
power-isa-atb; // Alternate Time Base
power-isa-cs; // Cache Specification
power-isa-e.le; // Embedded.Little-Endian
power-isa-e.pm; // Embedded.Performance Monitor
power-isa-ecl; // Embedded Cache Locking
power-isa-mmc; // Memory Coherence
power-isa-sp; // Signal Processing Engine
power-isa-sp.fd; // SPE.Embedded Float Scalar Double
power-isa-sp.fs; // SPE.Embedded Float Scalar Single
power-isa-sp.fv; // SPE.Embedded Float Vector
mmu-type = "power-embedded";
};
};
/*
* e5500 Power ISA Device Tree Source (include)
*
* Copyright 2012 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.
*/
/ {
cpus {
power-isa-version = "2.06";
power-isa-b; // Base
power-isa-e; // Embedded
power-isa-atb; // Alternate Time Base
power-isa-cs; // Cache Specification
power-isa-ds; // Decorated Storage
power-isa-e.ed; // Embedded.Enhanced Debug
power-isa-e.pd; // Embedded.External PID
power-isa-e.hv; // Embedded.Hypervisor
power-isa-e.le; // Embedded.Little-Endian
power-isa-e.pm; // Embedded.Performance Monitor
power-isa-e.pc; // Embedded.Processor Control
power-isa-ecl; // Embedded Cache Locking
power-isa-exp; // External Proxy
power-isa-fp; // Floating Point
power-isa-fp.r; // Floating Point.Record
power-isa-mmc; // Memory Coherence
power-isa-scpm; // Store Conditional Page Mobility
power-isa-wt; // Wait
power-isa-64; // 64-bit
mmu-type = "power-embedded";
};
};
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8536"; compatible = "fsl,MPC8536";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8544"; compatible = "fsl,MPC8544";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8548"; compatible = "fsl,MPC8548";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8568"; compatible = "fsl,MPC8568";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8569"; compatible = "fsl,MPC8569";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,MPC8572"; compatible = "fsl,MPC8572";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P1010"; compatible = "fsl,P1010";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P1020"; compatible = "fsl,P1020";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P1021"; compatible = "fsl,P1021";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P1022"; compatible = "fsl,P1022";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P1023"; compatible = "fsl,P1023";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500v2_power_isa.dtsi"
/ { / {
compatible = "fsl,P2020"; compatible = "fsl,P2020";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500mc_power_isa.dtsi"
/ { / {
compatible = "fsl,P2041"; compatible = "fsl,P2041";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500mc_power_isa.dtsi"
/ { / {
compatible = "fsl,P3041"; compatible = "fsl,P3041";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e500mc_power_isa.dtsi"
/ { / {
compatible = "fsl,P4080"; compatible = "fsl,P4080";
#address-cells = <2>; #address-cells = <2>;
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
*/ */
/dts-v1/; /dts-v1/;
/include/ "e5500_power_isa.dtsi"
/ { / {
compatible = "fsl,P5020"; compatible = "fsl,P5020";
#address-cells = <2>; #address-cells = <2>;
......
/*
* P5040 Silicon/SoC Device Tree Source (post include)
*
* Copyright 2012 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.
*/
&lbc {
compatible = "fsl,p5040-elbc", "fsl,elbc", "simple-bus";
interrupts = <25 2 0 0>;
#address-cells = <2>;
#size-cells = <1>;
};
/* controller at 0x200000 */
&pci0 {
compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4";
device_type = "pci";
#size-cells = <2>;
#address-cells = <3>;
bus-range = <0x0 0xff>;
clock-frequency = <33333333>;
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
>;
};
};
/* controller at 0x201000 */
&pci1 {
compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4";
device_type = "pci";
#size-cells = <2>;
#address-cells = <3>;
bus-range = <0 0xff>;
clock-frequency = <33333333>;
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
>;
};
};
/* controller at 0x202000 */
&pci2 {
compatible = "fsl,p5040-pcie", "fsl,qoriq-pcie-v2.4";
device_type = "pci";
#size-cells = <2>;
#address-cells = <3>;
bus-range = <0x0 0xff>;
clock-frequency = <33333333>;
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
>;
};
};
&dcsr {
#address-cells = <1>;
#size-cells = <1>;
compatible = "fsl,dcsr", "simple-bus";
dcsr-epu@0 {
compatible = "fsl,dcsr-epu";
interrupts = <52 2 0 0
84 2 0 0
85 2 0 0>;
reg = <0x0 0x1000>;
};
dcsr-npc {
compatible = "fsl,dcsr-npc";
reg = <0x1000 0x1000 0x1000000 0x8000>;
};
dcsr-nxc@2000 {
compatible = "fsl,dcsr-nxc";
reg = <0x2000 0x1000>;
};
dcsr-corenet {
compatible = "fsl,dcsr-corenet";
reg = <0x8000 0x1000 0xB0000 0x1000>;
};
dcsr-dpaa@9000 {
compatible = "fsl,p5040-dcsr-dpaa", "fsl,dcsr-dpaa";
reg = <0x9000 0x1000>;
};
dcsr-ocn@11000 {
compatible = "fsl,p5040-dcsr-ocn", "fsl,dcsr-ocn";
reg = <0x11000 0x1000>;
};
dcsr-ddr@12000 {
compatible = "fsl,dcsr-ddr";
dev-handle = <&ddr1>;
reg = <0x12000 0x1000>;
};
dcsr-ddr@13000 {
compatible = "fsl,dcsr-ddr";
dev-handle = <&ddr2>;
reg = <0x13000 0x1000>;
};
dcsr-nal@18000 {
compatible = "fsl,p5040-dcsr-nal", "fsl,dcsr-nal";
reg = <0x18000 0x1000>;
};
dcsr-rcpm@22000 {
compatible = "fsl,p5040-dcsr-rcpm", "fsl,dcsr-rcpm";
reg = <0x22000 0x1000>;
};
dcsr-cpu-sb-proxy@40000 {
compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
cpu-handle = <&cpu0>;
reg = <0x40000 0x1000>;
};
dcsr-cpu-sb-proxy@41000 {
compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
cpu-handle = <&cpu1>;
reg = <0x41000 0x1000>;
};
dcsr-cpu-sb-proxy@42000 {
compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
cpu-handle = <&cpu2>;
reg = <0x42000 0x1000>;
};
dcsr-cpu-sb-proxy@43000 {
compatible = "fsl,dcsr-e5500-sb-proxy", "fsl,dcsr-cpu-sb-proxy";
cpu-handle = <&cpu3>;
reg = <0x43000 0x1000>;
};
};
&soc {
#address-cells = <1>;
#size-cells = <1>;
device_type = "soc";
compatible = "simple-bus";
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>;
};
ddr1: memory-controller@8000 {
compatible = "fsl,qoriq-memory-controller-v4.5", "fsl,qoriq-memory-controller";
reg = <0x8000 0x1000>;
interrupts = <16 2 1 23>;
};
ddr2: 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,p5040-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 0x5000>;
interrupts = <
24 2 0 0
16 2 1 30>;
};
/include/ "qoriq-mpic.dtsi"
guts: global-utilities@e0000 {
compatible = "fsl,p5040-device-config", "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,p5040-pin-control", "fsl,qoriq-pin-control-1.0";
reg = <0xe0e00 0x200>;
#sleep-cells = <2>;
};
clockgen: global-utilities@e1000 {
compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0";
reg = <0xe1000 0x1000>;
clock-frequency = <0>;
};
rcpm: global-utilities@e2000 {
compatible = "fsl,p5040-rcpm", "fsl,qoriq-rcpm-1.0";
reg = <0xe2000 0x1000>;
#sleep-cells = <1>;
};
sfp: sfp@e8000 {
compatible = "fsl,p5040-sfp", "fsl,qoriq-sfp-1.0";
reg = <0xe8000 0x1000>;
};
serdes: serdes@ea000 {
compatible = "fsl,p5040-serdes";
reg = <0xea000 0x1000>;
};
/include/ "qoriq-dma-0.dtsi"
/include/ "qoriq-dma-1.dtsi"
/include/ "qoriq-espi-0.dtsi"
spi@110000 {
fsl,espi-num-chipselects = <4>;
};
/include/ "qoriq-esdhc-0.dtsi"
sdhc@114000 {
sdhci,auto-cmd12;
};
/include/ "qoriq-i2c-0.dtsi"
/include/ "qoriq-i2c-1.dtsi"
/include/ "qoriq-duart-0.dtsi"
/include/ "qoriq-duart-1.dtsi"
/include/ "qoriq-gpio-0.dtsi"
/include/ "qoriq-usb2-mph-0.dtsi"
usb0: usb@210000 {
compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph";
phy_type = "utmi";
port0;
};
/include/ "qoriq-usb2-dr-0.dtsi"
usb1: usb@211000 {
compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr";
dr_mode = "host";
phy_type = "utmi";
};
/include/ "qoriq-sata2-0.dtsi"
/include/ "qoriq-sata2-1.dtsi"
/include/ "qoriq-sec5.2-0.dtsi"
};
/*
* P5040 Silicon/SoC Device Tree Source (pre include)
*
* Copyright 2012 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/;
/include/ "e5500_power_isa.dtsi"
/ {
compatible = "fsl,P5040";
#address-cells = <2>;
#size-cells = <2>;
interrupt-parent = <&mpic>;
aliases {
ccsr = &soc;
dcsr = &dcsr;
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,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>;
};
};
cpu2: PowerPC,e5500@2 {
device_type = "cpu";
reg = <2>;
next-level-cache = <&L2_2>;
L2_2: l2-cache {
next-level-cache = <&cpc>;
};
};
cpu3: PowerPC,e5500@3 {
device_type = "cpu";
reg = <3>;
next-level-cache = <&L2_3>;
L2_3: l2-cache {
next-level-cache = <&cpc>;
};
};
};
};
/*
* QorIQ Sec/Crypto 5.2 device tree stub [ controller @ offset 0x300000 ]
*
* Copyright 2011-2012 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.
*/
crypto: crypto@300000 {
compatible = "fsl,sec-v5.2", "fsl,sec-v5.0", "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-v5.2-job-ring",
"fsl,sec-v5.0-job-ring",
"fsl,sec-v4.0-job-ring";
reg = <0x1000 0x1000>;
interrupts = <88 2 0 0>;
};
sec_jr1: jr@2000 {
compatible = "fsl,sec-v5.2-job-ring",
"fsl,sec-v5.0-job-ring",
"fsl,sec-v4.0-job-ring";
reg = <0x2000 0x1000>;
interrupts = <89 2 0 0>;
};
sec_jr2: jr@3000 {
compatible = "fsl,sec-v5.2-job-ring",
"fsl,sec-v5.0-job-ring",
"fsl,sec-v4.0-job-ring";
reg = <0x3000 0x1000>;
interrupts = <90 2 0 0>;
};
sec_jr3: jr@4000 {
compatible = "fsl,sec-v5.2-job-ring",
"fsl,sec-v5.0-job-ring",
"fsl,sec-v4.0-job-ring";
reg = <0x4000 0x1000>;
interrupts = <91 2 0 0>;
};
rtic@6000 {
compatible = "fsl,sec-v5.2-rtic",
"fsl,sec-v5.0-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-v5.2-rtic-memory",
"fsl,sec-v5.0-rtic-memory",
"fsl,sec-v4.0-rtic-memory";
reg = <0x00 0x20 0x100 0x80>;
};
rtic_b: rtic-b@20 {
compatible = "fsl,sec-v5.2-rtic-memory",
"fsl,sec-v5.0-rtic-memory",
"fsl,sec-v4.0-rtic-memory";
reg = <0x20 0x20 0x200 0x80>;
};
rtic_c: rtic-c@40 {
compatible = "fsl,sec-v5.2-rtic-memory",
"fsl,sec-v5.0-rtic-memory",
"fsl,sec-v4.0-rtic-memory";
reg = <0x40 0x20 0x300 0x80>;
};
rtic_d: rtic-d@60 {
compatible = "fsl,sec-v5.2-rtic-memory",
"fsl,sec-v5.0-rtic-memory",
"fsl,sec-v4.0-rtic-memory";
reg = <0x60 0x20 0x500 0x80>;
};
};
};
sec_mon: sec_mon@314000 {
compatible = "fsl,sec-v5.2-mon", "fsl,sec-v5.0-mon", "fsl,sec-v4.0-mon";
reg = <0x314000 0x1000>;
interrupts = <93 2 0 0>;
};
...@@ -132,6 +132,10 @@ rtc@68 { ...@@ -132,6 +132,10 @@ rtc@68 {
reg = <0x68>; reg = <0x68>;
interrupts = <0 0x1 0 0>; interrupts = <0 0x1 0 0>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
spi@7000 { spi@7000 {
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
/dts-v1/; /dts-v1/;
/include/ "fsl/e500v2_power_isa.dtsi"
/ { / {
model = "MPC8540ADS"; model = "MPC8540ADS";
compatible = "MPC8540ADS", "MPC85xxADS"; compatible = "MPC8540ADS", "MPC85xxADS";
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
/dts-v1/; /dts-v1/;
/include/ "fsl/e500v2_power_isa.dtsi"
/ { / {
model = "MPC8541CDS"; model = "MPC8541CDS";
compatible = "MPC8541CDS", "MPC85xxCDS"; compatible = "MPC8541CDS", "MPC85xxCDS";
......
...@@ -20,8 +20,10 @@ memory { ...@@ -20,8 +20,10 @@ memory {
reg = <0 0 0 0>; // Filled by U-Boot reg = <0 0 0 0>; // Filled by U-Boot
}; };
lbc: localbus@e0005000 { board_lbc: lbc: localbus@e0005000 {
reg = <0 0xe0005000 0 0x1000>; reg = <0 0xe0005000 0 0x1000>;
ranges = <0x0 0x0 0x0 0xff800000 0x800000>;
}; };
board_soc: soc: soc8544@e0000000 { board_soc: soc: soc8544@e0000000 {
......
...@@ -32,6 +32,45 @@ ...@@ -32,6 +32,45 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
&board_lbc {
nor@0,0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "cfi-flash";
reg = <0x0 0x0 0x800000>;
bank-width = <2>;
device-width = <1>;
partition@0 {
reg = <0x0 0x10000>;
label = "dtb-nor";
};
partition@20000 {
reg = <0x20000 0x30000>;
label = "diagnostic-nor";
read-only;
};
partition@200000 {
reg = <0x200000 0x200000>;
label = "dink-nor";
read-only;
};
partition@400000 {
reg = <0x400000 0x380000>;
label = "kernel-nor";
};
partition@780000 {
reg = <0x780000 0x80000>;
label = "u-boot-nor";
read-only;
};
};
};
&board_soc { &board_soc {
enet0: ethernet@24000 { enet0: ethernet@24000 {
phy-handle = <&phy0>; phy-handle = <&phy0>;
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
/dts-v1/; /dts-v1/;
/include/ "fsl/e500v2_power_isa.dtsi"
/ { / {
model = "MPC8555CDS"; model = "MPC8555CDS";
compatible = "MPC8555CDS", "MPC85xxCDS"; compatible = "MPC8555CDS", "MPC85xxCDS";
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
/dts-v1/; /dts-v1/;
/include/ "fsl/e500v2_power_isa.dtsi"
/ { / {
model = "MPC8560ADS"; model = "MPC8560ADS";
compatible = "MPC8560ADS", "MPC85xxADS"; compatible = "MPC8560ADS", "MPC85xxADS";
......
/*
* O2D Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o2d";
compatible = "ifm,o2d";
memory {
reg = <0x00000000 0x08000000>; // 128MB
};
localbus {
ranges = <0 0 0xfc000000 0x02000000
3 0 0xe3000000 0x00100000>;
flash@0,0 {
compatible = "cfi-flash";
reg = <0 0 0x02000000>;
bank-width = <2>;
device-width = <2>;
#size-cells = <1>;
#address-cells = <1>;
partition@60000 {
label = "kernel";
reg = <0x00060000 0x00260000>;
read-only;
};
/* o2d specific partitions */
partition@2c0000 {
label = "o2d user defined";
reg = <0x002c0000 0x01d40000>;
};
};
};
};
/*
* O2D base Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "mpc5200b.dtsi"
/ {
model = "ifm,o2d";
compatible = "ifm,o2d";
memory {
reg = <0x00000000 0x04000000>; // 64MB
};
soc5200@f0000000 {
gpio_simple: gpio@b00 {
};
timer@600 { // General Purpose Timer
#gpio-cells = <2>;
gpio-controller;
fsl,has-wdt;
fsl,wdt-on-boot = <0>;
};
timer@610 {
#gpio-cells = <2>;
gpio-controller;
};
timer7: timer@670 {
};
rtc@800 {
status = "disabled";
};
psc@2000 { // PSC1
compatible = "fsl,mpc5200b-psc-spi","fsl,mpc5200-psc-spi";
#address-cells = <1>;
#size-cells = <0>;
cell-index = <0>;
spidev@0 {
compatible = "spidev";
spi-max-frequency = <250000>;
reg = <0>;
};
};
psc@2200 { // PSC2
status = "disabled";
};
psc@2400 { // PSC3
status = "disabled";
};
psc@2600 { // PSC4
compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";
};
psc@2800 { // PSC5
compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";
};
psc@2c00 { // PSC6
status = "disabled";
};
ethernet@3000 {
phy-handle = <&phy0>;
};
mdio@3000 {
phy0: ethernet-phy@0 {
reg = <0>;
};
};
sclpc@3c00 {
compatible = "fsl,mpc5200-lpbfifo";
reg = <0x3c00 0x60>;
interrupts = <3 23 0>;
};
};
localbus {
ranges = <0 0 0xff000000 0x01000000
3 0 0xe3000000 0x00100000>;
// flash device at LocalPlus Bus CS0
flash@0,0 {
compatible = "cfi-flash";
reg = <0 0 0x01000000>;
bank-width = <1>;
device-width = <2>;
#size-cells = <1>;
#address-cells = <1>;
no-unaligned-direct-access;
/* common layout for all machines */
partition@0 {
label = "u-boot";
reg = <0x00000000 0x00040000>;
read-only;
};
partition@40000 {
label = "env";
reg = <0x00040000 0x00020000>;
read-only;
};
};
csi@3,0 {
compatible = "ifm,o2d-csi";
reg = <3 0 0x00100000>;
ifm,csi-clk-handle = <&timer7>;
gpios = <&gpio_simple 23 0 /* imag_capture */
&gpio_simple 26 0 /* imag_reset */
&gpio_simple 29 0>; /* imag_master_en */
interrupts = <1 1 2>; /* IRQ1, edge falling */
ifm,csi-addr-bus-width = <24>;
ifm,csi-data-bus-width = <8>;
ifm,csi-wait-cycles = <0>;
};
};
};
/*
* O2D300 Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o2d300";
compatible = "ifm,o2d";
localbus {
ranges = <0 0 0xfc000000 0x02000000
3 0 0xe3000000 0x00100000>;
flash@0,0 {
compatible = "cfi-flash";
reg = <0 0 0x02000000>;
bank-width = <2>;
device-width = <2>;
#size-cells = <1>;
#address-cells = <1>;
partition@40000 {
label = "env_1";
reg = <0x00040000 0x00020000>;
read-only;
};
partition@60000 {
label = "env_2";
reg = <0x00060000 0x00020000>;
read-only;
};
partition@80000 {
label = "kernel";
reg = <0x00080000 0x00260000>;
read-only;
};
/* o2d300 specific partitions */
partition@2e0000 {
label = "o2d300 user defined";
reg = <0x002e0000 0x01d20000>;
};
};
};
};
/*
* O2DNT2 Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o2dnt2";
compatible = "ifm,o2d";
memory {
reg = <0x00000000 0x08000000>; // 128MB
};
localbus {
ranges = <0 0 0xfc000000 0x02000000
3 0 0xe3000000 0x00100000>;
flash@0,0 {
compatible = "cfi-flash";
reg = <0 0 0x02000000>;
bank-width = <2>;
device-width = <2>;
#size-cells = <1>;
#address-cells = <1>;
partition@60000 {
label = "kernel";
reg = <0x00060000 0x00260000>;
read-only;
};
/* o2dnt2 specific partitions */
partition@2c0000 {
label = "o2dnt2 user defined";
reg = <0x002c0000 0x01d40000>;
};
};
};
};
/*
* O2I Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o2i";
compatible = "ifm,o2d";
localbus {
flash@0,0 {
partition@60000 {
label = "kernel";
reg = <0x00060000 0x00260000>;
read-only;
};
/* o2i specific partitions */
partition@2c0000 {
label = "o2i user defined";
reg = <0x002c0000 0x00d40000>;
};
};
};
};
/*
* O2MNT Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o2mnt";
compatible = "ifm,o2d";
localbus {
flash@0,0 {
partition@60000 {
label = "kernel";
reg = <0x00060000 0x00260000>;
read-only;
};
/* add o2mnt specific partitions */
partition@2c0000 {
label = "o2mnt user defined";
reg = <0x002c0000 0x00d40000>;
};
};
};
};
/*
* O3DNT Device Tree Source
*
* Copyright (C) 2012 DENX Software Engineering
* Anatolij Gustschin <agust@denx.de>
*
* 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/ "o2d.dtsi"
/ {
model = "ifm,o3dnt";
compatible = "ifm,o2d";
memory {
reg = <0x00000000 0x04000000>; // 64MB
};
localbus {
ranges = <0 0 0xfc000000 0x01000000
3 0 0xe3000000 0x00100000>;
flash@0,0 {
compatible = "cfi-flash";
reg = <0 0 0x01000000>;
bank-width = <2>;
device-width = <2>;
#size-cells = <1>;
#address-cells = <1>;
partition@60000 {
label = "kernel";
reg = <0x00060000 0x00260000>;
read-only;
};
/* o3dnt specific partitions */
partition@2c0000 {
label = "o3dnt user defined";
reg = <0x002c0000 0x00d40000>;
};
};
};
};
/*
* P1020 RDB Core0 Device Tree Source in CAMP mode.
*
* In CAMP mode, each core needs to have its own dts. Only mpic and L2 cache
* can be shared, all the other devices must be assigned to one core only.
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, tdm, dma, usb,
* eth1, eth2, sdhc, crypto, global-util, message, pci0, pci1, msi.
*
* Please note to add "-b 0" for core0's dts compiling.
*
* 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/ "p1020rdb.dts"
/ {
model = "fsl,P1020RDB";
compatible = "fsl,P1020RDB", "fsl,MPC85XXRDB-CAMP";
aliases {
ethernet1 = &enet1;
ethernet2 = &enet2;
serial0 = &serial0;
pci0 = &pci0;
pci1 = &pci1;
};
cpus {
PowerPC,P1020@1 {
status = "disabled";
};
};
memory {
device_type = "memory";
};
localbus@ffe05000 {
status = "disabled";
};
soc@ffe00000 {
serial1: serial@4600 {
status = "disabled";
};
enet0: ethernet@b0000 {
status = "disabled";
};
mpic: pic@40000 {
protected-sources = <
42 29 30 34 /* serial1, enet0-queue-group0 */
17 18 24 45 /* enet0-queue-group1, crypto */
>;
};
};
};
/*
* P1020 RDB Core1 Device Tree Source in CAMP mode.
*
* In CAMP mode, each core needs to have its own dts. Only mpic and L2 cache
* can be shared, all the other devices must be assigned to one core only.
* This dts allows core1 to have l2, eth0, crypto.
*
* Please note to add "-b 1" for core1's dts compiling.
*
* 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/ "p1020rdb.dts"
/ {
model = "fsl,P1020RDB";
compatible = "fsl,P1020RDB", "fsl,MPC85XXRDB-CAMP";
aliases {
ethernet0 = &enet0;
serial0 = &serial1;
};
cpus {
PowerPC,P1020@0 {
status = "disabled";
};
};
memory {
device_type = "memory";
};
localbus@ffe05000 {
status = "disabled";
};
soc@ffe00000 {
ecm-law@0 {
status = "disabled";
};
ecm@1000 {
status = "disabled";
};
memory-controller@2000 {
status = "disabled";
};
i2c@3000 {
status = "disabled";
};
i2c@3100 {
status = "disabled";
};
serial0: serial@4500 {
status = "disabled";
};
spi@7000 {
status = "disabled";
};
gpio: gpio-controller@f000 {
status = "disabled";
};
dma@21300 {
status = "disabled";
};
mdio@24000 {
status = "disabled";
};
mdio@25000 {
status = "disabled";
};
enet1: ethernet@b1000 {
status = "disabled";
};
enet2: ethernet@b2000 {
status = "disabled";
};
usb@22000 {
status = "disabled";
};
sdhci@2e000 {
status = "disabled";
};
mpic: pic@40000 {
protected-sources = <
16 /* ecm, mem, L2, pci0, pci1 */
43 42 59 /* i2c, serial0, spi */
47 63 62 /* gpio, tdm */
20 21 22 23 /* dma */
03 02 /* mdio */
35 36 40 /* enet1-queue-group0 */
51 52 67 /* enet1-queue-group1 */
31 32 33 /* enet2-queue-group0 */
25 26 27 /* enet2-queue-group1 */
28 72 58 /* usb, sdhci, crypto */
0xb0 0xb1 0xb2 /* message */
0xb3 0xb4 0xb5
0xb6 0xb7
0xe0 0xe1 0xe2 /* msi */
0xe3 0xe4 0xe5
0xe6 0xe7 /* sdhci, crypto , pci */
>;
};
msi@41600 {
status = "disabled";
};
global-utilities@e0000 { //global utilities block
status = "disabled";
};
};
pci0: pcie@ffe09000 {
status = "disabled";
};
pci1: pcie@ffe0a000 {
status = "disabled";
};
};
...@@ -149,6 +149,10 @@ rtc@68 { ...@@ -149,6 +149,10 @@ rtc@68 {
compatible = "dallas,ds1339"; compatible = "dallas,ds1339";
reg = <0x68>; reg = <0x68>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
spi@7000 { spi@7000 {
......
/*
* P1022 RDK 32-bit Physical Address Map Device Tree Source
*
* Copyright 2012 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/ "fsl/p1022si-pre.dtsi"
/ {
model = "fsl,P1022RDK";
compatible = "fsl,P1022RDK";
memory {
device_type = "memory";
};
board_lbc: lbc: localbus@ffe05000 {
/* The P1022 RDK does not have any localbus devices */
status = "disabled";
};
board_soc: soc: soc@ffe00000 {
ranges = <0x0 0x0 0xffe00000 0x100000>;
i2c@3100 {
wm8960:codec@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
/* MCLK source is a stand-alone oscillator */
clock-frequency = <12288000>;
};
rtc@68 {
compatible = "stm,m41t62";
reg = <0x68>;
};
adt7461@4c{
compatible = "adi,adt7461";
reg = <0x4c>;
};
zl6100@21{
compatible = "isil,zl6100";
reg = <0x21>;
};
zl6100@24{
compatible = "isil,zl6100";
reg = <0x24>;
};
zl6100@26{
compatible = "isil,zl6100";
reg = <0x26>;
};
zl6100@29{
compatible = "isil,zl6100";
reg = <0x29>;
};
};
spi@7000 {
flash@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spansion,m25p80";
reg = <0>;
spi-max-frequency = <1000000>;
partition@0 {
label = "full-spi-flash";
reg = <0x00000000 0x00100000>;
};
};
};
ssi@15000 {
fsl,mode = "i2s-slave";
codec-handle = <&wm8960>;
};
usb@22000 {
phy_type = "ulpi";
};
usb@23000 {
phy_type = "ulpi";
};
mdio@24000 {
phy0: ethernet-phy@0 {
interrupts = <3 1 0 0>;
reg = <0x1>;
};
phy1: ethernet-phy@1 {
interrupts = <9 1 0 0>;
reg = <0x2>;
};
};
mdio@25000 {
tbi0: tbi-phy@11 {
reg = <0x11>;
device_type = "tbi-phy";
};
};
ethernet@b0000 {
phy-handle = <&phy0>;
phy-connection-type = "rgmii-id";
};
ethernet@b1000 {
phy-handle = <&phy1>;
tbi-handle = <&tbi0>;
phy-connection-type = "sgmii";
};
};
pci0: pcie@ffe09000 {
ranges = <0x2000000 0x0 0xe0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
reg = <0x0 0xffe09000 0 0x1000>;
pcie@0 {
ranges = <0x2000000 0x0 0xe0000000
0x2000000 0x0 0xe0000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x100000>;
};
};
pci1: pcie@ffe0a000 {
ranges = <0x2000000 0x0 0xe0000000 0 0xc0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
reg = <0 0xffe0a000 0 0x1000>;
pcie@0 {
ranges = <0x2000000 0x0 0xe0000000
0x2000000 0x0 0xe0000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x100000>;
};
};
pci2: pcie@ffe0b000 {
ranges = <0x2000000 0x0 0xe0000000 0 0x80000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
reg = <0 0xffe0b000 0 0x1000>;
pcie@0 {
ranges = <0x2000000 0x0 0xe0000000
0x2000000 0x0 0xe0000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x100000>;
};
};
};
/include/ "fsl/p1022si-post.dtsi"
/*
* P2020 RDB Core0 Device Tree Source in CAMP mode.
*
* In CAMP mode, each core needs to have its own dts. Only mpic and L2 cache
* can be shared, all the other devices must be assigned to one core only.
* This dts file allows core0 to have memory, l2, i2c, spi, gpio, dma1, usb,
* eth1, eth2, sdhc, crypto, global-util, pci0.
*
* 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.
*/
/include/ "p2020rdb.dts"
/ {
model = "fsl,P2020RDB";
compatible = "fsl,P2020RDB", "fsl,MPC85XXRDB-CAMP";
cpus {
PowerPC,P2020@1 {
status = "disabled";
};
};
localbus@ffe05000 {
status = "disabled";
};
soc@ffe00000 {
serial1: serial@4600 {
status = "disabled";
};
dma@c300 {
status = "disabled";
};
enet0: ethernet@24000 {
status = "disabled";
};
mpic: pic@40000 {
protected-sources = <
42 76 77 78 79 /* serial1 , dma2 */
29 30 34 26 /* enet0, pci1 */
0xe0 0xe1 0xe2 0xe3 /* msi */
0xe4 0xe5 0xe6 0xe7
>;
};
msi@41600 {
status = "disabled";
};
};
pci0: pcie@ffe08000 {
status = "disabled";
};
pci2: pcie@ffe0a000 {
status = "disabled";
};
};
/*
* P2020 RDB Core1 Device Tree Source in CAMP mode.
*
* In CAMP mode, each core needs to have its own dts. Only mpic and L2 cache
* can be shared, all the other devices must be assigned to one core only.
* This dts allows core1 to have l2, dma2, eth0, pci1, msi.
*
* Please note to add "-b 1" for core1's dts compiling.
*
* 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.
*/
/include/ "p2020rdb.dts"
/ {
model = "fsl,P2020RDB";
compatible = "fsl,P2020RDB", "fsl,MPC85XXRDB-CAMP";
cpus {
PowerPC,P2020@0 {
status = "disabled";
};
};
localbus@ffe05000 {
status = "disabled";
};
soc@ffe00000 {
ecm-law@0 {
status = "disabled";
};
ecm@1000 {
status = "disabled";
};
memory-controller@2000 {
status = "disabled";
};
i2c@3000 {
status = "disabled";
};
i2c@3100 {
status = "disabled";
};
serial0: serial@4500 {
status = "disabled";
};
spi@7000 {
status = "disabled";
};
gpio: gpio-controller@f000 {
status = "disabled";
};
dma@21300 {
status = "disabled";
};
usb@22000 {
status = "disabled";
};
mdio@24520 {
status = "disabled";
};
mdio@25520 {
status = "disabled";
};
mdio@26520 {
status = "disabled";
};
enet1: ethernet@25000 {
status = "disabled";
};
enet2: ethernet@26000 {
status = "disabled";
};
sdhci@2e000 {
status = "disabled";
};
crypto@30000 {
status = "disabled";
};
mpic: pic@40000 {
protected-sources = <
17 18 43 42 59 47 /*ecm, mem, i2c, serial0, spi,gpio */
16 20 21 22 23 28 /* L2, dma1, USB */
03 35 36 40 31 32 33 /* mdio, enet1, enet2 */
72 45 58 25 /* sdhci, crypto , pci */
>;
};
global-utilities@e0000 { //global utilities block
status = "disabled";
};
};
pci0: pcie@ffe08000 {
status = "disabled";
};
pci1: pcie@ffe09000 {
status = "disabled";
};
};
...@@ -94,6 +94,10 @@ rtc@68 { ...@@ -94,6 +94,10 @@ rtc@68 {
compatible = "pericom,pt7c4338"; compatible = "pericom,pt7c4338";
reg = <0x68>; reg = <0x68>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
i2c@118100 { i2c@118100 {
......
...@@ -98,6 +98,10 @@ rtc@68 { ...@@ -98,6 +98,10 @@ rtc@68 {
reg = <0x68>; reg = <0x68>;
interrupts = <0x1 0x1 0 0>; interrupts = <0x1 0x1 0 0>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
}; };
......
...@@ -96,6 +96,10 @@ rtc@68 { ...@@ -96,6 +96,10 @@ rtc@68 {
reg = <0x68>; reg = <0x68>;
interrupts = <0x1 0x1 0 0>; interrupts = <0x1 0x1 0 0>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
usb0: usb@210000 { usb0: usb@210000 {
......
...@@ -98,6 +98,10 @@ rtc@68 { ...@@ -98,6 +98,10 @@ rtc@68 {
reg = <0x68>; reg = <0x68>;
interrupts = <0x1 0x1 0 0>; interrupts = <0x1 0x1 0 0>;
}; };
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
}; };
}; };
......
/*
* P5040DS Device Tree Source
*
* Copyright 2012 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/ "fsl/p5040si-pre.dtsi"
/ {
model = "fsl,P5040DS";
compatible = "fsl,P5040DS";
#address-cells = <2>;
#size-cells = <2>;
interrupt-parent = <&mpic>;
memory {
device_type = "memory";
};
dcsr: dcsr@f00000000 {
ranges = <0x00000000 0xf 0x00000000 0x01008000>;
};
soc: soc@ffe000000 {
ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
reg = <0xf 0xfe000000 0 0x00001000>;
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>;
};
partition@kernel {
label = "kernel";
reg = <0x00100000 0x00500000>;
};
partition@dtb {
label = "dtb";
reg = <0x00600000 0x00100000>;
};
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>;
};
adt7461@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
};
};
lbc: 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>;
};
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 0x01000000>;
};
};
board-control@3,0 {
compatible = "fsl,p5040ds-fpga", "fsl,fpga-ngpixis";
reg = <3 0 0x40>;
};
};
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>;
};
};
};
/include/ "fsl/p5040si-post.dtsi"
...@@ -112,6 +112,12 @@ CONFIG_SND=y ...@@ -112,6 +112,12 @@ CONFIG_SND=y
CONFIG_SND_MIXER_OSS=y CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y CONFIG_SND_PCM_OSS=y
# CONFIG_SND_SUPPORT_OLD_API is not set # CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_USB=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_MON=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_FSL=y
CONFIG_USB_STORAGE=y
CONFIG_EDAC=y CONFIG_EDAC=y
CONFIG_EDAC_MM_EDAC=y CONFIG_EDAC_MM_EDAC=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
......
...@@ -27,6 +27,7 @@ CONFIG_P2041_RDB=y ...@@ -27,6 +27,7 @@ CONFIG_P2041_RDB=y
CONFIG_P3041_DS=y CONFIG_P3041_DS=y
CONFIG_P4080_DS=y CONFIG_P4080_DS=y
CONFIG_P5020_DS=y CONFIG_P5020_DS=y
CONFIG_P5040_DS=y
CONFIG_HIGHMEM=y CONFIG_HIGHMEM=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
......
...@@ -23,6 +23,7 @@ CONFIG_MODVERSIONS=y ...@@ -23,6 +23,7 @@ CONFIG_MODVERSIONS=y
CONFIG_PARTITION_ADVANCED=y CONFIG_PARTITION_ADVANCED=y
CONFIG_MAC_PARTITION=y CONFIG_MAC_PARTITION=y
CONFIG_P5020_DS=y CONFIG_P5020_DS=y
CONFIG_P5040_DS=y
# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
CONFIG_IRQ_ALL_CPUS=y CONFIG_IRQ_ALL_CPUS=y
......
...@@ -30,6 +30,7 @@ CONFIG_MPC85xx_DS=y ...@@ -30,6 +30,7 @@ CONFIG_MPC85xx_DS=y
CONFIG_MPC85xx_RDB=y CONFIG_MPC85xx_RDB=y
CONFIG_P1010_RDB=y CONFIG_P1010_RDB=y
CONFIG_P1022_DS=y CONFIG_P1022_DS=y
CONFIG_P1022_RDK=y
CONFIG_P1023_RDS=y CONFIG_P1023_RDS=y
CONFIG_SOCRATES=y CONFIG_SOCRATES=y
CONFIG_KSI8560=y CONFIG_KSI8560=y
......
...@@ -32,6 +32,7 @@ CONFIG_MPC85xx_DS=y ...@@ -32,6 +32,7 @@ CONFIG_MPC85xx_DS=y
CONFIG_MPC85xx_RDB=y CONFIG_MPC85xx_RDB=y
CONFIG_P1010_RDB=y CONFIG_P1010_RDB=y
CONFIG_P1022_DS=y CONFIG_P1022_DS=y
CONFIG_P1022_RDK=y
CONFIG_P1023_RDS=y CONFIG_P1023_RDS=y
CONFIG_SOCRATES=y CONFIG_SOCRATES=y
CONFIG_KSI8560=y CONFIG_KSI8560=y
......
...@@ -51,6 +51,7 @@ CONFIG_KEXEC=y ...@@ -51,6 +51,7 @@ CONFIG_KEXEC=y
CONFIG_IRQ_ALL_CPUS=y CONFIG_IRQ_ALL_CPUS=y
CONFIG_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTREMOVE=y
CONFIG_SCHED_SMT=y CONFIG_SCHED_SMT=y
CONFIG_PPC_DENORMALISATION=y
CONFIG_PCCARD=y CONFIG_PCCARD=y
CONFIG_ELECTRA_CF=y CONFIG_ELECTRA_CF=y
CONFIG_HOTPLUG_PCI=m CONFIG_HOTPLUG_PCI=m
......
...@@ -48,6 +48,7 @@ CONFIG_MEMORY_HOTREMOVE=y ...@@ -48,6 +48,7 @@ CONFIG_MEMORY_HOTREMOVE=y
CONFIG_PPC_64K_PAGES=y CONFIG_PPC_64K_PAGES=y
CONFIG_PPC_SUBPAGE_PROT=y CONFIG_PPC_SUBPAGE_PROT=y
CONFIG_SCHED_SMT=y CONFIG_SCHED_SMT=y
CONFIG_PPC_DENORMALISATION=y
CONFIG_HOTPLUG_PCI=m CONFIG_HOTPLUG_PCI=m
CONFIG_HOTPLUG_PCI_RPA=m CONFIG_HOTPLUG_PCI_RPA=m
CONFIG_HOTPLUG_PCI_RPA_DLPAR=m CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
......
#ifndef _ASM_POWERPC_ABS_ADDR_H
#define _ASM_POWERPC_ABS_ADDR_H
#ifdef __KERNEL__
/*
* c 2001 PPC 64 Team, 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/memblock.h>
#include <asm/types.h>
#include <asm/page.h>
#include <asm/prom.h>
struct mschunks_map {
unsigned long num_chunks;
unsigned long chunk_size;
unsigned long chunk_shift;
unsigned long chunk_mask;
u32 *mapping;
};
extern struct mschunks_map mschunks_map;
/* Chunks are 256 KB */
#define MSCHUNKS_CHUNK_SHIFT (18)
#define MSCHUNKS_CHUNK_SIZE (1UL << MSCHUNKS_CHUNK_SHIFT)
#define MSCHUNKS_OFFSET_MASK (MSCHUNKS_CHUNK_SIZE - 1)
static inline unsigned long chunk_to_addr(unsigned long chunk)
{
return chunk << MSCHUNKS_CHUNK_SHIFT;
}
static inline unsigned long addr_to_chunk(unsigned long addr)
{
return addr >> MSCHUNKS_CHUNK_SHIFT;
}
static inline unsigned long phys_to_abs(unsigned long pa)
{
return pa;
}
/* Convenience macros */
#define virt_to_abs(va) phys_to_abs(__pa(va))
#define abs_to_virt(aa) __va(aa)
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_ABS_ADDR_H */
...@@ -30,6 +30,8 @@ extern void flush_dcache_page(struct page *page); ...@@ -30,6 +30,8 @@ extern void flush_dcache_page(struct page *page);
#define flush_dcache_mmap_lock(mapping) do { } while (0) #define flush_dcache_mmap_lock(mapping) do { } while (0)
#define flush_dcache_mmap_unlock(mapping) do { } while (0) #define flush_dcache_mmap_unlock(mapping) do { } while (0)
extern void __flush_disable_L1(void);
extern void __flush_icache_range(unsigned long, unsigned long); extern void __flush_icache_range(unsigned long, unsigned long);
static inline void flush_icache_range(unsigned long start, unsigned long stop) static inline void flush_icache_range(unsigned long start, unsigned long stop)
{ {
......
...@@ -44,7 +44,7 @@ static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; } ...@@ -44,7 +44,7 @@ static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; }
static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; } static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
#endif #endif
extern int set_dabr(unsigned long dabr); extern int set_dabr(unsigned long dabr, unsigned long dabrx);
#ifdef CONFIG_PPC_ADV_DEBUG_REGS #ifdef CONFIG_PPC_ADV_DEBUG_REGS
extern void do_send_trap(struct pt_regs *regs, unsigned long address, extern void do_send_trap(struct pt_regs *regs, unsigned long address,
unsigned long error_code, int signal_code, int brkpt); unsigned long error_code, int signal_code, int brkpt);
......
...@@ -31,6 +31,46 @@ struct device_node; ...@@ -31,6 +31,46 @@ struct device_node;
#ifdef CONFIG_EEH #ifdef CONFIG_EEH
/*
* The struct is used to trace PE related EEH functionality.
* In theory, there will have one instance of the struct to
* be created against particular PE. In nature, PEs corelate
* to each other. the struct has to reflect that hierarchy in
* order to easily pick up those affected PEs when one particular
* PE has EEH errors.
*
* Also, one particular PE might be composed of PCI device, PCI
* bus and its subordinate components. The struct also need ship
* the information. Further more, one particular PE is only meaingful
* in the corresponding PHB. Therefore, the root PEs should be created
* against existing PHBs in on-to-one fashion.
*/
#define EEH_PE_INVALID (1 << 0) /* Invalid */
#define EEH_PE_PHB (1 << 1) /* PHB PE */
#define EEH_PE_DEVICE (1 << 2) /* Device PE */
#define EEH_PE_BUS (1 << 3) /* Bus PE */
#define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */
#define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */
struct eeh_pe {
int type; /* PE type: PHB/Bus/Device */
int state; /* PE EEH dependent mode */
int config_addr; /* Traditional PCI address */
int addr; /* PE configuration address */
struct pci_controller *phb; /* Associated PHB */
int check_count; /* Times of ignored error */
int freeze_count; /* Times of froze up */
int false_positives; /* Times of reported #ff's */
struct eeh_pe *parent; /* Parent PE */
struct list_head child_list; /* Link PE to the child list */
struct list_head edevs; /* Link list of EEH devices */
struct list_head child; /* Child PEs */
};
#define eeh_pe_for_each_dev(pe, edev) \
list_for_each_entry(edev, &pe->edevs, list)
/* /*
* The struct is used to trace EEH state for the associated * The struct is used to trace EEH state for the associated
* PCI device node or PCI device. In future, it might * PCI device node or PCI device. In future, it might
...@@ -38,21 +78,16 @@ struct device_node; ...@@ -38,21 +78,16 @@ struct device_node;
* another tree except the currently existing tree of PCI * another tree except the currently existing tree of PCI
* buses and PCI devices * buses and PCI devices
*/ */
#define EEH_MODE_SUPPORTED (1<<0) /* EEH supported on the device */ #define EEH_DEV_IRQ_DISABLED (1<<0) /* Interrupt disabled */
#define EEH_MODE_NOCHECK (1<<1) /* EEH check should be skipped */
#define EEH_MODE_ISOLATED (1<<2) /* The device has been isolated */
#define EEH_MODE_RECOVERING (1<<3) /* Recovering the device */
#define EEH_MODE_IRQ_DISABLED (1<<4) /* Interrupt disabled */
struct eeh_dev { struct eeh_dev {
int mode; /* EEH mode */ int mode; /* EEH mode */
int class_code; /* Class code of the device */ int class_code; /* Class code of the device */
int config_addr; /* Config address */ int config_addr; /* Config address */
int pe_config_addr; /* PE config address */ int pe_config_addr; /* PE config address */
int check_count; /* Times of ignored error */
int freeze_count; /* Times of froze up */
int false_positives; /* Times of reported #ff's */
u32 config_space[16]; /* Saved PCI config space */ u32 config_space[16]; /* Saved PCI config space */
struct eeh_pe *pe; /* Associated PE */
struct list_head list; /* Form link list in the PE */
struct pci_controller *phb; /* Associated PHB */ struct pci_controller *phb; /* Associated PHB */
struct device_node *dn; /* Associated device node */ struct device_node *dn; /* Associated device node */
struct pci_dev *pdev; /* Associated PCI device */ struct pci_dev *pdev; /* Associated PCI device */
...@@ -95,19 +130,51 @@ static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev) ...@@ -95,19 +130,51 @@ static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev)
struct eeh_ops { struct eeh_ops {
char *name; char *name;
int (*init)(void); int (*init)(void);
int (*set_option)(struct device_node *dn, int option); void* (*of_probe)(struct device_node *dn, void *flag);
int (*get_pe_addr)(struct device_node *dn); void* (*dev_probe)(struct pci_dev *dev, void *flag);
int (*get_state)(struct device_node *dn, int *state); int (*set_option)(struct eeh_pe *pe, int option);
int (*reset)(struct device_node *dn, int option); int (*get_pe_addr)(struct eeh_pe *pe);
int (*wait_state)(struct device_node *dn, int max_wait); int (*get_state)(struct eeh_pe *pe, int *state);
int (*get_log)(struct device_node *dn, int severity, char *drv_log, unsigned long len); int (*reset)(struct eeh_pe *pe, int option);
int (*configure_bridge)(struct device_node *dn); int (*wait_state)(struct eeh_pe *pe, int max_wait);
int (*get_log)(struct eeh_pe *pe, int severity, char *drv_log, unsigned long len);
int (*configure_bridge)(struct eeh_pe *pe);
int (*read_config)(struct device_node *dn, int where, int size, u32 *val); int (*read_config)(struct device_node *dn, int where, int size, u32 *val);
int (*write_config)(struct device_node *dn, int where, int size, u32 val); int (*write_config)(struct device_node *dn, int where, int size, u32 val);
}; };
extern struct eeh_ops *eeh_ops; extern struct eeh_ops *eeh_ops;
extern int eeh_subsystem_enabled; extern int eeh_subsystem_enabled;
extern struct mutex eeh_mutex;
extern int eeh_probe_mode;
#define EEH_PROBE_MODE_DEV (1<<0) /* From PCI device */
#define EEH_PROBE_MODE_DEVTREE (1<<1) /* From device tree */
static inline void eeh_probe_mode_set(int flag)
{
eeh_probe_mode = flag;
}
static inline int eeh_probe_mode_devtree(void)
{
return (eeh_probe_mode == EEH_PROBE_MODE_DEVTREE);
}
static inline int eeh_probe_mode_dev(void)
{
return (eeh_probe_mode == EEH_PROBE_MODE_DEV);
}
static inline void eeh_lock(void)
{
mutex_lock(&eeh_mutex);
}
static inline void eeh_unlock(void)
{
mutex_unlock(&eeh_mutex);
}
/* /*
* Max number of EEH freezes allowed before we consider the device * Max number of EEH freezes allowed before we consider the device
...@@ -115,22 +182,26 @@ extern int eeh_subsystem_enabled; ...@@ -115,22 +182,26 @@ extern int eeh_subsystem_enabled;
*/ */
#define EEH_MAX_ALLOWED_FREEZES 5 #define EEH_MAX_ALLOWED_FREEZES 5
typedef void *(*eeh_traverse_func)(void *data, void *flag);
int __devinit eeh_phb_pe_create(struct pci_controller *phb);
int eeh_add_to_parent_pe(struct eeh_dev *edev);
int eeh_rmv_from_parent_pe(struct eeh_dev *edev, int purge_pe);
void *eeh_pe_dev_traverse(struct eeh_pe *root,
eeh_traverse_func fn, void *flag);
void eeh_pe_restore_bars(struct eeh_pe *pe);
struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe);
void * __devinit eeh_dev_init(struct device_node *dn, void *data); void * __devinit eeh_dev_init(struct device_node *dn, void *data);
void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb); void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb);
void __init eeh_dev_phb_init(void);
void __init eeh_init(void);
#ifdef CONFIG_PPC_PSERIES
int __init eeh_pseries_init(void);
#endif
int __init eeh_ops_register(struct eeh_ops *ops); int __init eeh_ops_register(struct eeh_ops *ops);
int __exit eeh_ops_unregister(const char *name); int __exit eeh_ops_unregister(const char *name);
unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long eeh_check_failure(const volatile void __iomem *token,
unsigned long val); unsigned long val);
int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev); int eeh_dev_check_failure(struct eeh_dev *edev);
void __init pci_addr_cache_build(void); void __init eeh_addr_cache_build(void);
void eeh_add_device_tree_early(struct device_node *); void eeh_add_device_tree_early(struct device_node *);
void eeh_add_device_tree_late(struct pci_bus *); void eeh_add_device_tree_late(struct pci_bus *);
void eeh_remove_bus_device(struct pci_dev *); void eeh_remove_bus_device(struct pci_dev *, int);
/** /**
* EEH_POSSIBLE_ERROR() -- test for possible MMIO failure. * EEH_POSSIBLE_ERROR() -- test for possible MMIO failure.
...@@ -156,34 +227,24 @@ static inline void *eeh_dev_init(struct device_node *dn, void *data) ...@@ -156,34 +227,24 @@ static inline void *eeh_dev_init(struct device_node *dn, void *data)
static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { } static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { }
static inline void eeh_dev_phb_init(void) { }
static inline void eeh_init(void) { }
#ifdef CONFIG_PPC_PSERIES
static inline int eeh_pseries_init(void)
{
return 0;
}
#endif /* CONFIG_PPC_PSERIES */
static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
{ {
return val; return val;
} }
static inline int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) #define eeh_dev_check_failure(x) (0)
{
return 0;
}
static inline void pci_addr_cache_build(void) { } static inline void eeh_addr_cache_build(void) { }
static inline void eeh_add_device_tree_early(struct device_node *dn) { } static inline void eeh_add_device_tree_early(struct device_node *dn) { }
static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } static inline void eeh_add_device_tree_late(struct pci_bus *bus) { }
static inline void eeh_remove_bus_device(struct pci_dev *dev) { } static inline void eeh_remove_bus_device(struct pci_dev *dev, int purge_pe) { }
static inline void eeh_lock(void) { }
static inline void eeh_unlock(void) { }
#define EEH_POSSIBLE_ERROR(val, type) (0) #define EEH_POSSIBLE_ERROR(val, type) (0)
#define EEH_IO_ERROR_VALUE(size) (-1UL) #define EEH_IO_ERROR_VALUE(size) (-1UL)
#endif /* CONFIG_EEH */ #endif /* CONFIG_EEH */
......
...@@ -28,11 +28,11 @@ ...@@ -28,11 +28,11 @@
*/ */
struct eeh_event { struct eeh_event {
struct list_head list; /* to form event queue */ struct list_head list; /* to form event queue */
struct eeh_dev *edev; /* EEH device */ struct eeh_pe *pe; /* EEH PE */
}; };
int eeh_send_failure_event(struct eeh_dev *edev); int eeh_send_failure_event(struct eeh_pe *pe);
struct eeh_dev *handle_eeh_events(struct eeh_event *); void eeh_handle_event(struct eeh_pe *pe);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* ASM_POWERPC_EEH_EVENT_H */ #endif /* ASM_POWERPC_EEH_EVENT_H */
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
* critical data * critical data
*/ */
#define PACA_EXGDBELL PACA_EXGEN
/* We are out of SPRGs so we save some things in the PACA. The normal /* We are out of SPRGs so we save some things in the PACA. The normal
* exception frame is smaller than the CRIT or MC one though * exception frame is smaller than the CRIT or MC one though
...@@ -45,8 +46,9 @@ ...@@ -45,8 +46,9 @@
#define EX_CR (1 * 8) #define EX_CR (1 * 8)
#define EX_R10 (2 * 8) #define EX_R10 (2 * 8)
#define EX_R11 (3 * 8) #define EX_R11 (3 * 8)
#define EX_R14 (4 * 8) #define EX_R13 (4 * 8)
#define EX_R15 (5 * 8) #define EX_R14 (5 * 8)
#define EX_R15 (6 * 8)
/* /*
* The TLB miss exception uses different slots. * The TLB miss exception uses different slots.
......
...@@ -48,6 +48,8 @@ struct ccsr_guts { ...@@ -48,6 +48,8 @@ struct ccsr_guts {
__be32 dmuxcr; /* 0x.0068 - DMA Mux Control Register */ __be32 dmuxcr; /* 0x.0068 - DMA Mux Control Register */
u8 res06c[0x70 - 0x6c]; u8 res06c[0x70 - 0x6c];
__be32 devdisr; /* 0x.0070 - Device Disable Control */ __be32 devdisr; /* 0x.0070 - Device Disable Control */
#define CCSR_GUTS_DEVDISR_TB1 0x00001000
#define CCSR_GUTS_DEVDISR_TB0 0x00004000
__be32 devdisr2; /* 0x.0074 - Device Disable Control 2 */ __be32 devdisr2; /* 0x.0074 - Device Disable Control 2 */
u8 res078[0x7c - 0x78]; u8 res078[0x7c - 0x78];
__be32 pmjcr; /* 0x.007c - 4 Power Management Jog Control Register */ __be32 pmjcr; /* 0x.007c - 4 Power Management Jog Control Register */
......
...@@ -768,22 +768,24 @@ struct fsl_ifc_gpcm { ...@@ -768,22 +768,24 @@ struct fsl_ifc_gpcm {
*/ */
struct fsl_ifc_regs { struct fsl_ifc_regs {
__be32 ifc_rev; __be32 ifc_rev;
u32 res1[0x3]; u32 res1[0x2];
struct { struct {
__be32 cspr_ext;
__be32 cspr; __be32 cspr;
u32 res2[0x2]; u32 res2;
} cspr_cs[FSL_IFC_BANK_COUNT]; } cspr_cs[FSL_IFC_BANK_COUNT];
u32 res3[0x18]; u32 res3[0x19];
struct { struct {
__be32 amask; __be32 amask;
u32 res4[0x2]; u32 res4[0x2];
} amask_cs[FSL_IFC_BANK_COUNT]; } amask_cs[FSL_IFC_BANK_COUNT];
u32 res5[0x18]; u32 res5[0x17];
struct { struct {
__be32 csor_ext;
__be32 csor; __be32 csor;
u32 res6[0x2]; u32 res6;
} csor_cs[FSL_IFC_BANK_COUNT]; } csor_cs[FSL_IFC_BANK_COUNT];
u32 res7[0x18]; u32 res7[0x19];
struct { struct {
__be32 ftim[4]; __be32 ftim[4];
u32 res8[0x8]; u32 res8[0x8];
......
...@@ -152,11 +152,6 @@ ...@@ -152,11 +152,6 @@
#define H_VASI_RESUMED 5 #define H_VASI_RESUMED 5
#define H_VASI_COMPLETED 6 #define H_VASI_COMPLETED 6
/* DABRX flags */
#define H_DABRX_HYPERVISOR (1UL<<(63-61))
#define H_DABRX_KERNEL (1UL<<(63-62))
#define H_DABRX_USER (1UL<<(63-63))
/* Each control block has to be on a 4K boundary */ /* Each control block has to be on a 4K boundary */
#define H_CB_ALIGNMENT 4096 #define H_CB_ALIGNMENT 4096
......
...@@ -27,10 +27,11 @@ ...@@ -27,10 +27,11 @@
#ifdef CONFIG_HAVE_HW_BREAKPOINT #ifdef CONFIG_HAVE_HW_BREAKPOINT
struct arch_hw_breakpoint { struct arch_hw_breakpoint {
bool extraneous_interrupt;
u8 len; /* length of the target data symbol */
int type;
unsigned long address; unsigned long address;
unsigned long dabrx;
int type;
u8 len; /* length of the target data symbol */
bool extraneous_interrupt;
}; };
#include <linux/kdebug.h> #include <linux/kdebug.h>
...@@ -61,7 +62,7 @@ extern void ptrace_triggered(struct perf_event *bp, ...@@ -61,7 +62,7 @@ extern void ptrace_triggered(struct perf_event *bp,
struct perf_sample_data *data, struct pt_regs *regs); struct perf_sample_data *data, struct pt_regs *regs);
static inline void hw_breakpoint_disable(void) static inline void hw_breakpoint_disable(void)
{ {
set_dabr(0); set_dabr(0, 0);
} }
extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs); extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs);
......
...@@ -29,21 +29,16 @@ ...@@ -29,21 +29,16 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <asm/probes.h>
#define __ARCH_WANT_KPROBES_INSN_SLOT #define __ARCH_WANT_KPROBES_INSN_SLOT
struct pt_regs; struct pt_regs;
struct kprobe; struct kprobe;
typedef unsigned int kprobe_opcode_t; typedef ppc_opcode_t kprobe_opcode_t;
#define BREAKPOINT_INSTRUCTION 0x7fe00008 /* trap */
#define MAX_INSN_SIZE 1 #define MAX_INSN_SIZE 1
#define IS_TW(instr) (((instr) & 0xfc0007fe) == 0x7c000008)
#define IS_TD(instr) (((instr) & 0xfc0007fe) == 0x7c000088)
#define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000)
#define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000)
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* /*
* 64bit powerpc uses function descriptors. * 64bit powerpc uses function descriptors.
...@@ -72,12 +67,6 @@ typedef unsigned int kprobe_opcode_t; ...@@ -72,12 +67,6 @@ typedef unsigned int kprobe_opcode_t;
addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); \ addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); \
} \ } \
} }
#define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \
IS_TWI(instr) || IS_TDI(instr))
#else
/* Use stock kprobe_lookup_name since ppc32 doesn't use function descriptors */
#define is_trap(instr) (IS_TW(instr) || IS_TWI(instr))
#endif #endif
#define flush_insn_slot(p) do { } while (0) #define flush_insn_slot(p) do { } while (0)
......
...@@ -59,7 +59,7 @@ struct hpte_cache { ...@@ -59,7 +59,7 @@ struct hpte_cache {
struct hlist_node list_vpte; struct hlist_node list_vpte;
struct hlist_node list_vpte_long; struct hlist_node list_vpte_long;
struct rcu_head rcu_head; struct rcu_head rcu_head;
u64 host_va; u64 host_vpn;
u64 pfn; u64 pfn;
ulong slot; ulong slot;
struct kvmppc_pte pte; struct kvmppc_pte pte;
......
...@@ -74,7 +74,6 @@ struct kvmppc_host_state { ...@@ -74,7 +74,6 @@ struct kvmppc_host_state {
ulong vmhandler; ulong vmhandler;
ulong scratch0; ulong scratch0;
ulong scratch1; ulong scratch1;
ulong sprg3;
u8 in_guest; u8 in_guest;
u8 restore_hid5; u8 restore_hid5;
u8 napping; u8 napping;
......
...@@ -34,19 +34,19 @@ struct machdep_calls { ...@@ -34,19 +34,19 @@ struct machdep_calls {
char *name; char *name;
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
void (*hpte_invalidate)(unsigned long slot, void (*hpte_invalidate)(unsigned long slot,
unsigned long va, unsigned long vpn,
int psize, int ssize, int psize, int ssize,
int local); int local);
long (*hpte_updatepp)(unsigned long slot, long (*hpte_updatepp)(unsigned long slot,
unsigned long newpp, unsigned long newpp,
unsigned long va, unsigned long vpn,
int psize, int ssize, int psize, int ssize,
int local); int local);
void (*hpte_updateboltedpp)(unsigned long newpp, void (*hpte_updateboltedpp)(unsigned long newpp,
unsigned long ea, unsigned long ea,
int psize, int ssize); int psize, int ssize);
long (*hpte_insert)(unsigned long hpte_group, long (*hpte_insert)(unsigned long hpte_group,
unsigned long va, unsigned long vpn,
unsigned long prpn, unsigned long prpn,
unsigned long rflags, unsigned long rflags,
unsigned long vflags, unsigned long vflags,
...@@ -180,7 +180,8 @@ struct machdep_calls { ...@@ -180,7 +180,8 @@ struct machdep_calls {
void (*enable_pmcs)(void); void (*enable_pmcs)(void);
/* Set DABR for this platform, leave empty for default implemenation */ /* Set DABR for this platform, leave empty for default implemenation */
int (*set_dabr)(unsigned long dabr); int (*set_dabr)(unsigned long dabr,
unsigned long dabrx);
#ifdef CONFIG_PPC32 /* XXX for now */ #ifdef CONFIG_PPC32 /* XXX for now */
/* A general init function, called by ppc_init in init/main.c. /* A general init function, called by ppc_init in init/main.c.
......
...@@ -15,6 +15,13 @@ ...@@ -15,6 +15,13 @@
#include <asm/asm-compat.h> #include <asm/asm-compat.h>
#include <asm/page.h> #include <asm/page.h>
/*
* This is necessary to get the definition of PGTABLE_RANGE which we
* need for various slices related matters. Note that this isn't the
* complete pgtable.h but only a portion of it.
*/
#include <asm/pgtable-ppc64.h>
/* /*
* Segment table * Segment table
*/ */
...@@ -154,9 +161,25 @@ struct mmu_psize_def ...@@ -154,9 +161,25 @@ struct mmu_psize_def
#define MMU_SEGSIZE_256M 0 #define MMU_SEGSIZE_256M 0
#define MMU_SEGSIZE_1T 1 #define MMU_SEGSIZE_1T 1
/*
* encode page number shift.
* in order to fit the 78 bit va in a 64 bit variable we shift the va by
* 12 bits. This enable us to address upto 76 bit va.
* For hpt hash from a va we can ignore the page size bits of va and for
* hpte encoding we ignore up to 23 bits of va. So ignoring lower 12 bits ensure
* we work in all cases including 4k page size.
*/
#define VPN_SHIFT 12
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
static inline int segment_shift(int ssize)
{
if (ssize == MMU_SEGSIZE_256M)
return SID_SHIFT;
return SID_SHIFT_1T;
}
/* /*
* The current system page and segment sizes * The current system page and segment sizes
*/ */
...@@ -179,19 +202,40 @@ extern unsigned long tce_alloc_start, tce_alloc_end; ...@@ -179,19 +202,40 @@ extern unsigned long tce_alloc_start, tce_alloc_end;
*/ */
extern int mmu_ci_restrictions; extern int mmu_ci_restrictions;
/*
* This computes the AVPN and B fields of the first dword of a HPTE,
* for use when we want to match an existing PTE. The bottom 7 bits
* of the returned value are zero.
*/
static inline unsigned long hpte_encode_avpn(unsigned long vpn, int psize,
int ssize)
{
unsigned long v;
/*
* The AVA field omits the low-order 23 bits of the 78 bits VA.
* These bits are not needed in the PTE, because the
* low-order b of these bits are part of the byte offset
* into the virtual page and, if b < 23, the high-order
* 23-b of these bits are always used in selecting the
* PTEGs to be searched
*/
v = (vpn >> (23 - VPN_SHIFT)) & ~(mmu_psize_defs[psize].avpnm);
v <<= HPTE_V_AVPN_SHIFT;
v |= ((unsigned long) ssize) << HPTE_V_SSIZE_SHIFT;
return v;
}
/* /*
* This function sets the AVPN and L fields of the HPTE appropriately * This function sets the AVPN and L fields of the HPTE appropriately
* for the page size * for the page size
*/ */
static inline unsigned long hpte_encode_v(unsigned long va, int psize, static inline unsigned long hpte_encode_v(unsigned long vpn,
int ssize) int psize, int ssize)
{ {
unsigned long v; unsigned long v;
v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm); v = hpte_encode_avpn(vpn, psize, ssize);
v <<= HPTE_V_AVPN_SHIFT;
if (psize != MMU_PAGE_4K) if (psize != MMU_PAGE_4K)
v |= HPTE_V_LARGE; v |= HPTE_V_LARGE;
v |= ((unsigned long) ssize) << HPTE_V_SSIZE_SHIFT;
return v; return v;
} }
...@@ -216,30 +260,37 @@ static inline unsigned long hpte_encode_r(unsigned long pa, int psize) ...@@ -216,30 +260,37 @@ static inline unsigned long hpte_encode_r(unsigned long pa, int psize)
} }
/* /*
* Build a VA given VSID, EA and segment size * Build a VPN_SHIFT bit shifted va given VSID, EA and segment size.
*/ */
static inline unsigned long hpt_va(unsigned long ea, unsigned long vsid, static inline unsigned long hpt_vpn(unsigned long ea,
int ssize) unsigned long vsid, int ssize)
{ {
if (ssize == MMU_SEGSIZE_256M) unsigned long mask;
return (vsid << 28) | (ea & 0xfffffffUL); int s_shift = segment_shift(ssize);
return (vsid << 40) | (ea & 0xffffffffffUL);
mask = (1ul << (s_shift - VPN_SHIFT)) - 1;
return (vsid << (s_shift - VPN_SHIFT)) | ((ea >> VPN_SHIFT) & mask);
} }
/* /*
* This hashes a virtual address * This hashes a virtual address
*/ */
static inline unsigned long hpt_hash(unsigned long vpn,
static inline unsigned long hpt_hash(unsigned long va, unsigned int shift, unsigned int shift, int ssize)
int ssize)
{ {
int mask;
unsigned long hash, vsid; unsigned long hash, vsid;
/* VPN_SHIFT can be atmost 12 */
if (ssize == MMU_SEGSIZE_256M) { if (ssize == MMU_SEGSIZE_256M) {
hash = (va >> 28) ^ ((va & 0x0fffffffUL) >> shift); mask = (1ul << (SID_SHIFT - VPN_SHIFT)) - 1;
hash = (vpn >> (SID_SHIFT - VPN_SHIFT)) ^
((vpn & mask) >> (shift - VPN_SHIFT));
} else { } else {
vsid = va >> 40; mask = (1ul << (SID_SHIFT_1T - VPN_SHIFT)) - 1;
hash = vsid ^ (vsid << 25) ^ ((va & 0xffffffffffUL) >> shift); vsid = vpn >> (SID_SHIFT_1T - VPN_SHIFT);
hash = vsid ^ (vsid << 25) ^
((vpn & mask) >> (shift - VPN_SHIFT)) ;
} }
return hash & 0x7fffffffffUL; return hash & 0x7fffffffffUL;
} }
...@@ -280,63 +331,61 @@ extern void slb_set_size(u16 size); ...@@ -280,63 +331,61 @@ extern void slb_set_size(u16 size);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
/* /*
* VSID allocation * VSID allocation (256MB segment)
*
* We first generate a 38-bit "proto-VSID". For kernel addresses this
* is equal to the ESID | 1 << 37, for user addresses it is:
* (context << USER_ESID_BITS) | (esid & ((1U << USER_ESID_BITS) - 1)
* *
* We first generate a 36-bit "proto-VSID". For kernel addresses this * This splits the proto-VSID into the below range
* is equal to the ESID, for user addresses it is: * 0 - (2^(CONTEXT_BITS + USER_ESID_BITS) - 1) : User proto-VSID range
* (context << 15) | (esid & 0x7fff) * 2^(CONTEXT_BITS + USER_ESID_BITS) - 2^(VSID_BITS) : Kernel proto-VSID range
* *
* The two forms are distinguishable because the top bit is 0 for user * We also have CONTEXT_BITS + USER_ESID_BITS = VSID_BITS - 1
* addresses, whereas the top two bits are 1 for kernel addresses. * That is, we assign half of the space to user processes and half
* Proto-VSIDs with the top two bits equal to 0b10 are reserved for * to the kernel.
* now.
* *
* The proto-VSIDs are then scrambled into real VSIDs with the * The proto-VSIDs are then scrambled into real VSIDs with the
* multiplicative hash: * multiplicative hash:
* *
* VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS * VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS
* where VSID_MULTIPLIER = 268435399 = 0xFFFFFC7
* VSID_MODULUS = 2^36-1 = 0xFFFFFFFFF
* *
* This scramble is only well defined for proto-VSIDs below * VSID_MULTIPLIER is prime, so in particular it is
* 0xFFFFFFFFF, so both proto-VSID and actual VSID 0xFFFFFFFFF are
* reserved. VSID_MULTIPLIER is prime, so in particular it is
* co-prime to VSID_MODULUS, making this a 1:1 scrambling function. * co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
* Because the modulus is 2^n-1 we can compute it efficiently without * Because the modulus is 2^n-1 we can compute it efficiently without
* a divide or extra multiply (see below). * a divide or extra multiply (see below).
* *
* This scheme has several advantages over older methods: * This scheme has several advantages over older methods:
* *
* - We have VSIDs allocated for every kernel address * - We have VSIDs allocated for every kernel address
* (i.e. everything above 0xC000000000000000), except the very top * (i.e. everything above 0xC000000000000000), except the very top
* segment, which simplifies several things. * segment, which simplifies several things.
* *
* - We allow for 16 significant bits of ESID and 19 bits of * - We allow for USER_ESID_BITS significant bits of ESID and
* context for user addresses. i.e. 16T (44 bits) of address space for * CONTEXT_BITS bits of context for user addresses.
* up to half a million contexts. * i.e. 64T (46 bits) of address space for up to half a million contexts.
* *
* - The scramble function gives robust scattering in the hash * - The scramble function gives robust scattering in the hash
* table (at least based on some initial results). The previous * table (at least based on some initial results). The previous
* method was more susceptible to pathological cases giving excessive * method was more susceptible to pathological cases giving excessive
* hash collisions. * hash collisions.
*/ */
/* /*
* WARNING - If you change these you must make sure the asm * This should be computed such that protovosid * vsid_mulitplier
* implementations in slb_allocate (slb_low.S), do_stab_bolted * doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
* (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
*/ */
#define VSID_MULTIPLIER_256M ASM_CONST(12538073) /* 24-bit prime */
#define VSID_MULTIPLIER_256M ASM_CONST(200730139) /* 28-bit prime */ #define VSID_BITS_256M 38
#define VSID_BITS_256M 36
#define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1) #define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1)
#define VSID_MULTIPLIER_1T ASM_CONST(12538073) /* 24-bit prime */ #define VSID_MULTIPLIER_1T ASM_CONST(12538073) /* 24-bit prime */
#define VSID_BITS_1T 24 #define VSID_BITS_1T 26
#define VSID_MODULUS_1T ((1UL<<VSID_BITS_1T)-1) #define VSID_MODULUS_1T ((1UL<<VSID_BITS_1T)-1)
#define CONTEXT_BITS 19 #define CONTEXT_BITS 19
#define USER_ESID_BITS 16 #define USER_ESID_BITS 18
#define USER_ESID_BITS_1T 4 #define USER_ESID_BITS_1T 6
#define USER_VSID_RANGE (1UL << (USER_ESID_BITS + SID_SHIFT)) #define USER_VSID_RANGE (1UL << (USER_ESID_BITS + SID_SHIFT))
...@@ -372,6 +421,8 @@ extern void slb_set_size(u16 size); ...@@ -372,6 +421,8 @@ extern void slb_set_size(u16 size);
srdi rx,rx,VSID_BITS_##size; /* extract 2^VSID_BITS bit */ \ srdi rx,rx,VSID_BITS_##size; /* extract 2^VSID_BITS bit */ \
add rt,rt,rx add rt,rt,rx
/* 4 bits per slice and we have one slice per 1TB */
#define SLICE_ARRAY_SIZE (PGTABLE_RANGE >> 41)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -416,7 +467,7 @@ typedef struct { ...@@ -416,7 +467,7 @@ typedef struct {
#ifdef CONFIG_PPC_MM_SLICES #ifdef CONFIG_PPC_MM_SLICES
u64 low_slices_psize; /* SLB page size encodings */ u64 low_slices_psize; /* SLB page size encodings */
u64 high_slices_psize; /* 4 bits per slice for now */ unsigned char high_slices_psize[SLICE_ARRAY_SIZE];
#else #else
u16 sllp; /* SLB page size encoding */ u16 sllp; /* SLB page size encoding */
#endif #endif
...@@ -452,12 +503,32 @@ typedef struct { ...@@ -452,12 +503,32 @@ typedef struct {
}) })
#endif /* 1 */ #endif /* 1 */
/* This is only valid for addresses >= PAGE_OFFSET */ /*
* This is only valid for addresses >= PAGE_OFFSET
* The proto-VSID space is divided into two class
* User: 0 to 2^(CONTEXT_BITS + USER_ESID_BITS) -1
* kernel: 2^(CONTEXT_BITS + USER_ESID_BITS) to 2^(VSID_BITS) - 1
*
* With KERNEL_START at 0xc000000000000000, the proto vsid for
* the kernel ends up with 0xc00000000 (36 bits). With 64TB
* support we need to have kernel proto-VSID in the
* [2^37 to 2^38 - 1] range due to the increased USER_ESID_BITS.
*/
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize) static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
{ {
if (ssize == MMU_SEGSIZE_256M) unsigned long proto_vsid;
return vsid_scramble(ea >> SID_SHIFT, 256M); /*
return vsid_scramble(ea >> SID_SHIFT_1T, 1T); * We need to make sure proto_vsid for the kernel is
* >= 2^(CONTEXT_BITS + USER_ESID_BITS[_1T])
*/
if (ssize == MMU_SEGSIZE_256M) {
proto_vsid = ea >> SID_SHIFT;
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS));
return vsid_scramble(proto_vsid, 256M);
}
proto_vsid = ea >> SID_SHIFT_1T;
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS_1T));
return vsid_scramble(proto_vsid, 1T);
} }
/* Returns the segment size indicator for a user address */ /* Returns the segment size indicator for a user address */
......
...@@ -146,6 +146,15 @@ extern void setup_initial_memory_limit(phys_addr_t first_memblock_base, ...@@ -146,6 +146,15 @@ extern void setup_initial_memory_limit(phys_addr_t first_memblock_base,
extern u64 ppc64_rma_size; extern u64 ppc64_rma_size;
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
struct mm_struct;
#ifdef CONFIG_DEBUG_VM
extern void assert_pte_locked(struct mm_struct *mm, unsigned long addr);
#else /* CONFIG_DEBUG_VM */
static inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr)
{
}
#endif /* !CONFIG_DEBUG_VM */
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
/* The kernel use the constants below to index in the page sizes array. /* The kernel use the constants below to index in the page sizes array.
......
...@@ -307,6 +307,7 @@ struct mpc52xx_lpbfifo_request { ...@@ -307,6 +307,7 @@ struct mpc52xx_lpbfifo_request {
size_t size; size_t size;
size_t pos; /* current position of transfer */ size_t pos; /* current position of transfer */
int flags; int flags;
int defer_xfer_start;
/* What to do when finished */ /* What to do when finished */
void (*callback)(struct mpc52xx_lpbfifo_request *); void (*callback)(struct mpc52xx_lpbfifo_request *);
...@@ -323,6 +324,7 @@ struct mpc52xx_lpbfifo_request { ...@@ -323,6 +324,7 @@ struct mpc52xx_lpbfifo_request {
extern int mpc52xx_lpbfifo_submit(struct mpc52xx_lpbfifo_request *req); extern int mpc52xx_lpbfifo_submit(struct mpc52xx_lpbfifo_request *req);
extern void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req); extern void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req);
extern void mpc52xx_lpbfifo_poll(void); extern void mpc52xx_lpbfifo_poll(void);
extern int mpc52xx_lpbfifo_start_xfer(struct mpc52xx_lpbfifo_request *req);
/* mpc52xx_pic.c */ /* mpc52xx_pic.c */
extern void mpc52xx_init_irq(void); extern void mpc52xx_init_irq(void);
......
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
*/ */
#define MPIC_TIMER_BASE 0x01100 #define MPIC_TIMER_BASE 0x01100
#define MPIC_TIMER_STRIDE 0x40 #define MPIC_TIMER_STRIDE 0x40
#define MPIC_TIMER_GROUP_STRIDE 0x1000
#define MPIC_TIMER_CURRENT_CNT 0x00000 #define MPIC_TIMER_CURRENT_CNT 0x00000
#define MPIC_TIMER_BASE_CNT 0x00010 #define MPIC_TIMER_BASE_CNT 0x00010
...@@ -110,10 +111,16 @@ ...@@ -110,10 +111,16 @@
#define MPIC_VECPRI_SENSE_MASK 0x00400000 #define MPIC_VECPRI_SENSE_MASK 0x00400000
#define MPIC_IRQ_DESTINATION 0x00010 #define MPIC_IRQ_DESTINATION 0x00010
#define MPIC_FSL_BRR1 0x00000
#define MPIC_FSL_BRR1_VER 0x0000ffff
#define MPIC_MAX_IRQ_SOURCES 2048 #define MPIC_MAX_IRQ_SOURCES 2048
#define MPIC_MAX_CPUS 32 #define MPIC_MAX_CPUS 32
#define MPIC_MAX_ISU 32 #define MPIC_MAX_ISU 32
#define MPIC_MAX_ERR 32
#define MPIC_FSL_ERR_INT 16
/* /*
* Tsi108 implementation of MPIC has many differences from the original one * Tsi108 implementation of MPIC has many differences from the original one
*/ */
...@@ -266,6 +273,7 @@ struct mpic ...@@ -266,6 +273,7 @@ struct mpic
struct irq_chip hc_ipi; struct irq_chip hc_ipi;
#endif #endif
struct irq_chip hc_tm; struct irq_chip hc_tm;
struct irq_chip hc_err;
const char *name; const char *name;
/* Flags */ /* Flags */
unsigned int flags; unsigned int flags;
...@@ -279,6 +287,8 @@ struct mpic ...@@ -279,6 +287,8 @@ struct mpic
/* vector numbers used for internal sources (ipi/timers) */ /* vector numbers used for internal sources (ipi/timers) */
unsigned int ipi_vecs[4]; unsigned int ipi_vecs[4];
unsigned int timer_vecs[8]; unsigned int timer_vecs[8];
/* vector numbers used for FSL MPIC error interrupts */
unsigned int err_int_vecs[MPIC_MAX_ERR];
/* Spurious vector to program into unused sources */ /* Spurious vector to program into unused sources */
unsigned int spurious_vec; unsigned int spurious_vec;
...@@ -296,11 +306,15 @@ struct mpic ...@@ -296,11 +306,15 @@ struct mpic
phys_addr_t paddr; phys_addr_t paddr;
/* The various ioremap'ed bases */ /* The various ioremap'ed bases */
struct mpic_reg_bank thiscpuregs;
struct mpic_reg_bank gregs; struct mpic_reg_bank gregs;
struct mpic_reg_bank tmregs; struct mpic_reg_bank tmregs;
struct mpic_reg_bank cpuregs[MPIC_MAX_CPUS]; struct mpic_reg_bank cpuregs[MPIC_MAX_CPUS];
struct mpic_reg_bank isus[MPIC_MAX_ISU]; struct mpic_reg_bank isus[MPIC_MAX_ISU];
/* ioremap'ed base for error interrupt registers */
u32 __iomem *err_regs;
/* Protected sources */ /* Protected sources */
unsigned long *protected; unsigned long *protected;
...@@ -365,6 +379,11 @@ struct mpic ...@@ -365,6 +379,11 @@ struct mpic
#define MPIC_NO_RESET 0x00004000 #define MPIC_NO_RESET 0x00004000
/* Freescale MPIC (compatible includes "fsl,mpic") */ /* Freescale MPIC (compatible includes "fsl,mpic") */
#define MPIC_FSL 0x00008000 #define MPIC_FSL 0x00008000
/* Freescale MPIC supports EIMR (error interrupt mask register).
* This flag is set for MPIC version >= 4.1 (version determined
* from the BRR1 register).
*/
#define MPIC_FSL_HAS_EIMR 0x00010000
/* MPIC HW modification ID */ /* MPIC HW modification ID */
#define MPIC_REGSET_MASK 0xf0000000 #define MPIC_REGSET_MASK 0xf0000000
......
...@@ -100,7 +100,7 @@ struct paca_struct { ...@@ -100,7 +100,7 @@ struct paca_struct {
/* SLB related definitions */ /* SLB related definitions */
u16 vmalloc_sllp; u16 vmalloc_sllp;
u16 slb_cache_ptr; u16 slb_cache_ptr;
u16 slb_cache[SLB_CACHE_ENTRIES]; u32 slb_cache[SLB_CACHE_ENTRIES];
#endif /* CONFIG_PPC_STD_MMU_64 */ #endif /* CONFIG_PPC_STD_MMU_64 */
#ifdef CONFIG_PPC_BOOK3E #ifdef CONFIG_PPC_BOOK3E
...@@ -136,6 +136,7 @@ struct paca_struct { ...@@ -136,6 +136,7 @@ struct paca_struct {
u8 io_sync; /* writel() needs spin_unlock sync */ u8 io_sync; /* writel() needs spin_unlock sync */
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */ u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
u8 nap_state_lost; /* NV GPR values lost in power7_idle */ u8 nap_state_lost; /* NV GPR values lost in power7_idle */
u64 sprg3; /* Saved user-visible sprg */
#ifdef CONFIG_PPC_POWERNV #ifdef CONFIG_PPC_POWERNV
/* Pointer to OPAL machine check event structure set by the /* Pointer to OPAL machine check event structure set by the
......
...@@ -78,11 +78,19 @@ extern u64 ppc64_pft_size; ...@@ -78,11 +78,19 @@ extern u64 ppc64_pft_size;
#define GET_LOW_SLICE_INDEX(addr) ((addr) >> SLICE_LOW_SHIFT) #define GET_LOW_SLICE_INDEX(addr) ((addr) >> SLICE_LOW_SHIFT)
#define GET_HIGH_SLICE_INDEX(addr) ((addr) >> SLICE_HIGH_SHIFT) #define GET_HIGH_SLICE_INDEX(addr) ((addr) >> SLICE_HIGH_SHIFT)
/*
* 1 bit per slice and we have one slice per 1TB
* Right now we support only 64TB.
* IF we change this we will have to change the type
* of high_slices
*/
#define SLICE_MASK_SIZE 8
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
struct slice_mask { struct slice_mask {
u16 low_slices; u16 low_slices;
u16 high_slices; u64 high_slices;
}; };
struct mm_struct; struct mm_struct;
......
...@@ -182,14 +182,25 @@ static inline int pci_device_from_OF_node(struct device_node *np, ...@@ -182,14 +182,25 @@ static inline int pci_device_from_OF_node(struct device_node *np,
#if defined(CONFIG_EEH) #if defined(CONFIG_EEH)
static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn) static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn)
{ {
/*
* For those OF nodes whose parent isn't PCI bridge, they
* don't have PCI_DN actually. So we have to skip them for
* any EEH operations.
*/
if (!dn || !PCI_DN(dn))
return NULL;
return PCI_DN(dn)->edev; return PCI_DN(dn)->edev;
} }
#else
#define of_node_to_eeh_dev(x) (NULL)
#endif #endif
/** Find the bus corresponding to the indicated device node */ /** Find the bus corresponding to the indicated device node */
extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn); extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn);
/** Remove all of the PCI devices under this bus */ /** Remove all of the PCI devices under this bus */
extern void __pcibios_remove_pci_devices(struct pci_bus *bus, int purge_pe);
extern void pcibios_remove_pci_devices(struct pci_bus *bus); extern void pcibios_remove_pci_devices(struct pci_bus *bus);
/** Discover new pci devices under this bus, and add them */ /** Discover new pci devices under this bus, and add them */
......
...@@ -49,6 +49,7 @@ struct power_pmu { ...@@ -49,6 +49,7 @@ struct power_pmu {
#define PPMU_ALT_SIPR 2 /* uses alternate posn for SIPR/HV */ #define PPMU_ALT_SIPR 2 /* uses alternate posn for SIPR/HV */
#define PPMU_NO_SIPR 4 /* no SIPR/HV in MMCRA at all */ #define PPMU_NO_SIPR 4 /* no SIPR/HV in MMCRA at all */
#define PPMU_NO_CONT_SAMPLING 8 /* no continuous sampling */ #define PPMU_NO_CONT_SAMPLING 8 /* no continuous sampling */
#define PPMU_SIAR_VALID 16 /* Processor has SIAR Valid bit */
/* /*
* Values for flags to get_alternatives() * Values for flags to get_alternatives()
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
*/ */
#define PTE_INDEX_SIZE 9 #define PTE_INDEX_SIZE 9
#define PMD_INDEX_SIZE 7 #define PMD_INDEX_SIZE 7
#define PUD_INDEX_SIZE 7 #define PUD_INDEX_SIZE 9
#define PGD_INDEX_SIZE 9 #define PGD_INDEX_SIZE 9
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#define PTRS_PER_PTE (1 << PTE_INDEX_SIZE) #define PTRS_PER_PTE (1 << PTE_INDEX_SIZE)
#define PTRS_PER_PMD (1 << PMD_INDEX_SIZE) #define PTRS_PER_PMD (1 << PMD_INDEX_SIZE)
#define PTRS_PER_PUD (1 << PMD_INDEX_SIZE) #define PTRS_PER_PUD (1 << PUD_INDEX_SIZE)
#define PTRS_PER_PGD (1 << PGD_INDEX_SIZE) #define PTRS_PER_PGD (1 << PGD_INDEX_SIZE)
/* PMD_SHIFT determines what a second-level page table entry can map */ /* PMD_SHIFT determines what a second-level page table entry can map */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#define PTE_INDEX_SIZE 12 #define PTE_INDEX_SIZE 12
#define PMD_INDEX_SIZE 12 #define PMD_INDEX_SIZE 12
#define PUD_INDEX_SIZE 0 #define PUD_INDEX_SIZE 0
#define PGD_INDEX_SIZE 4 #define PGD_INDEX_SIZE 6
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE) #define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE)
......
...@@ -21,17 +21,6 @@ ...@@ -21,17 +21,6 @@
#define PGTABLE_RANGE (ASM_CONST(1) << PGTABLE_EADDR_SIZE) #define PGTABLE_RANGE (ASM_CONST(1) << PGTABLE_EADDR_SIZE)
/* Some sanity checking */
#if TASK_SIZE_USER64 > PGTABLE_RANGE
#error TASK_SIZE_USER64 exceeds pagetable range
#endif
#ifdef CONFIG_PPC_STD_MMU_64
#if TASK_SIZE_USER64 > (1UL << (USER_ESID_BITS + SID_SHIFT))
#error TASK_SIZE_USER64 exceeds user VSID range
#endif
#endif
/* /*
* Define the address range of the kernel non-linear virtual area * Define the address range of the kernel non-linear virtual area
*/ */
...@@ -41,7 +30,7 @@ ...@@ -41,7 +30,7 @@
#else #else
#define KERN_VIRT_START ASM_CONST(0xD000000000000000) #define KERN_VIRT_START ASM_CONST(0xD000000000000000)
#endif #endif
#define KERN_VIRT_SIZE PGTABLE_RANGE #define KERN_VIRT_SIZE ASM_CONST(0x0000100000000000)
/* /*
* The vmalloc space starts at the beginning of that region, and * The vmalloc space starts at the beginning of that region, and
...@@ -117,9 +106,6 @@ ...@@ -117,9 +106,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/stddef.h>
#include <asm/tlbflush.h>
/* /*
* This is the default implementation of various PTE accessors, it's * This is the default implementation of various PTE accessors, it's
* used in all cases except Book3S with 64K pages where we have a * used in all cases except Book3S with 64K pages where we have a
...@@ -198,7 +184,8 @@ ...@@ -198,7 +184,8 @@
/* to find an entry in a kernel page-table-directory */ /* to find an entry in a kernel page-table-directory */
/* This now only contains the vmalloc pages */ /* This now only contains the vmalloc pages */
#define pgd_offset_k(address) pgd_offset(&init_mm, address) #define pgd_offset_k(address) pgd_offset(&init_mm, address)
extern void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, unsigned long pte, int huge);
/* Atomic PTE updates */ /* Atomic PTE updates */
static inline unsigned long pte_update(struct mm_struct *mm, static inline unsigned long pte_update(struct mm_struct *mm,
......
...@@ -9,14 +9,6 @@ ...@@ -9,14 +9,6 @@
struct mm_struct; struct mm_struct;
#ifdef CONFIG_DEBUG_VM
extern void assert_pte_locked(struct mm_struct *mm, unsigned long addr);
#else /* CONFIG_DEBUG_VM */
static inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr)
{
}
#endif /* !CONFIG_DEBUG_VM */
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#if defined(CONFIG_PPC64) #if defined(CONFIG_PPC64)
...@@ -27,6 +19,8 @@ static inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr) ...@@ -27,6 +19,8 @@ static inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/tlbflush.h>
/* Generic accessors to PTE bits */ /* Generic accessors to PTE bits */
static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
#define PPC_INST_TLBIVAX 0x7c000624 #define PPC_INST_TLBIVAX 0x7c000624
#define PPC_INST_TLBSRX_DOT 0x7c0006a5 #define PPC_INST_TLBSRX_DOT 0x7c0006a5
#define PPC_INST_XXLOR 0xf0000510 #define PPC_INST_XXLOR 0xf0000510
#define PPC_INST_XVCPSGNDP 0xf0000780
#define PPC_INST_NAP 0x4c000364 #define PPC_INST_NAP 0x4c000364
#define PPC_INST_SLEEP 0x4c0003a4 #define PPC_INST_SLEEP 0x4c0003a4
...@@ -277,6 +278,8 @@ ...@@ -277,6 +278,8 @@
VSX_XX1((s), a, b)) VSX_XX1((s), a, b))
#define XXLOR(t, a, b) stringify_in_c(.long PPC_INST_XXLOR | \ #define XXLOR(t, a, b) stringify_in_c(.long PPC_INST_XXLOR | \
VSX_XX3((t), a, b)) VSX_XX3((t), a, b))
#define XVCPSGNDP(t, a, b) stringify_in_c(.long (PPC_INST_XVCPSGNDP | \
VSX_XX3((t), (a), (b))))
#define PPC_NAP stringify_in_c(.long PPC_INST_NAP) #define PPC_NAP stringify_in_c(.long PPC_INST_NAP)
#define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP) #define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP)
......
...@@ -47,19 +47,17 @@ extern int rtas_setup_phb(struct pci_controller *phb); ...@@ -47,19 +47,17 @@ extern int rtas_setup_phb(struct pci_controller *phb);
#ifdef CONFIG_EEH #ifdef CONFIG_EEH
void pci_addr_cache_build(void); void eeh_addr_cache_insert_dev(struct pci_dev *dev);
void pci_addr_cache_insert_device(struct pci_dev *dev); void eeh_addr_cache_rmv_dev(struct pci_dev *dev);
void pci_addr_cache_remove_device(struct pci_dev *dev); struct eeh_dev *eeh_addr_cache_get_dev(unsigned long addr);
struct pci_dev *pci_addr_cache_get_device(unsigned long addr); void eeh_slot_error_detail(struct eeh_pe *pe, int severity);
void eeh_slot_error_detail(struct eeh_dev *edev, int severity); int eeh_pci_enable(struct eeh_pe *pe, int function);
int eeh_pci_enable(struct eeh_dev *edev, int function); int eeh_reset_pe(struct eeh_pe *);
int eeh_reset_pe(struct eeh_dev *); void eeh_save_bars(struct eeh_dev *edev);
void eeh_restore_bars(struct eeh_dev *);
int rtas_write_config(struct pci_dn *, int where, int size, u32 val); int rtas_write_config(struct pci_dn *, int where, int size, u32 val);
int rtas_read_config(struct pci_dn *, int where, int size, u32 *val); int rtas_read_config(struct pci_dn *, int where, int size, u32 *val);
void eeh_mark_slot(struct device_node *dn, int mode_flag); void eeh_pe_state_mark(struct eeh_pe *pe, int state);
void eeh_clear_slot(struct device_node *dn, int mode_flag); void eeh_pe_state_clear(struct eeh_pe *pe, int state);
struct device_node *eeh_find_device_pe(struct device_node *dn);
void eeh_sysfs_add_device(struct pci_dev *pdev); void eeh_sysfs_add_device(struct pci_dev *pdev);
void eeh_sysfs_remove_device(struct pci_dev *pdev); void eeh_sysfs_remove_device(struct pci_dev *pdev);
......
#ifndef _ASM_POWERPC_PROBES_H
#define _ASM_POWERPC_PROBES_H
#ifdef __KERNEL__
/*
* Definitions common to probes files
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Copyright IBM Corporation, 2012
*/
#include <linux/types.h>
typedef u32 ppc_opcode_t;
#define BREAKPOINT_INSTRUCTION 0x7fe00008 /* trap */
/* Trap definitions per ISA */
#define IS_TW(instr) (((instr) & 0xfc0007fe) == 0x7c000008)
#define IS_TD(instr) (((instr) & 0xfc0007fe) == 0x7c000088)
#define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000)
#define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000)
#ifdef CONFIG_PPC64
#define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \
IS_TWI(instr) || IS_TDI(instr))
#else
#define is_trap(instr) (IS_TW(instr) || IS_TWI(instr))
#endif /* CONFIG_PPC64 */
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_PROBES_H */
...@@ -97,8 +97,8 @@ extern struct task_struct *last_task_used_spe; ...@@ -97,8 +97,8 @@ extern struct task_struct *last_task_used_spe;
#endif #endif
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* 64-bit user address space is 44-bits (16TB user VM) */ /* 64-bit user address space is 46-bits (64TB user VM) */
#define TASK_SIZE_USER64 (0x0000100000000000UL) #define TASK_SIZE_USER64 (0x0000400000000000UL)
/* /*
* 32-bit user address space is 4GB - 1 page * 32-bit user address space is 4GB - 1 page
...@@ -219,6 +219,8 @@ struct thread_struct { ...@@ -219,6 +219,8 @@ struct thread_struct {
#endif /* CONFIG_HAVE_HW_BREAKPOINT */ #endif /* CONFIG_HAVE_HW_BREAKPOINT */
#endif #endif
unsigned long dabr; /* Data address breakpoint register */ unsigned long dabr; /* Data address breakpoint register */
unsigned long dabrx; /* ... extension */
unsigned long trap_nr; /* last trap # on this thread */
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
/* Complete AltiVec register set */ /* Complete AltiVec register set */
vector128 vr[32] __attribute__((aligned(16))); vector128 vr[32] __attribute__((aligned(16)));
......
...@@ -58,14 +58,16 @@ ...@@ -58,14 +58,16 @@
/* Trick: we set __end to va + 64k, which happens works for /* Trick: we set __end to va + 64k, which happens works for
* a 16M page as well as we want only one iteration * a 16M page as well as we want only one iteration
*/ */
#define pte_iterate_hashed_subpages(rpte, psize, va, index, shift) \ #define pte_iterate_hashed_subpages(rpte, psize, vpn, index, shift) \
do { \ do { \
unsigned long __end = va + PAGE_SIZE; \ unsigned long __end = vpn + (1UL << (PAGE_SHIFT - VPN_SHIFT)); \
unsigned __split = (psize == MMU_PAGE_4K || \ unsigned __split = (psize == MMU_PAGE_4K || \
psize == MMU_PAGE_64K_AP); \ psize == MMU_PAGE_64K_AP); \
shift = mmu_psize_defs[psize].shift; \ shift = mmu_psize_defs[psize].shift; \
for (index = 0; va < __end; index++, va += (1L << shift)) { \ for (index = 0; vpn < __end; index++, \
if (!__split || __rpte_sub_valid(rpte, index)) do { \ vpn += (1L << (shift - VPN_SHIFT))) { \
if (!__split || __rpte_sub_valid(rpte, index)) \
do {
#define pte_iterate_hashed_end() } while(0); } } while(0) #define pte_iterate_hashed_end() } while(0); } } while(0)
......
...@@ -208,6 +208,9 @@ ...@@ -208,6 +208,9 @@
#define SPRN_DABRX 0x3F7 /* Data Address Breakpoint Register Extension */ #define SPRN_DABRX 0x3F7 /* Data Address Breakpoint Register Extension */
#define DABRX_USER (1UL << 0) #define DABRX_USER (1UL << 0)
#define DABRX_KERNEL (1UL << 1) #define DABRX_KERNEL (1UL << 1)
#define DABRX_HYP (1UL << 2)
#define DABRX_BTI (1UL << 3)
#define DABRX_ALL (DABRX_BTI | DABRX_HYP | DABRX_KERNEL | DABRX_USER)
#define SPRN_DAR 0x013 /* Data Address Register */ #define SPRN_DAR 0x013 /* Data Address Register */
#define SPRN_DBCR 0x136 /* e300 Data Breakpoint Control Reg */ #define SPRN_DBCR 0x136 /* e300 Data Breakpoint Control Reg */
#define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */
...@@ -521,6 +524,7 @@ ...@@ -521,6 +524,7 @@
#define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ #define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */
#define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ #define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */
#define HSRR1_DENORM 0x00100000 /* Denorm exception */
#define SPRN_TBCTL 0x35f /* PA6T Timebase control register */ #define SPRN_TBCTL 0x35f /* PA6T Timebase control register */
#define TBCTL_FREEZE 0x0000000000000000ull /* Freeze all tbs */ #define TBCTL_FREEZE 0x0000000000000000ull /* Freeze all tbs */
...@@ -602,6 +606,10 @@ ...@@ -602,6 +606,10 @@
#define POWER6_MMCRA_SIPR 0x0000020000000000ULL #define POWER6_MMCRA_SIPR 0x0000020000000000ULL
#define POWER6_MMCRA_THRM 0x00000020UL #define POWER6_MMCRA_THRM 0x00000020UL
#define POWER6_MMCRA_OTHER 0x0000000EUL #define POWER6_MMCRA_OTHER 0x0000000EUL
#define POWER7P_MMCRA_SIAR_VALID 0x10000000 /* P7+ SIAR contents valid */
#define POWER7P_MMCRA_SDAR_VALID 0x08000000 /* P7+ SDAR contents valid */
#define SPRN_PMC1 787 #define SPRN_PMC1 787
#define SPRN_PMC2 788 #define SPRN_PMC2 788
#define SPRN_PMC3 789 #define SPRN_PMC3 789
...@@ -761,7 +769,8 @@ ...@@ -761,7 +769,8 @@
* 64-bit embedded * 64-bit embedded
* - SPRG0 generic exception scratch * - SPRG0 generic exception scratch
* - SPRG2 TLB exception stack * - SPRG2 TLB exception stack
* - SPRG3 CPU and NUMA node for VDSO getcpu (user visible) * - SPRG3 critical exception scratch and
* CPU and NUMA node for VDSO getcpu (user visible)
* - SPRG4 unused (user visible) * - SPRG4 unused (user visible)
* - SPRG6 TLB miss scratch (user visible, sorry !) * - SPRG6 TLB miss scratch (user visible, sorry !)
* - SPRG7 critical exception scratch * - SPRG7 critical exception scratch
...@@ -858,11 +867,12 @@ ...@@ -858,11 +867,12 @@
#ifdef CONFIG_PPC_BOOK3E_64 #ifdef CONFIG_PPC_BOOK3E_64
#define SPRN_SPRG_MC_SCRATCH SPRN_SPRG8 #define SPRN_SPRG_MC_SCRATCH SPRN_SPRG8
#define SPRN_SPRG_CRIT_SCRATCH SPRN_SPRG7 #define SPRN_SPRG_CRIT_SCRATCH SPRN_SPRG3
#define SPRN_SPRG_DBG_SCRATCH SPRN_SPRG9 #define SPRN_SPRG_DBG_SCRATCH SPRN_SPRG9
#define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2 #define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2
#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6 #define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6
#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0 #define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0
#define SPRN_SPRG_GDBELL_SCRATCH SPRN_SPRG_GEN_SCRATCH
#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX #define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX
#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA #define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA
...@@ -937,7 +947,7 @@ ...@@ -937,7 +947,7 @@
#define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) /* Version field */ #define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) /* Version field */
#define PVR_REV(pvr) (((pvr) >> 0) & 0xFFFF) /* Revison field */ #define PVR_REV(pvr) (((pvr) >> 0) & 0xFFFF) /* Revison field */
#define __is_processor(pv) (PVR_VER(mfspr(SPRN_PVR)) == (pv)) #define pvr_version_is(pvr) (PVR_VER(mfspr(SPRN_PVR)) == (pvr))
/* /*
* IBM has further subdivided the standard PowerPC 16-bit version and * IBM has further subdivided the standard PowerPC 16-bit version and
...@@ -1002,25 +1012,25 @@ ...@@ -1002,25 +1012,25 @@
#define PVR_476_ISS 0x00052000 #define PVR_476_ISS 0x00052000
/* 64-bit processors */ /* 64-bit processors */
/* XXX the prefix should be PVR_, we'll do a global sweep to fix it one day */ #define PVR_NORTHSTAR 0x0033
#define PV_NORTHSTAR 0x0033 #define PVR_PULSAR 0x0034
#define PV_PULSAR 0x0034 #define PVR_POWER4 0x0035
#define PV_POWER4 0x0035 #define PVR_ICESTAR 0x0036
#define PV_ICESTAR 0x0036 #define PVR_SSTAR 0x0037
#define PV_SSTAR 0x0037 #define PVR_POWER4p 0x0038
#define PV_POWER4p 0x0038 #define PVR_970 0x0039
#define PV_970 0x0039 #define PVR_POWER5 0x003A
#define PV_POWER5 0x003A #define PVR_POWER5p 0x003B
#define PV_POWER5p 0x003B #define PVR_970FX 0x003C
#define PV_970FX 0x003C #define PVR_POWER6 0x003E
#define PV_POWER6 0x003E #define PVR_POWER7 0x003F
#define PV_POWER7 0x003F #define PVR_630 0x0040
#define PV_630 0x0040 #define PVR_630p 0x0041
#define PV_630p 0x0041 #define PVR_970MP 0x0044
#define PV_970MP 0x0044 #define PVR_970GX 0x0045
#define PV_970GX 0x0045 #define PVR_POWER7p 0x004A
#define PV_BE 0x0070 #define PVR_BE 0x0070
#define PV_PA6T 0x0090 #define PVR_PA6T 0x0090
/* Macros for setting and retrieving special purpose registers */ /* Macros for setting and retrieving special purpose registers */
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -9,7 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex); ...@@ -9,7 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex);
extern unsigned int rtas_data; extern unsigned int rtas_data;
extern int mem_init_done; /* set on boot once kmalloc can be called */ extern int mem_init_done; /* set on boot once kmalloc can be called */
extern int init_bootmem_done; /* set once bootmem is available */ extern int init_bootmem_done; /* set once bootmem is available */
extern phys_addr_t memory_limit; extern unsigned long long memory_limit;
extern unsigned long klimit; extern unsigned long klimit;
extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
......
...@@ -65,6 +65,7 @@ int generic_cpu_disable(void); ...@@ -65,6 +65,7 @@ int generic_cpu_disable(void);
void generic_cpu_die(unsigned int cpu); void generic_cpu_die(unsigned int cpu);
void generic_mach_cpu_die(void); void generic_mach_cpu_die(void);
void generic_set_cpu_dead(unsigned int cpu); void generic_set_cpu_dead(unsigned int cpu);
void generic_set_cpu_up(unsigned int cpu);
int generic_check_cpu_restart(unsigned int cpu); int generic_check_cpu_restart(unsigned int cpu);
#endif #endif
...@@ -190,6 +191,7 @@ extern unsigned long __secondary_hold_spinloop; ...@@ -190,6 +191,7 @@ extern unsigned long __secondary_hold_spinloop;
extern unsigned long __secondary_hold_acknowledge; extern unsigned long __secondary_hold_acknowledge;
extern char __secondary_hold; extern char __secondary_hold;
extern void __early_start(void);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
*/ */
#define SECTION_SIZE_BITS 24 #define SECTION_SIZE_BITS 24
#define MAX_PHYSADDR_BITS 44 #define MAX_PHYSADDR_BITS 46
#define MAX_PHYSMEM_BITS 44 #define MAX_PHYSMEM_BITS 46
#endif /* CONFIG_SPARSEMEM */ #endif /* CONFIG_SPARSEMEM */
......
...@@ -22,4 +22,10 @@ int __init swiotlb_setup_bus_notifier(void); ...@@ -22,4 +22,10 @@ int __init swiotlb_setup_bus_notifier(void);
extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev); extern void pci_dma_dev_setup_swiotlb(struct pci_dev *pdev);
#ifdef CONFIG_SWIOTLB
void swiotlb_detect_4g(void);
#else
static inline void swiotlb_detect_4g(void) {}
#endif
#endif /* __ASM_SWIOTLB_H */ #endif /* __ASM_SWIOTLB_H */
...@@ -102,7 +102,10 @@ static inline struct thread_info *current_thread_info(void) ...@@ -102,7 +102,10 @@ static inline struct thread_info *current_thread_info(void)
#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ #define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */
#define TIF_NOERROR 12 /* Force successful syscall return */ #define TIF_NOERROR 12 /* Force successful syscall return */
#define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */
#define TIF_UPROBE 14 /* breakpointed or single-stepping */
#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ #define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */
#define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation
for stack store? */
/* as above, but as bit values */ /* as above, but as bit values */
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
...@@ -118,12 +121,14 @@ static inline struct thread_info *current_thread_info(void) ...@@ -118,12 +121,14 @@ static inline struct thread_info *current_thread_info(void)
#define _TIF_RESTOREALL (1<<TIF_RESTOREALL) #define _TIF_RESTOREALL (1<<TIF_RESTOREALL)
#define _TIF_NOERROR (1<<TIF_NOERROR) #define _TIF_NOERROR (1<<TIF_NOERROR)
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
#define _TIF_UPROBE (1<<TIF_UPROBE)
#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
#define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE)
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
_TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT) _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT)
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
_TIF_NOTIFY_RESUME) _TIF_NOTIFY_RESUME | _TIF_UPROBE)
#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR)
/* Bits in local_flags */ /* Bits in local_flags */
......
...@@ -95,7 +95,7 @@ struct ppc64_tlb_batch { ...@@ -95,7 +95,7 @@ struct ppc64_tlb_batch {
unsigned long index; unsigned long index;
struct mm_struct *mm; struct mm_struct *mm;
real_pte_t pte[PPC64_TLB_BATCH_NR]; real_pte_t pte[PPC64_TLB_BATCH_NR];
unsigned long vaddr[PPC64_TLB_BATCH_NR]; unsigned long vpn[PPC64_TLB_BATCH_NR];
unsigned int psize; unsigned int psize;
int ssize; int ssize;
}; };
...@@ -103,9 +103,6 @@ DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); ...@@ -103,9 +103,6 @@ DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
extern void __flush_tlb_pending(struct ppc64_tlb_batch *batch); extern void __flush_tlb_pending(struct ppc64_tlb_batch *batch);
extern void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, unsigned long pte, int huge);
#define __HAVE_ARCH_ENTER_LAZY_MMU_MODE #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
static inline void arch_enter_lazy_mmu_mode(void) static inline void arch_enter_lazy_mmu_mode(void)
...@@ -127,7 +124,7 @@ static inline void arch_leave_lazy_mmu_mode(void) ...@@ -127,7 +124,7 @@ static inline void arch_leave_lazy_mmu_mode(void)
#define arch_flush_lazy_mmu_mode() do {} while (0) #define arch_flush_lazy_mmu_mode() do {} while (0)
extern void flush_hash_page(unsigned long va, real_pte_t pte, int psize, extern void flush_hash_page(unsigned long vpn, real_pte_t pte, int psize,
int ssize, int local); int ssize, int local);
extern void flush_hash_range(unsigned long number, int local); extern void flush_hash_range(unsigned long number, int local);
......
...@@ -98,11 +98,6 @@ struct exception_table_entry { ...@@ -98,11 +98,6 @@ struct exception_table_entry {
* PowerPC, we can just do these as direct assignments. (Of course, the * PowerPC, we can just do these as direct assignments. (Of course, the
* exception handling means that it's no longer "just"...) * exception handling means that it's no longer "just"...)
* *
* The "user64" versions of the user access functions are versions that
* allow access of 64-bit data. The "get_user" functions do not
* properly handle 64-bit data because the value gets down cast to a long.
* The "put_user" functions already handle 64-bit data properly but we add
* "user64" versions for completeness
*/ */
#define get_user(x, ptr) \ #define get_user(x, ptr) \
__get_user_check((x), (ptr), sizeof(*(ptr))) __get_user_check((x), (ptr), sizeof(*(ptr)))
...@@ -114,12 +109,6 @@ struct exception_table_entry { ...@@ -114,12 +109,6 @@ struct exception_table_entry {
#define __put_user(x, ptr) \ #define __put_user(x, ptr) \
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
#ifndef __powerpc64__
#define __get_user64(x, ptr) \
__get_user64_nocheck((x), (ptr), sizeof(*(ptr)))
#define __put_user64(x, ptr) __put_user(x, ptr)
#endif
#define __get_user_inatomic(x, ptr) \ #define __get_user_inatomic(x, ptr) \
__get_user_nosleep((x), (ptr), sizeof(*(ptr))) __get_user_nosleep((x), (ptr), sizeof(*(ptr)))
#define __put_user_inatomic(x, ptr) \ #define __put_user_inatomic(x, ptr) \
......
#ifndef _ASM_UPROBES_H
#define _ASM_UPROBES_H
/*
* User-space Probes (UProbes) for powerpc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Copyright IBM Corporation, 2007-2012
*
* Adapted from the x86 port by Ananth N Mavinakayanahalli <ananth@in.ibm.com>
*/
#include <linux/notifier.h>
#include <asm/probes.h>
typedef ppc_opcode_t uprobe_opcode_t;
#define MAX_UINSN_BYTES 4
#define UPROBE_XOL_SLOT_BYTES (MAX_UINSN_BYTES)
/* The following alias is needed for reference from arch-agnostic code */
#define UPROBE_SWBP_INSN BREAKPOINT_INSTRUCTION
#define UPROBE_SWBP_INSN_SIZE 4 /* swbp insn size in bytes */
struct arch_uprobe {
union {
u8 insn[MAX_UINSN_BYTES];
u32 ainsn;
};
};
struct arch_uprobe_task {
unsigned long saved_trap_nr;
};
extern int arch_uprobe_analyze_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long addr);
extern int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs);
extern int arch_uprobe_post_xol(struct arch_uprobe *aup, struct pt_regs *regs);
extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk);
extern int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data);
extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs);
#endif /* _ASM_UPROBES_H */
...@@ -96,6 +96,7 @@ obj-$(CONFIG_MODULES) += ppc_ksyms.o ...@@ -96,6 +96,7 @@ obj-$(CONFIG_MODULES) += ppc_ksyms.o
obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_BOOTX_TEXT) += btext.o
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KPROBES) += kprobes.o
obj-$(CONFIG_UPROBES) += uprobes.o
obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
obj-$(CONFIG_SWIOTLB) += dma-swiotlb.o obj-$(CONFIG_SWIOTLB) += dma-swiotlb.o
......
...@@ -206,6 +206,7 @@ int main(void) ...@@ -206,6 +206,7 @@ int main(void)
DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time)); DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save)); DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost)); DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost));
DEFINE(PACA_SPRG3, offsetof(struct paca_struct, sprg3));
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
/* RTAS */ /* RTAS */
...@@ -534,7 +535,6 @@ int main(void) ...@@ -534,7 +535,6 @@ int main(void)
HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler); HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler);
HSTATE_FIELD(HSTATE_SCRATCH0, scratch0); HSTATE_FIELD(HSTATE_SCRATCH0, scratch0);
HSTATE_FIELD(HSTATE_SCRATCH1, scratch1); HSTATE_FIELD(HSTATE_SCRATCH1, scratch1);
HSTATE_FIELD(HSTATE_SPRG3, sprg3);
HSTATE_FIELD(HSTATE_IN_GUEST, in_guest); HSTATE_FIELD(HSTATE_IN_GUEST, in_guest);
HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5); HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5);
HSTATE_FIELD(HSTATE_NAPPING, napping); HSTATE_FIELD(HSTATE_NAPPING, napping);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment