mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 02:04:19 +08:00
Merge remote-tracking branch 'scott/next' into next
Merge some Freescale updates from Scott Wood
This commit is contained in:
commit
a12e4537ad
@ -1,21 +1,20 @@
|
||||
* Freescale MSI interrupt controller
|
||||
|
||||
Required properties:
|
||||
- compatible : compatible list, contains 2 entries,
|
||||
first is "fsl,CHIP-msi", where CHIP is the processor(mpc8610, mpc8572,
|
||||
etc.) and the second is "fsl,mpic-msi" or "fsl,ipic-msi" depending on
|
||||
the parent type.
|
||||
- compatible : compatible list, may contain one or two entries
|
||||
The first is "fsl,CHIP-msi", where CHIP is the processor(mpc8610, mpc8572,
|
||||
etc.) and the second is "fsl,mpic-msi" or "fsl,ipic-msi" or
|
||||
"fsl,mpic-msi-v4.3" depending on the parent type and version. If mpic
|
||||
version is 4.3, the number of MSI registers is increased to 16, MSIIR1 is
|
||||
provided to access these 16 registers, and compatible "fsl,mpic-msi-v4.3"
|
||||
should be used. The first entry is optional; the second entry is
|
||||
required.
|
||||
|
||||
- reg : It may contain one or two regions. The first region should contain
|
||||
the address and the length of the shared message interrupt register set.
|
||||
The second region should contain the address of aliased MSIIR register for
|
||||
platforms that have such an alias.
|
||||
|
||||
- msi-available-ranges: use <start count> style section to define which
|
||||
msi interrupt can be used in the 256 msi interrupts. This property is
|
||||
optional, without this, all the 256 MSI interrupts can be used.
|
||||
Each available range must begin and end on a multiple of 32 (i.e.
|
||||
no splitting an individual MSI register or the associated PIC interrupt).
|
||||
The second region should contain the address of aliased MSIIR or MSIIR1
|
||||
register for platforms that have such an alias, if using MSIIR1, the second
|
||||
region must be added because different MSI group has different MSIIR1 offset.
|
||||
|
||||
- interrupts : each one of the interrupts here is one entry per 32 MSIs,
|
||||
and routed to the host interrupt controller. the interrupts should
|
||||
@ -28,6 +27,14 @@ Required properties:
|
||||
to MPIC.
|
||||
|
||||
Optional properties:
|
||||
- msi-available-ranges: use <start count> style section to define which
|
||||
msi interrupt can be used in the 256 msi interrupts. This property is
|
||||
optional, without this, all the MSI interrupts can be used.
|
||||
Each available range must begin and end on a multiple of 32 (i.e.
|
||||
no splitting an individual MSI register or the associated PIC interrupt).
|
||||
MPIC v4.3 does not support this property because the 32 interrupts of an
|
||||
individual register are not continuous when using MSIIR1.
|
||||
|
||||
- msi-address-64: 64-bit PCI address of the MSIIR register. The MSIIR register
|
||||
is used for MSI messaging. The address of MSIIR in PCI address space is
|
||||
the MSI message address.
|
||||
@ -54,6 +61,28 @@ Example:
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
msi@41600 {
|
||||
compatible = "fsl,mpic-msi-v4.3";
|
||||
reg = <0x41600 0x200 0x44148 4>;
|
||||
interrupts = <
|
||||
0xe0 0 0 0
|
||||
0xe1 0 0 0
|
||||
0xe2 0 0 0
|
||||
0xe3 0 0 0
|
||||
0xe4 0 0 0
|
||||
0xe5 0 0 0
|
||||
0xe6 0 0 0
|
||||
0xe7 0 0 0
|
||||
0x100 0 0 0
|
||||
0x101 0 0 0
|
||||
0x102 0 0 0
|
||||
0x103 0 0 0
|
||||
0x104 0 0 0
|
||||
0x105 0 0 0
|
||||
0x106 0 0 0
|
||||
0x107 0 0 0>;
|
||||
};
|
||||
|
||||
The Freescale hypervisor and msi-address-64
|
||||
-------------------------------------------
|
||||
Normally, PCI devices have access to all of CCSR via an ATMU mapping. The
|
||||
|
@ -98,7 +98,7 @@ CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7)
|
||||
CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell)
|
||||
|
||||
KBUILD_CPPFLAGS += -Iarch/$(ARCH)
|
||||
KBUILD_AFLAGS += -Iarch/$(ARCH)
|
||||
KBUILD_AFLAGS += -msoft-float -Iarch/$(ARCH)
|
||||
KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y)
|
||||
CPP = $(CC) -E $(KBUILD_CFLAGS)
|
||||
|
||||
@ -132,6 +132,21 @@ ifeq ($(CONFIG_6xx),y)
|
||||
KBUILD_CFLAGS += -mcpu=powerpc
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_E500),y)
|
||||
ifeq ($(CONFIG_64BIT),y)
|
||||
KBUILD_CFLAGS += -mcpu=e5500
|
||||
KBUILD_AFLAGS += -mcpu=e5500
|
||||
else
|
||||
ifeq ($(CONFIG_PPC_E500MC),y)
|
||||
KBUILD_CFLAGS += -mcpu=e500mc
|
||||
KBUILD_AFLAGS += -mcpu=e500mc
|
||||
else
|
||||
KBUILD_CFLAGS += -mcpu=8540
|
||||
KBUILD_AFLAGS += -mcpu=8540
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
|
||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||
KBUILD_CFLAGS += -mno-sched-epilog
|
||||
@ -139,7 +154,6 @@ endif
|
||||
|
||||
cpu-as-$(CONFIG_4xx) += -Wa,-m405
|
||||
cpu-as-$(CONFIG_ALTIVEC) += -Wa,-maltivec
|
||||
cpu-as-$(CONFIG_E500) += -Wa,-me500
|
||||
cpu-as-$(CONFIG_E200) += -Wa,-me200
|
||||
|
||||
KBUILD_AFLAGS += $(cpu-as-y)
|
||||
|
@ -33,7 +33,7 @@
|
||||
*/
|
||||
|
||||
/include/ "fsl/b4420si-pre.dtsi"
|
||||
/include/ "b4qds.dts"
|
||||
/include/ "b4qds.dtsi"
|
||||
|
||||
/ {
|
||||
model = "fsl,B4420QDS";
|
||||
|
@ -33,7 +33,7 @@
|
||||
*/
|
||||
|
||||
/include/ "fsl/b4860si-pre.dtsi"
|
||||
/include/ "b4qds.dts"
|
||||
/include/ "b4qds.dtsi"
|
||||
|
||||
/ {
|
||||
model = "fsl,B4860QDS";
|
||||
|
@ -204,7 +204,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
/include/ "qoriq-mpic.dtsi"
|
||||
/include/ "qoriq-mpic4.3.dtsi"
|
||||
|
||||
guts: global-utilities@e0000 {
|
||||
compatible = "fsl,b4-device-config";
|
||||
|
149
arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi
Normal file
149
arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* QorIQ MPIC device tree stub [ controller @ offset 0x40000 ]
|
||||
*
|
||||
* Copyright 2013 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.
|
||||
*/
|
||||
|
||||
mpic: pic@40000 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <4>;
|
||||
reg = <0x40000 0x40000>;
|
||||
compatible = "fsl,mpic";
|
||||
device_type = "open-pic";
|
||||
clock-frequency = <0x0>;
|
||||
};
|
||||
|
||||
timer@41100 {
|
||||
compatible = "fsl,mpic-global-timer";
|
||||
reg = <0x41100 0x100 0x41300 4>;
|
||||
interrupts = <0 0 3 0
|
||||
1 0 3 0
|
||||
2 0 3 0
|
||||
3 0 3 0>;
|
||||
};
|
||||
|
||||
msi0: msi@41600 {
|
||||
compatible = "fsl,mpic-msi-v4.3";
|
||||
reg = <0x41600 0x200 0x44148 4>;
|
||||
interrupts = <
|
||||
0xe0 0 0 0
|
||||
0xe1 0 0 0
|
||||
0xe2 0 0 0
|
||||
0xe3 0 0 0
|
||||
0xe4 0 0 0
|
||||
0xe5 0 0 0
|
||||
0xe6 0 0 0
|
||||
0xe7 0 0 0
|
||||
0x100 0 0 0
|
||||
0x101 0 0 0
|
||||
0x102 0 0 0
|
||||
0x103 0 0 0
|
||||
0x104 0 0 0
|
||||
0x105 0 0 0
|
||||
0x106 0 0 0
|
||||
0x107 0 0 0>;
|
||||
};
|
||||
|
||||
msi1: msi@41800 {
|
||||
compatible = "fsl,mpic-msi-v4.3";
|
||||
reg = <0x41800 0x200 0x45148 4>;
|
||||
interrupts = <
|
||||
0xe8 0 0 0
|
||||
0xe9 0 0 0
|
||||
0xea 0 0 0
|
||||
0xeb 0 0 0
|
||||
0xec 0 0 0
|
||||
0xed 0 0 0
|
||||
0xee 0 0 0
|
||||
0xef 0 0 0
|
||||
0x108 0 0 0
|
||||
0x109 0 0 0
|
||||
0x10a 0 0 0
|
||||
0x10b 0 0 0
|
||||
0x10c 0 0 0
|
||||
0x10d 0 0 0
|
||||
0x10e 0 0 0
|
||||
0x10f 0 0 0>;
|
||||
};
|
||||
|
||||
msi2: msi@41a00 {
|
||||
compatible = "fsl,mpic-msi-v4.3";
|
||||
reg = <0x41a00 0x200 0x46148 4>;
|
||||
interrupts = <
|
||||
0xf0 0 0 0
|
||||
0xf1 0 0 0
|
||||
0xf2 0 0 0
|
||||
0xf3 0 0 0
|
||||
0xf4 0 0 0
|
||||
0xf5 0 0 0
|
||||
0xf6 0 0 0
|
||||
0xf7 0 0 0
|
||||
0x110 0 0 0
|
||||
0x111 0 0 0
|
||||
0x112 0 0 0
|
||||
0x113 0 0 0
|
||||
0x114 0 0 0
|
||||
0x115 0 0 0
|
||||
0x116 0 0 0
|
||||
0x117 0 0 0>;
|
||||
};
|
||||
|
||||
msi3: msi@41c00 {
|
||||
compatible = "fsl,mpic-msi-v4.3";
|
||||
reg = <0x41c00 0x200 0x47148 4>;
|
||||
interrupts = <
|
||||
0xf8 0 0 0
|
||||
0xf9 0 0 0
|
||||
0xfa 0 0 0
|
||||
0xfb 0 0 0
|
||||
0xfc 0 0 0
|
||||
0xfd 0 0 0
|
||||
0xfe 0 0 0
|
||||
0xff 0 0 0
|
||||
0x118 0 0 0
|
||||
0x119 0 0 0
|
||||
0x11a 0 0 0
|
||||
0x11b 0 0 0
|
||||
0x11c 0 0 0
|
||||
0x11d 0 0 0
|
||||
0x11e 0 0 0
|
||||
0x11f 0 0 0>;
|
||||
};
|
||||
|
||||
timer@42100 {
|
||||
compatible = "fsl,mpic-global-timer";
|
||||
reg = <0x42100 0x100 0x42300 4>;
|
||||
interrupts = <4 0 3 0
|
||||
5 0 3 0
|
||||
6 0 3 0
|
||||
7 0 3 0>;
|
||||
};
|
@ -358,7 +358,7 @@
|
||||
16 2 1 30>;
|
||||
};
|
||||
|
||||
/include/ "qoriq-mpic.dtsi"
|
||||
/include/ "qoriq-mpic4.3.dtsi"
|
||||
|
||||
guts: global-utilities@e0000 {
|
||||
compatible = "fsl,t4240-device-config", "fsl,qoriq-device-config-2.0";
|
||||
|
280
arch/powerpc/boot/dts/p1020rdb-pd.dts
Normal file
280
arch/powerpc/boot/dts/p1020rdb-pd.dts
Normal file
@ -0,0 +1,280 @@
|
||||
/*
|
||||
* P1020 RDB-PD Device Tree Source (32-bit address map)
|
||||
*
|
||||
* Copyright 2013 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/p1020si-pre.dtsi"
|
||||
/ {
|
||||
model = "fsl,P1020RDB-PD";
|
||||
compatible = "fsl,P1020RDB-PD";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
};
|
||||
|
||||
lbc: localbus@ffe05000 {
|
||||
reg = <0x0 0xffe05000 0x0 0x1000>;
|
||||
|
||||
/* NOR, NAND flash, L2 switch and CPLD */
|
||||
ranges = <0x0 0x0 0x0 0xec000000 0x04000000
|
||||
0x1 0x0 0x0 0xff800000 0x00040000
|
||||
0x2 0x0 0x0 0xffa00000 0x00020000
|
||||
0x3 0x0 0x0 0xffb00000 0x00020000>;
|
||||
|
||||
nor@0,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "cfi-flash";
|
||||
reg = <0x0 0x0 0x4000000>;
|
||||
bank-width = <2>;
|
||||
device-width = <1>;
|
||||
|
||||
partition@0 {
|
||||
/* 128KB for DTB Image */
|
||||
reg = <0x0 0x00020000>;
|
||||
label = "NOR DTB Image";
|
||||
};
|
||||
|
||||
partition@20000 {
|
||||
/* 3.875 MB for Linux Kernel Image */
|
||||
reg = <0x00020000 0x003e0000>;
|
||||
label = "NOR Linux Kernel Image";
|
||||
};
|
||||
|
||||
partition@400000 {
|
||||
/* 58MB for Root file System */
|
||||
reg = <0x00400000 0x03a00000>;
|
||||
label = "NOR Root File System";
|
||||
};
|
||||
|
||||
partition@3e00000 {
|
||||
/* This location must not be altered */
|
||||
/* 1M for Vitesse 7385 Switch firmware */
|
||||
reg = <0x3e00000 0x00100000>;
|
||||
label = "NOR Vitesse-7385 Firmware";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@3f00000 {
|
||||
/* This location must not be altered */
|
||||
/* 512KB for u-boot Bootloader Image */
|
||||
/* 512KB for u-boot Environment Variables */
|
||||
reg = <0x03f00000 0x00100000>;
|
||||
label = "NOR U-Boot Image";
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
|
||||
nand@1,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,p1020-fcm-nand",
|
||||
"fsl,elbc-fcm-nand";
|
||||
reg = <0x1 0x0 0x40000>;
|
||||
|
||||
partition@0 {
|
||||
/* This location must not be altered */
|
||||
/* 1MB for u-boot Bootloader Image */
|
||||
reg = <0x0 0x00100000>;
|
||||
label = "NAND U-Boot Image";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@100000 {
|
||||
/* 1MB for DTB Image */
|
||||
reg = <0x00100000 0x00100000>;
|
||||
label = "NAND DTB Image";
|
||||
};
|
||||
|
||||
partition@200000 {
|
||||
/* 4MB for Linux Kernel Image */
|
||||
reg = <0x00200000 0x00400000>;
|
||||
label = "NAND Linux Kernel Image";
|
||||
};
|
||||
|
||||
partition@600000 {
|
||||
/* 122MB for File System Image */
|
||||
reg = <0x00600000 0x07a00000>;
|
||||
label = "NAND File System Image";
|
||||
};
|
||||
};
|
||||
|
||||
cpld@2,0 {
|
||||
compatible = "fsl,p1020rdb-pd-cpld";
|
||||
reg = <0x2 0x0 0x20000>;
|
||||
};
|
||||
|
||||
L2switch@3,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "vitesse-7385";
|
||||
reg = <0x3 0x0 0x20000>;
|
||||
};
|
||||
};
|
||||
|
||||
soc: soc@ffe00000 {
|
||||
ranges = <0x0 0x0 0xffe00000 0x100000>;
|
||||
|
||||
i2c@3000 {
|
||||
rtc@68 {
|
||||
compatible = "dallas,ds1339";
|
||||
reg = <0x68>;
|
||||
};
|
||||
};
|
||||
|
||||
spi@7000 {
|
||||
flash@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spansion,s25sl12801";
|
||||
reg = <0>;
|
||||
/* input clock */
|
||||
spi-max-frequency = <40000000>;
|
||||
|
||||
partition@0 {
|
||||
/* 512KB for u-boot Bootloader Image */
|
||||
reg = <0x0 0x00080000>;
|
||||
label = "SPI U-Boot Image";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@80000 {
|
||||
/* 512KB for DTB Image*/
|
||||
reg = <0x00080000 0x00080000>;
|
||||
label = "SPI DTB Image";
|
||||
};
|
||||
|
||||
partition@100000 {
|
||||
/* 4MB for Linux Kernel Image */
|
||||
reg = <0x00100000 0x00400000>;
|
||||
label = "SPI Linux Kernel Image";
|
||||
};
|
||||
|
||||
partition@500000 {
|
||||
/* 11MB for FS System Image */
|
||||
reg = <0x00500000 0x00b00000>;
|
||||
label = "SPI File System Image";
|
||||
};
|
||||
};
|
||||
|
||||
slic@0 {
|
||||
compatible = "zarlink,le88266";
|
||||
reg = <1>;
|
||||
spi-max-frequency = <8000000>;
|
||||
};
|
||||
|
||||
slic@1 {
|
||||
compatible = "zarlink,le88266";
|
||||
reg = <2>;
|
||||
spi-max-frequency = <8000000>;
|
||||
};
|
||||
};
|
||||
|
||||
mdio@24000 {
|
||||
phy0: ethernet-phy@0 {
|
||||
interrupts = <3 1 0 0>;
|
||||
reg = <0x0>;
|
||||
};
|
||||
|
||||
phy1: ethernet-phy@1 {
|
||||
interrupts = <2 1 0 0>;
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
mdio@25000 {
|
||||
tbi1: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
mdio@26000 {
|
||||
tbi2: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
enet0: ethernet@b0000 {
|
||||
fixed-link = <1 1 1000 0 0>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
|
||||
enet1: ethernet@b1000 {
|
||||
phy-handle = <&phy0>;
|
||||
tbi-handle = <&tbi1>;
|
||||
phy-connection-type = "sgmii";
|
||||
};
|
||||
|
||||
enet2: ethernet@b2000 {
|
||||
phy-handle = <&phy1>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
};
|
||||
|
||||
usb@22000 {
|
||||
phy_type = "ulpi";
|
||||
};
|
||||
};
|
||||
|
||||
pci0: pcie@ffe09000 {
|
||||
reg = <0x0 0xffe09000 0x0 0x1000>;
|
||||
ranges = <0x2000000 0x0 0xa0000000 0x0 0xa0000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0x0 0xffc10000 0x0 0x10000>;
|
||||
pcie@0 {
|
||||
ranges = <0x2000000 0x0 0xa0000000
|
||||
0x2000000 0x0 0xa0000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
0x1000000 0x0 0x0
|
||||
0x0 0x100000>;
|
||||
};
|
||||
};
|
||||
|
||||
pci1: pcie@ffe0a000 {
|
||||
reg = <0x0 0xffe0a000 0x0 0x1000>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0x0 0x80000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0x0 0xffc00000 0x0 0x10000>;
|
||||
pcie@0 {
|
||||
ranges = <0x2000000 0x0 0x80000000
|
||||
0x2000000 0x0 0x80000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
0x1000000 0x0 0x0
|
||||
0x0 0x100000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/include/ "fsl/p1020si-post.dtsi"
|
@ -63,6 +63,7 @@ CONFIG_IPV6=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
|
@ -70,6 +70,7 @@ CONFIG_IPV6=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
|
@ -59,6 +59,7 @@ CONFIG_IPV6=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_OF_PARTS=y
|
||||
|
@ -42,6 +42,7 @@ CONFIG_INET_ESP=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
|
@ -78,6 +78,7 @@ CONFIG_IPV6=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_OF_PARTS=y
|
||||
|
@ -81,6 +81,7 @@ CONFIG_IPV6=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_OF_PARTS=y
|
||||
|
@ -105,6 +105,12 @@
|
||||
extern bool epapr_paravirt_enabled;
|
||||
extern u32 epapr_hypercall_start[];
|
||||
|
||||
#ifdef CONFIG_EPAPR_PARAVIRT
|
||||
int __init epapr_paravirt_early_init(void);
|
||||
#else
|
||||
static inline int epapr_paravirt_early_init(void) { return 0; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We use "uintptr_t" to define a register because it's guaranteed to be a
|
||||
* 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit
|
||||
|
@ -396,7 +396,14 @@ extern struct bus_type mpic_subsys;
|
||||
#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */
|
||||
|
||||
/* Get the version of primary MPIC */
|
||||
#ifdef CONFIG_MPIC
|
||||
extern u32 fsl_mpic_primary_get_version(void);
|
||||
#else
|
||||
static inline u32 fsl_mpic_primary_get_version(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Allocate the controller structure and setup the linux irq descs
|
||||
* for the range if interrupts passed in. No HW initialization is
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/hw_irq.h>
|
||||
|
||||
#define MAX_HWEVENTS 4
|
||||
#define MAX_HWEVENTS 6
|
||||
|
||||
/* event flags */
|
||||
#define FSL_EMB_EVENT_VALID 1
|
||||
|
@ -81,6 +81,53 @@
|
||||
#define __REGA0_R30 30
|
||||
#define __REGA0_R31 31
|
||||
|
||||
/* opcode and xopcode for instructions */
|
||||
#define OP_TRAP 3
|
||||
#define OP_TRAP_64 2
|
||||
|
||||
#define OP_31_XOP_TRAP 4
|
||||
#define OP_31_XOP_LWZX 23
|
||||
#define OP_31_XOP_DCBST 54
|
||||
#define OP_31_XOP_LWZUX 55
|
||||
#define OP_31_XOP_TRAP_64 68
|
||||
#define OP_31_XOP_DCBF 86
|
||||
#define OP_31_XOP_LBZX 87
|
||||
#define OP_31_XOP_STWX 151
|
||||
#define OP_31_XOP_STBX 215
|
||||
#define OP_31_XOP_LBZUX 119
|
||||
#define OP_31_XOP_STBUX 247
|
||||
#define OP_31_XOP_LHZX 279
|
||||
#define OP_31_XOP_LHZUX 311
|
||||
#define OP_31_XOP_MFSPR 339
|
||||
#define OP_31_XOP_LHAX 343
|
||||
#define OP_31_XOP_LHAUX 375
|
||||
#define OP_31_XOP_STHX 407
|
||||
#define OP_31_XOP_STHUX 439
|
||||
#define OP_31_XOP_MTSPR 467
|
||||
#define OP_31_XOP_DCBI 470
|
||||
#define OP_31_XOP_LWBRX 534
|
||||
#define OP_31_XOP_TLBSYNC 566
|
||||
#define OP_31_XOP_STWBRX 662
|
||||
#define OP_31_XOP_LHBRX 790
|
||||
#define OP_31_XOP_STHBRX 918
|
||||
|
||||
#define OP_LWZ 32
|
||||
#define OP_LD 58
|
||||
#define OP_LWZU 33
|
||||
#define OP_LBZ 34
|
||||
#define OP_LBZU 35
|
||||
#define OP_STW 36
|
||||
#define OP_STWU 37
|
||||
#define OP_STD 62
|
||||
#define OP_STB 38
|
||||
#define OP_STBU 39
|
||||
#define OP_LHZ 40
|
||||
#define OP_LHZU 41
|
||||
#define OP_LHA 42
|
||||
#define OP_LHAU 43
|
||||
#define OP_STH 44
|
||||
#define OP_STHU 45
|
||||
|
||||
/* sorted alphabetically */
|
||||
#define PPC_INST_BHRBE 0x7c00025c
|
||||
#define PPC_INST_CLRBHRB 0x7c00035c
|
||||
|
@ -17,12 +17,16 @@
|
||||
/* Freescale Book E Performance Monitor APU Registers */
|
||||
#define PMRN_PMC0 0x010 /* Performance Monitor Counter 0 */
|
||||
#define PMRN_PMC1 0x011 /* Performance Monitor Counter 1 */
|
||||
#define PMRN_PMC2 0x012 /* Performance Monitor Counter 1 */
|
||||
#define PMRN_PMC3 0x013 /* Performance Monitor Counter 1 */
|
||||
#define PMRN_PMC2 0x012 /* Performance Monitor Counter 2 */
|
||||
#define PMRN_PMC3 0x013 /* Performance Monitor Counter 3 */
|
||||
#define PMRN_PMC4 0x014 /* Performance Monitor Counter 4 */
|
||||
#define PMRN_PMC5 0x015 /* Performance Monitor Counter 5 */
|
||||
#define PMRN_PMLCA0 0x090 /* PM Local Control A0 */
|
||||
#define PMRN_PMLCA1 0x091 /* PM Local Control A1 */
|
||||
#define PMRN_PMLCA2 0x092 /* PM Local Control A2 */
|
||||
#define PMRN_PMLCA3 0x093 /* PM Local Control A3 */
|
||||
#define PMRN_PMLCA4 0x094 /* PM Local Control A4 */
|
||||
#define PMRN_PMLCA5 0x095 /* PM Local Control A5 */
|
||||
|
||||
#define PMLCA_FC 0x80000000 /* Freeze Counter */
|
||||
#define PMLCA_FCS 0x40000000 /* Freeze in Supervisor */
|
||||
@ -30,14 +34,18 @@
|
||||
#define PMLCA_FCM1 0x10000000 /* Freeze when PMM==1 */
|
||||
#define PMLCA_FCM0 0x08000000 /* Freeze when PMM==0 */
|
||||
#define PMLCA_CE 0x04000000 /* Condition Enable */
|
||||
#define PMLCA_FGCS1 0x00000002 /* Freeze in guest state */
|
||||
#define PMLCA_FGCS0 0x00000001 /* Freeze in hypervisor state */
|
||||
|
||||
#define PMLCA_EVENT_MASK 0x00ff0000 /* Event field */
|
||||
#define PMLCA_EVENT_MASK 0x01ff0000 /* Event field */
|
||||
#define PMLCA_EVENT_SHIFT 16
|
||||
|
||||
#define PMRN_PMLCB0 0x110 /* PM Local Control B0 */
|
||||
#define PMRN_PMLCB1 0x111 /* PM Local Control B1 */
|
||||
#define PMRN_PMLCB2 0x112 /* PM Local Control B2 */
|
||||
#define PMRN_PMLCB3 0x113 /* PM Local Control B3 */
|
||||
#define PMRN_PMLCB4 0x114 /* PM Local Control B4 */
|
||||
#define PMRN_PMLCB5 0x115 /* PM Local Control B5 */
|
||||
|
||||
#define PMLCB_THRESHMUL_MASK 0x0700 /* Threshold Multiple Field */
|
||||
#define PMLCB_THRESHMUL_SHIFT 8
|
||||
@ -55,16 +63,22 @@
|
||||
|
||||
#define PMRN_UPMC0 0x000 /* User Performance Monitor Counter 0 */
|
||||
#define PMRN_UPMC1 0x001 /* User Performance Monitor Counter 1 */
|
||||
#define PMRN_UPMC2 0x002 /* User Performance Monitor Counter 1 */
|
||||
#define PMRN_UPMC3 0x003 /* User Performance Monitor Counter 1 */
|
||||
#define PMRN_UPMC2 0x002 /* User Performance Monitor Counter 2 */
|
||||
#define PMRN_UPMC3 0x003 /* User Performance Monitor Counter 3 */
|
||||
#define PMRN_UPMC4 0x004 /* User Performance Monitor Counter 4 */
|
||||
#define PMRN_UPMC5 0x005 /* User Performance Monitor Counter 5 */
|
||||
#define PMRN_UPMLCA0 0x080 /* User PM Local Control A0 */
|
||||
#define PMRN_UPMLCA1 0x081 /* User PM Local Control A1 */
|
||||
#define PMRN_UPMLCA2 0x082 /* User PM Local Control A2 */
|
||||
#define PMRN_UPMLCA3 0x083 /* User PM Local Control A3 */
|
||||
#define PMRN_UPMLCA4 0x084 /* User PM Local Control A4 */
|
||||
#define PMRN_UPMLCA5 0x085 /* User PM Local Control A5 */
|
||||
#define PMRN_UPMLCB0 0x100 /* User PM Local Control B0 */
|
||||
#define PMRN_UPMLCB1 0x101 /* User PM Local Control B1 */
|
||||
#define PMRN_UPMLCB2 0x102 /* User PM Local Control B2 */
|
||||
#define PMRN_UPMLCB3 0x103 /* User PM Local Control B3 */
|
||||
#define PMRN_UPMLCB4 0x104 /* User PM Local Control B4 */
|
||||
#define PMRN_UPMLCB5 0x105 /* User PM Local Control B5 */
|
||||
#define PMRN_UPMGC0 0x180 /* User PM Global Control 0 */
|
||||
|
||||
|
||||
|
@ -75,7 +75,7 @@ _GLOBAL(__setup_cpu_e500v2)
|
||||
bl __e500_icache_setup
|
||||
bl __e500_dcache_setup
|
||||
bl __setup_e500_ivors
|
||||
#ifdef CONFIG_FSL_RIO
|
||||
#if defined(CONFIG_FSL_RIO) || defined(CONFIG_FSL_PCI)
|
||||
/* Ensure that RFXE is set */
|
||||
mfspr r3,SPRN_HID1
|
||||
oris r3,r3,HID1_RFXE@h
|
||||
|
@ -2105,7 +2105,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
MMU_FTR_USE_TLBILX,
|
||||
.icache_bsize = 64,
|
||||
.dcache_bsize = 64,
|
||||
.num_pmcs = 4,
|
||||
.num_pmcs = 6,
|
||||
.oprofile_cpu_type = "ppc/e6500",
|
||||
.oprofile_type = PPC_OPROFILE_FSL_EMB,
|
||||
.cpu_setup = __setup_cpu_e6500,
|
||||
|
@ -30,22 +30,20 @@ extern u32 epapr_ev_idle_start[];
|
||||
|
||||
bool epapr_paravirt_enabled;
|
||||
|
||||
static int __init epapr_paravirt_init(void)
|
||||
static int __init early_init_dt_scan_epapr(unsigned long node,
|
||||
const char *uname,
|
||||
int depth, void *data)
|
||||
{
|
||||
struct device_node *hyper_node;
|
||||
const u32 *insts;
|
||||
int len, i;
|
||||
unsigned long len;
|
||||
int i;
|
||||
|
||||
hyper_node = of_find_node_by_path("/hypervisor");
|
||||
if (!hyper_node)
|
||||
return -ENODEV;
|
||||
|
||||
insts = of_get_property(hyper_node, "hcall-instructions", &len);
|
||||
insts = of_get_flat_dt_prop(node, "hcall-instructions", &len);
|
||||
if (!insts)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
|
||||
if (len % 4 || len > (4 * 4))
|
||||
return -ENODEV;
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < (len / 4); i++) {
|
||||
patch_instruction(epapr_hypercall_start + i, insts[i]);
|
||||
@ -55,13 +53,19 @@ static int __init epapr_paravirt_init(void)
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
|
||||
if (of_get_property(hyper_node, "has-idle", NULL))
|
||||
if (of_get_flat_dt_prop(node, "has-idle", NULL))
|
||||
ppc_md.power_save = epapr_ev_idle;
|
||||
#endif
|
||||
|
||||
epapr_paravirt_enabled = true;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int __init epapr_paravirt_early_init(void)
|
||||
{
|
||||
of_scan_flat_dt(early_init_dt_scan_epapr, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_initcall(epapr_paravirt_init);
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <asm/serial.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/epapr_hcalls.h>
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
@ -128,6 +129,8 @@ notrace void __init machine_init(u64 dt_ptr)
|
||||
/* Do some early initialization based on the flat device tree */
|
||||
early_init_devtree(__va(dt_ptr));
|
||||
|
||||
epapr_paravirt_early_init();
|
||||
|
||||
early_init_mmu();
|
||||
|
||||
probe_machine();
|
||||
@ -326,5 +329,4 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
/* Initialize the MMU context management stuff */
|
||||
mmu_context_init();
|
||||
|
||||
}
|
||||
|
@ -66,6 +66,7 @@
|
||||
#include <asm/code-patching.h>
|
||||
#include <asm/kvm_ppc.h>
|
||||
#include <asm/hugetlb.h>
|
||||
#include <asm/epapr_hcalls.h>
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
@ -215,6 +216,8 @@ void __init early_setup(unsigned long dt_ptr)
|
||||
*/
|
||||
early_init_devtree(__va(dt_ptr));
|
||||
|
||||
epapr_paravirt_early_init();
|
||||
|
||||
/* Now we know the logical id of our boot cpu, setup the paca. */
|
||||
setup_paca(&paca[boot_cpuid]);
|
||||
fixup_boot_paca();
|
||||
|
@ -141,6 +141,14 @@ _GLOBAL(swsusp_arch_resume)
|
||||
lis r11,swsusp_save_area@h
|
||||
ori r11,r11,swsusp_save_area@l
|
||||
|
||||
/*
|
||||
* Mappings from virtual addresses to physical addresses may be
|
||||
* different than they were prior to restoring hibernation state.
|
||||
* Invalidate the TLB so that the boot CPU is using the new
|
||||
* mappings.
|
||||
*/
|
||||
bl _tlbil_all
|
||||
|
||||
lwz r4,SL_SPRG0(r11)
|
||||
mtsprg 0,r4
|
||||
lwz r4,SL_SPRG1(r11)
|
||||
|
@ -62,6 +62,7 @@
|
||||
#include <asm/switch_to.h>
|
||||
#include <asm/tm.h>
|
||||
#include <asm/debug.h>
|
||||
#include <sysdev/fsl_pci.h>
|
||||
|
||||
#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
|
||||
int (*__debugger)(struct pt_regs *regs) __read_mostly;
|
||||
@ -567,6 +568,8 @@ int machine_check_e500(struct pt_regs *regs)
|
||||
if (reason & MCSR_BUS_RBERR) {
|
||||
if (fsl_rio_mcheck_exception(regs))
|
||||
return 1;
|
||||
if (fsl_pci_mcheck_exception(regs))
|
||||
return 1;
|
||||
}
|
||||
|
||||
printk("Machine check in kernel mode.\n");
|
||||
|
@ -30,53 +30,10 @@
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/kvm_ppc.h>
|
||||
#include <asm/disassemble.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
#include "timing.h"
|
||||
#include "trace.h"
|
||||
|
||||
#define OP_TRAP 3
|
||||
#define OP_TRAP_64 2
|
||||
|
||||
#define OP_31_XOP_TRAP 4
|
||||
#define OP_31_XOP_LWZX 23
|
||||
#define OP_31_XOP_DCBST 54
|
||||
#define OP_31_XOP_TRAP_64 68
|
||||
#define OP_31_XOP_DCBF 86
|
||||
#define OP_31_XOP_LBZX 87
|
||||
#define OP_31_XOP_STWX 151
|
||||
#define OP_31_XOP_STBX 215
|
||||
#define OP_31_XOP_LBZUX 119
|
||||
#define OP_31_XOP_STBUX 247
|
||||
#define OP_31_XOP_LHZX 279
|
||||
#define OP_31_XOP_LHZUX 311
|
||||
#define OP_31_XOP_MFSPR 339
|
||||
#define OP_31_XOP_LHAX 343
|
||||
#define OP_31_XOP_STHX 407
|
||||
#define OP_31_XOP_STHUX 439
|
||||
#define OP_31_XOP_MTSPR 467
|
||||
#define OP_31_XOP_DCBI 470
|
||||
#define OP_31_XOP_LWBRX 534
|
||||
#define OP_31_XOP_TLBSYNC 566
|
||||
#define OP_31_XOP_STWBRX 662
|
||||
#define OP_31_XOP_LHBRX 790
|
||||
#define OP_31_XOP_STHBRX 918
|
||||
|
||||
#define OP_LWZ 32
|
||||
#define OP_LD 58
|
||||
#define OP_LWZU 33
|
||||
#define OP_LBZ 34
|
||||
#define OP_LBZU 35
|
||||
#define OP_STW 36
|
||||
#define OP_STWU 37
|
||||
#define OP_STD 62
|
||||
#define OP_STB 38
|
||||
#define OP_STBU 39
|
||||
#define OP_LHZ 40
|
||||
#define OP_LHZU 41
|
||||
#define OP_LHA 42
|
||||
#define OP_LHAU 43
|
||||
#define OP_STH 44
|
||||
#define OP_STHU 45
|
||||
|
||||
void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
unsigned long dec_nsec;
|
||||
|
@ -46,6 +46,12 @@ static inline u32 get_pmlca(int ctr)
|
||||
case 3:
|
||||
pmlca = mfpmr(PMRN_PMLCA3);
|
||||
break;
|
||||
case 4:
|
||||
pmlca = mfpmr(PMRN_PMLCA4);
|
||||
break;
|
||||
case 5:
|
||||
pmlca = mfpmr(PMRN_PMLCA5);
|
||||
break;
|
||||
default:
|
||||
panic("Bad ctr number\n");
|
||||
}
|
||||
@ -68,6 +74,12 @@ static inline void set_pmlca(int ctr, u32 pmlca)
|
||||
case 3:
|
||||
mtpmr(PMRN_PMLCA3, pmlca);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMLCA4, pmlca);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMLCA5, pmlca);
|
||||
break;
|
||||
default:
|
||||
panic("Bad ctr number\n");
|
||||
}
|
||||
@ -84,6 +96,10 @@ static inline unsigned int ctr_read(unsigned int i)
|
||||
return mfpmr(PMRN_PMC2);
|
||||
case 3:
|
||||
return mfpmr(PMRN_PMC3);
|
||||
case 4:
|
||||
return mfpmr(PMRN_PMC4);
|
||||
case 5:
|
||||
return mfpmr(PMRN_PMC5);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -104,6 +120,12 @@ static inline void ctr_write(unsigned int i, unsigned int val)
|
||||
case 3:
|
||||
mtpmr(PMRN_PMC3, val);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMC4, val);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMC5, val);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -133,6 +155,14 @@ static void init_pmc_stop(int ctr)
|
||||
mtpmr(PMRN_PMLCA3, pmlca);
|
||||
mtpmr(PMRN_PMLCB3, pmlcb);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMLCA4, pmlca);
|
||||
mtpmr(PMRN_PMLCB4, pmlcb);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMLCA5, pmlca);
|
||||
mtpmr(PMRN_PMLCB5, pmlcb);
|
||||
break;
|
||||
default:
|
||||
panic("Bad ctr number!\n");
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ obj64-$(CONFIG_PPC_PERF_CTRS) += power4-pmu.o ppc970-pmu.o power5-pmu.o \
|
||||
obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o
|
||||
|
||||
obj-$(CONFIG_FSL_EMB_PERF_EVENT) += core-fsl-emb.o
|
||||
obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500) += e500-pmu.o
|
||||
obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500) += e500-pmu.o e6500-pmu.o
|
||||
|
||||
obj-$(CONFIG_PPC64) += $(obj64-y)
|
||||
obj-$(CONFIG_PPC32) += $(obj32-y)
|
||||
|
@ -70,6 +70,12 @@ static unsigned long read_pmc(int idx)
|
||||
case 3:
|
||||
val = mfpmr(PMRN_PMC3);
|
||||
break;
|
||||
case 4:
|
||||
val = mfpmr(PMRN_PMC4);
|
||||
break;
|
||||
case 5:
|
||||
val = mfpmr(PMRN_PMC5);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "oops trying to read PMC%d\n", idx);
|
||||
val = 0;
|
||||
@ -95,6 +101,12 @@ static void write_pmc(int idx, unsigned long val)
|
||||
case 3:
|
||||
mtpmr(PMRN_PMC3, val);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMC4, val);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMC5, val);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "oops trying to write PMC%d\n", idx);
|
||||
}
|
||||
@ -120,6 +132,12 @@ static void write_pmlca(int idx, unsigned long val)
|
||||
case 3:
|
||||
mtpmr(PMRN_PMLCA3, val);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMLCA4, val);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMLCA5, val);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "oops trying to write PMLCA%d\n", idx);
|
||||
}
|
||||
@ -145,6 +163,12 @@ static void write_pmlcb(int idx, unsigned long val)
|
||||
case 3:
|
||||
mtpmr(PMRN_PMLCB3, val);
|
||||
break;
|
||||
case 4:
|
||||
mtpmr(PMRN_PMLCB4, val);
|
||||
break;
|
||||
case 5:
|
||||
mtpmr(PMRN_PMLCB5, val);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "oops trying to write PMLCB%d\n", idx);
|
||||
}
|
||||
@ -462,6 +486,12 @@ static int fsl_emb_pmu_event_init(struct perf_event *event)
|
||||
int num_restricted;
|
||||
int i;
|
||||
|
||||
if (ppmu->n_counter > MAX_HWEVENTS) {
|
||||
WARN(1, "No. of perf counters (%d) is higher than max array size(%d)\n",
|
||||
ppmu->n_counter, MAX_HWEVENTS);
|
||||
ppmu->n_counter = MAX_HWEVENTS;
|
||||
}
|
||||
|
||||
switch (event->attr.type) {
|
||||
case PERF_TYPE_HARDWARE:
|
||||
ev = event->attr.config;
|
||||
|
121
arch/powerpc/perf/e6500-pmu.c
Normal file
121
arch/powerpc/perf/e6500-pmu.c
Normal file
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Performance counter support for e6500 family processors.
|
||||
*
|
||||
* Author: Priyanka Jain, Priyanka.Jain@freescale.com
|
||||
* Based on e500-pmu.c
|
||||
* Copyright 2013 Freescale Semiconductor, Inc.
|
||||
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/cputable.h>
|
||||
|
||||
/*
|
||||
* Map of generic hardware event types to hardware events
|
||||
* Zero if unsupported
|
||||
*/
|
||||
static int e6500_generic_events[] = {
|
||||
[PERF_COUNT_HW_CPU_CYCLES] = 1,
|
||||
[PERF_COUNT_HW_INSTRUCTIONS] = 2,
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = 221,
|
||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 12,
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = 15,
|
||||
};
|
||||
|
||||
#define C(x) PERF_COUNT_HW_CACHE_##x
|
||||
|
||||
/*
|
||||
* Table of generalized cache-related events.
|
||||
* 0 means not supported, -1 means nonsensical, other values
|
||||
* are event codes.
|
||||
*/
|
||||
static int e6500_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
|
||||
[C(L1D)] = {
|
||||
/*RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { 27, 222 },
|
||||
[C(OP_WRITE)] = { 28, 223 },
|
||||
[C(OP_PREFETCH)] = { 29, 0 },
|
||||
},
|
||||
[C(L1I)] = {
|
||||
/*RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { 2, 254 },
|
||||
[C(OP_WRITE)] = { -1, -1 },
|
||||
[C(OP_PREFETCH)] = { 37, 0 },
|
||||
},
|
||||
/*
|
||||
* Assuming LL means L2, it's not a good match for this model.
|
||||
* It does not have separate read/write events (but it does have
|
||||
* separate instruction/data events).
|
||||
*/
|
||||
[C(LL)] = {
|
||||
/*RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { 0, 0 },
|
||||
[C(OP_WRITE)] = { 0, 0 },
|
||||
[C(OP_PREFETCH)] = { 0, 0 },
|
||||
},
|
||||
/*
|
||||
* There are data/instruction MMU misses, but that's a miss on
|
||||
* the chip's internal level-one TLB which is probably not
|
||||
* what the user wants. Instead, unified level-two TLB misses
|
||||
* are reported here.
|
||||
*/
|
||||
[C(DTLB)] = {
|
||||
/*RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { 26, 66 },
|
||||
[C(OP_WRITE)] = { -1, -1 },
|
||||
[C(OP_PREFETCH)] = { -1, -1 },
|
||||
},
|
||||
[C(BPU)] = {
|
||||
/*RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { 12, 15 },
|
||||
[C(OP_WRITE)] = { -1, -1 },
|
||||
[C(OP_PREFETCH)] = { -1, -1 },
|
||||
},
|
||||
[C(NODE)] = {
|
||||
/* RESULT_ACCESS RESULT_MISS */
|
||||
[C(OP_READ)] = { -1, -1 },
|
||||
[C(OP_WRITE)] = { -1, -1 },
|
||||
[C(OP_PREFETCH)] = { -1, -1 },
|
||||
},
|
||||
};
|
||||
|
||||
static int num_events = 512;
|
||||
|
||||
/* Upper half of event id is PMLCb, for threshold events */
|
||||
static u64 e6500_xlate_event(u64 event_id)
|
||||
{
|
||||
u32 event_low = (u32)event_id;
|
||||
if (event_low >= num_events ||
|
||||
(event_id & (FSL_EMB_EVENT_THRESHMUL | FSL_EMB_EVENT_THRESH)))
|
||||
return 0;
|
||||
|
||||
return FSL_EMB_EVENT_VALID;
|
||||
}
|
||||
|
||||
static struct fsl_emb_pmu e6500_pmu = {
|
||||
.name = "e6500 family",
|
||||
.n_counter = 6,
|
||||
.n_restricted = 0,
|
||||
.xlate_event = e6500_xlate_event,
|
||||
.n_generic = ARRAY_SIZE(e6500_generic_events),
|
||||
.generic_events = e6500_generic_events,
|
||||
.cache_events = &e6500_cache_events,
|
||||
};
|
||||
|
||||
static int init_e6500_pmu(void)
|
||||
{
|
||||
if (!cur_cpu_spec->oprofile_cpu_type ||
|
||||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e6500"))
|
||||
return -ENODEV;
|
||||
|
||||
return register_fsl_emb_pmu(&e6500_pmu);
|
||||
}
|
||||
|
||||
early_initcall(init_e6500_pmu);
|
@ -53,12 +53,6 @@ void __init corenet_ds_setup_arch(void)
|
||||
{
|
||||
mpc85xx_smp_init();
|
||||
|
||||
#if defined(CONFIG_PCI) && defined(CONFIG_PPC64)
|
||||
pci_devs_phb_init();
|
||||
#endif
|
||||
|
||||
fsl_pci_assign_primary();
|
||||
|
||||
swiotlb_detect_4g();
|
||||
|
||||
pr_info("%s board from Freescale Semiconductor\n", ppc_md.name);
|
||||
|
@ -160,6 +160,7 @@ machine_arch_initcall(p2020_rdb_pc, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1020_mbg_pc, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1020_rdb, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1020_rdb_pc, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1020_rdb_pd, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1020_utm_pc, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1021_rdb_pc, mpc85xx_common_publish_devices);
|
||||
machine_arch_initcall(p1025_rdb, mpc85xx_common_publish_devices);
|
||||
@ -193,6 +194,13 @@ static int __init p1020_rdb_pc_probe(void)
|
||||
return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PC");
|
||||
}
|
||||
|
||||
static int __init p1020_rdb_pd_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
|
||||
return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PD");
|
||||
}
|
||||
|
||||
static int __init p1021_rdb_pc_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
@ -351,6 +359,20 @@ define_machine(p1020_rdb_pc) {
|
||||
.progress = udbg_progress,
|
||||
};
|
||||
|
||||
define_machine(p1020_rdb_pd) {
|
||||
.name = "P1020RDB-PD",
|
||||
.probe = p1020_rdb_pd_probe,
|
||||
.setup_arch = mpc85xx_rdb_setup_arch,
|
||||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.progress = udbg_progress,
|
||||
};
|
||||
|
||||
define_machine(p1024_rdb) {
|
||||
.name = "P1024 RDB",
|
||||
.probe = p1024_rdb_probe,
|
||||
|
@ -28,6 +28,18 @@
|
||||
#include "fsl_msi.h"
|
||||
#include "fsl_pci.h"
|
||||
|
||||
#define MSIIR_OFFSET_MASK 0xfffff
|
||||
#define MSIIR_IBS_SHIFT 0
|
||||
#define MSIIR_SRS_SHIFT 5
|
||||
#define MSIIR1_IBS_SHIFT 4
|
||||
#define MSIIR1_SRS_SHIFT 0
|
||||
#define MSI_SRS_MASK 0xf
|
||||
#define MSI_IBS_MASK 0x1f
|
||||
|
||||
#define msi_hwirq(msi, msir_index, intr_index) \
|
||||
((msir_index) << (msi)->srs_shift | \
|
||||
((intr_index) << (msi)->ibs_shift))
|
||||
|
||||
static LIST_HEAD(msi_head);
|
||||
|
||||
struct fsl_msi_feature {
|
||||
@ -80,18 +92,19 @@ static const struct irq_domain_ops fsl_msi_host_ops = {
|
||||
|
||||
static int fsl_msi_init_allocator(struct fsl_msi *msi_data)
|
||||
{
|
||||
int rc;
|
||||
int rc, hwirq;
|
||||
|
||||
rc = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS,
|
||||
rc = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS_MAX,
|
||||
msi_data->irqhost->of_node);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = msi_bitmap_reserve_dt_hwirqs(&msi_data->bitmap);
|
||||
if (rc < 0) {
|
||||
msi_bitmap_free(&msi_data->bitmap);
|
||||
return rc;
|
||||
}
|
||||
/*
|
||||
* Reserve all the hwirqs
|
||||
* The available hwirqs will be released in fsl_msi_setup_hwirq()
|
||||
*/
|
||||
for (hwirq = 0; hwirq < NR_MSI_IRQS_MAX; hwirq++)
|
||||
msi_bitmap_reserve_hwirq(&msi_data->bitmap, hwirq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -144,8 +157,9 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev, int hwirq,
|
||||
|
||||
msg->data = hwirq;
|
||||
|
||||
pr_debug("%s: allocated srs: %d, ibs: %d\n",
|
||||
__func__, hwirq / IRQS_PER_MSI_REG, hwirq % IRQS_PER_MSI_REG);
|
||||
pr_debug("%s: allocated srs: %d, ibs: %d\n", __func__,
|
||||
(hwirq >> msi_data->srs_shift) & MSI_SRS_MASK,
|
||||
(hwirq >> msi_data->ibs_shift) & MSI_IBS_MASK);
|
||||
}
|
||||
|
||||
static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
|
||||
@ -255,7 +269,7 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)
|
||||
|
||||
msir_index = cascade_data->index;
|
||||
|
||||
if (msir_index >= NR_MSI_REG)
|
||||
if (msir_index >= NR_MSI_REG_MAX)
|
||||
cascade_irq = NO_IRQ;
|
||||
|
||||
irqd_set_chained_irq_inprogress(idata);
|
||||
@ -285,8 +299,8 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)
|
||||
intr_index = ffs(msir_value) - 1;
|
||||
|
||||
cascade_irq = irq_linear_revmap(msi_data->irqhost,
|
||||
msir_index * IRQS_PER_MSI_REG +
|
||||
intr_index + have_shift);
|
||||
msi_hwirq(msi_data, msir_index,
|
||||
intr_index + have_shift));
|
||||
if (cascade_irq != NO_IRQ)
|
||||
generic_handle_irq(cascade_irq);
|
||||
have_shift += intr_index + 1;
|
||||
@ -316,7 +330,7 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
|
||||
|
||||
if (msi->list.prev != NULL)
|
||||
list_del(&msi->list);
|
||||
for (i = 0; i < NR_MSI_REG; i++) {
|
||||
for (i = 0; i < NR_MSI_REG_MAX; i++) {
|
||||
virq = msi->msi_virqs[i];
|
||||
if (virq != NO_IRQ) {
|
||||
cascade_data = irq_get_handler_data(virq);
|
||||
@ -339,7 +353,7 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
|
||||
int offset, int irq_index)
|
||||
{
|
||||
struct fsl_msi_cascade_data *cascade_data = NULL;
|
||||
int virt_msir;
|
||||
int virt_msir, i;
|
||||
|
||||
virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index);
|
||||
if (virt_msir == NO_IRQ) {
|
||||
@ -360,6 +374,11 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
|
||||
irq_set_handler_data(virt_msir, cascade_data);
|
||||
irq_set_chained_handler(virt_msir, fsl_msi_cascade);
|
||||
|
||||
/* Release the hwirqs corresponding to this MSI register */
|
||||
for (i = 0; i < IRQS_PER_MSI_REG; i++)
|
||||
msi_bitmap_free_hwirqs(&msi->bitmap,
|
||||
msi_hwirq(msi, offset, i), 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -368,14 +387,12 @@ static int fsl_of_msi_probe(struct platform_device *dev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct fsl_msi *msi;
|
||||
struct resource res;
|
||||
struct resource res, msiir;
|
||||
int err, i, j, irq_index, count;
|
||||
int rc;
|
||||
const u32 *p;
|
||||
const struct fsl_msi_feature *features;
|
||||
int len;
|
||||
u32 offset;
|
||||
static const u32 all_avail[] = { 0, NR_MSI_IRQS };
|
||||
|
||||
match = of_match_device(fsl_of_msi_ids, &dev->dev);
|
||||
if (!match)
|
||||
@ -392,7 +409,7 @@ static int fsl_of_msi_probe(struct platform_device *dev)
|
||||
platform_set_drvdata(dev, msi);
|
||||
|
||||
msi->irqhost = irq_domain_add_linear(dev->dev.of_node,
|
||||
NR_MSI_IRQS, &fsl_msi_host_ops, msi);
|
||||
NR_MSI_IRQS_MAX, &fsl_msi_host_ops, msi);
|
||||
|
||||
if (msi->irqhost == NULL) {
|
||||
dev_err(&dev->dev, "No memory for MSI irqhost\n");
|
||||
@ -421,6 +438,16 @@ static int fsl_of_msi_probe(struct platform_device *dev)
|
||||
}
|
||||
msi->msiir_offset =
|
||||
features->msiir_offset + (res.start & 0xfffff);
|
||||
|
||||
/*
|
||||
* First read the MSIIR/MSIIR1 offset from dts
|
||||
* On failure use the hardcode MSIIR offset
|
||||
*/
|
||||
if (of_address_to_resource(dev->dev.of_node, 1, &msiir))
|
||||
msi->msiir_offset = features->msiir_offset +
|
||||
(res.start & MSIIR_OFFSET_MASK);
|
||||
else
|
||||
msi->msiir_offset = msiir.start & MSIIR_OFFSET_MASK;
|
||||
}
|
||||
|
||||
msi->feature = features->fsl_pic_ip;
|
||||
@ -431,42 +458,66 @@ static int fsl_of_msi_probe(struct platform_device *dev)
|
||||
*/
|
||||
msi->phandle = dev->dev.of_node->phandle;
|
||||
|
||||
rc = fsl_msi_init_allocator(msi);
|
||||
if (rc) {
|
||||
err = fsl_msi_init_allocator(msi);
|
||||
if (err) {
|
||||
dev_err(&dev->dev, "Error allocating MSI bitmap\n");
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len);
|
||||
if (p && len % (2 * sizeof(u32)) != 0) {
|
||||
dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n",
|
||||
__func__);
|
||||
err = -EINVAL;
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if (!p) {
|
||||
p = all_avail;
|
||||
len = sizeof(all_avail);
|
||||
}
|
||||
if (of_device_is_compatible(dev->dev.of_node, "fsl,mpic-msi-v4.3")) {
|
||||
msi->srs_shift = MSIIR1_SRS_SHIFT;
|
||||
msi->ibs_shift = MSIIR1_IBS_SHIFT;
|
||||
if (p)
|
||||
dev_warn(&dev->dev, "%s: dose not support msi-available-ranges property\n",
|
||||
__func__);
|
||||
|
||||
for (irq_index = 0, i = 0; i < len / (2 * sizeof(u32)); i++) {
|
||||
if (p[i * 2] % IRQS_PER_MSI_REG ||
|
||||
p[i * 2 + 1] % IRQS_PER_MSI_REG) {
|
||||
printk(KERN_WARNING "%s: %s: msi available range of %u at %u is not IRQ-aligned\n",
|
||||
__func__, dev->dev.of_node->full_name,
|
||||
p[i * 2 + 1], p[i * 2]);
|
||||
for (irq_index = 0; irq_index < NR_MSI_REG_MSIIR1;
|
||||
irq_index++) {
|
||||
err = fsl_msi_setup_hwirq(msi, dev,
|
||||
irq_index, irq_index);
|
||||
if (err)
|
||||
goto error_out;
|
||||
}
|
||||
} else {
|
||||
static const u32 all_avail[] =
|
||||
{ 0, NR_MSI_REG_MSIIR * IRQS_PER_MSI_REG };
|
||||
|
||||
msi->srs_shift = MSIIR_SRS_SHIFT;
|
||||
msi->ibs_shift = MSIIR_IBS_SHIFT;
|
||||
|
||||
if (p && len % (2 * sizeof(u32)) != 0) {
|
||||
dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n",
|
||||
__func__);
|
||||
err = -EINVAL;
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
offset = p[i * 2] / IRQS_PER_MSI_REG;
|
||||
count = p[i * 2 + 1] / IRQS_PER_MSI_REG;
|
||||
if (!p) {
|
||||
p = all_avail;
|
||||
len = sizeof(all_avail);
|
||||
}
|
||||
|
||||
for (j = 0; j < count; j++, irq_index++) {
|
||||
err = fsl_msi_setup_hwirq(msi, dev, offset + j, irq_index);
|
||||
if (err)
|
||||
for (irq_index = 0, i = 0; i < len / (2 * sizeof(u32)); i++) {
|
||||
if (p[i * 2] % IRQS_PER_MSI_REG ||
|
||||
p[i * 2 + 1] % IRQS_PER_MSI_REG) {
|
||||
pr_warn("%s: %s: msi available range of %u at %u is not IRQ-aligned\n",
|
||||
__func__, dev->dev.of_node->full_name,
|
||||
p[i * 2 + 1], p[i * 2]);
|
||||
err = -EINVAL;
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
offset = p[i * 2] / IRQS_PER_MSI_REG;
|
||||
count = p[i * 2 + 1] / IRQS_PER_MSI_REG;
|
||||
|
||||
for (j = 0; j < count; j++, irq_index++) {
|
||||
err = fsl_msi_setup_hwirq(msi, dev, offset + j,
|
||||
irq_index);
|
||||
if (err)
|
||||
goto error_out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -508,6 +559,10 @@ static const struct of_device_id fsl_of_msi_ids[] = {
|
||||
.compatible = "fsl,mpic-msi",
|
||||
.data = &mpic_msi_feature,
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,mpic-msi-v4.3",
|
||||
.data = &mpic_msi_feature,
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,ipic-msi",
|
||||
.data = &ipic_msi_feature,
|
||||
|
@ -16,9 +16,11 @@
|
||||
#include <linux/of.h>
|
||||
#include <asm/msi_bitmap.h>
|
||||
|
||||
#define NR_MSI_REG 8
|
||||
#define NR_MSI_REG_MSIIR 8 /* MSIIR can index 8 MSI registers */
|
||||
#define NR_MSI_REG_MSIIR1 16 /* MSIIR1 can index 16 MSI registers */
|
||||
#define NR_MSI_REG_MAX NR_MSI_REG_MSIIR1
|
||||
#define IRQS_PER_MSI_REG 32
|
||||
#define NR_MSI_IRQS (NR_MSI_REG * IRQS_PER_MSI_REG)
|
||||
#define NR_MSI_IRQS_MAX (NR_MSI_REG_MAX * IRQS_PER_MSI_REG)
|
||||
|
||||
#define FSL_PIC_IP_MASK 0x0000000F
|
||||
#define FSL_PIC_IP_MPIC 0x00000001
|
||||
@ -31,9 +33,11 @@ struct fsl_msi {
|
||||
unsigned long cascade_irq;
|
||||
|
||||
u32 msiir_offset; /* Offset of MSIIR, relative to start of CCSR */
|
||||
u32 ibs_shift; /* Shift of interrupt bit select */
|
||||
u32 srs_shift; /* Shift of the shared interrupt register select */
|
||||
void __iomem *msi_regs;
|
||||
u32 feature;
|
||||
int msi_virqs[NR_MSI_REG];
|
||||
int msi_virqs[NR_MSI_REG_MAX];
|
||||
|
||||
struct msi_bitmap bitmap;
|
||||
|
||||
|
@ -26,11 +26,15 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/ppc-pci.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/disassemble.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
#include <sysdev/fsl_soc.h>
|
||||
#include <sysdev/fsl_pci.h>
|
||||
|
||||
@ -64,7 +68,7 @@ static int fsl_pcie_check_link(struct pci_controller *hose)
|
||||
if (hose->indirect_type & PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK) {
|
||||
if (hose->ops->read == fsl_indirect_read_config) {
|
||||
struct pci_bus bus;
|
||||
bus.number = 0;
|
||||
bus.number = hose->first_busno;
|
||||
bus.sysdata = hose;
|
||||
bus.ops = hose->ops;
|
||||
indirect_read_config(&bus, 0, PCIE_LTSSM, 4, &val);
|
||||
@ -297,10 +301,10 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
if (early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) {
|
||||
/* Size window to exact size if power-of-two or one size up */
|
||||
if ((1ull << mem_log) != mem) {
|
||||
mem_log++;
|
||||
if ((1ull << mem_log) > mem)
|
||||
pr_info("%s: Setting PCI inbound window "
|
||||
"greater than memory size\n", name);
|
||||
mem_log++;
|
||||
}
|
||||
|
||||
piwar |= ((mem_log - 1) & PIWAR_SZ_MASK);
|
||||
@ -373,7 +377,9 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
}
|
||||
|
||||
if (hose->dma_window_size < mem) {
|
||||
#ifndef CONFIG_SWIOTLB
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
ppc_swiotlb_enable = 1;
|
||||
#else
|
||||
pr_err("%s: ERROR: Memory size exceeds PCI ATMU ability to "
|
||||
"map - enable CONFIG_SWIOTLB to avoid dma errors.\n",
|
||||
name);
|
||||
@ -868,6 +874,160 @@ u64 fsl_pci_immrbar_base(struct pci_controller *hose)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_E500
|
||||
static int mcheck_handle_load(struct pt_regs *regs, u32 inst)
|
||||
{
|
||||
unsigned int rd, ra, rb, d;
|
||||
|
||||
rd = get_rt(inst);
|
||||
ra = get_ra(inst);
|
||||
rb = get_rb(inst);
|
||||
d = get_d(inst);
|
||||
|
||||
switch (get_op(inst)) {
|
||||
case 31:
|
||||
switch (get_xop(inst)) {
|
||||
case OP_31_XOP_LWZX:
|
||||
case OP_31_XOP_LWBRX:
|
||||
regs->gpr[rd] = 0xffffffff;
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LWZUX:
|
||||
regs->gpr[rd] = 0xffffffff;
|
||||
regs->gpr[ra] += regs->gpr[rb];
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LBZX:
|
||||
regs->gpr[rd] = 0xff;
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LBZUX:
|
||||
regs->gpr[rd] = 0xff;
|
||||
regs->gpr[ra] += regs->gpr[rb];
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LHZX:
|
||||
case OP_31_XOP_LHBRX:
|
||||
regs->gpr[rd] = 0xffff;
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LHZUX:
|
||||
regs->gpr[rd] = 0xffff;
|
||||
regs->gpr[ra] += regs->gpr[rb];
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LHAX:
|
||||
regs->gpr[rd] = ~0UL;
|
||||
break;
|
||||
|
||||
case OP_31_XOP_LHAUX:
|
||||
regs->gpr[rd] = ~0UL;
|
||||
regs->gpr[ra] += regs->gpr[rb];
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case OP_LWZ:
|
||||
regs->gpr[rd] = 0xffffffff;
|
||||
break;
|
||||
|
||||
case OP_LWZU:
|
||||
regs->gpr[rd] = 0xffffffff;
|
||||
regs->gpr[ra] += (s16)d;
|
||||
break;
|
||||
|
||||
case OP_LBZ:
|
||||
regs->gpr[rd] = 0xff;
|
||||
break;
|
||||
|
||||
case OP_LBZU:
|
||||
regs->gpr[rd] = 0xff;
|
||||
regs->gpr[ra] += (s16)d;
|
||||
break;
|
||||
|
||||
case OP_LHZ:
|
||||
regs->gpr[rd] = 0xffff;
|
||||
break;
|
||||
|
||||
case OP_LHZU:
|
||||
regs->gpr[rd] = 0xffff;
|
||||
regs->gpr[ra] += (s16)d;
|
||||
break;
|
||||
|
||||
case OP_LHA:
|
||||
regs->gpr[rd] = ~0UL;
|
||||
break;
|
||||
|
||||
case OP_LHAU:
|
||||
regs->gpr[rd] = ~0UL;
|
||||
regs->gpr[ra] += (s16)d;
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int is_in_pci_mem_space(phys_addr_t addr)
|
||||
{
|
||||
struct pci_controller *hose;
|
||||
struct resource *res;
|
||||
int i;
|
||||
|
||||
list_for_each_entry(hose, &hose_list, list_node) {
|
||||
if (!(hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG))
|
||||
continue;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
res = &hose->mem_resources[i];
|
||||
if ((res->flags & IORESOURCE_MEM) &&
|
||||
addr >= res->start && addr <= res->end)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fsl_pci_mcheck_exception(struct pt_regs *regs)
|
||||
{
|
||||
u32 inst;
|
||||
int ret;
|
||||
phys_addr_t addr = 0;
|
||||
|
||||
/* Let KVM/QEMU deal with the exception */
|
||||
if (regs->msr & MSR_GS)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
addr = mfspr(SPRN_MCARU);
|
||||
addr <<= 32;
|
||||
#endif
|
||||
addr += mfspr(SPRN_MCAR);
|
||||
|
||||
if (is_in_pci_mem_space(addr)) {
|
||||
if (user_mode(regs)) {
|
||||
pagefault_disable();
|
||||
ret = get_user(regs->nip, &inst);
|
||||
pagefault_enable();
|
||||
} else {
|
||||
ret = probe_kernel_address(regs->nip, inst);
|
||||
}
|
||||
|
||||
if (mcheck_handle_load(regs, inst)) {
|
||||
regs->nip += 4;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx)
|
||||
static const struct of_device_id pci_ids[] = {
|
||||
{ .compatible = "fsl,mpc8540-pci", },
|
||||
@ -928,28 +1088,10 @@ static int fsl_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
struct device_node *node;
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
|
||||
node = pdev->dev.of_node;
|
||||
ret = fsl_add_bridge(pdev, fsl_pci_primary == node);
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
if (ret == 0) {
|
||||
hose = pci_find_hose_for_OF_device(pdev->dev.of_node);
|
||||
|
||||
/*
|
||||
* if we couldn't map all of DRAM via the dma windows
|
||||
* we need SWIOTLB to handle buffers located outside of
|
||||
* dma capable memory region
|
||||
*/
|
||||
if (memblock_end_of_DRAM() - 1 > hose->dma_window_base_cur +
|
||||
hose->dma_window_size)
|
||||
ppc_swiotlb_enable = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
mpc85xx_pci_err_probe(pdev);
|
||||
|
||||
return 0;
|
||||
|
@ -126,5 +126,11 @@ static inline int mpc85xx_pci_err_probe(struct platform_device *op)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_PCI
|
||||
extern int fsl_pci_mcheck_exception(struct pt_regs *);
|
||||
#else
|
||||
static inline int fsl_pci_mcheck_exception(struct pt_regs *regs) {return 0; }
|
||||
#endif
|
||||
|
||||
#endif /* __POWERPC_FSL_PCI_H */
|
||||
#endif /* __KERNEL__ */
|
||||
|
Loading…
Reference in New Issue
Block a user