Commit a604c96e authored by Michael Ellerman's avatar Michael Ellerman

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux into next

Freescale updates from Scott:

"Highlights include 8xx optimizations, some more work on datapath device
tree content, e300 machine check support, t1040 corenet error reporting,
and various cleanups and fixes."
parents 5c65670c 0dc294f7
...@@ -7,6 +7,7 @@ CONTENTS ...@@ -7,6 +7,7 @@ CONTENTS
- FMan MURAM Node - FMan MURAM Node
- FMan dTSEC/XGEC/mEMAC Node - FMan dTSEC/XGEC/mEMAC Node
- FMan IEEE 1588 Node - FMan IEEE 1588 Node
- FMan MDIO Node
- Example - Example
============================================================================= =============================================================================
...@@ -356,6 +357,69 @@ ptp-timer@fe000 { ...@@ -356,6 +357,69 @@ ptp-timer@fe000 {
reg = <0xfe000 0x1000>; reg = <0xfe000 0x1000>;
}; };
=============================================================================
FMan MDIO Node
DESCRIPTION
The MDIO is a bus to which the PHY devices are connected.
PROPERTIES
- compatible
Usage: required
Value type: <stringlist>
Definition: A standard property.
Must include "fsl,fman-mdio" for 1 Gb/s MDIO from FMan v2.
Must include "fsl,fman-xmdio" for 10 Gb/s MDIO from FMan v2.
Must include "fsl,fman-memac-mdio" for 1/10 Gb/s MDIO from
FMan v3.
- reg
Usage: required
Value type: <prop-encoded-array>
Definition: A standard property.
- bus-frequency
Usage: optional
Value type: <u32>
Definition: Specifies the external MDIO bus clock speed to
be used, if different from the standard 2.5 MHz.
This may be due to the standard speed being unsupported (e.g.
due to a hardware problem), or to advertise that all relevant
components in the system support a faster speed.
- interrupts
Usage: required for external MDIO
Value type: <prop-encoded-array>
Definition: Event interrupt of external MDIO controller.
- fsl,fman-internal-mdio
Usage: required for internal MDIO
Value type: boolean
Definition: Fman has internal MDIO for internal PCS(Physical
Coding Sublayer) PHYs and external MDIO for external PHYs.
The settings and programming routines for internal/external
MDIO are different. Must be included for internal MDIO.
EXAMPLE
Example for FMan v2 external MDIO:
mdio@f1000 {
compatible = "fsl,fman-xmdio";
reg = <0xf1000 0x1000>;
interrupts = <101 2 0 0>;
};
Example for FMan v3 internal MDIO:
mdio@f1000 {
compatible = "fsl,fman-memac-mdio";
reg = <0xf1000 0x1000>;
fsl,fman-internal-mdio;
};
============================================================================= =============================================================================
Example Example
...@@ -531,4 +595,10 @@ fman@400000 { ...@@ -531,4 +595,10 @@ fman@400000 {
compatible = "fsl,fman-ptp-timer"; compatible = "fsl,fman-ptp-timer";
reg = <0xfe000 0x1000>; reg = <0xfe000 0x1000>;
}; };
mdio@f1000 {
compatible = "fsl,fman-xmdio";
reg = <0xf1000 0x1000>;
interrupts = <101 2 0 0>;
};
}; };
...@@ -36,6 +36,11 @@ are located at offsets 0xbf8 and 0xbfc ...@@ -36,6 +36,11 @@ are located at offsets 0xbf8 and 0xbfc
Value type: <prop-encoded-array> Value type: <prop-encoded-array>
Definition: Standard property. The error interrupt Definition: Standard property. The error interrupt
- fsl,bman-portals
Usage: Required
Value type: <phandle>
Definition: Phandle to this BMan instance's portals
- fsl,liodn - fsl,liodn
Usage: See pamu.txt Usage: See pamu.txt
Value type: <prop-encoded-array> Value type: <prop-encoded-array>
...@@ -96,7 +101,7 @@ The example below shows a BMan FBPR dynamic allocation memory node ...@@ -96,7 +101,7 @@ The example below shows a BMan FBPR dynamic allocation memory node
bman_fbpr: bman-fbpr { bman_fbpr: bman-fbpr {
compatible = "fsl,bman-fbpr"; compatible = "fsl,bman-fbpr";
alloc-ranges = <0 0 0xf 0xffffffff>; alloc-ranges = <0 0 0x10 0>;
size = <0 0x1000000>; size = <0 0x1000000>;
alignment = <0 0x1000000>; alignment = <0 0x1000000>;
}; };
...@@ -104,6 +109,10 @@ The example below shows a BMan FBPR dynamic allocation memory node ...@@ -104,6 +109,10 @@ The example below shows a BMan FBPR dynamic allocation memory node
The example below shows a (P4080) BMan CCSR-space node The example below shows a (P4080) BMan CCSR-space node
bportals: bman-portals@ff4000000 {
...
};
crypto@300000 { crypto@300000 {
... ...
fsl,bman = <&bman, 2>; fsl,bman = <&bman, 2>;
...@@ -115,6 +124,7 @@ The example below shows a (P4080) BMan CCSR-space node ...@@ -115,6 +124,7 @@ The example below shows a (P4080) BMan CCSR-space node
reg = <0x31a000 0x1000>; reg = <0x31a000 0x1000>;
interrupts = <16 2 1 2>; interrupts = <16 2 1 2>;
fsl,liodn = <0x17>; fsl,liodn = <0x17>;
fsl,bman-portals = <&bportals>;
memory-region = <&bman_fbpr>; memory-region = <&bman_fbpr>;
}; };
......
...@@ -38,6 +38,11 @@ are located at offsets 0xbf8 and 0xbfc ...@@ -38,6 +38,11 @@ are located at offsets 0xbf8 and 0xbfc
Value type: <prop-encoded-array> Value type: <prop-encoded-array>
Definition: Standard property. The error interrupt Definition: Standard property. The error interrupt
- fsl,qman-portals
Usage: Required
Value type: <phandle>
Definition: Phandle to this QMan instance's portals
- fsl,liodn - fsl,liodn
Usage: See pamu.txt Usage: See pamu.txt
Value type: <prop-encoded-array> Value type: <prop-encoded-array>
...@@ -113,13 +118,13 @@ The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes ...@@ -113,13 +118,13 @@ The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes
qman_fqd: qman-fqd { qman_fqd: qman-fqd {
compatible = "fsl,qman-fqd"; compatible = "fsl,qman-fqd";
alloc-ranges = <0 0 0xf 0xffffffff>; alloc-ranges = <0 0 0x10 0>;
size = <0 0x400000>; size = <0 0x400000>;
alignment = <0 0x400000>; alignment = <0 0x400000>;
}; };
qman_pfdr: qman-pfdr { qman_pfdr: qman-pfdr {
compatible = "fsl,qman-pfdr"; compatible = "fsl,qman-pfdr";
alloc-ranges = <0 0 0xf 0xffffffff>; alloc-ranges = <0 0 0x10 0>;
size = <0 0x2000000>; size = <0 0x2000000>;
alignment = <0 0x2000000>; alignment = <0 0x2000000>;
}; };
...@@ -127,6 +132,10 @@ The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes ...@@ -127,6 +132,10 @@ The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes
The example below shows a (P4080) QMan CCSR-space node The example below shows a (P4080) QMan CCSR-space node
qportals: qman-portals@ff4200000 {
...
};
clockgen: global-utilities@e1000 { clockgen: global-utilities@e1000 {
... ...
sysclk: sysclk { sysclk: sysclk {
...@@ -154,6 +163,7 @@ The example below shows a (P4080) QMan CCSR-space node ...@@ -154,6 +163,7 @@ The example below shows a (P4080) QMan CCSR-space node
reg = <0x318000 0x1000>; reg = <0x318000 0x1000>;
interrupts = <16 2 1 3> interrupts = <16 2 1 3>
fsl,liodn = <0x16>; fsl,liodn = <0x16>;
fsl,qman-portals = <&qportals>;
memory-region = <&qman_fqd &qman_pfdr>; memory-region = <&qman_fqd &qman_pfdr>;
clocks = <&platform_pll 1>; clocks = <&platform_pll 1>;
}; };
......
...@@ -50,6 +50,7 @@ ethernet@b0000 { ...@@ -50,6 +50,7 @@ ethernet@b0000 {
fsl,num_tx_queues = <0x8>; fsl,num_tx_queues = <0x8>;
fsl,magic-packet; fsl,magic-packet;
local-mac-address = [ 00 00 00 00 00 00 ]; local-mac-address = [ 00 00 00 00 00 00 ];
ranges;
queue-group@b0000 { queue-group@b0000 {
#address-cells = <1>; #address-cells = <1>;
......
...@@ -50,6 +50,7 @@ ethernet@b1000 { ...@@ -50,6 +50,7 @@ ethernet@b1000 {
fsl,num_tx_queues = <0x8>; fsl,num_tx_queues = <0x8>;
fsl,magic-packet; fsl,magic-packet;
local-mac-address = [ 00 00 00 00 00 00 ]; local-mac-address = [ 00 00 00 00 00 00 ];
ranges;
queue-group@b1000 { queue-group@b1000 {
#address-cells = <1>; #address-cells = <1>;
......
...@@ -49,6 +49,7 @@ ethernet@b2000 { ...@@ -49,6 +49,7 @@ ethernet@b2000 {
fsl,num_tx_queues = <0x8>; fsl,num_tx_queues = <0x8>;
fsl,magic-packet; fsl,magic-packet;
local-mac-address = [ 00 00 00 00 00 00 ]; local-mac-address = [ 00 00 00 00 00 00 ];
ranges;
queue-group@b2000 { queue-group@b2000 {
#address-cells = <1>; #address-cells = <1>;
......
/* /*
* PQ3 GPIO device tree stub [ controller @ offset 0xf000 ] * PQ3 GPIO device tree stub [ controller @ offset 0xfc00 ]
* *
* Copyright 2011 Freescale Semiconductor Inc. * Copyright 2011 Freescale Semiconductor Inc.
* *
...@@ -32,10 +32,10 @@ ...@@ -32,10 +32,10 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
gpio-controller@f000 { gpio-controller@fc00 {
#gpio-cells = <2>; #gpio-cells = <2>;
compatible = "fsl,pq3-gpio"; compatible = "fsl,pq3-gpio";
reg = <0xf000 0x100>; reg = <0xfc00 0x100>;
interrupts = <47 0x2 0 0>; interrupts = <47 0x2 0 0>;
gpio-controller; gpio-controller;
}; };
/*
* QorIQ BMan Portal device tree stub for 10 portals
*
* Copyright 2011 - 2014 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.
*/
&bportals {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
bman-portal@0 {
compatible = "fsl,bman-portal";
reg = <0x0 0x4000>, <0x100000 0x1000>;
interrupts = <105 2 0 0>;
};
bman-portal@4000 {
compatible = "fsl,bman-portal";
reg = <0x4000 0x4000>, <0x101000 0x1000>;
interrupts = <107 2 0 0>;
};
bman-portal@8000 {
compatible = "fsl,bman-portal";
reg = <0x8000 0x4000>, <0x102000 0x1000>;
interrupts = <109 2 0 0>;
};
bman-portal@c000 {
compatible = "fsl,bman-portal";
reg = <0xc000 0x4000>, <0x103000 0x1000>;
interrupts = <111 2 0 0>;
};
bman-portal@10000 {
compatible = "fsl,bman-portal";
reg = <0x10000 0x4000>, <0x104000 0x1000>;
interrupts = <113 2 0 0>;
};
bman-portal@14000 {
compatible = "fsl,bman-portal";
reg = <0x14000 0x4000>, <0x105000 0x1000>;
interrupts = <115 2 0 0>;
};
bman-portal@18000 {
compatible = "fsl,bman-portal";
reg = <0x18000 0x4000>, <0x106000 0x1000>;
interrupts = <117 2 0 0>;
};
bman-portal@1c000 {
compatible = "fsl,bman-portal";
reg = <0x1c000 0x4000>, <0x107000 0x1000>;
interrupts = <119 2 0 0>;
};
bman-portal@20000 {
compatible = "fsl,bman-portal";
reg = <0x20000 0x4000>, <0x108000 0x1000>;
interrupts = <121 2 0 0>;
};
bman-portal@24000 {
compatible = "fsl,bman-portal";
reg = <0x24000 0x4000>, <0x109000 0x1000>;
interrupts = <123 2 0 0>;
};
};
/*
* QorIQ BMan device tree stub [ controller @ offset 0x31a000 ]
*
* Copyright 2011 - 2014 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.
*/
bman: bman@31a000 {
compatible = "fsl,bman";
reg = <0x31a000 0x1000>;
interrupts = <16 2 1 2>;
fsl,bman-portals = <&bportals>;
memory-region = <&bman_fbpr>;
};
/*
* QorIQ QMan Portal device tree stub for 10 portals & 15 pool channels
*
* Copyright 2011 - 2014 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.
*/
&qportals {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
qportal0: qman-portal@0 {
compatible = "fsl,qman-portal";
reg = <0x0 0x4000>, <0x100000 0x1000>;
interrupts = <104 2 0 0>;
fsl,qman-channel-id = <0x0>;
};
qportal1: qman-portal@4000 {
compatible = "fsl,qman-portal";
reg = <0x4000 0x4000>, <0x101000 0x1000>;
interrupts = <106 2 0 0>;
fsl,qman-channel-id = <1>;
};
qportal2: qman-portal@8000 {
compatible = "fsl,qman-portal";
reg = <0x8000 0x4000>, <0x102000 0x1000>;
interrupts = <108 2 0 0>;
fsl,qman-channel-id = <2>;
};
qportal3: qman-portal@c000 {
compatible = "fsl,qman-portal";
reg = <0xc000 0x4000>, <0x103000 0x1000>;
interrupts = <110 2 0 0>;
fsl,qman-channel-id = <3>;
};
qportal4: qman-portal@10000 {
compatible = "fsl,qman-portal";
reg = <0x10000 0x4000>, <0x104000 0x1000>;
interrupts = <112 2 0 0>;
fsl,qman-channel-id = <4>;
};
qportal5: qman-portal@14000 {
compatible = "fsl,qman-portal";
reg = <0x14000 0x4000>, <0x105000 0x1000>;
interrupts = <114 2 0 0>;
fsl,qman-channel-id = <5>;
};
qportal6: qman-portal@18000 {
compatible = "fsl,qman-portal";
reg = <0x18000 0x4000>, <0x106000 0x1000>;
interrupts = <116 2 0 0>;
fsl,qman-channel-id = <6>;
};
qportal7: qman-portal@1c000 {
compatible = "fsl,qman-portal";
reg = <0x1c000 0x4000>, <0x107000 0x1000>;
interrupts = <118 2 0 0>;
fsl,qman-channel-id = <7>;
};
qportal8: qman-portal@20000 {
compatible = "fsl,qman-portal";
reg = <0x20000 0x4000>, <0x108000 0x1000>;
interrupts = <120 2 0 0>;
fsl,qman-channel-id = <8>;
};
qportal9: qman-portal@24000 {
compatible = "fsl,qman-portal";
reg = <0x24000 0x4000>, <0x109000 0x1000>;
interrupts = <122 2 0 0>;
fsl,qman-channel-id = <9>;
};
};
/*
* QorIQ QMan device tree stub [ controller @ offset 0x318000 ]
*
* Copyright 2011 - 2014 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.
*/
qman: qman@318000 {
compatible = "fsl,qman";
reg = <0x318000 0x1000>;
interrupts = <16 2 1 3>;
fsl,qman-portals = <&qportals>;
memory-region = <&qman_fqd &qman_pfdr>;
};
/*
* QorIQ QMan rev3 device tree stub [ controller @ offset 0x318000 ]
*
* Copyright 2014 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.
*/
qman: qman@318000 {
compatible = "fsl,qman";
reg = <0x318000 0x2000>;
interrupts = <16 2 1 3>;
fsl,qman-portals = <&qportals>;
memory-region = <&qman_fqd &qman_pfdr>;
};
/*
* Device tree source for the Emerson/Artesyn MVME2500
*
* Copyright 2014 Elettra-Sincrotrone Trieste S.C.p.A.
*
* 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.
*
* Based on: P2020 DS Device Tree Source
* Copyright 2009 Freescale Semiconductor Inc.
*/
/include/ "fsl/p2020si-pre.dtsi"
/ {
model = "MVME2500";
compatible = "artesyn,MVME2500";
aliases {
serial2 = &serial2;
serial3 = &serial3;
serial4 = &serial4;
serial5 = &serial5;
};
memory {
device_type = "memory";
};
soc: soc@ffe00000 {
ranges = <0x0 0 0xffe00000 0x100000>;
i2c@3000 {
hwmon@4c {
compatible = "adi,adt7461";
reg = <0x4c>;
};
rtc@68 {
compatible = "dallas,ds1337";
reg = <0x68>;
interrupts = <8 1 0 0>;
};
eeprom@54 {
compatible = "atmel,24c64";
reg = <0x54>;
};
eeprom@52 {
compatible = "atmel,24c512";
reg = <0x52>;
};
eeprom@53 {
compatible = "atmel,24c512";
reg = <0x53>;
};
eeprom@50 {
compatible = "atmel,24c02";
reg = <0x50>;
};
};
spi0: spi@7000 {
fsl,espi-num-chipselects = <2>;
flash@0 {
compatible = "atmel,at25df641";
reg = <0>;
spi-max-frequency = <10000000>;
};
flash@1 {
compatible = "atmel,at25df641";
reg = <1>;
spi-max-frequency = <10000000>;
};
};
usb@22000 {
dr_mode = "host";
phy_type = "ulpi";
};
enet0: ethernet@24000 {
tbi-handle = <&tbi0>;
phy-handle = <&phy1>;
phy-connection-type = "rgmii-id";
};
mdio@24520 {
phy1: ethernet-phy@1 {
compatible = "brcm,bcm54616S";
interrupts = <6 1 0 0>;
reg = <0x1>;
};
phy2: ethernet-phy@2 {
compatible = "brcm,bcm54616S";
interrupts = <6 1 0 0>;
reg = <0x2>;
};
phy3: ethernet-phy@3 {
compatible = "brcm,bcm54616S";
interrupts = <5 1 0 0>;
reg = <0x3>;
};
phy7: ethernet-phy@7 {
compatible = "brcm,bcm54616S";
interrupts = <7 1 0 0>;
reg = <0x7>;
};
tbi0: tbi-phy@11 {
reg = <0x11>;
device_type = "tbi-phy";
};
};
enet1: ethernet@25000 {
tbi-handle = <&tbi1>;
phy-handle = <&phy7>;
phy-connection-type = "rgmii-id";
};
mdio@25520 {
tbi1: tbi-phy@11 {
reg = <0x11>;
device_type = "tbi-phy";
};
};
enet2: ethernet@26000 {
tbi-handle = <&tbi2>;
phy-handle = <&phy3>;
phy-connection-type = "rgmii-id";
};
mdio@26520 {
tbi2: tbi-phy@11 {
reg = <0x11>;
device_type = "tbi-phy";
};
};
};
lbc: localbus@ffe05000 {
reg = <0 0xffe05000 0 0x1000>;
ranges = <0x0 0x0 0x0 0xfff00000 0x00080000
0x1 0x0 0x0 0xffc40000 0x00010000
0x2 0x0 0x0 0xffc50000 0x00010000
0x3 0x0 0x0 0xffc60000 0x00010000
0x4 0x0 0x0 0xffc70000 0x00010000
0x6 0x0 0x0 0xffc80000 0x00010000
0x5 0x0 0x0 0xffdf0000 0x00008000>;
serial2: serial@1,0 {
device_type = "serial";
compatible = "ns16550";
reg = <0x1 0x0 0x100>;
clock-frequency = <1843200>;
interrupts = <11 2 0 0>;
};
serial3: serial@2,0 {
device_type = "serial";
compatible = "ns16550";
reg = <0x2 0x0 0x100>;
clock-frequency = <1843200>;
interrupts = <1 2 0 0>;
};
serial4: serial@3,0 {
device_type = "serial";
compatible = "ns16550";
reg = <0x3 0x0 0x100>;
clock-frequency = <1843200>;
interrupts = <2 2 0 0>;
};
serial5: serial@4,0 {
device_type = "serial";
compatible = "ns16550";
reg = <0x4 0x0 0x100>;
clock-frequency = <1843200>;
interrupts = <3 2 0 0>;
};
mram@0,0 {
compatible = "everspin,mram", "mtd-ram";
reg = <0x0 0x0 0x80000>;
bank-width = <2>;
};
board-control@5,0 {
compatible = "artesyn,mvme2500-fpga";
reg = <0x5 0x0 0x01000>;
};
cpld@6,0 {
compatible = "artesyn,mvme2500-cpld";
reg = <0x6 0x0 0x10000>;
interrupts = <9 1 0 0>;
};
};
pci0: pcie@ffe08000 {
reg = <0 0xffe08000 0 0x1000>;
ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
pcie@0 {
ranges = <0x2000000 0x0 0x80000000
0x2000000 0x0 0x80000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x10000>;
};
};
pci1: pcie@ffe09000 {
reg = <0 0xffe09000 0 0x1000>;
ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
pcie@0 {
ranges = <0x2000000 0x0 0xa0000000
0x2000000 0x0 0xa0000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x10000>;
};
};
pci2: pcie@ffe0a000 {
reg = <0 0xffe0a000 0 0x1000>;
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
pcie@0 {
ranges = <0x2000000 0x0 0xc0000000
0x2000000 0x0 0xc0000000
0x0 0x20000000
0x1000000 0x0 0x0
0x1000000 0x0 0x0
0x0 0x10000>;
};
};
};
/include/ "fsl/p2020si-post.dtsi"
/ {
soc@ffe00000 {
serial@4600 {
status = "disabled";
};
i2c@3100 {
status = "disabled";
};
sdhc@2e000 {
compatible = "fsl,p2020-esdhc", "fsl,esdhc";
non-removable;
};
};
};
/*
* T4240 emulator Device Tree Source
*
* 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.
*/
/dts-v1/;
/include/ "fsl/e6500_power_isa.dtsi"
/ {
compatible = "fsl,T4240";
#address-cells = <2>;
#size-cells = <2>;
interrupt-parent = <&mpic>;
aliases {
ccsr = &soc;
serial0 = &serial0;
serial1 = &serial1;
serial2 = &serial2;
serial3 = &serial3;
dma0 = &dma0;
dma1 = &dma1;
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: PowerPC,e6500@0 {
device_type = "cpu";
reg = <0 1>;
next-level-cache = <&L2_1>;
fsl,portid-mapping = <0x80000000>;
};
cpu1: PowerPC,e6500@2 {
device_type = "cpu";
reg = <2 3>;
next-level-cache = <&L2_1>;
fsl,portid-mapping = <0x80000000>;
};
cpu2: PowerPC,e6500@4 {
device_type = "cpu";
reg = <4 5>;
next-level-cache = <&L2_1>;
fsl,portid-mapping = <0x80000000>;
};
cpu3: PowerPC,e6500@6 {
device_type = "cpu";
reg = <6 7>;
next-level-cache = <&L2_1>;
fsl,portid-mapping = <0x80000000>;
};
cpu4: PowerPC,e6500@8 {
device_type = "cpu";
reg = <8 9>;
next-level-cache = <&L2_2>;
fsl,portid-mapping = <0x40000000>;
};
cpu5: PowerPC,e6500@10 {
device_type = "cpu";
reg = <10 11>;
next-level-cache = <&L2_2>;
fsl,portid-mapping = <0x40000000>;
};
cpu6: PowerPC,e6500@12 {
device_type = "cpu";
reg = <12 13>;
next-level-cache = <&L2_2>;
fsl,portid-mapping = <0x40000000>;
};
cpu7: PowerPC,e6500@14 {
device_type = "cpu";
reg = <14 15>;
next-level-cache = <&L2_2>;
fsl,portid-mapping = <0x40000000>;
};
cpu8: PowerPC,e6500@16 {
device_type = "cpu";
reg = <16 17>;
next-level-cache = <&L2_3>;
fsl,portid-mapping = <0x20000000>;
};
cpu9: PowerPC,e6500@18 {
device_type = "cpu";
reg = <18 19>;
next-level-cache = <&L2_3>;
fsl,portid-mapping = <0x20000000>;
};
cpu10: PowerPC,e6500@20 {
device_type = "cpu";
reg = <20 21>;
next-level-cache = <&L2_3>;
fsl,portid-mapping = <0x20000000>;
};
cpu11: PowerPC,e6500@22 {
device_type = "cpu";
reg = <22 23>;
next-level-cache = <&L2_3>;
fsl,portid-mapping = <0x20000000>;
};
};
};
/ {
model = "fsl,T4240QDS";
compatible = "fsl,T4240EMU", "fsl,T4240QDS";
#address-cells = <2>;
#size-cells = <2>;
interrupt-parent = <&mpic>;
ifc: localbus@ffe124000 {
reg = <0xf 0xfe124000 0 0x2000>;
ranges = <0 0 0xf 0xe8000000 0x08000000
2 0 0xf 0xff800000 0x00010000
3 0 0xf 0xffdf0000 0x00008000>;
nor@0,0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "cfi-flash";
reg = <0x0 0x0 0x8000000>;
bank-width = <2>;
device-width = <1>;
};
};
memory {
device_type = "memory";
};
soc: soc@ffe000000 {
ranges = <0x00000000 0xf 0xfe000000 0x1000000>;
reg = <0xf 0xfe000000 0 0x00001000>;
};
};
&ifc {
#address-cells = <2>;
#size-cells = <1>;
compatible = "fsl,ifc", "simple-bus";
interrupts = <25 2 0 0>;
};
&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.7",
"fsl,qoriq-memory-controller";
reg = <0x8000 0x1000>;
interrupts = <16 2 1 23>;
};
ddr2: memory-controller@9000 {
compatible = "fsl,qoriq-memory-controller-v4.7",
"fsl,qoriq-memory-controller";
reg = <0x9000 0x1000>;
interrupts = <16 2 1 22>;
};
ddr3: memory-controller@a000 {
compatible = "fsl,qoriq-memory-controller-v4.7",
"fsl,qoriq-memory-controller";
reg = <0xa000 0x1000>;
interrupts = <16 2 1 21>;
};
cpc: l3-cache-controller@10000 {
compatible = "fsl,t4240-l3-cache-controller", "cache";
reg = <0x10000 0x1000
0x11000 0x1000
0x12000 0x1000>;
interrupts = <16 2 1 27
16 2 1 26
16 2 1 25>;
};
corenet-cf@18000 {
compatible = "fsl,corenet2-cf", "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 0x6000>;
fsl,portid-mapping = <0x8000>;
interrupts = <
24 2 0 0
16 2 1 30>;
};
/include/ "fsl/qoriq-mpic.dtsi"
guts: global-utilities@e0000 {
compatible = "fsl,t4240-device-config", "fsl,qoriq-device-config-2.0";
reg = <0xe0000 0xe00>;
fsl,has-rstcr;
fsl,liodn-bits = <12>;
};
/include/ "fsl/qoriq-clockgen2.dtsi"
global-utilities@e1000 {
compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0";
};
/include/ "fsl/qoriq-dma-0.dtsi"
/include/ "fsl/qoriq-dma-1.dtsi"
/include/ "fsl/qoriq-i2c-0.dtsi"
/include/ "fsl/qoriq-i2c-1.dtsi"
/include/ "fsl/qoriq-duart-0.dtsi"
/include/ "fsl/qoriq-duart-1.dtsi"
L2_1: l2-cache-controller@c20000 {
compatible = "fsl,t4240-l2-cache-controller";
reg = <0xc20000 0x40000>;
next-level-cache = <&cpc>;
};
L2_2: l2-cache-controller@c60000 {
compatible = "fsl,t4240-l2-cache-controller";
reg = <0xc60000 0x40000>;
next-level-cache = <&cpc>;
};
L2_3: l2-cache-controller@ca0000 {
compatible = "fsl,t4240-l2-cache-controller";
reg = <0xca0000 0x40000>;
next-level-cache = <&cpc>;
};
};
...@@ -75,6 +75,7 @@ CONFIG_MTD_PHYSMAP_OF=y ...@@ -75,6 +75,7 @@ CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_NAND=y CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_FSL_ELBC=y CONFIG_MTD_NAND_FSL_ELBC=y
CONFIG_MTD_NAND_FSL_IFC=y CONFIG_MTD_NAND_FSL_IFC=y
CONFIG_MTD_SPI_NOR=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=131072 CONFIG_BLK_DEV_RAM_SIZE=131072
...@@ -92,6 +93,7 @@ CONFIG_SATA_SIL=y ...@@ -92,6 +93,7 @@ CONFIG_SATA_SIL=y
CONFIG_PATA_SIL680=y CONFIG_PATA_SIL680=y
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
CONFIG_FSL_PQ_MDIO=y CONFIG_FSL_PQ_MDIO=y
CONFIG_FSL_XGMAC_MDIO=y
CONFIG_E1000=y CONFIG_E1000=y
CONFIG_E1000E=y CONFIG_E1000E=y
CONFIG_AT803X_PHY=y CONFIG_AT803X_PHY=y
......
...@@ -69,6 +69,7 @@ CONFIG_MTD_PHYSMAP_OF=y ...@@ -69,6 +69,7 @@ CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_NAND=y CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_FSL_ELBC=y CONFIG_MTD_NAND_FSL_ELBC=y
CONFIG_MTD_NAND_FSL_IFC=y CONFIG_MTD_NAND_FSL_IFC=y
CONFIG_MTD_SPI_NOR=y
CONFIG_MTD_UBI=y CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
...@@ -79,7 +80,11 @@ CONFIG_SATA_FSL=y ...@@ -79,7 +80,11 @@ CONFIG_SATA_FSL=y
CONFIG_SATA_SIL24=y CONFIG_SATA_SIL24=y
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
CONFIG_DUMMY=y CONFIG_DUMMY=y
CONFIG_FSL_PQ_MDIO=y
CONFIG_FSL_XGMAC_MDIO=y
CONFIG_E1000E=y CONFIG_E1000E=y
CONFIG_VITESSE_PHY=y
CONFIG_FIXED_PHY=y
CONFIG_INPUT_FF_MEMLESS=m CONFIG_INPUT_FF_MEMLESS=m
# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_KEYBOARD is not set
......
...@@ -42,6 +42,7 @@ CONFIG_TQM8548=y ...@@ -42,6 +42,7 @@ CONFIG_TQM8548=y
CONFIG_TQM8555=y CONFIG_TQM8555=y
CONFIG_TQM8560=y CONFIG_TQM8560=y
CONFIG_SBC8548=y CONFIG_SBC8548=y
CONFIG_MVME2500=y
CONFIG_QUICC_ENGINE=y CONFIG_QUICC_ENGINE=y
CONFIG_QE_GPIO=y CONFIG_QE_GPIO=y
CONFIG_HIGHMEM=y CONFIG_HIGHMEM=y
...@@ -49,6 +50,8 @@ CONFIG_BINFMT_MISC=m ...@@ -49,6 +50,8 @@ CONFIG_BINFMT_MISC=m
CONFIG_MATH_EMULATION=y CONFIG_MATH_EMULATION=y
CONFIG_FORCE_MAX_ZONEORDER=12 CONFIG_FORCE_MAX_ZONEORDER=12
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCIEPORTBUS=y
# CONFIG_PCIEASPM is not set
CONFIG_PCI_MSI=y CONFIG_PCI_MSI=y
CONFIG_RAPIDIO=y CONFIG_RAPIDIO=y
CONFIG_NET=y CONFIG_NET=y
...@@ -85,10 +88,14 @@ CONFIG_FTL=y ...@@ -85,10 +88,14 @@ CONFIG_FTL=y
CONFIG_MTD_CFI=y CONFIG_MTD_CFI=y
CONFIG_MTD_CFI_INTELEXT=y CONFIG_MTD_CFI_INTELEXT=y
CONFIG_MTD_CFI_AMDSTD=y CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_PHYSMAP=y
CONFIG_MTD_PHYSMAP_OF=y CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_PLATRAM=y
CONFIG_MTD_M25P80=y
CONFIG_MTD_NAND=y CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_FSL_ELBC=y CONFIG_MTD_NAND_FSL_ELBC=y
CONFIG_MTD_NAND_FSL_IFC=y CONFIG_MTD_NAND_FSL_IFC=y
CONFIG_MTD_SPI_NOR=y
CONFIG_MTD_UBI=y CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_NBD=y
...@@ -120,6 +127,7 @@ CONFIG_MARVELL_PHY=y ...@@ -120,6 +127,7 @@ CONFIG_MARVELL_PHY=y
CONFIG_DAVICOM_PHY=y CONFIG_DAVICOM_PHY=y
CONFIG_CICADA_PHY=y CONFIG_CICADA_PHY=y
CONFIG_VITESSE_PHY=y CONFIG_VITESSE_PHY=y
CONFIG_BROADCOM_PHY=y
CONFIG_FIXED_PHY=y CONFIG_FIXED_PHY=y
CONFIG_INPUT_FF_MEMLESS=m CONFIG_INPUT_FF_MEMLESS=m
# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_MOUSEDEV is not set
...@@ -128,8 +136,8 @@ CONFIG_INPUT_FF_MEMLESS=m ...@@ -128,8 +136,8 @@ CONFIG_INPUT_FF_MEMLESS=m
CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_LIBPS2=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=2 CONFIG_SERIAL_8250_NR_UARTS=6
CONFIG_SERIAL_8250_RUNTIME_UARTS=2 CONFIG_SERIAL_8250_RUNTIME_UARTS=6
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_RSA=y
...@@ -142,7 +150,8 @@ CONFIG_SPI=y ...@@ -142,7 +150,8 @@ CONFIG_SPI=y
CONFIG_SPI_FSL_SPI=y CONFIG_SPI_FSL_SPI=y
CONFIG_SPI_FSL_ESPI=y CONFIG_SPI_FSL_ESPI=y
CONFIG_GPIO_MPC8XXX=y CONFIG_GPIO_MPC8XXX=y
# CONFIG_HWMON is not set CONFIG_HWMON=m
CONFIG_SENSORS_LM90=m
CONFIG_FB=y CONFIG_FB=y
CONFIG_FB_FSL_DIU=y CONFIG_FB_FSL_DIU=y
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
...@@ -185,6 +194,7 @@ CONFIG_MMC_SDHCI_PLTFM=y ...@@ -185,6 +194,7 @@ CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_ESDHC=y CONFIG_MMC_SDHCI_OF_ESDHC=y
CONFIG_EDAC=y CONFIG_EDAC=y
CONFIG_EDAC_MM_EDAC=y CONFIG_EDAC_MM_EDAC=y
CONFIG_EDAC_MPC85XX=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_DS1307=y CONFIG_RTC_DRV_DS1307=y
CONFIG_RTC_DRV_DS1374=y CONFIG_RTC_DRV_DS1374=y
......
...@@ -91,6 +91,7 @@ CONFIG_MTD_PHYSMAP_OF=y ...@@ -91,6 +91,7 @@ CONFIG_MTD_PHYSMAP_OF=y
CONFIG_MTD_NAND=y CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_FSL_ELBC=y CONFIG_MTD_NAND_FSL_ELBC=y
CONFIG_MTD_NAND_FSL_IFC=y CONFIG_MTD_NAND_FSL_IFC=y
CONFIG_MTD_SPI_NOR=y
CONFIG_MTD_UBI=y CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_NBD=y CONFIG_BLK_DEV_NBD=y
......
...@@ -119,6 +119,10 @@ extern void setup_indirect_pci(struct pci_controller* hose, ...@@ -119,6 +119,10 @@ extern void setup_indirect_pci(struct pci_controller* hose,
extern int indirect_read_config(struct pci_bus *bus, unsigned int devfn, extern int indirect_read_config(struct pci_bus *bus, unsigned int devfn,
int offset, int len, u32 *val); int offset, int len, u32 *val);
extern int __indirect_read_config(struct pci_controller *hose,
unsigned char bus_number, unsigned int devfn,
int offset, int len, u32 *val);
extern int indirect_write_config(struct pci_bus *bus, unsigned int devfn, extern int indirect_write_config(struct pci_bus *bus, unsigned int devfn,
int offset, int len, u32 val); int offset, int len, u32 val);
......
...@@ -178,12 +178,11 @@ static inline unsigned long pte_update(pte_t *p, ...@@ -178,12 +178,11 @@ static inline unsigned long pte_update(pte_t *p,
andc %1,%0,%5\n\ andc %1,%0,%5\n\
or %1,%1,%6\n\ or %1,%1,%6\n\
/* 0x200 == Extended encoding, bit 22 */ \ /* 0x200 == Extended encoding, bit 22 */ \
/* Bit 22 has to be 1 if neither _PAGE_USER nor _PAGE_RW are set */ \ /* Bit 22 has to be 1 when _PAGE_USER is unset and _PAGE_RO is set */ \
rlwimi %1,%1,32-2,0x200\n /* get _PAGE_USER */ \ rlwimi %1,%1,32-1,0x200\n /* get _PAGE_RO */ \
rlwinm %3,%1,32-1,0x200\n /* get _PAGE_RW */ \ rlwinm %3,%1,32-2,0x200\n /* get _PAGE_USER */ \
or %1,%3,%1\n\ andc %1,%1,%3\n\
xori %1,%1,0x200\n" stwcx. %1,0,%4\n\
" stwcx. %1,0,%4\n\
bne- 1b" bne- 1b"
: "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2) : "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2)
: "r" (p), "r" (clr), "r" (set), "m" (*p) : "r" (p), "r" (clr), "r" (set), "m" (*p)
...@@ -275,7 +274,7 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, ...@@ -275,7 +274,7 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
pte_t *ptep) pte_t *ptep)
{ {
pte_update(ptep, (_PAGE_RW | _PAGE_HWWRITE), 0); pte_update(ptep, (_PAGE_RW | _PAGE_HWWRITE), _PAGE_RO);
} }
static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
unsigned long addr, pte_t *ptep) unsigned long addr, pte_t *ptep)
...@@ -286,9 +285,11 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, ...@@ -286,9 +285,11 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry) static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
{ {
unsigned long bits = pte_val(entry) & unsigned long set = pte_val(entry) &
(_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC); (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
pte_update(ptep, 0, bits); unsigned long clr = ~pte_val(entry) & _PAGE_RO;
pte_update(ptep, clr, set);
} }
#define __HAVE_ARCH_PTE_SAME #define __HAVE_ARCH_PTE_SAME
...@@ -346,10 +347,14 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry) ...@@ -346,10 +347,14 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
#define pte_to_pgoff(pte) (pte_val(pte) >> 3) #define pte_to_pgoff(pte) (pte_val(pte) >> 3)
#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE }) #define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE })
#ifndef CONFIG_PPC_4K_PAGES
void pgtable_cache_init(void);
#else
/* /*
* No page table caches to initialise * No page table caches to initialise
*/ */
#define pgtable_cache_init() do { } while (0) #define pgtable_cache_init() do { } while (0)
#endif
extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep,
pmd_t **pmdp); pmd_t **pmdp);
......
...@@ -30,7 +30,8 @@ struct mm_struct; ...@@ -30,7 +30,8 @@ struct mm_struct;
#include <asm/tlbflush.h> #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 | _PAGE_RO)) != _PAGE_RO; }
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; }
static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
...@@ -115,12 +116,14 @@ static inline unsigned long pte_pfn(pte_t pte) { ...@@ -115,12 +116,14 @@ static inline unsigned long pte_pfn(pte_t pte) {
/* Generic modifiers for PTE bits */ /* Generic modifiers for PTE bits */
static inline pte_t pte_wrprotect(pte_t pte) { static inline pte_t pte_wrprotect(pte_t pte) {
pte_val(pte) &= ~(_PAGE_RW | _PAGE_HWWRITE); return pte; } pte_val(pte) &= ~(_PAGE_RW | _PAGE_HWWRITE);
pte_val(pte) |= _PAGE_RO; return pte; }
static inline pte_t pte_mkclean(pte_t pte) { static inline pte_t pte_mkclean(pte_t pte) {
pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HWWRITE); return pte; } pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HWWRITE); return pte; }
static inline pte_t pte_mkold(pte_t pte) { static inline pte_t pte_mkold(pte_t pte) {
pte_val(pte) &= ~_PAGE_ACCESSED; return pte; } pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
static inline pte_t pte_mkwrite(pte_t pte) { static inline pte_t pte_mkwrite(pte_t pte) {
pte_val(pte) &= ~_PAGE_RO;
pte_val(pte) |= _PAGE_RW; return pte; } pte_val(pte) |= _PAGE_RW; return pte; }
static inline pte_t pte_mkdirty(pte_t pte) { static inline pte_t pte_mkdirty(pte_t pte) {
pte_val(pte) |= _PAGE_DIRTY; return pte; } pte_val(pte) |= _PAGE_DIRTY; return pte; }
......
...@@ -46,9 +46,9 @@ ...@@ -46,9 +46,9 @@
* require a TLB exception handler change. It is assumed unused bits * require a TLB exception handler change. It is assumed unused bits
* are always zero. * are always zero.
*/ */
#define _PAGE_RW 0x0400 /* lsb PP bits, inverted in HW */ #define _PAGE_RO 0x0400 /* lsb PP bits */
#define _PAGE_USER 0x0800 /* msb PP bits */ #define _PAGE_USER 0x0800 /* msb PP bits */
/* set when neither _PAGE_USER nor _PAGE_RW are set */ /* set when _PAGE_USER is unset and _PAGE_RO is set */
#define _PAGE_KNLRO 0x0200 #define _PAGE_KNLRO 0x0200
#define _PMD_PRESENT 0x0001 #define _PMD_PRESENT 0x0001
...@@ -62,9 +62,8 @@ ...@@ -62,9 +62,8 @@
#define PTE_ATOMIC_UPDATES 1 #define PTE_ATOMIC_UPDATES 1
/* We need to add _PAGE_SHARED to kernel pages */ /* We need to add _PAGE_SHARED to kernel pages */
#define _PAGE_KERNEL_RO (_PAGE_SHARED | _PAGE_KNLRO) #define _PAGE_KERNEL_RO (_PAGE_SHARED | _PAGE_RO | _PAGE_KNLRO)
#define _PAGE_KERNEL_ROX (_PAGE_EXEC | _PAGE_KNLRO) #define _PAGE_KERNEL_ROX (_PAGE_EXEC | _PAGE_RO | _PAGE_KNLRO)
#define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW | _PAGE_HWWRITE)
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_PTE_8xx_H */ #endif /* _ASM_POWERPC_PTE_8xx_H */
...@@ -34,6 +34,12 @@ ...@@ -34,6 +34,12 @@
#ifndef _PAGE_PSIZE #ifndef _PAGE_PSIZE
#define _PAGE_PSIZE 0 #define _PAGE_PSIZE 0
#endif #endif
/* _PAGE_RO and _PAGE_RW shall not be defined at the same time */
#ifndef _PAGE_RO
#define _PAGE_RO 0
#else
#define _PAGE_RW 0
#endif
#ifndef _PMD_PRESENT_MASK #ifndef _PMD_PRESENT_MASK
#define _PMD_PRESENT_MASK _PMD_PRESENT #define _PMD_PRESENT_MASK _PMD_PRESENT
#endif #endif
...@@ -42,10 +48,10 @@ ...@@ -42,10 +48,10 @@
#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE() #define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
#endif #endif
#ifndef _PAGE_KERNEL_RO #ifndef _PAGE_KERNEL_RO
#define _PAGE_KERNEL_RO 0 #define _PAGE_KERNEL_RO (_PAGE_RO)
#endif #endif
#ifndef _PAGE_KERNEL_ROX #ifndef _PAGE_KERNEL_ROX
#define _PAGE_KERNEL_ROX (_PAGE_EXEC) #define _PAGE_KERNEL_ROX (_PAGE_EXEC | _PAGE_RO)
#endif #endif
#ifndef _PAGE_KERNEL_RW #ifndef _PAGE_KERNEL_RW
#define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW | _PAGE_HWWRITE) #define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW | _PAGE_HWWRITE)
...@@ -95,7 +101,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); ...@@ -95,7 +101,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
/* Mask of bits returned by pte_pgprot() */ /* Mask of bits returned by pte_pgprot() */
#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \ #define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
_PAGE_WRITETHRU | _PAGE_ENDIAN | _PAGE_4K_PFN | \ _PAGE_WRITETHRU | _PAGE_ENDIAN | _PAGE_4K_PFN | \
_PAGE_USER | _PAGE_ACCESSED | \ _PAGE_USER | _PAGE_ACCESSED | _PAGE_RO | \
_PAGE_RW | _PAGE_HWWRITE | _PAGE_DIRTY | _PAGE_EXEC) _PAGE_RW | _PAGE_HWWRITE | _PAGE_DIRTY | _PAGE_EXEC)
#ifdef CONFIG_NUMA_BALANCING #ifdef CONFIG_NUMA_BALANCING
...@@ -128,11 +134,14 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); ...@@ -128,11 +134,14 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
*/ */
#define PAGE_NONE __pgprot(_PAGE_BASE) #define PAGE_NONE __pgprot(_PAGE_BASE)
#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW) #define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW)
#define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW | _PAGE_EXEC) #define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW | \
#define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER) _PAGE_EXEC)
#define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC) #define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RO)
#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER) #define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RO | \
#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC) _PAGE_EXEC)
#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RO)
#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RO | \
_PAGE_EXEC)
#define __P000 PAGE_NONE #define __P000 PAGE_NONE
#define __P001 PAGE_READONLY #define __P001 PAGE_READONLY
......
...@@ -1133,6 +1133,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -1133,6 +1133,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.icache_bsize = 32, .icache_bsize = 32,
.dcache_bsize = 32, .dcache_bsize = 32,
.cpu_setup = __setup_cpu_603, .cpu_setup = __setup_cpu_603,
.machine_check = machine_check_generic,
.num_pmcs = 4, .num_pmcs = 4,
.oprofile_cpu_type = "ppc/e300", .oprofile_cpu_type = "ppc/e300",
.oprofile_type = PPC_OPROFILE_FSL_EMB, .oprofile_type = PPC_OPROFILE_FSL_EMB,
......
...@@ -319,36 +319,29 @@ InstructionTLBMiss: ...@@ -319,36 +319,29 @@ InstructionTLBMiss:
* pin the first 8MB of kernel memory */ * pin the first 8MB of kernel memory */
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
#endif #endif
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
beq 3f beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
3: 3:
#endif #endif
/* Extract level 1 index */ /* Insert level 1 index */
rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
lwzx r11, r10, r11 /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
beq 2f /* If zero, don't try to find a pte */ /* Load the MI_TWC with the attributes for this "segment." */
/* We have a pte table, so load the MI_TWC with the attributes
* for this "segment."
*/
MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */ MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */
mfspr r11, SPRN_SRR0 /* Get effective address of fault */ rlwinm r11, r11,0,0,19 /* Extract page descriptor page address */
/* Extract level 2 index */ /* Extract level 2 index */
rlwinm r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 rlwinm r10, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
lwzx r10, r10, r11 /* Get the pte */ lwzx r10, r10, r11 /* Get the pte */
#ifdef CONFIG_SWAP #ifdef CONFIG_SWAP
andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT rlwinm r11, r10, 32-5, _PAGE_PRESENT
cmpwi cr0, r11, _PAGE_ACCESSED | _PAGE_PRESENT and r11, r11, r10
li r11, RPN_PATTERN rlwimi r10, r11, 0, _PAGE_PRESENT
bne- cr0, 2f
#else
li r11, RPN_PATTERN
#endif #endif
li r11, RPN_PATTERN
/* The Linux PTE won't go exactly into the MMU TLB. /* The Linux PTE won't go exactly into the MMU TLB.
* Software indicator bits 21 and 28 must be clear. * Software indicator bits 21 and 28 must be clear.
* Software indicator bits 24, 25, 26, and 27 must be * Software indicator bits 24, 25, 26, and 27 must be
...@@ -366,21 +359,6 @@ InstructionTLBMiss: ...@@ -366,21 +359,6 @@ InstructionTLBMiss:
mfspr r10, SPRN_SPRG_SCRATCH2 mfspr r10, SPRN_SPRG_SCRATCH2
EXCEPTION_EPILOG_0 EXCEPTION_EPILOG_0
rfi rfi
2:
mfspr r10, SPRN_SRR1
/* clear all error bits as TLB Miss
* sets a few unconditionally
*/
rlwinm r10, r10, 0, 0xffff
mtspr SPRN_SRR1, r10
/* Restore registers */
#ifdef CONFIG_8xx_CPU6
mfspr r3, SPRN_DAR
mtspr SPRN_DAR, r11 /* Tag DAR */
#endif
mfspr r10, SPRN_SPRG_SCRATCH2
b InstructionTLBError1
. = 0x1200 . = 0x1200
DataStoreTLBMiss: DataStoreTLBMiss:
...@@ -395,20 +373,16 @@ DataStoreTLBMiss: ...@@ -395,20 +373,16 @@ DataStoreTLBMiss:
* kernel page tables. * kernel page tables.
*/ */
andis. r11, r10, 0x8000 andis. r11, r10, 0x8000
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
beq 3f beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
3: 3:
/* Extract level 1 index */ /* Insert level 1 index */
rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
lwzx r11, r10, r11 /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
beq 2f /* If zero, don't try to find a pte */
/* We have a pte table, so load fetch the pte from the table. /* We have a pte table, so load fetch the pte from the table.
*/ */
mfspr r10, SPRN_MD_EPN /* Get address of fault */
/* Extract level 2 index */ /* Extract level 2 index */
rlwinm r10, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 rlwinm r10, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
rlwimi r10, r11, 0, 0, 32 - PAGE_SHIFT - 1 /* Add level 2 base */ rlwimi r10, r11, 0, 0, 32 - PAGE_SHIFT - 1 /* Add level 2 base */
...@@ -441,16 +415,13 @@ DataStoreTLBMiss: ...@@ -441,16 +415,13 @@ DataStoreTLBMiss:
and r11, r11, r10 and r11, r11, r10
rlwimi r10, r11, 0, _PAGE_PRESENT rlwimi r10, r11, 0, _PAGE_PRESENT
#endif #endif
/* invert RW */
xori r10, r10, _PAGE_RW
/* The Linux PTE won't go exactly into the MMU TLB. /* The Linux PTE won't go exactly into the MMU TLB.
* Software indicator bits 22 and 28 must be clear. * Software indicator bits 22 and 28 must be clear.
* Software indicator bits 24, 25, 26, and 27 must be * Software indicator bits 24, 25, 26, and 27 must be
* set. All other Linux PTE bits control the behavior * set. All other Linux PTE bits control the behavior
* of the MMU. * of the MMU.
*/ */
2: li r11, RPN_PATTERN li r11, RPN_PATTERN
rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */
MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */ MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */
...@@ -469,10 +440,7 @@ DataStoreTLBMiss: ...@@ -469,10 +440,7 @@ DataStoreTLBMiss:
*/ */
. = 0x1300 . = 0x1300
InstructionTLBError: InstructionTLBError:
EXCEPTION_PROLOG_0 EXCEPTION_PROLOG
InstructionTLBError1:
EXCEPTION_PROLOG_1
EXCEPTION_PROLOG_2
mr r4,r12 mr r4,r12
mr r5,r9 mr r5,r9
andis. r10,r5,0x4000 andis. r10,r5,0x4000
...@@ -532,30 +500,21 @@ DARFixed:/* Return from dcbx instruction bug workaround */ ...@@ -532,30 +500,21 @@ DARFixed:/* Return from dcbx instruction bug workaround */
/* define if you don't want to use self modifying code */ /* define if you don't want to use self modifying code */
#define NO_SELF_MODIFYING_CODE #define NO_SELF_MODIFYING_CODE
FixupDAR:/* Entry point for dcbx workaround. */ FixupDAR:/* Entry point for dcbx workaround. */
#ifdef CONFIG_8xx_CPU6
mtspr SPRN_DAR, r3
#endif
mtspr SPRN_SPRG_SCRATCH2, r10 mtspr SPRN_SPRG_SCRATCH2, r10
/* fetch instruction from memory. */ /* fetch instruction from memory. */
mfspr r10, SPRN_SRR0 mfspr r10, SPRN_SRR0
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
beq- 3f /* Branch if user space */ beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l /* Insert level 1 index */
/* Extract level 1 index */ 3: rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
3: rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
lwzx r11, r10, r11 /* Get the level 1 entry */ rlwinm r11, r11,0,0,19 /* Extract page descriptor page address */
rlwinm r10, r11,0,0,19 /* Extract page descriptor page address */ /* Insert level 2 index */
mfspr r11, SPRN_SRR0 /* Get effective address of fault */ rlwimi r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
/* Extract level 2 index */ lwz r11, 0(r11) /* Get the pte */
rlwinm r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
lwzx r11, r10, r11 /* Get the pte */
#ifdef CONFIG_8xx_CPU6
mfspr r3, SPRN_DAR
#endif
/* concat physical page address(r11) and page offset(r10) */ /* concat physical page address(r11) and page offset(r10) */
mfspr r10, SPRN_SRR0
rlwimi r11, r10, 0, 32 - PAGE_SHIFT, 31 rlwimi r11, r10, 0, 32 - PAGE_SHIFT, 31
lwz r11,0(r11) lwz r11,0(r11)
/* Check if it really is a dcbx instruction. */ /* Check if it really is a dcbx instruction. */
...@@ -705,8 +664,7 @@ start_here: ...@@ -705,8 +664,7 @@ start_here:
* init's THREAD like the context switch code does, but this is * init's THREAD like the context switch code does, but this is
* easier......until someone changes init's static structures. * easier......until someone changes init's static structures.
*/ */
lis r6, swapper_pg_dir@h lis r6, swapper_pg_dir@ha
ori r6, r6, swapper_pg_dir@l
tophys(r6,r6) tophys(r6,r6)
#ifdef CONFIG_8xx_CPU6 #ifdef CONFIG_8xx_CPU6
lis r4, cpu6_errata_word@h lis r4, cpu6_errata_word@h
...@@ -885,23 +843,28 @@ _GLOBAL(set_context) ...@@ -885,23 +843,28 @@ _GLOBAL(set_context)
stw r4, 0x4(r5) stw r4, 0x4(r5)
#endif #endif
/* Register M_TW will contain base address of level 1 table minus the
* lower part of the kernel PGDIR base address, so that all accesses to
* level 1 table are done relative to lower part of kernel PGDIR base
* address.
*/
li r5, (swapper_pg_dir-PAGE_OFFSET)@l
sub r4, r4, r5
tophys (r4, r4)
#ifdef CONFIG_8xx_CPU6 #ifdef CONFIG_8xx_CPU6
lis r6, cpu6_errata_word@h lis r6, cpu6_errata_word@h
ori r6, r6, cpu6_errata_word@l ori r6, r6, cpu6_errata_word@l
tophys (r4, r4)
li r7, 0x3f80 li r7, 0x3f80
stw r7, 12(r6) stw r7, 12(r6)
lwz r7, 12(r6) lwz r7, 12(r6)
mtspr SPRN_M_TW, r4 /* Update MMU base address */ #endif
mtspr SPRN_M_TW, r4 /* Update pointeur to level 1 table */
#ifdef CONFIG_8xx_CPU6
li r7, 0x3380 li r7, 0x3380
stw r7, 12(r6) stw r7, 12(r6)
lwz r7, 12(r6) lwz r7, 12(r6)
mtspr SPRN_M_CASID, r3 /* Update context */
#else
mtspr SPRN_M_CASID,r3 /* Update context */
tophys (r4, r4)
mtspr SPRN_M_TW, r4 /* and pgd */
#endif #endif
mtspr SPRN_M_CASID, r3 /* Update context */
SYNC SYNC
blr blr
......
...@@ -67,8 +67,6 @@ struct tlbcamrange { ...@@ -67,8 +67,6 @@ struct tlbcamrange {
phys_addr_t phys; phys_addr_t phys;
} tlbcam_addrs[NUM_TLBCAMS]; } tlbcam_addrs[NUM_TLBCAMS];
extern unsigned int tlbcam_index;
unsigned long tlbcam_sz(int idx) unsigned long tlbcam_sz(int idx)
{ {
return tlbcam_addrs[idx].limit - tlbcam_addrs[idx].start + 1; return tlbcam_addrs[idx].limit - tlbcam_addrs[idx].start + 1;
......
...@@ -52,12 +52,15 @@ ...@@ -52,12 +52,15 @@
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include "mmu_decl.h"
static unsigned int first_context, last_context; static unsigned int first_context, last_context;
static unsigned int next_context, nr_free_contexts; static unsigned int next_context, nr_free_contexts;
static unsigned long *context_map; static unsigned long *context_map;
static unsigned long *stale_map[NR_CPUS]; static unsigned long *stale_map[NR_CPUS];
static struct mm_struct **context_mm; static struct mm_struct **context_mm;
static DEFINE_RAW_SPINLOCK(context_lock); static DEFINE_RAW_SPINLOCK(context_lock);
static bool no_selective_tlbil;
#define CTX_MAP_SIZE \ #define CTX_MAP_SIZE \
(sizeof(unsigned long) * (last_context / BITS_PER_LONG + 1)) (sizeof(unsigned long) * (last_context / BITS_PER_LONG + 1))
...@@ -133,6 +136,38 @@ static unsigned int steal_context_smp(unsigned int id) ...@@ -133,6 +136,38 @@ static unsigned int steal_context_smp(unsigned int id)
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
static unsigned int steal_all_contexts(void)
{
struct mm_struct *mm;
int cpu = smp_processor_id();
unsigned int id;
for (id = first_context; id <= last_context; id++) {
/* Pick up the victim mm */
mm = context_mm[id];
pr_hardcont(" | steal %d from 0x%p", id, mm);
/* Mark this mm as having no context anymore */
mm->context.id = MMU_NO_CONTEXT;
if (id != first_context) {
context_mm[id] = NULL;
__clear_bit(id, context_map);
#ifdef DEBUG_MAP_CONSISTENCY
mm->context.active = 0;
#endif
}
__clear_bit(id, stale_map[cpu]);
}
/* Flush the TLB for all contexts (not to be used on SMP) */
_tlbil_all();
nr_free_contexts = last_context - first_context;
return first_context;
}
/* Note that this will also be called on SMP if all other CPUs are /* Note that this will also be called on SMP if all other CPUs are
* offlined, which means that it may be called for cpu != 0. For * offlined, which means that it may be called for cpu != 0. For
* this to work, we somewhat assume that CPUs that are onlined * this to work, we somewhat assume that CPUs that are onlined
...@@ -241,7 +276,10 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) ...@@ -241,7 +276,10 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
goto stolen; goto stolen;
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
id = steal_context_up(id); if (no_selective_tlbil)
id = steal_all_contexts();
else
id = steal_context_up(id);
goto stolen; goto stolen;
} }
nr_free_contexts--; nr_free_contexts--;
...@@ -407,12 +445,15 @@ void __init mmu_context_init(void) ...@@ -407,12 +445,15 @@ void __init mmu_context_init(void)
if (mmu_has_feature(MMU_FTR_TYPE_8xx)) { if (mmu_has_feature(MMU_FTR_TYPE_8xx)) {
first_context = 0; first_context = 0;
last_context = 15; last_context = 15;
no_selective_tlbil = true;
} else if (mmu_has_feature(MMU_FTR_TYPE_47x)) { } else if (mmu_has_feature(MMU_FTR_TYPE_47x)) {
first_context = 1; first_context = 1;
last_context = 65535; last_context = 65535;
no_selective_tlbil = false;
} else { } else {
first_context = 1; first_context = 1;
last_context = 255; last_context = 255;
no_selective_tlbil = false;
} }
#ifdef DEBUG_CLAMP_LAST_CONTEXT #ifdef DEBUG_CLAMP_LAST_CONTEXT
......
...@@ -63,7 +63,6 @@ void setbat(int index, unsigned long virt, phys_addr_t phys, ...@@ -63,7 +63,6 @@ void setbat(int index, unsigned long virt, phys_addr_t phys,
#endif /* HAVE_BATS */ #endif /* HAVE_BATS */
#ifdef HAVE_TLBCAM #ifdef HAVE_TLBCAM
extern unsigned int tlbcam_index;
extern phys_addr_t v_mapped_by_tlbcam(unsigned long va); extern phys_addr_t v_mapped_by_tlbcam(unsigned long va);
extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa); extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
#else /* !HAVE_TLBCAM */ #else /* !HAVE_TLBCAM */
...@@ -73,13 +72,25 @@ extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa); ...@@ -73,13 +72,25 @@ extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
#define PGDIR_ORDER (32 + PGD_T_LOG2 - PGDIR_SHIFT) #define PGDIR_ORDER (32 + PGD_T_LOG2 - PGDIR_SHIFT)
#ifndef CONFIG_PPC_4K_PAGES
static struct kmem_cache *pgtable_cache;
void pgtable_cache_init(void)
{
pgtable_cache = kmem_cache_create("PGDIR cache", 1 << PGDIR_ORDER,
1 << PGDIR_ORDER, 0, NULL);
if (pgtable_cache == NULL)
panic("Couldn't allocate pgtable caches");
}
#endif
pgd_t *pgd_alloc(struct mm_struct *mm) pgd_t *pgd_alloc(struct mm_struct *mm)
{ {
pgd_t *ret; pgd_t *ret;
/* pgdir take page or two with 4K pages and a page fraction otherwise */ /* pgdir take page or two with 4K pages and a page fraction otherwise */
#ifndef CONFIG_PPC_4K_PAGES #ifndef CONFIG_PPC_4K_PAGES
ret = kzalloc(1 << PGDIR_ORDER, GFP_KERNEL); ret = kmem_cache_alloc(pgtable_cache, GFP_KERNEL | __GFP_ZERO);
#else #else
ret = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, ret = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
PGDIR_ORDER - PAGE_SHIFT); PGDIR_ORDER - PAGE_SHIFT);
...@@ -90,7 +101,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm) ...@@ -90,7 +101,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
void pgd_free(struct mm_struct *mm, pgd_t *pgd) void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{ {
#ifndef CONFIG_PPC_4K_PAGES #ifndef CONFIG_PPC_4K_PAGES
kfree((void *)pgd); kmem_cache_free(pgtable_cache, (void *)pgd);
#else #else
free_pages((unsigned long)pgd, PGDIR_ORDER - PAGE_SHIFT); free_pages((unsigned long)pgd, PGDIR_ORDER - PAGE_SHIFT);
#endif #endif
...@@ -147,7 +158,7 @@ void __iomem * ...@@ -147,7 +158,7 @@ void __iomem *
ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags) ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags)
{ {
/* writeable implies dirty for kernel addresses */ /* writeable implies dirty for kernel addresses */
if (flags & _PAGE_RW) if ((flags & (_PAGE_RW | _PAGE_RO)) != _PAGE_RO)
flags |= _PAGE_DIRTY | _PAGE_HWWRITE; flags |= _PAGE_DIRTY | _PAGE_HWWRITE;
/* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */ /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
......
...@@ -284,8 +284,11 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, ...@@ -284,8 +284,11 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr,
struct cpumask *cpu_mask; struct cpumask *cpu_mask;
unsigned int pid; unsigned int pid;
if (unlikely(!mm))
return;
preempt_disable(); preempt_disable();
pid = mm ? mm->context.id : 0; pid = mm->context.id;
if (unlikely(pid == MMU_NO_CONTEXT)) if (unlikely(pid == MMU_NO_CONTEXT))
goto bail; goto bail;
cpu_mask = mm_cpumask(mm); cpu_mask = mm_cpumask(mm);
......
...@@ -330,9 +330,11 @@ static int fsl_emb_pmu_add(struct perf_event *event, int flags) ...@@ -330,9 +330,11 @@ static int fsl_emb_pmu_add(struct perf_event *event, int flags)
} }
local64_set(&event->hw.prev_count, val); local64_set(&event->hw.prev_count, val);
if (!(flags & PERF_EF_START)) { if (unlikely(!(flags & PERF_EF_START))) {
event->hw.state = PERF_HES_STOPPED | PERF_HES_UPTODATE; event->hw.state = PERF_HES_STOPPED | PERF_HES_UPTODATE;
val = 0; val = 0;
} else {
event->hw.state &= ~(PERF_HES_STOPPED | PERF_HES_UPTODATE);
} }
write_pmc(i, val); write_pmc(i, val);
...@@ -389,6 +391,7 @@ static void fsl_emb_pmu_del(struct perf_event *event, int flags) ...@@ -389,6 +391,7 @@ static void fsl_emb_pmu_del(struct perf_event *event, int flags)
static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags) static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags)
{ {
unsigned long flags; unsigned long flags;
unsigned long val;
s64 left; s64 left;
if (event->hw.idx < 0 || !event->hw.sample_period) if (event->hw.idx < 0 || !event->hw.sample_period)
...@@ -405,7 +408,10 @@ static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags) ...@@ -405,7 +408,10 @@ static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags)
event->hw.state = 0; event->hw.state = 0;
left = local64_read(&event->hw.period_left); left = local64_read(&event->hw.period_left);
write_pmc(event->hw.idx, left); val = 0;
if (left < 0x80000000L)
val = 0x80000000L - left;
write_pmc(event->hw.idx, val);
perf_event_update_userpage(event); perf_event_update_userpage(event);
perf_pmu_enable(event->pmu); perf_pmu_enable(event->pmu);
......
...@@ -162,8 +162,7 @@ int mpc831x_usb_cfg(void) ...@@ -162,8 +162,7 @@ int mpc831x_usb_cfg(void)
iounmap(immap); iounmap(immap);
if (immr_node) of_node_put(immr_node);
of_node_put(immr_node);
/* Map USB SOC space */ /* Map USB SOC space */
ret = of_address_to_resource(np, 0, &res); ret = of_address_to_resource(np, 0, &res);
......
...@@ -241,6 +241,12 @@ config SGY_CTS1000 ...@@ -241,6 +241,12 @@ config SGY_CTS1000
help help
Enable this to support functionality in Servergy's CTS-1000 systems. Enable this to support functionality in Servergy's CTS-1000 systems.
config MVME2500
bool "Artesyn MVME2500"
select DEFAULT_UIMAGE
help
This option enables support for the Emerson/Artesyn MVME2500 board.
endif # PPC32 endif # PPC32
config PPC_QEMU_E500 config PPC_QEMU_E500
......
...@@ -31,3 +31,4 @@ obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o ...@@ -31,3 +31,4 @@ obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o
obj-$(CONFIG_GE_IMP3A) += ge_imp3a.o obj-$(CONFIG_GE_IMP3A) += ge_imp3a.o
obj-$(CONFIG_PPC_QEMU_E500) += qemu_e500.o obj-$(CONFIG_PPC_QEMU_E500) += qemu_e500.o
obj-$(CONFIG_SGY_CTS1000) += sgy_cts1000.o obj-$(CONFIG_SGY_CTS1000) += sgy_cts1000.o
obj-$(CONFIG_MVME2500) += mvme2500.o
/*
* Board setup routines for the Emerson/Artesyn MVME2500
*
* Copyright 2014 Elettra-Sincrotrone Trieste S.C.p.A.
*
* Based on earlier code by:
*
* Xianghua Xiao (x.xiao@freescale.com)
* Tom Armistead (tom.armistead@emerson.com)
* Copyright 2012 Emerson
*
* 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.
*
* Author Alessio Igor Bogani <alessio.bogani@elettra.eu>
*
*/
#include <linux/pci.h>
#include <asm/udbg.h>
#include <asm/mpic.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
#include "mpc85xx.h"
void __init mvme2500_pic_init(void)
{
struct mpic *mpic = mpic_alloc(NULL, 0,
MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU,
0, 256, " OpenPIC ");
BUG_ON(mpic == NULL);
mpic_init(mpic);
}
/*
* Setup the architecture
*/
static void __init mvme2500_setup_arch(void)
{
if (ppc_md.progress)
ppc_md.progress("mvme2500_setup_arch()", 0);
fsl_pci_assign_primary();
pr_info("MVME2500 board from Artesyn\n");
}
machine_arch_initcall(mvme2500, mpc85xx_common_publish_devices);
/*
* Called very early, device-tree isn't unflattened
*/
static int __init mvme2500_probe(void)
{
unsigned long root = of_get_flat_dt_root();
return of_flat_dt_is_compatible(root, "artesyn,MVME2500");
}
define_machine(mvme2500) {
.name = "MVME2500",
.probe = mvme2500_probe,
.setup_arch = mvme2500_setup_arch,
.init_IRQ = mvme2500_pic_init,
#ifdef CONFIG_PCI
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
#endif
.get_irq = mpic_get_irq,
.restart = fsl_rstcr_restart,
.calibrate_decr = generic_calibrate_decr,
.progress = udbg_progress,
};
...@@ -68,13 +68,10 @@ static int fsl_pcie_check_link(struct pci_controller *hose) ...@@ -68,13 +68,10 @@ static int fsl_pcie_check_link(struct pci_controller *hose)
u32 val = 0; u32 val = 0;
if (hose->indirect_type & PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK) { if (hose->indirect_type & PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK) {
if (hose->ops->read == fsl_indirect_read_config) { if (hose->ops->read == fsl_indirect_read_config)
struct pci_bus bus; __indirect_read_config(hose, hose->first_busno, 0,
bus.number = hose->first_busno; PCIE_LTSSM, 4, &val);
bus.sysdata = hose; else
bus.ops = hose->ops;
indirect_read_config(&bus, 0, PCIE_LTSSM, 4, &val);
} else
early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val); early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val);
if (val < PCIE_LTSSM_L0) if (val < PCIE_LTSSM_L0)
return 1; return 1;
......
...@@ -20,31 +20,31 @@ ...@@ -20,31 +20,31 @@
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <asm/machdep.h> #include <asm/machdep.h>
int indirect_read_config(struct pci_bus *bus, unsigned int devfn, int __indirect_read_config(struct pci_controller *hose,
int offset, int len, u32 *val) unsigned char bus_number, unsigned int devfn,
int offset, int len, u32 *val)
{ {
struct pci_controller *hose = pci_bus_to_host(bus);
volatile void __iomem *cfg_data; volatile void __iomem *cfg_data;
u8 cfg_type = 0; u8 cfg_type = 0;
u32 bus_no, reg; u32 bus_no, reg;
if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) { if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
if (bus->number != hose->first_busno) if (bus_number != hose->first_busno)
return PCIBIOS_DEVICE_NOT_FOUND; return PCIBIOS_DEVICE_NOT_FOUND;
if (devfn != 0) if (devfn != 0)
return PCIBIOS_DEVICE_NOT_FOUND; return PCIBIOS_DEVICE_NOT_FOUND;
} }
if (ppc_md.pci_exclude_device) if (ppc_md.pci_exclude_device)
if (ppc_md.pci_exclude_device(hose, bus->number, devfn)) if (ppc_md.pci_exclude_device(hose, bus_number, devfn))
return PCIBIOS_DEVICE_NOT_FOUND; return PCIBIOS_DEVICE_NOT_FOUND;
if (hose->indirect_type & PPC_INDIRECT_TYPE_SET_CFG_TYPE) if (hose->indirect_type & PPC_INDIRECT_TYPE_SET_CFG_TYPE)
if (bus->number != hose->first_busno) if (bus_number != hose->first_busno)
cfg_type = 1; cfg_type = 1;
bus_no = (bus->number == hose->first_busno) ? bus_no = (bus_number == hose->first_busno) ?
hose->self_busno : bus->number; hose->self_busno : bus_number;
if (hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG) if (hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG)
reg = ((offset & 0xf00) << 16) | (offset & 0xfc); reg = ((offset & 0xf00) << 16) | (offset & 0xfc);
...@@ -77,6 +77,15 @@ int indirect_read_config(struct pci_bus *bus, unsigned int devfn, ...@@ -77,6 +77,15 @@ int indirect_read_config(struct pci_bus *bus, unsigned int devfn,
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
} }
int indirect_read_config(struct pci_bus *bus, unsigned int devfn,
int offset, int len, u32 *val)
{
struct pci_controller *hose = pci_bus_to_host(bus);
return __indirect_read_config(hose, bus->number, devfn, offset, len,
val);
}
int indirect_write_config(struct pci_bus *bus, unsigned int devfn, int indirect_write_config(struct pci_bus *bus, unsigned int devfn,
int offset, int len, u32 val) int offset, int len, u32 val)
{ {
......
...@@ -497,7 +497,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware) ...@@ -497,7 +497,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware)
* saved microcode information and put in the new. * saved microcode information and put in the new.
*/ */
memset(&qe_firmware_info, 0, sizeof(qe_firmware_info)); memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
strcpy(qe_firmware_info.id, firmware->id); strlcpy(qe_firmware_info.id, firmware->id, sizeof(qe_firmware_info.id));
qe_firmware_info.extended_modes = firmware->extended_modes; qe_firmware_info.extended_modes = firmware->extended_modes;
memcpy(qe_firmware_info.vtraps, firmware->vtraps, memcpy(qe_firmware_info.vtraps, firmware->vtraps,
sizeof(firmware->vtraps)); sizeof(firmware->vtraps));
...@@ -583,8 +583,8 @@ struct qe_firmware_info *qe_get_firmware_info(void) ...@@ -583,8 +583,8 @@ struct qe_firmware_info *qe_get_firmware_info(void)
/* Copy the data into qe_firmware_info*/ /* Copy the data into qe_firmware_info*/
sprop = of_get_property(fw, "id", NULL); sprop = of_get_property(fw, "id", NULL);
if (sprop) if (sprop)
strncpy(qe_firmware_info.id, sprop, strlcpy(qe_firmware_info.id, sprop,
sizeof(qe_firmware_info.id) - 1); sizeof(qe_firmware_info.id));
prop = of_find_property(fw, "extended-modes", NULL); prop = of_find_property(fw, "extended-modes", NULL);
if (prop && (prop->length == sizeof(u64))) { if (prop && (prop->length == sizeof(u64))) {
......
...@@ -27,18 +27,29 @@ enum ccf_version { ...@@ -27,18 +27,29 @@ enum ccf_version {
struct ccf_info { struct ccf_info {
enum ccf_version version; enum ccf_version version;
int err_reg_offs; int err_reg_offs;
bool has_brr;
}; };
static const struct ccf_info ccf1_info = { static const struct ccf_info ccf1_info = {
.version = CCF1, .version = CCF1,
.err_reg_offs = 0xa00, .err_reg_offs = 0xa00,
.has_brr = false,
}; };
static const struct ccf_info ccf2_info = { static const struct ccf_info ccf2_info = {
.version = CCF2, .version = CCF2,
.err_reg_offs = 0xe40, .err_reg_offs = 0xe40,
.has_brr = true,
}; };
/*
* This register is present but not documented, with different values for
* IP_ID, on other chips with fsl,corenet2-cf such as t4240 and b4860.
*/
#define CCF_BRR 0xbf8
#define CCF_BRR_IPID 0xffff0000
#define CCF_BRR_IPID_T1040 0x09310000
static const struct of_device_id ccf_matches[] = { static const struct of_device_id ccf_matches[] = {
{ {
.compatible = "fsl,corenet1-cf", .compatible = "fsl,corenet1-cf",
...@@ -66,6 +77,8 @@ struct ccf_err_regs { ...@@ -66,6 +77,8 @@ struct ccf_err_regs {
/* LAE/CV also valid for errdis and errinten */ /* LAE/CV also valid for errdis and errinten */
#define ERRDET_LAE (1 << 0) /* Local Access Error */ #define ERRDET_LAE (1 << 0) /* Local Access Error */
#define ERRDET_CV (1 << 1) /* Coherency Violation */ #define ERRDET_CV (1 << 1) /* Coherency Violation */
#define ERRDET_UTID (1 << 2) /* Unavailable Target ID (t1040) */
#define ERRDET_MCST (1 << 3) /* Multicast Stash (t1040) */
#define ERRDET_CTYPE_SHIFT 26 /* Capture Type (ccf2 only) */ #define ERRDET_CTYPE_SHIFT 26 /* Capture Type (ccf2 only) */
#define ERRDET_CTYPE_MASK (0x1f << ERRDET_CTYPE_SHIFT) #define ERRDET_CTYPE_MASK (0x1f << ERRDET_CTYPE_SHIFT)
#define ERRDET_CAP (1 << 31) /* Capture Valid (ccf2 only) */ #define ERRDET_CAP (1 << 31) /* Capture Valid (ccf2 only) */
...@@ -84,6 +97,7 @@ struct ccf_private { ...@@ -84,6 +97,7 @@ struct ccf_private {
struct device *dev; struct device *dev;
void __iomem *regs; void __iomem *regs;
struct ccf_err_regs __iomem *err_regs; struct ccf_err_regs __iomem *err_regs;
bool t1040;
}; };
static irqreturn_t ccf_irq(int irq, void *dev_id) static irqreturn_t ccf_irq(int irq, void *dev_id)
...@@ -142,6 +156,12 @@ static irqreturn_t ccf_irq(int irq, void *dev_id) ...@@ -142,6 +156,12 @@ static irqreturn_t ccf_irq(int irq, void *dev_id)
if (errdet & ERRDET_CV) if (errdet & ERRDET_CV)
dev_crit(ccf->dev, "Coherency Violation\n"); dev_crit(ccf->dev, "Coherency Violation\n");
if (errdet & ERRDET_UTID)
dev_crit(ccf->dev, "Unavailable Target ID\n");
if (errdet & ERRDET_MCST)
dev_crit(ccf->dev, "Multicast Stash\n");
if (cap_valid) { if (cap_valid) {
dev_crit(ccf->dev, "address 0x%09llx, src id 0x%x\n", dev_crit(ccf->dev, "address 0x%09llx, src id 0x%x\n",
addr, src_id); addr, src_id);
...@@ -157,6 +177,7 @@ static int ccf_probe(struct platform_device *pdev) ...@@ -157,6 +177,7 @@ static int ccf_probe(struct platform_device *pdev)
struct ccf_private *ccf; struct ccf_private *ccf;
struct resource *r; struct resource *r;
const struct of_device_id *match; const struct of_device_id *match;
u32 errinten;
int ret, irq; int ret, irq;
match = of_match_device(ccf_matches, &pdev->dev); match = of_match_device(ccf_matches, &pdev->dev);
...@@ -183,6 +204,13 @@ static int ccf_probe(struct platform_device *pdev) ...@@ -183,6 +204,13 @@ static int ccf_probe(struct platform_device *pdev)
ccf->info = match->data; ccf->info = match->data;
ccf->err_regs = ccf->regs + ccf->info->err_reg_offs; ccf->err_regs = ccf->regs + ccf->info->err_reg_offs;
if (ccf->info->has_brr) {
u32 brr = ioread32be(ccf->regs + CCF_BRR);
if ((brr & CCF_BRR_IPID) == CCF_BRR_IPID_T1040)
ccf->t1040 = true;
}
dev_set_drvdata(&pdev->dev, ccf); dev_set_drvdata(&pdev->dev, ccf);
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
...@@ -197,15 +225,19 @@ static int ccf_probe(struct platform_device *pdev) ...@@ -197,15 +225,19 @@ static int ccf_probe(struct platform_device *pdev)
return ret; return ret;
} }
errinten = ERRDET_LAE | ERRDET_CV;
if (ccf->t1040)
errinten |= ERRDET_UTID | ERRDET_MCST;
switch (ccf->info->version) { switch (ccf->info->version) {
case CCF1: case CCF1:
/* On CCF1 this register enables rather than disables. */ /* On CCF1 this register enables rather than disables. */
iowrite32be(ERRDET_LAE | ERRDET_CV, &ccf->err_regs->errdis); iowrite32be(errinten, &ccf->err_regs->errdis);
break; break;
case CCF2: case CCF2:
iowrite32be(0, &ccf->err_regs->errdis); iowrite32be(0, &ccf->err_regs->errdis);
iowrite32be(ERRDET_LAE | ERRDET_CV, &ccf->err_regs->errinten); iowrite32be(errinten, &ccf->err_regs->errinten);
break; break;
} }
......
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