forked from Minki/linux
powerpc updates for 3.19
Some nice cleanups like removing bootmem, and removal of __get_cpu_var(). There is one patch to mm/gup.c. This is the generic GUP implementation, but is only used by us and arm(64). We have an ack from Steve Capper, and although we didn't get an ack from Andrew he told us to take the patch through the powerpc tree. There's one cxl patch. This is in drivers/misc, but Greg said he was happy for us to manage fixes for it. There is an infrastructure patch to support an IPMI driver for OPAL. That patch also appears in Corey Minyard's IPMI tree, you may see a conflict there. There is also an RTC driver for OPAL. We weren't able to get any response from the RTC maintainer, Alessandro Zummo, so in the end we just merged the driver. The usual batch of Freescale updates from Scott. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJUiSTSAAoJEFHr6jzI4aWAirQP/3rIEng0LzLu5kW2zkGylIaM SNDum1vze3mHiTFl+CFcSIGpC1UEULoB49HA+2oE/ExKpIceG6lpL2LP+wNh2FW5 mozjMjS6mZt4w1Fu1D2ZtgQc3O1T1pxkqsnZmPa8gVf5k5d5IQNPY6yB0pgVWwbV gwBKxe4VwPAzJjppE9i9MDhNTJwmHZq0lI8XuoTXOOU/f+4G1WxmjrbyveQ7cRP5 i/sq2cKjxpWA+KDeIXo0GR0DpXR7qMeAvFX5xXY7oKuUJIFDM4kSHfmMYP6qLf5c 2vlsJqHVqfOgQdve41z1ooaPzNtg7ezVo+VqqguSgtSgwy2JUo/uHpnzz3gD1Olo AP5+6xj8LZac0rTPxF4n4Hoyrp7AaaFjEFt1zqT9PWniZW4B41wtia0QORBNUf1S UEmKAC9T3WZJ47mH7WMSadtOPF9E3Yd/zuiPD4udtptCNKPbr6/k1MpJPIW2D4Rn BJ0QZTRd7V0yRofXxZtHxaMxq8pWd/Tip7J/zr/ghz+ulnH8BuFamuhCCLuJlESU +A2PMfuseyTMpH9sMAmmTwSGPDKjaUFWvmFvY/n88NZL7r2LlomNrDWFSSQOIHUP FxjYmjUMpZeexsfyRdgFV/INhYC3o3cso2fRGO45YK6nkxNnjNFEBS6WhQLvNLBu sknd1WjXkuJtoMC15SrQ =jvyT -----END PGP SIGNATURE----- Merge tag 'powerpc-3.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux Pull powerpc updates from Michael Ellerman: "Some nice cleanups like removing bootmem, and removal of __get_cpu_var(). There is one patch to mm/gup.c. This is the generic GUP implementation, but is only used by us and arm(64). We have an ack from Steve Capper, and although we didn't get an ack from Andrew he told us to take the patch through the powerpc tree. There's one cxl patch. This is in drivers/misc, but Greg said he was happy for us to manage fixes for it. There is an infrastructure patch to support an IPMI driver for OPAL. There is also an RTC driver for OPAL. We weren't able to get any response from the RTC maintainer, Alessandro Zummo, so in the end we just merged the driver. The usual batch of Freescale updates from Scott" * tag 'powerpc-3.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux: (101 commits) powerpc/powernv: Return to cpu offline loop when finished in KVM guest powerpc/book3s: Fix partial invalidation of TLBs in MCE code. powerpc/mm: don't do tlbie for updatepp request with NO HPTE fault powerpc/xmon: Cleanup the breakpoint flags powerpc/xmon: Enable HW instruction breakpoint on POWER8 powerpc/mm/thp: Use tlbiel if possible powerpc/mm/thp: Remove code duplication powerpc/mm/hugetlb: Sanity check gigantic hugepage count powerpc/oprofile: Disable pagefaults during user stack read powerpc/mm: Check for matching hpte without taking hpte lock powerpc: Drop useless warning in eeh_init() powerpc/powernv: Cleanup unused MCE definitions/declarations. powerpc/eeh: Dump PHB diag-data early powerpc/eeh: Recover EEH error on ownership change for BCM5719 powerpc/eeh: Set EEH_PE_RESET on PE reset powerpc/eeh: Refactor eeh_reset_pe() powerpc: Remove more traces of bootmem powerpc/pseries: Initialise nvram_pstore_info's buf_lock cxl: Name interrupts in /proc/interrupt cxl: Return error to PSL if IRQ demultiplexing fails & print clearer warning ...
This commit is contained in:
commit
140cd7fb04
@ -62,6 +62,8 @@ Required properties:
|
||||
It takes parent's clock-frequency as its clock.
|
||||
* "fsl,qoriq-sysclk-2.0": for input system clock (v2.0).
|
||||
It takes parent's clock-frequency as its clock.
|
||||
* "fsl,qoriq-platform-pll-1.0" for the platform PLL clock (v1.0)
|
||||
* "fsl,qoriq-platform-pll-2.0" for the platform PLL clock (v2.0)
|
||||
- #clock-cells: From common clock binding. The number of cells in a
|
||||
clock-specifier. Should be <0> for "fsl,qoriq-sysclk-[1,2].0"
|
||||
clocks, or <1> for "fsl,qoriq-core-pll-[1,2].0" clocks.
|
||||
@ -128,8 +130,16 @@ Example for clock block and clock provider:
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
|
||||
platform-pll: platform-pll@c00 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0xc00 0x4>;
|
||||
compatible = "fsl,qoriq-platform-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "platform-pll", "platform-pll-div2";
|
||||
};
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
Example for clock consumer:
|
||||
|
||||
@ -139,4 +149,4 @@ Example for clock consumer:
|
||||
clocks = <&mux0>;
|
||||
...
|
||||
};
|
||||
}
|
||||
};
|
||||
|
534
Documentation/devicetree/bindings/powerpc/fsl/fman.txt
Normal file
534
Documentation/devicetree/bindings/powerpc/fsl/fman.txt
Normal file
@ -0,0 +1,534 @@
|
||||
=============================================================================
|
||||
Freescale Frame Manager Device Bindings
|
||||
|
||||
CONTENTS
|
||||
- FMan Node
|
||||
- FMan Port Node
|
||||
- FMan MURAM Node
|
||||
- FMan dTSEC/XGEC/mEMAC Node
|
||||
- FMan IEEE 1588 Node
|
||||
- Example
|
||||
|
||||
=============================================================================
|
||||
FMan Node
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Due to the fact that the FMan is an aggregation of sub-engines (ports, MACs,
|
||||
etc.) the FMan node will have child nodes for each of them.
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,fman"
|
||||
FMan version can be determined via FM_IP_REV_1 register in the
|
||||
FMan block. The offset is 0xc4 from the beginning of the
|
||||
Frame Processing Manager memory map (0xc3000 from the
|
||||
beginning of the FMan node).
|
||||
|
||||
- cell-index
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: Specifies the index of the FMan unit.
|
||||
|
||||
The cell-index value may be used by the SoC, to identify the
|
||||
FMan unit in the SoC memory map. In the table bellow,
|
||||
there's a description of the cell-index use in each SoC:
|
||||
|
||||
- P1023:
|
||||
register[bit] FMan unit cell-index
|
||||
============================================================
|
||||
DEVDISR[1] 1 0
|
||||
|
||||
- P2041, P3041, P4080 P5020, P5040:
|
||||
register[bit] FMan unit cell-index
|
||||
============================================================
|
||||
DCFG_DEVDISR2[6] 1 0
|
||||
DCFG_DEVDISR2[14] 2 1
|
||||
(Second FM available only in P4080 and P5040)
|
||||
|
||||
- B4860, T1040, T2080, T4240:
|
||||
register[bit] FMan unit cell-index
|
||||
============================================================
|
||||
DCFG_CCSR_DEVDISR2[24] 1 0
|
||||
DCFG_CCSR_DEVDISR2[25] 2 1
|
||||
(Second FM available only in T4240)
|
||||
|
||||
DEVDISR, DCFG_DEVDISR2 and DCFG_CCSR_DEVDISR2 are located in
|
||||
the specific SoC "Device Configuration/Pin Control" Memory
|
||||
Map.
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A standard property. Specifies the offset of the
|
||||
following configuration registers:
|
||||
- BMI configuration registers.
|
||||
- QMI configuration registers.
|
||||
- DMA configuration registers.
|
||||
- FPM configuration registers.
|
||||
- FMan controller configuration registers.
|
||||
|
||||
- ranges
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A standard property.
|
||||
|
||||
- clocks
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: phandle for the fman input clock.
|
||||
|
||||
- clock-names
|
||||
usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: "fmanclk" for the fman input clock.
|
||||
|
||||
- interrupts
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A pair of IRQs are specified in this property.
|
||||
The first element is associated with the event interrupts and
|
||||
the second element is associated with the error interrupts.
|
||||
|
||||
- fsl,qman-channel-range
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Specifies the range of the available dedicated
|
||||
channels in the FMan. The first cell specifies the beginning
|
||||
of the range and the second cell specifies the number of
|
||||
channels.
|
||||
Further information available at:
|
||||
"Work Queue (WQ) Channel Assignments in the QMan" section
|
||||
in DPAA Reference Manual.
|
||||
|
||||
- fsl,qman
|
||||
- fsl,bman
|
||||
Usage: required
|
||||
Definition: See soc/fsl/qman.txt and soc/fsl/bman.txt
|
||||
|
||||
=============================================================================
|
||||
FMan MURAM Node
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
FMan Internal memory - shared between all the FMan modules.
|
||||
It contains data structures that are common and written to or read by
|
||||
the modules.
|
||||
FMan internal memory is split into the following parts:
|
||||
Packet buffering (Tx/Rx FIFOs)
|
||||
Frames internal context
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,fman-muram"
|
||||
|
||||
- ranges
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A standard property.
|
||||
Specifies the multi-user memory offset and the size within
|
||||
the FMan.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
muram@0 {
|
||||
compatible = "fsl,fman-muram";
|
||||
ranges = <0 0x000000 0x28000>;
|
||||
};
|
||||
|
||||
=============================================================================
|
||||
FMan Port Node
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
The Frame Manager (FMan) supports several types of hardware ports:
|
||||
Ethernet receiver (RX)
|
||||
Ethernet transmitter (TX)
|
||||
Offline/Host command (O/H)
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: A standard property.
|
||||
Must include one of the following:
|
||||
- "fsl,fman-v2-port-oh" for FManV2 OH ports
|
||||
- "fsl,fman-v2-port-rx" for FManV2 RX ports
|
||||
- "fsl,fman-v2-port-tx" for FManV2 TX ports
|
||||
- "fsl,fman-v3-port-oh" for FManV3 OH ports
|
||||
- "fsl,fman-v3-port-rx" for FManV3 RX ports
|
||||
- "fsl,fman-v3-port-tx" for FManV3 TX ports
|
||||
|
||||
- cell-index
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: Specifies the hardware port id.
|
||||
Each hardware port on the FMan has its own hardware PortID.
|
||||
Super set of all hardware Port IDs available at FMan Reference
|
||||
Manual under "FMan Hardware Ports in Freescale Devices" table.
|
||||
|
||||
Each hardware port is assigned a 4KB, port-specific page in
|
||||
the FMan hardware port memory region (which is part of the
|
||||
FMan memory map). The first 4 KB in the FMan hardware ports
|
||||
memory region is used for what are called common registers.
|
||||
The subsequent 63 4KB pages are allocated to the hardware
|
||||
ports.
|
||||
The page of a specific port is determined by the cell-index.
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: There is one reg region describing the port
|
||||
configuration registers.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
port@a8000 {
|
||||
cell-index = <0x28>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xa8000 0x1000>;
|
||||
};
|
||||
|
||||
port@88000 {
|
||||
cell-index = <0x8>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x88000 0x1000>;
|
||||
};
|
||||
|
||||
port@81000 {
|
||||
cell-index = <0x1>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x81000 0x1000>;
|
||||
};
|
||||
|
||||
=============================================================================
|
||||
FMan dTSEC/XGEC/mEMAC Node
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
mEMAC/dTSEC/XGEC are the Ethernet network interfaces
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: A standard property.
|
||||
Must include one of the following:
|
||||
- "fsl,fman-dtsec" for dTSEC MAC
|
||||
- "fsl,fman-xgec" for XGEC MAC
|
||||
- "fsl,fman-memac for mEMAC MAC
|
||||
|
||||
- cell-index
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: Specifies the MAC id.
|
||||
|
||||
The cell-index value may be used by the FMan or the SoC, to
|
||||
identify the MAC unit in the FMan (or SoC) memory map.
|
||||
In the tables bellow there's a description of the cell-index
|
||||
use, there are two tables, one describes the use of cell-index
|
||||
by the FMan, the second describes the use by the SoC:
|
||||
|
||||
1. FMan Registers
|
||||
|
||||
FManV2:
|
||||
register[bit] MAC cell-index
|
||||
============================================================
|
||||
FM_EPI[16] XGEC 8
|
||||
FM_EPI[16+n] dTSECn n-1
|
||||
FM_NPI[11+n] dTSECn n-1
|
||||
n = 1,..,5
|
||||
|
||||
FManV3:
|
||||
register[bit] MAC cell-index
|
||||
============================================================
|
||||
FM_EPI[16+n] mEMACn n-1
|
||||
FM_EPI[25] mEMAC10 9
|
||||
|
||||
FM_NPI[11+n] mEMACn n-1
|
||||
FM_NPI[10] mEMAC10 9
|
||||
FM_NPI[11] mEMAC9 8
|
||||
n = 1,..8
|
||||
|
||||
FM_EPI and FM_NPI are located in the FMan memory map.
|
||||
|
||||
2. SoC registers:
|
||||
|
||||
- P2041, P3041, P4080 P5020, P5040:
|
||||
register[bit] FMan MAC cell
|
||||
Unit index
|
||||
============================================================
|
||||
DCFG_DEVDISR2[7] 1 XGEC 8
|
||||
DCFG_DEVDISR2[7+n] 1 dTSECn n-1
|
||||
DCFG_DEVDISR2[15] 2 XGEC 8
|
||||
DCFG_DEVDISR2[15+n] 2 dTSECn n-1
|
||||
n = 1,..5
|
||||
|
||||
- T1040, T2080, T4240, B4860:
|
||||
register[bit] FMan MAC cell
|
||||
Unit index
|
||||
============================================================
|
||||
DCFG_CCSR_DEVDISR2[n-1] 1 mEMACn n-1
|
||||
DCFG_CCSR_DEVDISR2[11+n] 2 mEMACn n-1
|
||||
n = 1,..6,9,10
|
||||
|
||||
EVDISR, DCFG_DEVDISR2 and DCFG_CCSR_DEVDISR2 are located in
|
||||
the specific SoC "Device Configuration/Pin Control" Memory
|
||||
Map.
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A standard property.
|
||||
|
||||
- fsl,fman-ports
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: An array of two phandles - the first references is
|
||||
the FMan RX port and the second is the TX port used by this
|
||||
MAC.
|
||||
|
||||
- ptp-timer
|
||||
Usage required
|
||||
Value type: <phandle>
|
||||
Definition: A phandle for 1EEE1588 timer.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
fman1_tx28: port@a8000 {
|
||||
cell-index = <0x28>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xa8000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx8: port@88000 {
|
||||
cell-index = <0x8>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x88000 0x1000>;
|
||||
};
|
||||
|
||||
ptp-timer: ptp_timer@fe000 {
|
||||
compatible = "fsl,fman-ptp-timer";
|
||||
reg = <0xfe000 0x1000>;
|
||||
};
|
||||
|
||||
ethernet@e0000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <0>;
|
||||
reg = <0xe0000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx8 &fman1_tx28>;
|
||||
ptp-timer = <&ptp-timer>;
|
||||
};
|
||||
|
||||
============================================================================
|
||||
FMan IEEE 1588 Node
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
The FMan interface to support IEEE 1588
|
||||
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: A standard property.
|
||||
Must include "fsl,fman-ptp-timer".
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: A standard property.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
ptp-timer@fe000 {
|
||||
compatible = "fsl,fman-ptp-timer";
|
||||
reg = <0xfe000 0x1000>;
|
||||
};
|
||||
|
||||
=============================================================================
|
||||
Example
|
||||
|
||||
fman@400000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <1>;
|
||||
compatible = "fsl,fman"
|
||||
ranges = <0 0x400000 0x100000>;
|
||||
reg = <0x400000 0x100000>;
|
||||
clocks = <&fman_clk>;
|
||||
clock-names = "fmanclk";
|
||||
interrupts = <
|
||||
96 2 0 0
|
||||
16 2 1 1>;
|
||||
fsl,qman-channel-range = <0x40 0xc>;
|
||||
|
||||
muram@0 {
|
||||
compatible = "fsl,fman-muram";
|
||||
reg = <0x0 0x28000>;
|
||||
};
|
||||
|
||||
port@81000 {
|
||||
cell-index = <1>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x81000 0x1000>;
|
||||
};
|
||||
|
||||
port@82000 {
|
||||
cell-index = <2>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x82000 0x1000>;
|
||||
};
|
||||
|
||||
port@83000 {
|
||||
cell-index = <3>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x83000 0x1000>;
|
||||
};
|
||||
|
||||
port@84000 {
|
||||
cell-index = <4>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x84000 0x1000>;
|
||||
};
|
||||
|
||||
port@85000 {
|
||||
cell-index = <5>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x85000 0x1000>;
|
||||
};
|
||||
|
||||
port@86000 {
|
||||
cell-index = <6>;
|
||||
compatible = "fsl,fman-v2-port-oh";
|
||||
reg = <0x86000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0x8: port@88000 {
|
||||
cell-index = <0x8>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x88000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0x9: port@89000 {
|
||||
cell-index = <0x9>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x89000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0xa: port@8a000 {
|
||||
cell-index = <0xa>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x8a000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0xb: port@8b000 {
|
||||
cell-index = <0xb>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x8b000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0xc: port@8c000 {
|
||||
cell-index = <0xc>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x8c000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_rx_0x10: port@90000 {
|
||||
cell-index = <0x10>;
|
||||
compatible = "fsl,fman-v2-port-rx";
|
||||
reg = <0x90000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x28: port@a8000 {
|
||||
cell-index = <0x28>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xa8000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x29: port@a9000 {
|
||||
cell-index = <0x29>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xa9000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x2a: port@aa000 {
|
||||
cell-index = <0x2a>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xaa000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x2b: port@ab000 {
|
||||
cell-index = <0x2b>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xab000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x2c: port@ac0000 {
|
||||
cell-index = <0x2c>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xac000 0x1000>;
|
||||
};
|
||||
|
||||
fman1_tx_0x30: port@b0000 {
|
||||
cell-index = <0x30>;
|
||||
compatible = "fsl,fman-v2-port-tx";
|
||||
reg = <0xb0000 0x1000>;
|
||||
};
|
||||
|
||||
ethernet@e0000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <0>;
|
||||
reg = <0xe0000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0x8 &fman1_tx_0x28>;
|
||||
};
|
||||
|
||||
ethernet@e2000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <1>;
|
||||
reg = <0xe2000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0x9 &fman1_tx_0x29>;
|
||||
};
|
||||
|
||||
ethernet@e4000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <2>;
|
||||
reg = <0xe4000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0xa &fman1_tx_0x2a>;
|
||||
};
|
||||
|
||||
ethernet@e6000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <3>;
|
||||
reg = <0xe6000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0xb &fman1_tx_0x2b>;
|
||||
};
|
||||
|
||||
ethernet@e8000 {
|
||||
compatible = "fsl,fman-dtsec";
|
||||
cell-index = <4>;
|
||||
reg = <0xf0000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0xc &fman1_tx_0x2c>;
|
||||
|
||||
ethernet@f0000 {
|
||||
cell-index = <8>;
|
||||
compatible = "fsl,fman-xgec";
|
||||
reg = <0xf0000 0x1000>;
|
||||
fsl,fman-ports = <&fman1_rx_0x10 &fman1_tx_0x30>;
|
||||
};
|
||||
|
||||
ptp-timer@fe000 {
|
||||
compatible = "fsl,fman-ptp-timer";
|
||||
reg = <0xfe000 0x1000>;
|
||||
};
|
||||
};
|
16
Documentation/devicetree/bindings/rtc/rtc-opal.txt
Normal file
16
Documentation/devicetree/bindings/rtc/rtc-opal.txt
Normal file
@ -0,0 +1,16 @@
|
||||
IBM OPAL real-time clock
|
||||
------------------------
|
||||
|
||||
Required properties:
|
||||
- comapatible: Should be "ibm,opal-rtc"
|
||||
|
||||
Optional properties:
|
||||
- has-tpo: Decides if the wakeup is supported or not.
|
||||
|
||||
Example:
|
||||
rtc {
|
||||
compatible = "ibm,opal-rtc";
|
||||
has-tpo;
|
||||
phandle = <0x10000029>;
|
||||
linux,phandle = <0x10000029>;
|
||||
};
|
56
Documentation/devicetree/bindings/soc/fsl/bman-portals.txt
Normal file
56
Documentation/devicetree/bindings/soc/fsl/bman-portals.txt
Normal file
@ -0,0 +1,56 @@
|
||||
QorIQ DPAA Buffer Manager Portals Device Tree Binding
|
||||
|
||||
Copyright (C) 2008 - 2014 Freescale Semiconductor Inc.
|
||||
|
||||
CONTENTS
|
||||
|
||||
- BMan Portal
|
||||
- Example
|
||||
|
||||
BMan Portal Node
|
||||
|
||||
Portals are memory mapped interfaces to BMan that allow low-latency, lock-less
|
||||
interaction by software running on processor cores, accelerators and network
|
||||
interfaces with the BMan
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: Required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,bman-portal-<hardware revision>"
|
||||
May include "fsl,<SoC>-bman-portal" or "fsl,bman-portal"
|
||||
|
||||
- reg
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Two regions. The first is the cache-enabled region of
|
||||
the portal. The second is the cache-inhibited region of
|
||||
the portal
|
||||
|
||||
- interrupts
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Standard property
|
||||
|
||||
EXAMPLE
|
||||
|
||||
The example below shows a (P4080) BMan portals container/bus node with two portals
|
||||
|
||||
bman-portals@ff4000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
ranges = <0 0xf 0xf4000000 0x200000>;
|
||||
|
||||
bman-portal@0 {
|
||||
compatible = "fsl,bman-portal-1.0.0", "fsl,bman-portal";
|
||||
reg = <0x0 0x4000>, <0x100000 0x1000>;
|
||||
interrupts = <105 2 0 0>;
|
||||
};
|
||||
bman-portal@4000 {
|
||||
compatible = "fsl,bman-portal-1.0.0", "fsl,bman-portal";
|
||||
reg = <0x4000 0x4000>, <0x101000 0x1000>;
|
||||
interrupts = <107 2 0 0>;
|
||||
};
|
||||
};
|
125
Documentation/devicetree/bindings/soc/fsl/bman.txt
Normal file
125
Documentation/devicetree/bindings/soc/fsl/bman.txt
Normal file
@ -0,0 +1,125 @@
|
||||
QorIQ DPAA Buffer Manager Device Tree Bindings
|
||||
|
||||
Copyright (C) 2008 - 2014 Freescale Semiconductor Inc.
|
||||
|
||||
CONTENTS
|
||||
|
||||
- BMan Node
|
||||
- BMan Private Memory Node
|
||||
- Example
|
||||
|
||||
BMan Node
|
||||
|
||||
The Buffer Manager is part of the Data-Path Acceleration Architecture (DPAA).
|
||||
BMan supports hardware allocation and deallocation of buffers belonging to pools
|
||||
originally created by software with configurable depletion thresholds. This
|
||||
binding covers the CCSR space programming model
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: Required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,bman"
|
||||
May include "fsl,<SoC>-bman"
|
||||
|
||||
- reg
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Registers region within the CCSR address space
|
||||
|
||||
The BMan revision information is located in the BMAN_IP_REV_1/2 registers which
|
||||
are located at offsets 0xbf8 and 0xbfc
|
||||
|
||||
- interrupts
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Standard property. The error interrupt
|
||||
|
||||
- fsl,liodn
|
||||
Usage: See pamu.txt
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: PAMU property used for static LIODN assignment
|
||||
|
||||
- fsl,iommu-parent
|
||||
Usage: See pamu.txt
|
||||
Value type: <phandle>
|
||||
Definition: PAMU property used for dynamic LIODN assignment
|
||||
|
||||
For additional details about the PAMU/LIODN binding(s) see pamu.txt
|
||||
|
||||
Devices connected to a BMan instance via Direct Connect Portals (DCP) must link
|
||||
to the respective BMan instance
|
||||
|
||||
- fsl,bman
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Description: List of phandle and DCP index pairs, to the BMan instance
|
||||
to which this device is connected via the DCP
|
||||
|
||||
BMan Private Memory Node
|
||||
|
||||
BMan requires a contiguous range of physical memory used for the backing store
|
||||
for BMan Free Buffer Proxy Records (FBPR). This memory is reserved/allocated as a
|
||||
node under the /reserved-memory node
|
||||
|
||||
The BMan FBPR memory node must be named "bman-fbpr"
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Must inclide "fsl,bman-fbpr"
|
||||
|
||||
The following constraints are relevant to the FBPR private memory:
|
||||
- The size must be 2^(size + 1), with size = 11..33. That is 4 KiB to
|
||||
16 GiB
|
||||
- The alignment must be a muliptle of the memory size
|
||||
|
||||
The size of the FBPR must be chosen by observing the hardware features configured
|
||||
via the Reset Configuration Word (RCW) and that are relevant to a specific board
|
||||
(e.g. number of MAC(s) pinned-out, number of offline/host command FMan ports,
|
||||
etc.). The size configured in the DT must reflect the hardware capabilities and
|
||||
not the specific needs of an application
|
||||
|
||||
For additional details about reserved memory regions see reserved-memory.txt
|
||||
|
||||
EXAMPLE
|
||||
|
||||
The example below shows a BMan FBPR dynamic allocation memory node
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
bman_fbpr: bman-fbpr {
|
||||
compatible = "fsl,bman-fbpr";
|
||||
alloc-ranges = <0 0 0xf 0xffffffff>;
|
||||
size = <0 0x1000000>;
|
||||
alignment = <0 0x1000000>;
|
||||
};
|
||||
};
|
||||
|
||||
The example below shows a (P4080) BMan CCSR-space node
|
||||
|
||||
crypto@300000 {
|
||||
...
|
||||
fsl,bman = <&bman, 2>;
|
||||
...
|
||||
};
|
||||
|
||||
bman: bman@31a000 {
|
||||
compatible = "fsl,bman";
|
||||
reg = <0x31a000 0x1000>;
|
||||
interrupts = <16 2 1 2>;
|
||||
fsl,liodn = <0x17>;
|
||||
memory-region = <&bman_fbpr>;
|
||||
};
|
||||
|
||||
fman@400000 {
|
||||
...
|
||||
fsl,bman = <&bman, 0>;
|
||||
...
|
||||
};
|
154
Documentation/devicetree/bindings/soc/fsl/qman-portals.txt
Normal file
154
Documentation/devicetree/bindings/soc/fsl/qman-portals.txt
Normal file
@ -0,0 +1,154 @@
|
||||
QorIQ DPAA Queue Manager Portals Device Tree Binding
|
||||
|
||||
Copyright (C) 2008 - 2014 Freescale Semiconductor Inc.
|
||||
|
||||
CONTENTS
|
||||
|
||||
- QMan Portal
|
||||
- QMan Pool Channel
|
||||
- Example
|
||||
|
||||
QMan Portal Node
|
||||
|
||||
Portals are memory mapped interfaces to QMan that allow low-latency, lock-less
|
||||
interaction by software running on processor cores, accelerators and network
|
||||
interfaces with the QMan
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: Required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,qman-portal-<hardware revision>"
|
||||
May include "fsl,<SoC>-qman-portal" or "fsl,qman-portal"
|
||||
|
||||
- reg
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Two regions. The first is the cache-enabled region of
|
||||
the portal. The second is the cache-inhibited region of
|
||||
the portal
|
||||
|
||||
- interrupts
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Standard property
|
||||
|
||||
- fsl,liodn
|
||||
Usage: See pamu.txt
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Two LIODN(s). DQRR LIODN (DLIODN) and Frame LIODN
|
||||
(FLIODN)
|
||||
|
||||
- fsl,iommu-parent
|
||||
Usage: See pamu.txt
|
||||
Value type: <phandle>
|
||||
Definition: PAMU property used for dynamic LIODN assignment
|
||||
|
||||
For additional details about the PAMU/LIODN binding(s) see pamu.txt
|
||||
|
||||
- fsl,qman-channel-id
|
||||
Usage: Required
|
||||
Value type: <u32>
|
||||
Definition: The hardware index of the channel. This can also be
|
||||
determined by dividing any of the channel's 8 work queue
|
||||
IDs by 8
|
||||
|
||||
In addition to these properties the qman-portals should have sub-nodes to
|
||||
represent the HW devices/portals that are connected to the software portal
|
||||
described here
|
||||
|
||||
The currently supported sub-nodes are:
|
||||
* fman0
|
||||
* fman1
|
||||
* pme
|
||||
* crypto
|
||||
|
||||
These subnodes should have the following properties:
|
||||
|
||||
- fsl,liodn
|
||||
Usage: See pamu.txt
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: PAMU property used for static LIODN assignment
|
||||
|
||||
- fsl,iommu-parent
|
||||
Usage: See pamu.txt
|
||||
Value type: <phandle>
|
||||
Definition: PAMU property used for dynamic LIODN assignment
|
||||
|
||||
- dev-handle
|
||||
Usage: Required
|
||||
Value type: <phandle>
|
||||
Definition: The phandle to the particular hardware device that this
|
||||
portal is connected to.
|
||||
|
||||
DPAA QMan Pool Channel Nodes
|
||||
|
||||
Pool Channels are defined with the following properties.
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: Required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,qman-pool-channel"
|
||||
May include "fsl,<SoC>-qman-pool-channel"
|
||||
|
||||
- fsl,qman-channel-id
|
||||
Usage: Required
|
||||
Value type: <u32>
|
||||
Definition: The hardware index of the channel. This can also be
|
||||
determined by dividing any of the channel's 8 work queue
|
||||
IDs by 8
|
||||
|
||||
EXAMPLE
|
||||
|
||||
The example below shows a (P4080) QMan portals container/bus node with two portals
|
||||
|
||||
qman-portals@ff4200000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
ranges = <0 0xf 0xf4200000 0x200000>;
|
||||
|
||||
qman-portal@0 {
|
||||
compatible = "fsl,qman-portal-1.2.0", "fsl,qman-portal";
|
||||
reg = <0 0x4000>, <0x100000 0x1000>;
|
||||
interrupts = <104 2 0 0>;
|
||||
fsl,liodn = <1 2>;
|
||||
fsl,qman-channel-id = <0>;
|
||||
|
||||
fman0 {
|
||||
fsl,liodn = <0x21>;
|
||||
dev-handle = <&fman0>;
|
||||
};
|
||||
fman1 {
|
||||
fsl,liodn = <0xa1>;
|
||||
dev-handle = <&fman1>;
|
||||
};
|
||||
crypto {
|
||||
fsl,liodn = <0x41 0x66>;
|
||||
dev-handle = <&crypto>;
|
||||
};
|
||||
};
|
||||
qman-portal@4000 {
|
||||
compatible = "fsl,qman-portal-1.2.0", "fsl,qman-portal";
|
||||
reg = <0x4000 0x4000>, <0x101000 0x1000>;
|
||||
interrupts = <106 2 0 0>;
|
||||
fsl,liodn = <3 4>;
|
||||
fsl,qman-channel-id = <1>;
|
||||
|
||||
fman0 {
|
||||
fsl,liodn = <0x22>;
|
||||
dev-handle = <&fman0>;
|
||||
};
|
||||
fman1 {
|
||||
fsl,liodn = <0xa2>;
|
||||
dev-handle = <&fman1>;
|
||||
};
|
||||
crypto {
|
||||
fsl,liodn = <0x42 0x67>;
|
||||
dev-handle = <&crypto>;
|
||||
};
|
||||
};
|
||||
};
|
165
Documentation/devicetree/bindings/soc/fsl/qman.txt
Normal file
165
Documentation/devicetree/bindings/soc/fsl/qman.txt
Normal file
@ -0,0 +1,165 @@
|
||||
QorIQ DPAA Queue Manager Device Tree Binding
|
||||
|
||||
Copyright (C) 2008 - 2014 Freescale Semiconductor Inc.
|
||||
|
||||
CONTENTS
|
||||
|
||||
- QMan Node
|
||||
- QMan Private Memory Nodes
|
||||
- Example
|
||||
|
||||
QMan Node
|
||||
|
||||
The Queue Manager is part of the Data-Path Acceleration Architecture (DPAA). QMan
|
||||
supports queuing and QoS scheduling of frames to CPUs, network interfaces and
|
||||
DPAA logic modules, maintains packet ordering within flows. Besides providing
|
||||
flow-level queuing, is also responsible for congestion management functions such
|
||||
as RED/WRED, congestion notifications and tail discards. This binding covers the
|
||||
CCSR space programming model
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: Required
|
||||
Value type: <stringlist>
|
||||
Definition: Must include "fsl,qman"
|
||||
May include "fsl,<SoC>-qman"
|
||||
|
||||
- reg
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Registers region within the CCSR address space
|
||||
|
||||
The QMan revision information is located in the QMAN_IP_REV_1/2 registers which
|
||||
are located at offsets 0xbf8 and 0xbfc
|
||||
|
||||
- interrupts
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Standard property. The error interrupt
|
||||
|
||||
- fsl,liodn
|
||||
Usage: See pamu.txt
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: PAMU property used for static LIODN assignment
|
||||
|
||||
- fsl,iommu-parent
|
||||
Usage: See pamu.txt
|
||||
Value type: <phandle>
|
||||
Definition: PAMU property used for dynamic LIODN assignment
|
||||
|
||||
For additional details about the PAMU/LIODN binding(s) see pamu.txt
|
||||
|
||||
- clocks
|
||||
Usage: See clock-bindings.txt and qoriq-clock.txt
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: Reference input clock. Its frequency is half of the
|
||||
platform clock
|
||||
|
||||
Devices connected to a QMan instance via Direct Connect Portals (DCP) must link
|
||||
to the respective QMan instance
|
||||
|
||||
- fsl,qman
|
||||
Usage: Required
|
||||
Value type: <prop-encoded-array>
|
||||
Description: List of phandle and DCP index pairs, to the QMan instance
|
||||
to which this device is connected via the DCP
|
||||
|
||||
QMan Private Memory Nodes
|
||||
|
||||
QMan requires two contiguous range of physical memory used for the backing store
|
||||
for QMan Frame Queue Descriptor (FQD) and Packed Frame Descriptor Record (PFDR).
|
||||
This memory is reserved/allocated as a nodes under the /reserved-memory node
|
||||
|
||||
The QMan FQD memory node must be named "qman-fqd"
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Must inclide "fsl,qman-fqd"
|
||||
|
||||
The QMan PFDR memory node must be named "qman-pfdr"
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: Must inclide "fsl,qman-pfdr"
|
||||
|
||||
The following constraints are relevant to the FQD and PFDR private memory:
|
||||
- The size must be 2^(size + 1), with size = 11..29. That is 4 KiB to
|
||||
1 GiB
|
||||
- The alignment must be a muliptle of the memory size
|
||||
|
||||
The size of the FQD and PFDP must be chosen by observing the hardware features
|
||||
configured via the Reset Configuration Word (RCW) and that are relevant to a
|
||||
specific board (e.g. number of MAC(s) pinned-out, number of offline/host command
|
||||
FMan ports, etc.). The size configured in the DT must reflect the hardware
|
||||
capabilities and not the specific needs of an application
|
||||
|
||||
For additional details about reserved memory regions see reserved-memory.txt
|
||||
|
||||
EXAMPLE
|
||||
|
||||
The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
qman_fqd: qman-fqd {
|
||||
compatible = "fsl,qman-fqd";
|
||||
alloc-ranges = <0 0 0xf 0xffffffff>;
|
||||
size = <0 0x400000>;
|
||||
alignment = <0 0x400000>;
|
||||
};
|
||||
qman_pfdr: qman-pfdr {
|
||||
compatible = "fsl,qman-pfdr";
|
||||
alloc-ranges = <0 0 0xf 0xffffffff>;
|
||||
size = <0 0x2000000>;
|
||||
alignment = <0 0x2000000>;
|
||||
};
|
||||
};
|
||||
|
||||
The example below shows a (P4080) QMan CCSR-space node
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
...
|
||||
sysclk: sysclk {
|
||||
...
|
||||
};
|
||||
...
|
||||
platform_pll: platform-pll@c00 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0xc00 0x4>;
|
||||
compatible = "fsl,qoriq-platform-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "platform-pll", "platform-pll-div2";
|
||||
};
|
||||
...
|
||||
};
|
||||
|
||||
crypto@300000 {
|
||||
...
|
||||
fsl,qman = <&qman, 2>;
|
||||
...
|
||||
};
|
||||
|
||||
qman: qman@318000 {
|
||||
compatible = "fsl,qman";
|
||||
reg = <0x318000 0x1000>;
|
||||
interrupts = <16 2 1 3>
|
||||
fsl,liodn = <0x16>;
|
||||
memory-region = <&qman_fqd &qman_pfdr>;
|
||||
clocks = <&platform_pll 1>;
|
||||
};
|
||||
|
||||
fman@400000 {
|
||||
...
|
||||
fsl,qman = <&qman, 0>;
|
||||
...
|
||||
};
|
@ -88,6 +88,7 @@ config PPC
|
||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||
select BINFMT_ELF
|
||||
select ARCH_BINFMT_ELF_RANDOMIZE_PIE
|
||||
select OF
|
||||
select OF_EARLY_FLATTREE
|
||||
select OF_RESERVED_MEM
|
||||
@ -148,6 +149,8 @@ config PPC
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||
select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
|
||||
select NO_BOOTMEM
|
||||
select HAVE_GENERIC_RCU_GUP
|
||||
|
||||
config GENERIC_CSUM
|
||||
def_bool CPU_LITTLE_ENDIAN
|
||||
@ -549,7 +552,7 @@ config PPC_4K_PAGES
|
||||
bool "4k page size"
|
||||
|
||||
config PPC_16K_PAGES
|
||||
bool "16k page size" if 44x
|
||||
bool "16k page size" if 44x || PPC_8xx
|
||||
|
||||
config PPC_64K_PAGES
|
||||
bool "64k page size" if 44x || PPC_STD_MMU_64 || PPC_BOOK3E_64
|
||||
|
@ -193,9 +193,9 @@
|
||||
fsl,liodn-bits = <12>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "fsl/qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,b4-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
reg = <0xe1000 0x1000>;
|
||||
};
|
||||
|
||||
/include/ "fsl/qoriq-dma-0.dtsi"
|
||||
|
@ -152,6 +152,29 @@
|
||||
reg = <0x68>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@2 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2>;
|
||||
|
||||
ina220@40 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@3 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x3>;
|
||||
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -40,31 +40,6 @@
|
||||
compatible = "fsl,ifc-nand";
|
||||
reg = <0x0 0x0 0x4000>;
|
||||
|
||||
partition@0 {
|
||||
/* This location must not be altered */
|
||||
/* 3MB for u-boot Bootloader Image */
|
||||
reg = <0x0 0x00300000>;
|
||||
label = "NAND U-Boot Image";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@300000 {
|
||||
/* 1MB for DTB Image */
|
||||
reg = <0x00300000 0x00100000>;
|
||||
label = "NAND DTB Image";
|
||||
};
|
||||
|
||||
partition@400000 {
|
||||
/* 8MB for Linux Kernel Image */
|
||||
reg = <0x00400000 0x00800000>;
|
||||
label = "NAND Linux Kernel Image";
|
||||
};
|
||||
|
||||
partition@c00000 {
|
||||
/* Rest space for Root file System Image */
|
||||
reg = <0x00c00000 0x07400000>;
|
||||
label = "NAND RFS Image";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@ -82,31 +57,6 @@
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
||||
/* 512KB for u-boot Bootloader Image */
|
||||
partition@0 {
|
||||
reg = <0x0 0x00080000>;
|
||||
label = "SPI Flash U-Boot Image";
|
||||
read-only;
|
||||
};
|
||||
|
||||
/* 512KB for DTB Image */
|
||||
partition@80000 {
|
||||
reg = <0x00080000 0x00080000>;
|
||||
label = "SPI Flash DTB Image";
|
||||
};
|
||||
|
||||
/* 4MB for Linux Kernel Image */
|
||||
partition@100000 {
|
||||
reg = <0x00100000 0x00400000>;
|
||||
label = "SPI Flash Kernel Image";
|
||||
};
|
||||
|
||||
/*11MB for RFS Image */
|
||||
partition@500000 {
|
||||
reg = <0x00500000 0x00B00000>;
|
||||
label = "SPI Flash RFS Image";
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -80,33 +80,9 @@
|
||||
compatible = "fsl,b4420-device-config", "fsl,qoriq-device-config-2.0";
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -124,33 +124,9 @@
|
||||
compatible = "fsl,b4860-device-config", "fsl,qoriq-device-config-2.0";
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -305,53 +305,9 @@
|
||||
#sleep-cells = <2>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen1.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
|
||||
mux2: mux2@40 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -332,53 +332,9 @@
|
||||
#sleep-cells = <2>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen1.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
|
||||
mux2: mux2@40 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -352,35 +352,9 @@
|
||||
#sleep-cells = <2>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen1.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
|
||||
pll2: pll2@840 {
|
||||
#clock-cells = <1>;
|
||||
@ -398,24 +372,6 @@
|
||||
clock-output-names = "pll3", "pll3-div2";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
|
||||
mux2: mux2@40 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x40 0x4>;
|
||||
|
@ -337,53 +337,9 @@
|
||||
#sleep-cells = <2>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen1.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
};
|
||||
|
||||
rcpm: global-utilities@e2000 {
|
||||
|
@ -297,53 +297,9 @@
|
||||
#sleep-cells = <2>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen1.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
|
||||
mux2: mux2@40 {
|
||||
#clock-cells = <0>;
|
||||
|
85
arch/powerpc/boot/dts/fsl/qoriq-clockgen1.dtsi
Normal file
85
arch/powerpc/boot/dts/fsl/qoriq-clockgen1.dtsi
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* QorIQ clock control device tree stub [ controller @ offset 0xe1000 ]
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,qoriq-clockgen-1.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
clock-frequency = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-1.0", "fixed-clock";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2";
|
||||
};
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2";
|
||||
};
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux0";
|
||||
};
|
||||
mux1: mux1@20 {
|
||||
#clock-cells = <0>;
|
||||
reg = <0x20 0x4>;
|
||||
compatible = "fsl,qoriq-core-mux-1.0";
|
||||
clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
|
||||
clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
|
||||
clock-output-names = "cmux1";
|
||||
};
|
||||
platform_pll: platform-pll@c00 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0xc00 0x4>;
|
||||
compatible = "fsl,qoriq-platform-pll-1.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "platform-pll", "platform-pll-div2";
|
||||
};
|
||||
};
|
68
arch/powerpc/boot/dts/fsl/qoriq-clockgen2.dtsi
Normal file
68
arch/powerpc/boot/dts/fsl/qoriq-clockgen2.dtsi
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* QorIQ clock control device tree stub [ controller @ offset 0xe1000 ]
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0", "fixed-clock";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
platform_pll: platform-pll@c00 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0xc00 0x4>;
|
||||
compatible = "fsl,qoriq-platform-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "platform-pll", "platform-pll-div2";
|
||||
};
|
||||
};
|
@ -281,35 +281,9 @@
|
||||
fsl,liodn-bits = <12>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,t1040-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0";
|
||||
clock-output-names = "sysclk", "fixed-clock";
|
||||
};
|
||||
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -305,34 +305,9 @@
|
||||
fsl,liodn-bits = <12>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,t2080-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0";
|
||||
clock-output-names = "sysclk", "fixed-clock";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
|
||||
mux0: mux0@0 {
|
||||
#clock-cells = <0>;
|
||||
|
@ -368,34 +368,9 @@
|
||||
fsl,liodn-bits = <12>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
ranges = <0x0 0xe1000 0x1000>;
|
||||
reg = <0xe1000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
sysclk: sysclk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fsl,qoriq-sysclk-2.0";
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
pll0: pll0@800 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll0", "pll0-div2", "pll0-div4";
|
||||
};
|
||||
|
||||
pll1: pll1@820 {
|
||||
#clock-cells = <1>;
|
||||
reg = <0x820 0x4>;
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "pll1", "pll1-div2", "pll1-div4";
|
||||
};
|
||||
|
||||
pll2: pll2@840 {
|
||||
#clock-cells = <1>;
|
||||
|
@ -98,6 +98,26 @@
|
||||
reg = <0x68>;
|
||||
interrupts = <0x1 0x1 0 0>;
|
||||
};
|
||||
ina220@40 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@41 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x41>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@44 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x44>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@45 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x45>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
|
@ -98,6 +98,26 @@
|
||||
reg = <0x68>;
|
||||
interrupts = <0x1 0x1 0 0>;
|
||||
};
|
||||
ina220@40 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@41 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x41>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@44 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x44>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@45 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x45>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
|
@ -95,6 +95,26 @@
|
||||
reg = <0x68>;
|
||||
interrupts = <0x1 0x1 0 0>;
|
||||
};
|
||||
ina220@40 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@41 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x41>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@44 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x44>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
ina220@45 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x45>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
|
@ -83,6 +83,13 @@
|
||||
};
|
||||
};
|
||||
|
||||
i2c@118000 {
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@118100 {
|
||||
pca9546@77 {
|
||||
compatible = "nxp,pca9546";
|
||||
|
@ -169,6 +169,17 @@
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@3 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x3>;
|
||||
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -250,9 +250,9 @@
|
||||
fsl,liodn-bits = <12>;
|
||||
};
|
||||
|
||||
clockgen: global-utilities@e1000 {
|
||||
/include/ "fsl/qoriq-clockgen2.dtsi"
|
||||
global-utilities@e1000 {
|
||||
compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0";
|
||||
reg = <0xe1000 0x1000>;
|
||||
};
|
||||
|
||||
/include/ "fsl/qoriq-dma-0.dtsi"
|
||||
|
@ -144,13 +144,24 @@ static char cmdline[BOOT_COMMAND_LINE_SIZE]
|
||||
|
||||
static void prep_cmdline(void *chosen)
|
||||
{
|
||||
unsigned int getline_timeout = 5000;
|
||||
int v;
|
||||
int n;
|
||||
|
||||
/* Wait-for-input time */
|
||||
n = getprop(chosen, "linux,cmdline-timeout", &v, sizeof(v));
|
||||
if (n == sizeof(v))
|
||||
getline_timeout = v;
|
||||
|
||||
if (cmdline[0] == '\0')
|
||||
getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1);
|
||||
|
||||
printf("\n\rLinux/PowerPC load: %s", cmdline);
|
||||
|
||||
/* If possible, edit the command line */
|
||||
if (console_ops.edit_cmdline)
|
||||
console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE);
|
||||
if (console_ops.edit_cmdline && getline_timeout)
|
||||
console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE, getline_timeout);
|
||||
|
||||
printf("\n\r");
|
||||
|
||||
/* Put the command line back into the devtree for the kernel */
|
||||
|
@ -58,7 +58,7 @@ extern struct dt_ops dt_ops;
|
||||
struct console_ops {
|
||||
int (*open)(void);
|
||||
void (*write)(const char *buf, int len);
|
||||
void (*edit_cmdline)(char *buf, int len);
|
||||
void (*edit_cmdline)(char *buf, int len, unsigned int getline_timeout);
|
||||
void (*close)(void);
|
||||
void *data;
|
||||
};
|
||||
|
@ -33,7 +33,7 @@ static void serial_write(const char *buf, int len)
|
||||
scdp->putc(*buf++);
|
||||
}
|
||||
|
||||
static void serial_edit_cmdline(char *buf, int len)
|
||||
static void serial_edit_cmdline(char *buf, int len, unsigned int timeout)
|
||||
{
|
||||
int timer = 0, count;
|
||||
char ch, *cp;
|
||||
@ -44,7 +44,7 @@ static void serial_edit_cmdline(char *buf, int len)
|
||||
cp = &buf[count];
|
||||
count++;
|
||||
|
||||
while (timer++ < 5*1000) {
|
||||
do {
|
||||
if (scdp->tstc()) {
|
||||
while (((ch = scdp->getc()) != '\n') && (ch != '\r')) {
|
||||
/* Test for backspace/delete */
|
||||
@ -70,7 +70,7 @@ static void serial_edit_cmdline(char *buf, int len)
|
||||
break; /* Exit 'timer' loop */
|
||||
}
|
||||
udelay(1000); /* 1 msec */
|
||||
}
|
||||
} while (timer++ < timeout);
|
||||
*cp = 0;
|
||||
}
|
||||
|
||||
|
@ -144,6 +144,7 @@ CONFIG_RTC_DRV_DS1374=y
|
||||
CONFIG_RTC_DRV_DS3232=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_VIRT_DRIVERS=y
|
||||
CONFIG_FSL_HV_MANAGER=y
|
||||
CONFIG_EXT2_FS=y
|
||||
|
@ -118,6 +118,7 @@ CONFIG_FSL_DMA=y
|
||||
CONFIG_VIRT_DRIVERS=y
|
||||
CONFIG_FSL_HV_MANAGER=y
|
||||
CONFIG_FSL_CORENET_CF=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_ISO9660_FS=m
|
||||
|
@ -215,6 +215,7 @@ CONFIG_RTC_DRV_DS3232=y
|
||||
CONFIG_RTC_DRV_CMOS=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_FSL_DMA=y
|
||||
CONFIG_MEMORY=y
|
||||
# CONFIG_NET_DMA is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
|
@ -216,6 +216,7 @@ CONFIG_RTC_DRV_DS3232=y
|
||||
CONFIG_RTC_DRV_CMOS=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_FSL_DMA=y
|
||||
CONFIG_MEMORY=y
|
||||
# CONFIG_NET_DMA is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
|
@ -14,9 +14,9 @@
|
||||
*
|
||||
* The bitop functions are defined to work on unsigned longs, so for a
|
||||
* ppc64 system the bits end up numbered:
|
||||
* |63..............0|127............64|191...........128|255...........196|
|
||||
* |63..............0|127............64|191...........128|255...........192|
|
||||
* and on ppc32:
|
||||
* |31.....0|63....31|95....64|127...96|159..128|191..160|223..192|255..224|
|
||||
* |31.....0|63....32|95....64|127...96|159..128|191..160|223..192|255..224|
|
||||
*
|
||||
* There are a few little-endian macros used mostly for filesystem
|
||||
* bitmaps, these work on similar bit arrays layouts, but
|
||||
@ -213,7 +213,7 @@ static __inline__ unsigned long ffz(unsigned long x)
|
||||
return __ilog2(x & -x);
|
||||
}
|
||||
|
||||
static __inline__ int __ffs(unsigned long x)
|
||||
static __inline__ unsigned long __ffs(unsigned long x)
|
||||
{
|
||||
return __ilog2(x & -x);
|
||||
}
|
||||
|
@ -448,13 +448,9 @@ extern const char *powerpc_base_platform;
|
||||
CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_DABRX)
|
||||
#define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2)
|
||||
|
||||
#define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \
|
||||
CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | \
|
||||
CPU_FTR_ICSWX | CPU_FTR_DABRX )
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_POSSIBLE (CPU_FTRS_E6500 | CPU_FTRS_E5500 | CPU_FTRS_A2)
|
||||
#define CPU_FTRS_POSSIBLE (CPU_FTRS_E6500 | CPU_FTRS_E5500)
|
||||
#else
|
||||
#define CPU_FTRS_POSSIBLE \
|
||||
(CPU_FTRS_POWER4 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | \
|
||||
@ -505,13 +501,13 @@ enum {
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_ALWAYS (CPU_FTRS_E6500 & CPU_FTRS_E5500 & CPU_FTRS_A2)
|
||||
#define CPU_FTRS_ALWAYS (CPU_FTRS_E6500 & CPU_FTRS_E5500)
|
||||
#else
|
||||
#define CPU_FTRS_ALWAYS \
|
||||
(CPU_FTRS_POWER4 & CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & \
|
||||
CPU_FTRS_POWER6 & CPU_FTRS_POWER7 & CPU_FTRS_CELL & \
|
||||
CPU_FTRS_PA6T & CPU_FTRS_POWER8 & CPU_FTRS_POWER8E & \
|
||||
CPU_FTRS_POWER8_DD1 & CPU_FTRS_POSSIBLE)
|
||||
CPU_FTRS_POWER8_DD1 & ~CPU_FTR_HVMODE & CPU_FTRS_POSSIBLE)
|
||||
#endif
|
||||
#else
|
||||
enum {
|
||||
|
@ -39,6 +39,7 @@ struct device_node;
|
||||
#define EEH_PROBE_MODE_DEV 0x04 /* From PCI device */
|
||||
#define EEH_PROBE_MODE_DEVTREE 0x08 /* From device tree */
|
||||
#define EEH_ENABLE_IO_FOR_LOG 0x10 /* Enable IO for log */
|
||||
#define EEH_EARLY_DUMP_LOG 0x20 /* Dump log immediately */
|
||||
|
||||
/*
|
||||
* Delay for PE reset, all in ms
|
||||
@ -72,6 +73,7 @@ struct device_node;
|
||||
#define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */
|
||||
#define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */
|
||||
#define EEH_PE_CFG_BLOCKED (1 << 2) /* Block config access */
|
||||
#define EEH_PE_RESET (1 << 3) /* PE reset in progress */
|
||||
|
||||
#define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */
|
||||
#define EEH_PE_CFG_RESTRICTED (1 << 9) /* Block config on error */
|
||||
|
@ -28,8 +28,7 @@
|
||||
the loader. We need to make sure that it is out of the way of the program
|
||||
that it will "exec", and that there is sufficient room for the brk. */
|
||||
|
||||
extern unsigned long randomize_et_dyn(unsigned long base);
|
||||
#define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000))
|
||||
#define ELF_ET_DYN_BASE 0x20000000
|
||||
|
||||
#define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0)
|
||||
|
||||
|
@ -68,7 +68,10 @@ struct ccsr_guts {
|
||||
u8 res0b4[0xc0 - 0xb4];
|
||||
__be32 iovselsr; /* 0x.00c0 - I/O voltage select status register
|
||||
Called 'elbcvselcr' on 86xx SOCs */
|
||||
u8 res0c4[0x224 - 0xc4];
|
||||
u8 res0c4[0x100 - 0xc4];
|
||||
__be32 rcwsr[16]; /* 0x.0100 - Reset Control Word Status registers
|
||||
There are 16 registers */
|
||||
u8 res140[0x224 - 0x140];
|
||||
__be32 iodelay1; /* 0x.0224 - IO delay control register 1 */
|
||||
__be32 iodelay2; /* 0x.0228 - IO delay control register 2 */
|
||||
u8 res22c[0x604 - 0x22c];
|
||||
|
@ -21,7 +21,12 @@ DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);
|
||||
|
||||
#define __ARCH_IRQ_STAT
|
||||
|
||||
#define local_softirq_pending() __get_cpu_var(irq_stat).__softirq_pending
|
||||
#define local_softirq_pending() __this_cpu_read(irq_stat.__softirq_pending)
|
||||
|
||||
#define __ARCH_SET_SOFTIRQ_PENDING
|
||||
|
||||
#define set_softirq_pending(x) __this_cpu_write(irq_stat.__softirq_pending, (x))
|
||||
#define or_softirq_pending(x) __this_cpu_or(irq_stat.__softirq_pending, (x))
|
||||
|
||||
static inline void ack_bad_irq(unsigned int irq)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ static inline unsigned int hugepd_shift(hugepd_t hpd)
|
||||
#endif /* CONFIG_PPC_BOOK3S_64 */
|
||||
|
||||
|
||||
static inline pte_t *hugepte_offset(hugepd_t *hpdp, unsigned long addr,
|
||||
static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
|
||||
unsigned pdshift)
|
||||
{
|
||||
/*
|
||||
@ -58,9 +58,9 @@ static inline pte_t *hugepte_offset(hugepd_t *hpdp, unsigned long addr,
|
||||
*/
|
||||
unsigned long idx = 0;
|
||||
|
||||
pte_t *dir = hugepd_page(*hpdp);
|
||||
pte_t *dir = hugepd_page(hpd);
|
||||
#ifndef CONFIG_PPC_FSL_BOOK3E
|
||||
idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(*hpdp);
|
||||
idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
|
||||
#endif
|
||||
|
||||
return dir + idx;
|
||||
@ -193,7 +193,7 @@ static inline void flush_hugetlb_page(struct vm_area_struct *vma,
|
||||
}
|
||||
|
||||
#define hugepd_shift(x) 0
|
||||
static inline pte_t *hugepte_offset(hugepd_t *hpdp, unsigned long addr,
|
||||
static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
|
||||
unsigned pdshift)
|
||||
{
|
||||
return 0;
|
||||
|
@ -855,9 +855,6 @@ static inline void * bus_to_virt(unsigned long address)
|
||||
|
||||
#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
|
||||
|
||||
void __iomem *devm_ioremap_prot(struct device *dev, resource_size_t offset,
|
||||
size_t size, unsigned long flags);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_IO_H */
|
||||
|
@ -42,7 +42,7 @@ struct machdep_calls {
|
||||
unsigned long newpp,
|
||||
unsigned long vpn,
|
||||
int bpsize, int apsize,
|
||||
int ssize, int local);
|
||||
int ssize, unsigned long flags);
|
||||
void (*hpte_updateboltedpp)(unsigned long newpp,
|
||||
unsigned long ea,
|
||||
int psize, int ssize);
|
||||
@ -60,7 +60,7 @@ struct machdep_calls {
|
||||
void (*hugepage_invalidate)(unsigned long vsid,
|
||||
unsigned long addr,
|
||||
unsigned char *hpte_slot_array,
|
||||
int psize, int ssize);
|
||||
int psize, int ssize, int local);
|
||||
/* special for kexec, to be called in real mode, linear mapping is
|
||||
* destroyed as well */
|
||||
void (*hpte_clear_all)(void);
|
||||
@ -142,7 +142,6 @@ struct machdep_calls {
|
||||
#endif
|
||||
|
||||
void (*restart)(char *cmd);
|
||||
void (*power_off)(void);
|
||||
void (*halt)(void);
|
||||
void (*panic)(char *str);
|
||||
void (*cpu_die)(void);
|
||||
@ -292,10 +291,6 @@ struct machdep_calls {
|
||||
#ifdef CONFIG_ARCH_RANDOM
|
||||
int (*get_random_long)(unsigned long *v);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||
int (*remove_memory)(u64, u64);
|
||||
#endif
|
||||
};
|
||||
|
||||
extern void e500_idle(void);
|
||||
@ -343,16 +338,6 @@ extern sys_ctrler_t sys_ctrler;
|
||||
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
|
||||
|
||||
/* Functions to produce codes on the leds.
|
||||
* The SRC code should be unique for the message category and should
|
||||
* be limited to the lower 24 bits (the upper 8 are set by these funcs),
|
||||
* and (for boot & dump) should be sorted numerically in the order
|
||||
* the events occur.
|
||||
*/
|
||||
/* Print a boot progress message. */
|
||||
void ppc64_boot_msg(unsigned int src, const char *msg);
|
||||
|
||||
static inline void log_error(char *buf, unsigned int err_type, int fatal)
|
||||
{
|
||||
if (ppc_md.log_error)
|
||||
|
@ -56,6 +56,7 @@
|
||||
* additional information from the MI_EPN, and MI_TWC registers.
|
||||
*/
|
||||
#define SPRN_MI_RPN 790
|
||||
#define MI_SPS16K 0x00000008 /* Small page size (0 = 4k, 1 = 16k) */
|
||||
|
||||
/* Define an RPN value for mapping kernel memory to large virtual
|
||||
* pages for boot initialization. This has real page number of 0,
|
||||
@ -129,6 +130,7 @@
|
||||
* additional information from the MD_EPN, and MD_TWC registers.
|
||||
*/
|
||||
#define SPRN_MD_RPN 798
|
||||
#define MD_SPS16K 0x00000008 /* Small page size (0 = 4k, 1 = 16k) */
|
||||
|
||||
/* This is a temporary storage register that could be used to save
|
||||
* a processor working register during a tablewalk.
|
||||
|
@ -316,27 +316,33 @@ static inline unsigned long hpt_hash(unsigned long vpn,
|
||||
return hash & 0x7fffffffffUL;
|
||||
}
|
||||
|
||||
#define HPTE_LOCAL_UPDATE 0x1
|
||||
#define HPTE_NOHPTE_UPDATE 0x2
|
||||
|
||||
extern int __hash_page_4K(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, pte_t *ptep, unsigned long trap,
|
||||
unsigned int local, int ssize, int subpage_prot);
|
||||
unsigned long flags, int ssize, int subpage_prot);
|
||||
extern int __hash_page_64K(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, pte_t *ptep, unsigned long trap,
|
||||
unsigned int local, int ssize);
|
||||
unsigned long flags, int ssize);
|
||||
struct mm_struct;
|
||||
unsigned int hash_page_do_lazy_icache(unsigned int pp, pte_t pte, int trap);
|
||||
extern int hash_page_mm(struct mm_struct *mm, unsigned long ea, unsigned long access, unsigned long trap);
|
||||
extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap);
|
||||
extern int hash_page_mm(struct mm_struct *mm, unsigned long ea,
|
||||
unsigned long access, unsigned long trap,
|
||||
unsigned long flags);
|
||||
extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap,
|
||||
unsigned long dsisr);
|
||||
int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
||||
pte_t *ptep, unsigned long trap, int local, int ssize,
|
||||
unsigned int shift, unsigned int mmu_psize);
|
||||
pte_t *ptep, unsigned long trap, unsigned long flags,
|
||||
int ssize, unsigned int shift, unsigned int mmu_psize);
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
extern int __hash_page_thp(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, pmd_t *pmdp, unsigned long trap,
|
||||
int local, int ssize, unsigned int psize);
|
||||
unsigned long flags, int ssize, unsigned int psize);
|
||||
#else
|
||||
static inline int __hash_page_thp(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, pmd_t *pmdp,
|
||||
unsigned long trap, int local,
|
||||
unsigned long trap, unsigned long flags,
|
||||
int ssize, unsigned int psize)
|
||||
{
|
||||
BUG();
|
||||
|
@ -154,6 +154,10 @@ struct opal_sg_list {
|
||||
#define OPAL_HANDLE_HMI 98
|
||||
#define OPAL_REGISTER_DUMP_REGION 101
|
||||
#define OPAL_UNREGISTER_DUMP_REGION 102
|
||||
#define OPAL_WRITE_TPO 103
|
||||
#define OPAL_READ_TPO 104
|
||||
#define OPAL_IPMI_SEND 107
|
||||
#define OPAL_IPMI_RECV 108
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@ -284,62 +288,6 @@ enum OpalMessageType {
|
||||
OPAL_MSG_TYPE_MAX,
|
||||
};
|
||||
|
||||
/* Machine check related definitions */
|
||||
enum OpalMCE_Version {
|
||||
OpalMCE_V1 = 1,
|
||||
};
|
||||
|
||||
enum OpalMCE_Severity {
|
||||
OpalMCE_SEV_NO_ERROR = 0,
|
||||
OpalMCE_SEV_WARNING = 1,
|
||||
OpalMCE_SEV_ERROR_SYNC = 2,
|
||||
OpalMCE_SEV_FATAL = 3,
|
||||
};
|
||||
|
||||
enum OpalMCE_Disposition {
|
||||
OpalMCE_DISPOSITION_RECOVERED = 0,
|
||||
OpalMCE_DISPOSITION_NOT_RECOVERED = 1,
|
||||
};
|
||||
|
||||
enum OpalMCE_Initiator {
|
||||
OpalMCE_INITIATOR_UNKNOWN = 0,
|
||||
OpalMCE_INITIATOR_CPU = 1,
|
||||
};
|
||||
|
||||
enum OpalMCE_ErrorType {
|
||||
OpalMCE_ERROR_TYPE_UNKNOWN = 0,
|
||||
OpalMCE_ERROR_TYPE_UE = 1,
|
||||
OpalMCE_ERROR_TYPE_SLB = 2,
|
||||
OpalMCE_ERROR_TYPE_ERAT = 3,
|
||||
OpalMCE_ERROR_TYPE_TLB = 4,
|
||||
};
|
||||
|
||||
enum OpalMCE_UeErrorType {
|
||||
OpalMCE_UE_ERROR_INDETERMINATE = 0,
|
||||
OpalMCE_UE_ERROR_IFETCH = 1,
|
||||
OpalMCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH = 2,
|
||||
OpalMCE_UE_ERROR_LOAD_STORE = 3,
|
||||
OpalMCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 4,
|
||||
};
|
||||
|
||||
enum OpalMCE_SlbErrorType {
|
||||
OpalMCE_SLB_ERROR_INDETERMINATE = 0,
|
||||
OpalMCE_SLB_ERROR_PARITY = 1,
|
||||
OpalMCE_SLB_ERROR_MULTIHIT = 2,
|
||||
};
|
||||
|
||||
enum OpalMCE_EratErrorType {
|
||||
OpalMCE_ERAT_ERROR_INDETERMINATE = 0,
|
||||
OpalMCE_ERAT_ERROR_PARITY = 1,
|
||||
OpalMCE_ERAT_ERROR_MULTIHIT = 2,
|
||||
};
|
||||
|
||||
enum OpalMCE_TlbErrorType {
|
||||
OpalMCE_TLB_ERROR_INDETERMINATE = 0,
|
||||
OpalMCE_TLB_ERROR_PARITY = 1,
|
||||
OpalMCE_TLB_ERROR_MULTIHIT = 2,
|
||||
};
|
||||
|
||||
enum OpalThreadStatus {
|
||||
OPAL_THREAD_INACTIVE = 0x0,
|
||||
OPAL_THREAD_STARTED = 0x1,
|
||||
@ -452,52 +400,15 @@ struct opal_msg {
|
||||
__be64 params[8];
|
||||
};
|
||||
|
||||
struct opal_machine_check_event {
|
||||
enum OpalMCE_Version version:8; /* 0x00 */
|
||||
uint8_t in_use; /* 0x01 */
|
||||
enum OpalMCE_Severity severity:8; /* 0x02 */
|
||||
enum OpalMCE_Initiator initiator:8; /* 0x03 */
|
||||
enum OpalMCE_ErrorType error_type:8; /* 0x04 */
|
||||
enum OpalMCE_Disposition disposition:8; /* 0x05 */
|
||||
uint8_t reserved_1[2]; /* 0x06 */
|
||||
uint64_t gpr3; /* 0x08 */
|
||||
uint64_t srr0; /* 0x10 */
|
||||
uint64_t srr1; /* 0x18 */
|
||||
union { /* 0x20 */
|
||||
struct {
|
||||
enum OpalMCE_UeErrorType ue_error_type:8;
|
||||
uint8_t effective_address_provided;
|
||||
uint8_t physical_address_provided;
|
||||
uint8_t reserved_1[5];
|
||||
uint64_t effective_address;
|
||||
uint64_t physical_address;
|
||||
uint8_t reserved_2[8];
|
||||
} ue_error;
|
||||
enum {
|
||||
OPAL_IPMI_MSG_FORMAT_VERSION_1 = 1,
|
||||
};
|
||||
|
||||
struct {
|
||||
enum OpalMCE_SlbErrorType slb_error_type:8;
|
||||
uint8_t effective_address_provided;
|
||||
uint8_t reserved_1[6];
|
||||
uint64_t effective_address;
|
||||
uint8_t reserved_2[16];
|
||||
} slb_error;
|
||||
|
||||
struct {
|
||||
enum OpalMCE_EratErrorType erat_error_type:8;
|
||||
uint8_t effective_address_provided;
|
||||
uint8_t reserved_1[6];
|
||||
uint64_t effective_address;
|
||||
uint8_t reserved_2[16];
|
||||
} erat_error;
|
||||
|
||||
struct {
|
||||
enum OpalMCE_TlbErrorType tlb_error_type:8;
|
||||
uint8_t effective_address_provided;
|
||||
uint8_t reserved_1[6];
|
||||
uint64_t effective_address;
|
||||
uint8_t reserved_2[16];
|
||||
} tlb_error;
|
||||
} u;
|
||||
struct opal_ipmi_msg {
|
||||
uint8_t version;
|
||||
uint8_t netfn;
|
||||
uint8_t cmd;
|
||||
uint8_t data[];
|
||||
};
|
||||
|
||||
/* FSP memory errors handling */
|
||||
@ -819,6 +730,9 @@ int64_t opal_rtc_read(__be32 *year_month_day,
|
||||
__be64 *hour_minute_second_millisecond);
|
||||
int64_t opal_rtc_write(uint32_t year_month_day,
|
||||
uint64_t hour_minute_second_millisecond);
|
||||
int64_t opal_tpo_read(uint64_t token, __be32 *year_mon_day, __be32 *hour_min);
|
||||
int64_t opal_tpo_write(uint64_t token, uint32_t year_mon_day,
|
||||
uint32_t hour_min);
|
||||
int64_t opal_cec_power_down(uint64_t request);
|
||||
int64_t opal_cec_reboot(void);
|
||||
int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
|
||||
@ -963,6 +877,10 @@ int64_t opal_handle_hmi(void);
|
||||
int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end);
|
||||
int64_t opal_unregister_dump_region(uint32_t id);
|
||||
int64_t opal_pci_set_phb_cxl_mode(uint64_t phb_id, uint64_t mode, uint64_t pe_number);
|
||||
int64_t opal_ipmi_send(uint64_t interface, struct opal_ipmi_msg *msg,
|
||||
uint64_t msg_len);
|
||||
int64_t opal_ipmi_recv(uint64_t interface, struct opal_ipmi_msg *msg,
|
||||
uint64_t *msg_len);
|
||||
|
||||
/* Internal functions */
|
||||
extern int early_init_dt_scan_opal(unsigned long node, const char *uname,
|
||||
@ -992,8 +910,6 @@ extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg);
|
||||
extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data);
|
||||
|
||||
struct rtc_time;
|
||||
extern int opal_set_rtc_time(struct rtc_time *tm);
|
||||
extern void opal_get_rtc_time(struct rtc_time *tm);
|
||||
extern unsigned long opal_get_boot_time(void);
|
||||
extern void opal_nvram_init(void);
|
||||
extern void opal_flash_init(void);
|
||||
|
@ -42,7 +42,6 @@ extern unsigned int debug_smp_processor_id(void); /* from linux/smp.h */
|
||||
#define get_slb_shadow() (get_paca()->slb_shadow_ptr)
|
||||
|
||||
struct task_struct;
|
||||
struct opal_machine_check_event;
|
||||
|
||||
/*
|
||||
* Defines the layout of the paca.
|
||||
@ -153,12 +152,6 @@ struct paca_struct {
|
||||
u64 tm_scratch; /* TM scratch area for reclaim */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
/* Pointer to OPAL machine check event structure set by the
|
||||
* early exception handler for use by high level C handler
|
||||
*/
|
||||
struct opal_machine_check_event *opal_mc_evt;
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
/* Exclusive emergency stack pointer for machine check exception. */
|
||||
void *mc_emergency_sp;
|
||||
|
@ -379,12 +379,14 @@ static inline int hugepd_ok(hugepd_t hpd)
|
||||
}
|
||||
#endif
|
||||
|
||||
#define is_hugepd(pdep) (hugepd_ok(*((hugepd_t *)(pdep))))
|
||||
#define is_hugepd(hpd) (hugepd_ok(hpd))
|
||||
#define pgd_huge pgd_huge
|
||||
int pgd_huge(pgd_t pgd);
|
||||
#else /* CONFIG_HUGETLB_PAGE */
|
||||
#define is_hugepd(pdep) 0
|
||||
#define pgd_huge(pgd) 0
|
||||
#endif /* CONFIG_HUGETLB_PAGE */
|
||||
#define __hugepd(x) ((hugepd_t) { (x) })
|
||||
|
||||
struct page;
|
||||
extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
|
||||
|
@ -170,6 +170,25 @@ static inline unsigned long pte_update(pte_t *p,
|
||||
#ifdef PTE_ATOMIC_UPDATES
|
||||
unsigned long old, tmp;
|
||||
|
||||
#ifdef CONFIG_PPC_8xx
|
||||
unsigned long tmp2;
|
||||
|
||||
__asm__ __volatile__("\
|
||||
1: lwarx %0,0,%4\n\
|
||||
andc %1,%0,%5\n\
|
||||
or %1,%1,%6\n\
|
||||
/* 0x200 == Extended encoding, bit 22 */ \
|
||||
/* Bit 22 has to be 1 if neither _PAGE_USER nor _PAGE_RW are set */ \
|
||||
rlwimi %1,%1,32-2,0x200\n /* get _PAGE_USER */ \
|
||||
rlwinm %3,%1,32-1,0x200\n /* get _PAGE_RW */ \
|
||||
or %1,%3,%1\n\
|
||||
xori %1,%1,0x200\n"
|
||||
" stwcx. %1,0,%4\n\
|
||||
bne- 1b"
|
||||
: "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2)
|
||||
: "r" (p), "r" (clr), "r" (set), "m" (*p)
|
||||
: "cc" );
|
||||
#else /* CONFIG_PPC_8xx */
|
||||
__asm__ __volatile__("\
|
||||
1: lwarx %0,0,%3\n\
|
||||
andc %1,%0,%4\n\
|
||||
@ -180,6 +199,7 @@ static inline unsigned long pte_update(pte_t *p,
|
||||
: "=&r" (old), "=&r" (tmp), "=m" (*p)
|
||||
: "r" (p), "r" (clr), "r" (set), "m" (*p)
|
||||
: "cc" );
|
||||
#endif /* CONFIG_PPC_8xx */
|
||||
#else /* PTE_ATOMIC_UPDATES */
|
||||
unsigned long old = pte_val(*p);
|
||||
*p = __pte((old & ~clr) | set);
|
||||
|
@ -57,7 +57,21 @@
|
||||
#define pgd_present(pgd) (pgd_val(pgd) != 0)
|
||||
#define pgd_clear(pgdp) (pgd_val(*(pgdp)) = 0)
|
||||
#define pgd_page_vaddr(pgd) (pgd_val(pgd) & ~PGD_MASKED_BITS)
|
||||
#define pgd_page(pgd) virt_to_page(pgd_page_vaddr(pgd))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static inline pte_t pgd_pte(pgd_t pgd)
|
||||
{
|
||||
return __pte(pgd_val(pgd));
|
||||
}
|
||||
|
||||
static inline pgd_t pte_pgd(pte_t pte)
|
||||
{
|
||||
return __pgd(pte_val(pte));
|
||||
}
|
||||
extern struct page *pgd_page(pgd_t pgd);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#define pud_offset(pgdp, addr) \
|
||||
(((pud_t *) pgd_page_vaddr(*(pgdp))) + \
|
||||
|
@ -38,4 +38,7 @@
|
||||
/* Bits to mask out from a PGD/PUD to get to the PMD page */
|
||||
#define PUD_MASKED_BITS 0x1ff
|
||||
|
||||
#define pgd_pte(pgd) (pud_pte(((pud_t){ pgd })))
|
||||
#define pte_pgd(pte) ((pgd_t)pte_pud(pte))
|
||||
|
||||
#endif /* _ASM_POWERPC_PGTABLE_PPC64_64K_H */
|
||||
|
@ -152,7 +152,7 @@
|
||||
#define pmd_none(pmd) (!pmd_val(pmd))
|
||||
#define pmd_bad(pmd) (!is_kernel_addr(pmd_val(pmd)) \
|
||||
|| (pmd_val(pmd) & PMD_BAD_BITS))
|
||||
#define pmd_present(pmd) (pmd_val(pmd) != 0)
|
||||
#define pmd_present(pmd) (!pmd_none(pmd))
|
||||
#define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0)
|
||||
#define pmd_page_vaddr(pmd) (pmd_val(pmd) & ~PMD_MASKED_BITS)
|
||||
extern struct page *pmd_page(pmd_t pmd);
|
||||
@ -164,9 +164,21 @@ extern struct page *pmd_page(pmd_t pmd);
|
||||
#define pud_present(pud) (pud_val(pud) != 0)
|
||||
#define pud_clear(pudp) (pud_val(*(pudp)) = 0)
|
||||
#define pud_page_vaddr(pud) (pud_val(pud) & ~PUD_MASKED_BITS)
|
||||
#define pud_page(pud) virt_to_page(pud_page_vaddr(pud))
|
||||
|
||||
extern struct page *pud_page(pud_t pud);
|
||||
|
||||
static inline pte_t pud_pte(pud_t pud)
|
||||
{
|
||||
return __pte(pud_val(pud));
|
||||
}
|
||||
|
||||
static inline pud_t pte_pud(pte_t pte)
|
||||
{
|
||||
return __pud(pte_val(pte));
|
||||
}
|
||||
#define pud_write(pud) pte_write(pud_pte(pud))
|
||||
#define pgd_set(pgdp, pudp) ({pgd_val(*(pgdp)) = (unsigned long)(pudp);})
|
||||
#define pgd_write(pgd) pte_write(pgd_pte(pgd))
|
||||
|
||||
/*
|
||||
* Find an entry in a page-table-directory. We combine the address region
|
||||
@ -422,7 +434,22 @@ extern void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||
pmd_t *pmdp, pmd_t pmd);
|
||||
extern void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr,
|
||||
pmd_t *pmd);
|
||||
|
||||
/*
|
||||
*
|
||||
* For core kernel code by design pmd_trans_huge is never run on any hugetlbfs
|
||||
* page. The hugetlbfs page table walking and mangling paths are totally
|
||||
* separated form the core VM paths and they're differentiated by
|
||||
* VM_HUGETLB being set on vm_flags well before any pmd_trans_huge could run.
|
||||
*
|
||||
* pmd_trans_huge() is defined as false at build time if
|
||||
* CONFIG_TRANSPARENT_HUGEPAGE=n to optimize away code blocks at build
|
||||
* time in such case.
|
||||
*
|
||||
* For ppc64 we need to differntiate from explicit hugepages from THP, because
|
||||
* for THP we also track the subpage details at the pmd level. We don't do
|
||||
* that for explicit huge pages.
|
||||
*
|
||||
*/
|
||||
static inline int pmd_trans_huge(pmd_t pmd)
|
||||
{
|
||||
/*
|
||||
@ -431,16 +458,6 @@ static inline int pmd_trans_huge(pmd_t pmd)
|
||||
return (pmd_val(pmd) & 0x3) && (pmd_val(pmd) & _PAGE_THP_HUGE);
|
||||
}
|
||||
|
||||
static inline int pmd_large(pmd_t pmd)
|
||||
{
|
||||
/*
|
||||
* leaf pte for huge page, bottom two bits != 00
|
||||
*/
|
||||
if (pmd_trans_huge(pmd))
|
||||
return pmd_val(pmd) & _PAGE_PRESENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int pmd_trans_splitting(pmd_t pmd)
|
||||
{
|
||||
if (pmd_trans_huge(pmd))
|
||||
@ -451,6 +468,14 @@ static inline int pmd_trans_splitting(pmd_t pmd)
|
||||
extern int has_transparent_hugepage(void);
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
|
||||
static inline int pmd_large(pmd_t pmd)
|
||||
{
|
||||
/*
|
||||
* leaf pte for huge page, bottom two bits != 00
|
||||
*/
|
||||
return ((pmd_val(pmd) & 0x3) != 0x0);
|
||||
}
|
||||
|
||||
static inline pte_t pmd_pte(pmd_t pmd)
|
||||
{
|
||||
return __pte(pmd_val(pmd));
|
||||
@ -576,6 +601,5 @@ static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _ASM_POWERPC_PGTABLE_PPC64_H_ */
|
||||
|
@ -274,11 +274,9 @@ extern void paging_init(void);
|
||||
*/
|
||||
extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t *);
|
||||
|
||||
extern int gup_hugepd(hugepd_t *hugepd, unsigned pdshift, unsigned long addr,
|
||||
unsigned long end, int write, struct page **pages, int *nr);
|
||||
|
||||
extern int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
|
||||
unsigned long end, int write, struct page **pages, int *nr);
|
||||
unsigned long end, int write,
|
||||
struct page **pages, int *nr);
|
||||
#ifndef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
#define pmd_large(pmd) 0
|
||||
#define has_transparent_hugepage() 0
|
||||
|
@ -451,7 +451,7 @@ extern unsigned long cpuidle_disable;
|
||||
enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
|
||||
|
||||
extern int powersave_nap; /* set if nap mode can be used in idle loop */
|
||||
extern void power7_nap(int check_irq);
|
||||
extern unsigned long power7_nap(int check_irq);
|
||||
extern void power7_sleep(void);
|
||||
extern void flush_instruction_cache(void);
|
||||
extern void hard_reset_now(void);
|
||||
|
@ -48,19 +48,22 @@
|
||||
*/
|
||||
#define _PAGE_RW 0x0400 /* lsb PP bits, inverted in HW */
|
||||
#define _PAGE_USER 0x0800 /* msb PP bits */
|
||||
/* set when neither _PAGE_USER nor _PAGE_RW are set */
|
||||
#define _PAGE_KNLRO 0x0200
|
||||
|
||||
#define _PMD_PRESENT 0x0001
|
||||
#define _PMD_BAD 0x0ff0
|
||||
#define _PMD_PAGE_MASK 0x000c
|
||||
#define _PMD_PAGE_8M 0x000c
|
||||
|
||||
#define _PTE_NONE_MASK _PAGE_ACCESSED
|
||||
#define _PTE_NONE_MASK _PAGE_KNLRO
|
||||
|
||||
/* Until my rework is finished, 8xx still needs atomic PTE updates */
|
||||
#define PTE_ATOMIC_UPDATES 1
|
||||
|
||||
/* We need to add _PAGE_SHARED to kernel pages */
|
||||
#define _PAGE_KERNEL_RO (_PAGE_SHARED)
|
||||
#define _PAGE_KERNEL_RO (_PAGE_SHARED | _PAGE_KNLRO)
|
||||
#define _PAGE_KERNEL_ROX (_PAGE_EXEC | _PAGE_KNLRO)
|
||||
#define _PAGE_KERNEL_RW (_PAGE_DIRTY | _PAGE_RW | _PAGE_HWWRITE)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -8,7 +8,6 @@ extern void ppc_printk_progress(char *s, unsigned short hex);
|
||||
|
||||
extern unsigned int rtas_data;
|
||||
extern int mem_init_done; /* set on boot once kmalloc can be called */
|
||||
extern int init_bootmem_done; /* set once bootmem is available */
|
||||
extern unsigned long long memory_limit;
|
||||
extern unsigned long klimit;
|
||||
extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
|
||||
@ -24,7 +23,7 @@ extern void reloc_got2(unsigned long);
|
||||
#define PTRRELOC(x) ((typeof(x)) add_reloc_offset((unsigned long)(x)))
|
||||
|
||||
void check_for_initrd(void);
|
||||
void do_init_bootmem(void);
|
||||
void initmem_init(void);
|
||||
void setup_panic(void);
|
||||
#define ARCH_PANIC_TIMEOUT 180
|
||||
|
||||
|
@ -71,13 +71,12 @@ struct thread_info {
|
||||
#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
|
||||
|
||||
/* how to get the thread information struct from C */
|
||||
register unsigned long __current_r1 asm("r1");
|
||||
static inline struct thread_info *current_thread_info(void)
|
||||
{
|
||||
register unsigned long sp asm("r1");
|
||||
|
||||
/* gcc4, at least, is smart enough to turn this into a single
|
||||
* rlwinm for ppc32 and clrrdi for ppc64 */
|
||||
return (struct thread_info *)(sp & ~(THREAD_SIZE-1));
|
||||
return (struct thread_info *)(__current_r1 & ~(THREAD_SIZE-1));
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
@ -107,14 +107,14 @@ extern void __flush_tlb_pending(struct ppc64_tlb_batch *batch);
|
||||
|
||||
static inline void arch_enter_lazy_mmu_mode(void)
|
||||
{
|
||||
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
|
||||
struct ppc64_tlb_batch *batch = this_cpu_ptr(&ppc64_tlb_batch);
|
||||
|
||||
batch->active = 1;
|
||||
}
|
||||
|
||||
static inline void arch_leave_lazy_mmu_mode(void)
|
||||
{
|
||||
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
|
||||
struct ppc64_tlb_batch *batch = this_cpu_ptr(&ppc64_tlb_batch);
|
||||
|
||||
if (batch->index)
|
||||
__flush_tlb_pending(batch);
|
||||
@ -125,9 +125,11 @@ static inline void arch_leave_lazy_mmu_mode(void)
|
||||
|
||||
|
||||
extern void flush_hash_page(unsigned long vpn, real_pte_t pte, int psize,
|
||||
int ssize, int local);
|
||||
int ssize, unsigned long flags);
|
||||
extern void flush_hash_range(unsigned long number, int local);
|
||||
|
||||
extern void flush_hash_hugepage(unsigned long vsid, unsigned long addr,
|
||||
pmd_t *pmdp, unsigned int psize, int ssize,
|
||||
unsigned long flags);
|
||||
|
||||
static inline void local_flush_tlb_mm(struct mm_struct *mm)
|
||||
{
|
||||
|
@ -38,12 +38,10 @@ static inline u16 scr_readw(volatile const u16 *addr)
|
||||
|
||||
#endif /* !CONFIG_VGA_CONSOLE && !CONFIG_MDA_CONSOLE */
|
||||
|
||||
extern unsigned long vgacon_remap_base;
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#define VGA_MAP_MEM(x,s) ((unsigned long) ioremap((x), s))
|
||||
#else
|
||||
#define VGA_MAP_MEM(x,s) (x + vgacon_remap_base)
|
||||
#define VGA_MAP_MEM(x,s) (x)
|
||||
#endif
|
||||
|
||||
#define vga_readb(x) (*(x))
|
||||
|
@ -98,7 +98,7 @@ DECLARE_PER_CPU(struct xics_cppr, xics_cppr);
|
||||
|
||||
static inline void xics_push_cppr(unsigned int vec)
|
||||
{
|
||||
struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr);
|
||||
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
||||
|
||||
if (WARN_ON(os_cppr->index >= MAX_NUM_PRIORITIES - 1))
|
||||
return;
|
||||
@ -111,7 +111,7 @@ static inline void xics_push_cppr(unsigned int vec)
|
||||
|
||||
static inline unsigned char xics_pop_cppr(void)
|
||||
{
|
||||
struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr);
|
||||
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
||||
|
||||
if (WARN_ON(os_cppr->index < 1))
|
||||
return LOWEST_PRIORITY;
|
||||
@ -121,7 +121,7 @@ static inline unsigned char xics_pop_cppr(void)
|
||||
|
||||
static inline void xics_set_base_cppr(unsigned char cppr)
|
||||
{
|
||||
struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr);
|
||||
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
||||
|
||||
/* we only really want to set the priority when there's
|
||||
* just one cppr value on the stack
|
||||
@ -133,7 +133,7 @@ static inline void xics_set_base_cppr(unsigned char cppr)
|
||||
|
||||
static inline unsigned char xics_cppr_top(void)
|
||||
{
|
||||
struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr);
|
||||
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
||||
|
||||
return os_cppr->stack[os_cppr->index];
|
||||
}
|
||||
|
@ -908,7 +908,7 @@ int fix_alignment(struct pt_regs *regs)
|
||||
flush_fp_to_thread(current);
|
||||
}
|
||||
|
||||
if ((nb == 16)) {
|
||||
if (nb == 16) {
|
||||
if (flags & F) {
|
||||
/* Special case for 16-byte FP loads and stores */
|
||||
PPC_WARN_ALIGNMENT(fp_pair, regs);
|
||||
|
@ -726,12 +726,5 @@ int main(void)
|
||||
arch.timing_last_enter.tv32.tbl));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
DEFINE(OPAL_MC_GPR3, offsetof(struct opal_machine_check_event, gpr3));
|
||||
DEFINE(OPAL_MC_SRR0, offsetof(struct opal_machine_check_event, srr0));
|
||||
DEFINE(OPAL_MC_SRR1, offsetof(struct opal_machine_check_event, srr1));
|
||||
DEFINE(PACA_OPAL_MC_EVT, offsetof(struct paca_struct, opal_mc_evt));
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -12,7 +12,6 @@
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <asm/code-patching.h>
|
||||
|
@ -41,7 +41,7 @@ void doorbell_exception(struct pt_regs *regs)
|
||||
|
||||
may_hard_irq_enable();
|
||||
|
||||
__get_cpu_var(irq_stat).doorbell_irqs++;
|
||||
__this_cpu_inc(irq_stat.doorbell_irqs);
|
||||
|
||||
smp_ipi_demux();
|
||||
|
||||
|
@ -143,6 +143,8 @@ static int __init eeh_setup(char *str)
|
||||
{
|
||||
if (!strcmp(str, "off"))
|
||||
eeh_add_flag(EEH_FORCE_DISABLED);
|
||||
else if (!strcmp(str, "early_log"))
|
||||
eeh_add_flag(EEH_EARLY_DUMP_LOG);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -758,30 +760,41 @@ static void eeh_reset_pe_once(struct eeh_pe *pe)
|
||||
int eeh_reset_pe(struct eeh_pe *pe)
|
||||
{
|
||||
int flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
|
||||
int i, rc;
|
||||
int i, state, ret;
|
||||
|
||||
/* Mark as reset and block config space */
|
||||
eeh_pe_state_mark(pe, EEH_PE_RESET | EEH_PE_CFG_BLOCKED);
|
||||
|
||||
/* Take three shots at resetting the bus */
|
||||
for (i=0; i<3; i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
eeh_reset_pe_once(pe);
|
||||
|
||||
/*
|
||||
* EEH_PE_ISOLATED is expected to be removed after
|
||||
* BAR restore.
|
||||
*/
|
||||
rc = eeh_ops->wait_state(pe, PCI_BUS_RESET_WAIT_MSEC);
|
||||
if ((rc & flags) == flags)
|
||||
return 0;
|
||||
|
||||
if (rc < 0) {
|
||||
pr_err("%s: Unrecoverable slot failure on PHB#%d-PE#%x",
|
||||
__func__, pe->phb->global_number, pe->addr);
|
||||
return -1;
|
||||
state = eeh_ops->wait_state(pe, PCI_BUS_RESET_WAIT_MSEC);
|
||||
if ((state & flags) == flags) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
pr_err("EEH: bus reset %d failed on PHB#%d-PE#%x, rc=%d\n",
|
||||
i+1, pe->phb->global_number, pe->addr, rc);
|
||||
|
||||
if (state < 0) {
|
||||
pr_warn("%s: Unrecoverable slot failure on PHB#%d-PE#%x",
|
||||
__func__, pe->phb->global_number, pe->addr);
|
||||
ret = -ENOTRECOVERABLE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* We might run out of credits */
|
||||
ret = -EIO;
|
||||
pr_warn("%s: Failure %d resetting PHB#%x-PE#%x\n (%d)\n",
|
||||
__func__, state, pe->phb->global_number, pe->addr, (i + 1));
|
||||
}
|
||||
|
||||
return -1;
|
||||
out:
|
||||
eeh_pe_state_clear(pe, EEH_PE_RESET | EEH_PE_CFG_BLOCKED);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -920,11 +933,8 @@ int eeh_init(void)
|
||||
pr_warn("%s: Platform EEH operation not found\n",
|
||||
__func__);
|
||||
return -EEXIST;
|
||||
} else if ((ret = eeh_ops->init())) {
|
||||
pr_warn("%s: Failed to call platform init function (%d)\n",
|
||||
__func__, ret);
|
||||
} else if ((ret = eeh_ops->init()))
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Initialize EEH event */
|
||||
ret = eeh_event_init();
|
||||
@ -1209,6 +1219,7 @@ int eeh_unfreeze_pe(struct eeh_pe *pe, bool sw_state)
|
||||
static struct pci_device_id eeh_reset_ids[] = {
|
||||
{ PCI_DEVICE(0x19a2, 0x0710) }, /* Emulex, BE */
|
||||
{ PCI_DEVICE(0x10df, 0xe220) }, /* Emulex, Lancer */
|
||||
{ PCI_DEVICE(0x14e4, 0x1657) }, /* Broadcom BCM5719 */
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
@ -528,13 +528,11 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe)
|
||||
eeh_pe_dev_traverse(pe, eeh_report_error, &result);
|
||||
|
||||
/* Issue reset */
|
||||
eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED);
|
||||
ret = eeh_reset_pe(pe);
|
||||
if (ret) {
|
||||
eeh_pe_state_clear(pe, EEH_PE_RECOVERING | EEH_PE_CFG_BLOCKED);
|
||||
eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
|
||||
return ret;
|
||||
}
|
||||
eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED);
|
||||
|
||||
/* Unfreeze the PE */
|
||||
ret = eeh_clear_pe_frozen_state(pe, true);
|
||||
@ -601,19 +599,15 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus)
|
||||
* config accesses. So we prefer to block them. However, controlled
|
||||
* PCI config accesses initiated from EEH itself are allowed.
|
||||
*/
|
||||
eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED);
|
||||
rc = eeh_reset_pe(pe);
|
||||
if (rc) {
|
||||
eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
pci_lock_rescan_remove();
|
||||
|
||||
/* Restore PE */
|
||||
eeh_ops->configure_bridge(pe);
|
||||
eeh_pe_restore_bars(pe);
|
||||
eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED);
|
||||
|
||||
/* Clear frozen state */
|
||||
rc = eeh_clear_pe_frozen_state(pe, false);
|
||||
|
@ -1424,12 +1424,18 @@ _GLOBAL(ftrace_graph_caller)
|
||||
lwz r4, 44(r1)
|
||||
subi r4, r4, MCOUNT_INSN_SIZE
|
||||
|
||||
/* get the parent address */
|
||||
addi r3, r1, 52
|
||||
/* Grab the LR out of the caller stack frame */
|
||||
lwz r3,52(r1)
|
||||
|
||||
bl prepare_ftrace_return
|
||||
nop
|
||||
|
||||
/*
|
||||
* prepare_ftrace_return gives us the address we divert to.
|
||||
* Change the LR in the callers stack frame to this.
|
||||
*/
|
||||
stw r3,52(r1)
|
||||
|
||||
MCOUNT_RESTORE_FRAME
|
||||
/* old link register ends up in ctr reg */
|
||||
bctr
|
||||
@ -1457,4 +1463,4 @@ _GLOBAL(return_to_handler)
|
||||
blr
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
#endif /* CONFIG_MCOUNT */
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
|
@ -1227,41 +1227,26 @@ _GLOBAL(ftrace_graph_caller)
|
||||
ld r4, 128(r1)
|
||||
subi r4, r4, MCOUNT_INSN_SIZE
|
||||
|
||||
/* get the parent address */
|
||||
/* Grab the LR out of the caller stack frame */
|
||||
ld r11, 112(r1)
|
||||
addi r3, r11, 16
|
||||
ld r3, 16(r11)
|
||||
|
||||
bl prepare_ftrace_return
|
||||
nop
|
||||
|
||||
/*
|
||||
* prepare_ftrace_return gives us the address we divert to.
|
||||
* Change the LR in the callers stack frame to this.
|
||||
*/
|
||||
ld r11, 112(r1)
|
||||
std r3, 16(r11)
|
||||
|
||||
ld r0, 128(r1)
|
||||
mtlr r0
|
||||
addi r1, r1, 112
|
||||
blr
|
||||
|
||||
_GLOBAL(return_to_handler)
|
||||
/* need to save return values */
|
||||
std r4, -24(r1)
|
||||
std r3, -16(r1)
|
||||
std r31, -8(r1)
|
||||
mr r31, r1
|
||||
stdu r1, -112(r1)
|
||||
|
||||
bl ftrace_return_to_handler
|
||||
nop
|
||||
|
||||
/* return value has real return address */
|
||||
mtlr r3
|
||||
|
||||
ld r1, 0(r1)
|
||||
ld r4, -24(r1)
|
||||
ld r3, -16(r1)
|
||||
ld r31, -8(r1)
|
||||
|
||||
/* Jump back to real return address */
|
||||
blr
|
||||
|
||||
_GLOBAL(mod_return_to_handler)
|
||||
/* need to save return values */
|
||||
std r4, -32(r1)
|
||||
std r3, -24(r1)
|
||||
@ -1272,7 +1257,7 @@ _GLOBAL(mod_return_to_handler)
|
||||
stdu r1, -112(r1)
|
||||
|
||||
/*
|
||||
* We are in a module using the module's TOC.
|
||||
* We might be called from a module.
|
||||
* Switch to our TOC to run inside the core kernel.
|
||||
*/
|
||||
ld r2, PACATOC(r13)
|
||||
|
@ -131,6 +131,8 @@ BEGIN_FTR_SECTION
|
||||
1:
|
||||
#endif
|
||||
|
||||
/* Return SRR1 from power7_nap() */
|
||||
mfspr r3,SPRN_SRR1
|
||||
beq cr1,2f
|
||||
b power7_wakeup_noloss
|
||||
2: b power7_wakeup_loss
|
||||
@ -292,15 +294,26 @@ decrementer_pSeries:
|
||||
. = 0xc00
|
||||
.globl system_call_pSeries
|
||||
system_call_pSeries:
|
||||
HMT_MEDIUM
|
||||
/*
|
||||
* If CONFIG_KVM_BOOK3S_64_HANDLER is set, save the PPR (on systems
|
||||
* that support it) before changing to HMT_MEDIUM. That allows the KVM
|
||||
* code to save that value into the guest state (it is the guest's PPR
|
||||
* value). Otherwise just change to HMT_MEDIUM as userspace has
|
||||
* already saved the PPR.
|
||||
*/
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||
SET_SCRATCH0(r13)
|
||||
GET_PACA(r13)
|
||||
std r9,PACA_EXGEN+EX_R9(r13)
|
||||
OPT_GET_SPR(r9, SPRN_PPR, CPU_FTR_HAS_PPR);
|
||||
HMT_MEDIUM;
|
||||
std r10,PACA_EXGEN+EX_R10(r13)
|
||||
OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r9, CPU_FTR_HAS_PPR);
|
||||
mfcr r9
|
||||
KVMTEST(0xc00)
|
||||
GET_SCRATCH0(r13)
|
||||
#else
|
||||
HMT_MEDIUM;
|
||||
#endif
|
||||
SYSCALL_PSERIES_1
|
||||
SYSCALL_PSERIES_2_RFID
|
||||
@ -1301,23 +1314,6 @@ hmi_exception_after_realmode:
|
||||
EXCEPTION_PROLOG_0(PACA_EXGEN)
|
||||
b hmi_exception_hv
|
||||
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
_GLOBAL(opal_mc_secondary_handler)
|
||||
HMT_MEDIUM_PPR_DISCARD
|
||||
SET_SCRATCH0(r13)
|
||||
GET_PACA(r13)
|
||||
clrldi r3,r3,2
|
||||
tovirt(r3,r3)
|
||||
std r3,PACA_OPAL_MC_EVT(r13)
|
||||
ld r13,OPAL_MC_SRR0(r3)
|
||||
mtspr SPRN_SRR0,r13
|
||||
ld r13,OPAL_MC_SRR1(r3)
|
||||
mtspr SPRN_SRR1,r13
|
||||
ld r3,OPAL_MC_GPR3(r3)
|
||||
GET_SCRATCH0(r13)
|
||||
b machine_check_pSeries
|
||||
#endif /* CONFIG_PPC_POWERNV */
|
||||
|
||||
|
||||
#define MACHINE_CHECK_HANDLER_WINDUP \
|
||||
/* Clear MSR_RI before setting SRR0 and SRR1. */\
|
||||
@ -1571,9 +1567,11 @@ do_hash_page:
|
||||
* r3 contains the faulting address
|
||||
* r4 contains the required access permissions
|
||||
* r5 contains the trap number
|
||||
* r6 contains dsisr
|
||||
*
|
||||
* at return r3 = 0 for success, 1 for page fault, negative for error
|
||||
*/
|
||||
ld r6,_DSISR(r1)
|
||||
bl hash_page /* build HPTE if possible */
|
||||
cmpdi r3,0 /* see if hash_page succeeded */
|
||||
|
||||
|
@ -510,79 +510,36 @@ int ftrace_disable_ftrace_graph_caller(void)
|
||||
}
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
extern void mod_return_to_handler(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Hook the return address and push it in the stack of return addrs
|
||||
* in current thread info.
|
||||
* in current thread info. Return the address we want to divert to.
|
||||
*/
|
||||
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||
unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
|
||||
{
|
||||
unsigned long old;
|
||||
int faulted;
|
||||
struct ftrace_graph_ent trace;
|
||||
unsigned long return_hooker = (unsigned long)&return_to_handler;
|
||||
unsigned long return_hooker;
|
||||
|
||||
if (unlikely(ftrace_graph_is_dead()))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* non core kernel code needs to save and restore the TOC */
|
||||
if (REGION_ID(self_addr) != KERNEL_REGION_ID)
|
||||
return_hooker = (unsigned long)&mod_return_to_handler;
|
||||
#endif
|
||||
return_hooker = ppc_function_entry(return_to_handler);
|
||||
|
||||
return_hooker = ppc_function_entry((void *)return_hooker);
|
||||
|
||||
/*
|
||||
* Protect against fault, even if it shouldn't
|
||||
* happen. This tool is too much intrusive to
|
||||
* ignore such a protection.
|
||||
*/
|
||||
asm volatile(
|
||||
"1: " PPC_LL "%[old], 0(%[parent])\n"
|
||||
"2: " PPC_STL "%[return_hooker], 0(%[parent])\n"
|
||||
" li %[faulted], 0\n"
|
||||
"3:\n"
|
||||
|
||||
".section .fixup, \"ax\"\n"
|
||||
"4: li %[faulted], 1\n"
|
||||
" b 3b\n"
|
||||
".previous\n"
|
||||
|
||||
".section __ex_table,\"a\"\n"
|
||||
PPC_LONG_ALIGN "\n"
|
||||
PPC_LONG "1b,4b\n"
|
||||
PPC_LONG "2b,4b\n"
|
||||
".previous"
|
||||
|
||||
: [old] "=&r" (old), [faulted] "=r" (faulted)
|
||||
: [parent] "r" (parent), [return_hooker] "r" (return_hooker)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
if (unlikely(faulted)) {
|
||||
ftrace_graph_stop();
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
trace.func = self_addr;
|
||||
trace.func = ip;
|
||||
trace.depth = current->curr_ret_stack + 1;
|
||||
|
||||
/* Only trace if the calling function expects to */
|
||||
if (!ftrace_graph_entry(&trace)) {
|
||||
*parent = old;
|
||||
return;
|
||||
}
|
||||
if (!ftrace_graph_entry(&trace))
|
||||
goto out;
|
||||
|
||||
if (ftrace_push_return_trace(old, self_addr, &trace.depth, 0) == -EBUSY)
|
||||
*parent = old;
|
||||
if (ftrace_push_return_trace(parent, ip, &trace.depth, 0) == -EBUSY)
|
||||
goto out;
|
||||
|
||||
parent = return_hooker;
|
||||
out:
|
||||
return parent;
|
||||
}
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
|
@ -33,13 +33,31 @@
|
||||
|
||||
/* Macro to make the code more readable. */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
#define DO_8xx_CPU6(val, reg) \
|
||||
li reg, val; \
|
||||
stw reg, 12(r0); \
|
||||
lwz reg, 12(r0);
|
||||
#define SPRN_MI_TWC_ADDR 0x2b80
|
||||
#define SPRN_MI_RPN_ADDR 0x2d80
|
||||
#define SPRN_MD_TWC_ADDR 0x3b80
|
||||
#define SPRN_MD_RPN_ADDR 0x3d80
|
||||
|
||||
#define MTSPR_CPU6(spr, reg, treg) \
|
||||
li treg, spr##_ADDR; \
|
||||
stw treg, 12(r0); \
|
||||
lwz treg, 12(r0); \
|
||||
mtspr spr, reg
|
||||
#else
|
||||
#define DO_8xx_CPU6(val, reg)
|
||||
#define MTSPR_CPU6(spr, reg, treg) \
|
||||
mtspr spr, reg
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Value for the bits that have fixed value in RPN entries.
|
||||
* Also used for tagging DAR for DTLBerror.
|
||||
*/
|
||||
#ifdef CONFIG_PPC_16K_PAGES
|
||||
#define RPN_PATTERN (0x00f0 | MD_SPS16K)
|
||||
#else
|
||||
#define RPN_PATTERN 0x00f0
|
||||
#endif
|
||||
|
||||
__HEAD
|
||||
_ENTRY(_stext);
|
||||
_ENTRY(_start);
|
||||
@ -65,13 +83,6 @@ _ENTRY(_start);
|
||||
* 8M 1:1. I also mapped an additional I/O space 1:1 so we can get to
|
||||
* the "internal" processor registers before MMU_init is called.
|
||||
*
|
||||
* The TLB code currently contains a major hack. Since I use the condition
|
||||
* code register, I have to save and restore it. I am out of registers, so
|
||||
* I just store it in memory location 0 (the TLB handlers are not reentrant).
|
||||
* To avoid making any decisions, I need to use the "segment" valid bit
|
||||
* in the first level table, but that would require many changes to the
|
||||
* Linux page directory/table functions that I don't want to do right now.
|
||||
*
|
||||
* -- Dan
|
||||
*/
|
||||
.globl __start
|
||||
@ -211,7 +222,7 @@ MachineCheck:
|
||||
EXCEPTION_PROLOG
|
||||
mfspr r4,SPRN_DAR
|
||||
stw r4,_DAR(r11)
|
||||
li r5,0x00f0
|
||||
li r5,RPN_PATTERN
|
||||
mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */
|
||||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
@ -219,30 +230,16 @@ MachineCheck:
|
||||
EXC_XFER_STD(0x200, machine_check_exception)
|
||||
|
||||
/* Data access exception.
|
||||
* This is "never generated" by the MPC8xx. We jump to it for other
|
||||
* translation errors.
|
||||
* This is "never generated" by the MPC8xx.
|
||||
*/
|
||||
. = 0x300
|
||||
DataAccess:
|
||||
EXCEPTION_PROLOG
|
||||
mfspr r10,SPRN_DSISR
|
||||
stw r10,_DSISR(r11)
|
||||
mr r5,r10
|
||||
mfspr r4,SPRN_DAR
|
||||
li r10,0x00f0
|
||||
mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
|
||||
/* Instruction access exception.
|
||||
* This is "never generated" by the MPC8xx. We jump to it for other
|
||||
* translation errors.
|
||||
* This is "never generated" by the MPC8xx.
|
||||
*/
|
||||
. = 0x400
|
||||
InstructionAccess:
|
||||
EXCEPTION_PROLOG
|
||||
mr r4,r12
|
||||
mr r5,r9
|
||||
EXC_XFER_LITE(0x400, handle_page_fault)
|
||||
|
||||
/* External interrupt */
|
||||
EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
|
||||
@ -253,7 +250,7 @@ Alignment:
|
||||
EXCEPTION_PROLOG
|
||||
mfspr r4,SPRN_DAR
|
||||
stw r4,_DAR(r11)
|
||||
li r5,0x00f0
|
||||
li r5,RPN_PATTERN
|
||||
mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */
|
||||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
@ -292,8 +289,8 @@ SystemCall:
|
||||
. = 0x1100
|
||||
/*
|
||||
* For the MPC8xx, this is a software tablewalk to load the instruction
|
||||
* TLB. It is modelled after the example in the Motorola manual. The task
|
||||
* switch loads the M_TWB register with the pointer to the first level table.
|
||||
* TLB. The task switch loads the M_TW register with the pointer to the first
|
||||
* level table.
|
||||
* If we discover there is no second level table (value is zero) or if there
|
||||
* is an invalid pte, we load that into the TLB, which causes another fault
|
||||
* into the TLB Error interrupt where we can handle such problems.
|
||||
@ -302,20 +299,17 @@ SystemCall:
|
||||
*/
|
||||
InstructionTLBMiss:
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
stw r3, 8(r0)
|
||||
mtspr SPRN_DAR, r3
|
||||
#endif
|
||||
EXCEPTION_PROLOG_0
|
||||
mtspr SPRN_SPRG_SCRATCH2, r10
|
||||
mfspr r10, SPRN_SRR0 /* Get effective address of fault */
|
||||
#ifdef CONFIG_8xx_CPU15
|
||||
addi r11, r10, 0x1000
|
||||
addi r11, r10, PAGE_SIZE
|
||||
tlbie r11
|
||||
addi r11, r10, -0x1000
|
||||
addi r11, r10, -PAGE_SIZE
|
||||
tlbie r11
|
||||
#endif
|
||||
DO_8xx_CPU6(0x3780, r3)
|
||||
mtspr SPRN_MD_EPN, r10 /* Have to use MD_EPN for walk, MI_EPN can't */
|
||||
mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */
|
||||
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
@ -323,32 +317,37 @@ InstructionTLBMiss:
|
||||
#ifdef CONFIG_MODULES
|
||||
/* Only modules will cause ITLB Misses as we always
|
||||
* pin the first 8MB of kernel memory */
|
||||
andi. r11, r10, 0x0800 /* Address >= 0x80000000 */
|
||||
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
|
||||
#endif
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table base address */
|
||||
#ifdef CONFIG_MODULES
|
||||
beq 3f
|
||||
lis r11, swapper_pg_dir@h
|
||||
ori r11, r11, swapper_pg_dir@l
|
||||
rlwimi r10, r11, 0, 2, 19
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h
|
||||
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
|
||||
3:
|
||||
#endif
|
||||
lwz r11, 0(r10) /* Get the level 1 entry */
|
||||
/* Extract level 1 index */
|
||||
rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
||||
lwzx r11, r10, 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 the MI_TWC with the attributes
|
||||
* for this "segment."
|
||||
*/
|
||||
ori r11,r11,1 /* Set valid bit */
|
||||
DO_8xx_CPU6(0x2b80, r3)
|
||||
mtspr SPRN_MI_TWC, r11 /* Set segment attributes */
|
||||
DO_8xx_CPU6(0x3b80, r3)
|
||||
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */
|
||||
mfspr r11, SPRN_MD_TWC /* ....and get the pte address */
|
||||
lwz r10, 0(r11) /* Get the pte */
|
||||
MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */
|
||||
mfspr r11, SPRN_SRR0 /* Get effective address of fault */
|
||||
/* Extract level 2 index */
|
||||
rlwinm r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
|
||||
lwzx r10, r10, r11 /* Get the pte */
|
||||
|
||||
#ifdef CONFIG_SWAP
|
||||
andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT
|
||||
cmpwi cr0, r11, _PAGE_ACCESSED | _PAGE_PRESENT
|
||||
li r11, RPN_PATTERN
|
||||
bne- cr0, 2f
|
||||
#else
|
||||
li r11, RPN_PATTERN
|
||||
#endif
|
||||
/* The Linux PTE won't go exactly into the MMU TLB.
|
||||
* Software indicator bits 21 and 28 must be clear.
|
||||
@ -356,62 +355,63 @@ InstructionTLBMiss:
|
||||
* set. All other Linux PTE bits control the behavior
|
||||
* of the MMU.
|
||||
*/
|
||||
li r11, 0x00f0
|
||||
rlwimi r10, r11, 0, 0x07f8 /* Set 24-27, clear 21-23,28 */
|
||||
DO_8xx_CPU6(0x2d80, r3)
|
||||
mtspr SPRN_MI_RPN, r10 /* Update TLB entry */
|
||||
MTSPR_CPU6(SPRN_MI_RPN, r10, r3) /* Update TLB entry */
|
||||
|
||||
/* Restore registers */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lwz r3, 8(r0)
|
||||
mfspr r3, SPRN_DAR
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
#endif
|
||||
mfspr r10, SPRN_SPRG_SCRATCH2
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
2:
|
||||
mfspr r11, SPRN_SRR1
|
||||
mfspr r10, SPRN_SRR1
|
||||
/* clear all error bits as TLB Miss
|
||||
* sets a few unconditionally
|
||||
*/
|
||||
rlwinm r11, r11, 0, 0xffff
|
||||
mtspr SPRN_SRR1, r11
|
||||
rlwinm r10, r10, 0, 0xffff
|
||||
mtspr SPRN_SRR1, r10
|
||||
|
||||
/* Restore registers */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lwz r3, 8(r0)
|
||||
mfspr r3, SPRN_DAR
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
#endif
|
||||
mfspr r10, SPRN_SPRG_SCRATCH2
|
||||
EXCEPTION_EPILOG_0
|
||||
b InstructionAccess
|
||||
b InstructionTLBError1
|
||||
|
||||
. = 0x1200
|
||||
DataStoreTLBMiss:
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
stw r3, 8(r0)
|
||||
mtspr SPRN_DAR, r3
|
||||
#endif
|
||||
EXCEPTION_PROLOG_0
|
||||
mtspr SPRN_SPRG_SCRATCH2, r10
|
||||
mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */
|
||||
mfspr r10, SPRN_MD_EPN
|
||||
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
*/
|
||||
andi. r11, r10, 0x0800
|
||||
andis. r11, r10, 0x8000
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table base address */
|
||||
beq 3f
|
||||
lis r11, swapper_pg_dir@h
|
||||
ori r11, r11, swapper_pg_dir@l
|
||||
rlwimi r10, r11, 0, 2, 19
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h
|
||||
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
|
||||
3:
|
||||
lwz r11, 0(r10) /* Get the level 1 entry */
|
||||
/* Extract level 1 index */
|
||||
rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
||||
lwzx r11, r10, 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.
|
||||
*/
|
||||
ori r11, r11, 1 /* Set valid bit in physical L2 page */
|
||||
DO_8xx_CPU6(0x3b80, r3)
|
||||
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */
|
||||
mfspr r10, SPRN_MD_TWC /* ....and get the pte address */
|
||||
mfspr r10, SPRN_MD_EPN /* Get address of fault */
|
||||
/* Extract level 2 index */
|
||||
rlwinm r10, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
|
||||
rlwimi r10, r11, 0, 0, 32 - PAGE_SHIFT - 1 /* Add level 2 base */
|
||||
lwz r10, 0(r10) /* Get the pte */
|
||||
|
||||
/* Insert the Guarded flag into the TWC from the Linux PTE.
|
||||
@ -425,8 +425,7 @@ DataStoreTLBMiss:
|
||||
* It is bit 25 in the Linux PTE and bit 30 in the TWC
|
||||
*/
|
||||
rlwimi r11, r10, 32-5, 30, 30
|
||||
DO_8xx_CPU6(0x3b80, r3)
|
||||
mtspr SPRN_MD_TWC, r11
|
||||
MTSPR_CPU6(SPRN_MD_TWC, r11, r3)
|
||||
|
||||
/* Both _PAGE_ACCESSED and _PAGE_PRESENT has to be set.
|
||||
* We also need to know if the insn is a load/store, so:
|
||||
@ -442,14 +441,8 @@ DataStoreTLBMiss:
|
||||
and r11, r11, r10
|
||||
rlwimi r10, r11, 0, _PAGE_PRESENT
|
||||
#endif
|
||||
/* Honour kernel RO, User NA */
|
||||
/* 0x200 == Extended encoding, bit 22 */
|
||||
rlwimi r10, r10, 32-2, 0x200 /* Copy USER to bit 22, 0x200 */
|
||||
/* r11 = (r10 & _PAGE_RW) >> 1 */
|
||||
rlwinm r11, r10, 32-1, 0x200
|
||||
or r10, r11, r10
|
||||
/* invert RW and 0x200 bits */
|
||||
xori r10, r10, _PAGE_RW | 0x200
|
||||
/* invert RW */
|
||||
xori r10, r10, _PAGE_RW
|
||||
|
||||
/* The Linux PTE won't go exactly into the MMU TLB.
|
||||
* Software indicator bits 22 and 28 must be clear.
|
||||
@ -457,14 +450,13 @@ DataStoreTLBMiss:
|
||||
* set. All other Linux PTE bits control the behavior
|
||||
* of the MMU.
|
||||
*/
|
||||
2: li r11, 0x00f0
|
||||
2: li r11, RPN_PATTERN
|
||||
rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */
|
||||
DO_8xx_CPU6(0x3d80, r3)
|
||||
mtspr SPRN_MD_RPN, r10 /* Update TLB entry */
|
||||
MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */
|
||||
|
||||
/* Restore registers */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lwz r3, 8(r0)
|
||||
mfspr r3, SPRN_DAR
|
||||
#endif
|
||||
mtspr SPRN_DAR, r11 /* Tag DAR */
|
||||
mfspr r10, SPRN_SPRG_SCRATCH2
|
||||
@ -477,7 +469,17 @@ DataStoreTLBMiss:
|
||||
*/
|
||||
. = 0x1300
|
||||
InstructionTLBError:
|
||||
b InstructionAccess
|
||||
EXCEPTION_PROLOG_0
|
||||
InstructionTLBError1:
|
||||
EXCEPTION_PROLOG_1
|
||||
EXCEPTION_PROLOG_2
|
||||
mr r4,r12
|
||||
mr r5,r9
|
||||
andis. r10,r5,0x4000
|
||||
beq+ 1f
|
||||
tlbie r4
|
||||
/* 0x400 is InstructionAccess exception, needed by bad_page_fault() */
|
||||
1: EXC_XFER_LITE(0x400, handle_page_fault)
|
||||
|
||||
/* This is the data TLB error on the MPC8xx. This could be due to
|
||||
* many reasons, including a dirty update to a pte. We bail out to
|
||||
@ -488,11 +490,21 @@ DataTLBError:
|
||||
EXCEPTION_PROLOG_0
|
||||
|
||||
mfspr r11, SPRN_DAR
|
||||
cmpwi cr0, r11, 0x00f0
|
||||
cmpwi cr0, r11, RPN_PATTERN
|
||||
beq- FixupDAR /* must be a buggy dcbX, icbi insn. */
|
||||
DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
EXCEPTION_EPILOG_0
|
||||
b DataAccess
|
||||
EXCEPTION_PROLOG_1
|
||||
EXCEPTION_PROLOG_2
|
||||
mfspr r5,SPRN_DSISR
|
||||
stw r5,_DSISR(r11)
|
||||
mfspr r4,SPRN_DAR
|
||||
andis. r10,r5,0x4000
|
||||
beq+ 1f
|
||||
tlbie r4
|
||||
1: li r10,RPN_PATTERN
|
||||
mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */
|
||||
/* 0x300 is DataAccess exception, needed by bad_page_fault() */
|
||||
EXC_XFER_LITE(0x300, handle_page_fault)
|
||||
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
|
||||
@ -521,29 +533,30 @@ DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
#define NO_SELF_MODIFYING_CODE
|
||||
FixupDAR:/* Entry point for dcbx workaround. */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
stw r3, 8(r0)
|
||||
mtspr SPRN_DAR, r3
|
||||
#endif
|
||||
mtspr SPRN_SPRG_SCRATCH2, r10
|
||||
/* fetch instruction from memory. */
|
||||
mfspr r10, SPRN_SRR0
|
||||
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
|
||||
DO_8xx_CPU6(0x3780, r3)
|
||||
mtspr SPRN_MD_EPN, r10
|
||||
mfspr r11, SPRN_M_TWB /* Get level 1 table entry address */
|
||||
mfspr r11, SPRN_M_TW /* Get level 1 table base address */
|
||||
beq- 3f /* Branch if user space */
|
||||
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h
|
||||
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
|
||||
rlwimi r11, r10, 32-20, 0xffc /* r11 = r11&~0xffc|(r10>>20)&0xffc */
|
||||
3: lwz r11, 0(r11) /* Get the level 1 entry */
|
||||
DO_8xx_CPU6(0x3b80, r3)
|
||||
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */
|
||||
mfspr r11, SPRN_MD_TWC /* ....and get the pte address */
|
||||
lwz r11, 0(r11) /* Get the pte */
|
||||
/* Extract level 1 index */
|
||||
3: rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
||||
lwzx r11, r10, r11 /* Get the level 1 entry */
|
||||
rlwinm r10, r11,0,0,19 /* Extract page descriptor page address */
|
||||
mfspr r11, SPRN_SRR0 /* Get effective address of fault */
|
||||
/* Extract level 2 index */
|
||||
rlwinm r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
|
||||
lwzx r11, r10, r11 /* Get the pte */
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lwz r3, 8(r0) /* restore r3 from memory */
|
||||
mfspr r3, SPRN_DAR
|
||||
#endif
|
||||
/* concat physical page address(r11) and page offset(r10) */
|
||||
rlwimi r11, r10, 0, 20, 31
|
||||
mfspr r10, SPRN_SRR0
|
||||
rlwimi r11, r10, 0, 32 - PAGE_SHIFT, 31
|
||||
lwz r11,0(r11)
|
||||
/* Check if it really is a dcbx instruction. */
|
||||
/* dcbt and dcbtst does not generate DTLB Misses/Errors,
|
||||
@ -698,11 +711,11 @@ start_here:
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lis r4, cpu6_errata_word@h
|
||||
ori r4, r4, cpu6_errata_word@l
|
||||
li r3, 0x3980
|
||||
li r3, 0x3f80
|
||||
stw r3, 12(r4)
|
||||
lwz r3, 12(r4)
|
||||
#endif
|
||||
mtspr SPRN_M_TWB, r6
|
||||
mtspr SPRN_M_TW, r6
|
||||
lis r4,2f@h
|
||||
ori r4,r4,2f@l
|
||||
tophys(r4,r4)
|
||||
@ -876,10 +889,10 @@ _GLOBAL(set_context)
|
||||
lis r6, cpu6_errata_word@h
|
||||
ori r6, r6, cpu6_errata_word@l
|
||||
tophys (r4, r4)
|
||||
li r7, 0x3980
|
||||
li r7, 0x3f80
|
||||
stw r7, 12(r6)
|
||||
lwz r7, 12(r6)
|
||||
mtspr SPRN_M_TWB, r4 /* Update MMU base address */
|
||||
mtspr SPRN_M_TW, r4 /* Update MMU base address */
|
||||
li r7, 0x3380
|
||||
stw r7, 12(r6)
|
||||
lwz r7, 12(r6)
|
||||
@ -887,7 +900,7 @@ _GLOBAL(set_context)
|
||||
#else
|
||||
mtspr SPRN_M_CASID,r3 /* Update context */
|
||||
tophys (r4, r4)
|
||||
mtspr SPRN_M_TWB, r4 /* and pgd */
|
||||
mtspr SPRN_M_TW, r4 /* and pgd */
|
||||
#endif
|
||||
SYNC
|
||||
blr
|
||||
@ -919,12 +932,13 @@ set_dec_cpu6:
|
||||
.globl sdata
|
||||
sdata:
|
||||
.globl empty_zero_page
|
||||
.align PAGE_SHIFT
|
||||
empty_zero_page:
|
||||
.space 4096
|
||||
.space PAGE_SIZE
|
||||
|
||||
.globl swapper_pg_dir
|
||||
swapper_pg_dir:
|
||||
.space 4096
|
||||
.space PGD_TABLE_SIZE
|
||||
|
||||
/* Room for two PTE table poiners, usually the kernel and current user
|
||||
* pointer to their respective root page table (pgdir).
|
||||
|
@ -63,7 +63,7 @@ int hw_breakpoint_slots(int type)
|
||||
int arch_install_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
struct arch_hw_breakpoint *info = counter_arch_bp(bp);
|
||||
struct perf_event **slot = &__get_cpu_var(bp_per_reg);
|
||||
struct perf_event **slot = this_cpu_ptr(&bp_per_reg);
|
||||
|
||||
*slot = bp;
|
||||
|
||||
@ -88,7 +88,7 @@ int arch_install_hw_breakpoint(struct perf_event *bp)
|
||||
*/
|
||||
void arch_uninstall_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
struct perf_event **slot = &__get_cpu_var(bp_per_reg);
|
||||
struct perf_event **slot = this_cpu_ptr(&bp_per_reg);
|
||||
|
||||
if (*slot != bp) {
|
||||
WARN_ONCE(1, "Can't find the breakpoint");
|
||||
@ -226,7 +226,7 @@ int __kprobes hw_breakpoint_handler(struct die_args *args)
|
||||
*/
|
||||
rcu_read_lock();
|
||||
|
||||
bp = __get_cpu_var(bp_per_reg);
|
||||
bp = __this_cpu_read(bp_per_reg);
|
||||
if (!bp)
|
||||
goto out;
|
||||
info = counter_arch_bp(bp);
|
||||
|
@ -212,6 +212,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
mtspr SPRN_SRR0,r5
|
||||
rfid
|
||||
|
||||
/*
|
||||
* R3 here contains the value that will be returned to the caller
|
||||
* of power7_nap.
|
||||
*/
|
||||
_GLOBAL(power7_wakeup_loss)
|
||||
ld r1,PACAR1(r13)
|
||||
BEGIN_FTR_SECTION
|
||||
@ -219,15 +223,19 @@ BEGIN_FTR_SECTION
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
REST_NVGPRS(r1)
|
||||
REST_GPR(2, r1)
|
||||
ld r3,_CCR(r1)
|
||||
ld r6,_CCR(r1)
|
||||
ld r4,_MSR(r1)
|
||||
ld r5,_NIP(r1)
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
mtcr r3
|
||||
mtcr r6
|
||||
mtspr SPRN_SRR1,r4
|
||||
mtspr SPRN_SRR0,r5
|
||||
rfid
|
||||
|
||||
/*
|
||||
* R3 here contains the value that will be returned to the caller
|
||||
* of power7_nap.
|
||||
*/
|
||||
_GLOBAL(power7_wakeup_noloss)
|
||||
lbz r0,PACA_NAPSTATELOST(r13)
|
||||
cmpwi r0,0
|
||||
|
@ -208,7 +208,7 @@ static unsigned long iommu_range_alloc(struct device *dev,
|
||||
* We don't need to disable preemption here because any CPU can
|
||||
* safely use any IOMMU pool.
|
||||
*/
|
||||
pool_nr = __raw_get_cpu_var(iommu_pool_hash) & (tbl->nr_pools - 1);
|
||||
pool_nr = __this_cpu_read(iommu_pool_hash) & (tbl->nr_pools - 1);
|
||||
|
||||
if (largealloc)
|
||||
pool = &(tbl->large_pool);
|
||||
|
@ -50,7 +50,6 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/radix-tree.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/of.h>
|
||||
@ -114,7 +113,7 @@ static inline notrace void set_soft_enabled(unsigned long enable)
|
||||
static inline notrace int decrementer_check_overflow(void)
|
||||
{
|
||||
u64 now = get_tb_or_rtc();
|
||||
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
|
||||
u64 *next_tb = this_cpu_ptr(&decrementers_next_tb);
|
||||
|
||||
return now >= *next_tb;
|
||||
}
|
||||
@ -499,7 +498,7 @@ void __do_irq(struct pt_regs *regs)
|
||||
|
||||
/* And finally process it */
|
||||
if (unlikely(irq == NO_IRQ))
|
||||
__get_cpu_var(irq_stat).spurious_irqs++;
|
||||
__this_cpu_inc(irq_stat.spurious_irqs);
|
||||
else
|
||||
generic_handle_irq(irq);
|
||||
|
||||
|
@ -155,7 +155,7 @@ static int kgdb_singlestep(struct pt_regs *regs)
|
||||
{
|
||||
struct thread_info *thread_info, *exception_thread_info;
|
||||
struct thread_info *backup_current_thread_info =
|
||||
&__get_cpu_var(kgdb_thread_info);
|
||||
this_cpu_ptr(&kgdb_thread_info);
|
||||
|
||||
if (user_mode(regs))
|
||||
return 0;
|
||||
|
@ -119,7 +119,7 @@ static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
|
||||
static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
|
||||
__this_cpu_write(current_kprobe, kcb->prev_kprobe.kp);
|
||||
kcb->kprobe_status = kcb->prev_kprobe.status;
|
||||
kcb->kprobe_saved_msr = kcb->prev_kprobe.saved_msr;
|
||||
}
|
||||
@ -127,7 +127,7 @@ static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
|
||||
struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
__get_cpu_var(current_kprobe) = p;
|
||||
__this_cpu_write(current_kprobe, p);
|
||||
kcb->kprobe_saved_msr = regs->msr;
|
||||
}
|
||||
|
||||
@ -192,7 +192,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||
ret = 1;
|
||||
goto no_kprobe;
|
||||
}
|
||||
p = __get_cpu_var(current_kprobe);
|
||||
p = __this_cpu_read(current_kprobe);
|
||||
if (p->break_handler && p->break_handler(p, regs)) {
|
||||
goto ss_probe;
|
||||
}
|
||||
|
@ -73,8 +73,8 @@ void save_mce_event(struct pt_regs *regs, long handled,
|
||||
uint64_t nip, uint64_t addr)
|
||||
{
|
||||
uint64_t srr1;
|
||||
int index = __get_cpu_var(mce_nest_count)++;
|
||||
struct machine_check_event *mce = &__get_cpu_var(mce_event[index]);
|
||||
int index = __this_cpu_inc_return(mce_nest_count);
|
||||
struct machine_check_event *mce = this_cpu_ptr(&mce_event[index]);
|
||||
|
||||
/*
|
||||
* Return if we don't have enough space to log mce event.
|
||||
@ -143,7 +143,7 @@ void save_mce_event(struct pt_regs *regs, long handled,
|
||||
*/
|
||||
int get_mce_event(struct machine_check_event *mce, bool release)
|
||||
{
|
||||
int index = __get_cpu_var(mce_nest_count) - 1;
|
||||
int index = __this_cpu_read(mce_nest_count) - 1;
|
||||
struct machine_check_event *mc_evt;
|
||||
int ret = 0;
|
||||
|
||||
@ -153,7 +153,7 @@ int get_mce_event(struct machine_check_event *mce, bool release)
|
||||
|
||||
/* Check if we have MCE info to process. */
|
||||
if (index < MAX_MC_EVT) {
|
||||
mc_evt = &__get_cpu_var(mce_event[index]);
|
||||
mc_evt = this_cpu_ptr(&mce_event[index]);
|
||||
/* Copy the event structure and release the original */
|
||||
if (mce)
|
||||
*mce = *mc_evt;
|
||||
@ -163,7 +163,7 @@ int get_mce_event(struct machine_check_event *mce, bool release)
|
||||
}
|
||||
/* Decrement the count to free the slot. */
|
||||
if (release)
|
||||
__get_cpu_var(mce_nest_count)--;
|
||||
__this_cpu_dec(mce_nest_count);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -184,13 +184,13 @@ void machine_check_queue_event(void)
|
||||
if (!get_mce_event(&evt, MCE_EVENT_RELEASE))
|
||||
return;
|
||||
|
||||
index = __get_cpu_var(mce_queue_count)++;
|
||||
index = __this_cpu_inc_return(mce_queue_count);
|
||||
/* If queue is full, just return for now. */
|
||||
if (index >= MAX_MC_EVT) {
|
||||
__get_cpu_var(mce_queue_count)--;
|
||||
__this_cpu_dec(mce_queue_count);
|
||||
return;
|
||||
}
|
||||
__get_cpu_var(mce_event_queue[index]) = evt;
|
||||
memcpy(this_cpu_ptr(&mce_event_queue[index]), &evt, sizeof(evt));
|
||||
|
||||
/* Queue irq work to process this event later. */
|
||||
irq_work_queue(&mce_event_process_work);
|
||||
@ -208,11 +208,11 @@ static void machine_check_process_queued_event(struct irq_work *work)
|
||||
* For now just print it to console.
|
||||
* TODO: log this error event to FSP or nvram.
|
||||
*/
|
||||
while (__get_cpu_var(mce_queue_count) > 0) {
|
||||
index = __get_cpu_var(mce_queue_count) - 1;
|
||||
while (__this_cpu_read(mce_queue_count) > 0) {
|
||||
index = __this_cpu_read(mce_queue_count) - 1;
|
||||
machine_check_print_event_info(
|
||||
&__get_cpu_var(mce_event_queue[index]));
|
||||
__get_cpu_var(mce_queue_count)--;
|
||||
this_cpu_ptr(&mce_event_queue[index]));
|
||||
__this_cpu_dec(mce_queue_count);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ static long mce_handle_derror(uint64_t dsisr, uint64_t slb_error_bits)
|
||||
}
|
||||
if (dsisr & P7_DSISR_MC_TLB_MULTIHIT_MFTLB) {
|
||||
if (cur_cpu_spec && cur_cpu_spec->flush_tlb)
|
||||
cur_cpu_spec->flush_tlb(TLBIEL_INVAL_PAGE);
|
||||
cur_cpu_spec->flush_tlb(TLBIEL_INVAL_SET);
|
||||
/* reset error bits */
|
||||
dsisr &= ~P7_DSISR_MC_TLB_MULTIHIT_MFTLB;
|
||||
}
|
||||
@ -110,7 +110,7 @@ static long mce_handle_common_ierror(uint64_t srr1)
|
||||
break;
|
||||
case P7_SRR1_MC_IFETCH_TLB_MULTIHIT:
|
||||
if (cur_cpu_spec && cur_cpu_spec->flush_tlb) {
|
||||
cur_cpu_spec->flush_tlb(TLBIEL_INVAL_PAGE);
|
||||
cur_cpu_spec->flush_tlb(TLBIEL_INVAL_SET);
|
||||
handled = 1;
|
||||
}
|
||||
break;
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/of_address.h>
|
||||
@ -1464,7 +1463,7 @@ static void pcibios_setup_phb_resources(struct pci_controller *hose,
|
||||
res = &hose->io_resource;
|
||||
|
||||
if (!res->flags) {
|
||||
printk(KERN_WARNING "PCI: I/O resource not set for host"
|
||||
pr_info("PCI: I/O resource not set for host"
|
||||
" bridge %s (domain %d)\n",
|
||||
hose->dn->full_name, hose->global_number);
|
||||
} else {
|
||||
|
@ -199,9 +199,7 @@ pci_create_OF_bus_map(void)
|
||||
struct property* of_prop;
|
||||
struct device_node *dn;
|
||||
|
||||
of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256);
|
||||
if (!of_prop)
|
||||
return;
|
||||
of_prop = memblock_virt_alloc(sizeof(struct property) + 256, 0);
|
||||
dn = of_find_node_by_path("/");
|
||||
if (dn) {
|
||||
memset(of_prop, -1, sizeof(struct property) + 256);
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/list.h>
|
||||
|
@ -37,9 +37,9 @@
|
||||
#include <linux/personality.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu.h>
|
||||
@ -499,7 +499,7 @@ static inline int set_dawr(struct arch_hw_breakpoint *brk)
|
||||
|
||||
void __set_breakpoint(struct arch_hw_breakpoint *brk)
|
||||
{
|
||||
__get_cpu_var(current_brk) = *brk;
|
||||
memcpy(this_cpu_ptr(¤t_brk), brk, sizeof(*brk));
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_DAWR))
|
||||
set_dawr(brk);
|
||||
@ -842,7 +842,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||
* schedule DABR
|
||||
*/
|
||||
#ifndef CONFIG_HAVE_HW_BREAKPOINT
|
||||
if (unlikely(!hw_brk_match(&__get_cpu_var(current_brk), &new->thread.hw_brk)))
|
||||
if (unlikely(!hw_brk_match(this_cpu_ptr(¤t_brk), &new->thread.hw_brk)))
|
||||
__set_breakpoint(&new->thread.hw_brk);
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#endif
|
||||
@ -856,7 +856,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||
* Collect processor utilization data per process
|
||||
*/
|
||||
if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
|
||||
struct cpu_usage *cu = &__get_cpu_var(cpu_usage_array);
|
||||
struct cpu_usage *cu = this_cpu_ptr(&cpu_usage_array);
|
||||
long unsigned start_tb, current_tb;
|
||||
start_tb = old_thread->start_tb;
|
||||
cu->current_tb = current_tb = mfspr(SPRN_PURR);
|
||||
@ -866,7 +866,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
batch = &__get_cpu_var(ppc64_tlb_batch);
|
||||
batch = this_cpu_ptr(&ppc64_tlb_batch);
|
||||
if (batch->active) {
|
||||
current_thread_info()->local_flags |= _TLF_LAZY_MMU;
|
||||
if (batch->index)
|
||||
@ -889,7 +889,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
if (current_thread_info()->local_flags & _TLF_LAZY_MMU) {
|
||||
current_thread_info()->local_flags &= ~_TLF_LAZY_MMU;
|
||||
batch = &__get_cpu_var(ppc64_tlb_batch);
|
||||
batch = this_cpu_ptr(&ppc64_tlb_batch);
|
||||
batch->active = 1;
|
||||
}
|
||||
#endif /* CONFIG_PPC_BOOK3S_64 */
|
||||
@ -921,12 +921,8 @@ static void show_instructions(struct pt_regs *regs)
|
||||
pc = (unsigned long)phys_to_virt(pc);
|
||||
#endif
|
||||
|
||||
/* We use __get_user here *only* to avoid an OOPS on a
|
||||
* bad address because the pc *should* only be a
|
||||
* kernel address.
|
||||
*/
|
||||
if (!__kernel_text_address(pc) ||
|
||||
__get_user(instr, (unsigned int __user *)pc)) {
|
||||
probe_kernel_address((unsigned int __user *)pc, instr)) {
|
||||
printk(KERN_CONT "XXXXXXXX ");
|
||||
} else {
|
||||
if (regs->nip == pc)
|
||||
@ -1531,13 +1527,6 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
||||
int curr_frame = current->curr_ret_stack;
|
||||
extern void return_to_handler(void);
|
||||
unsigned long rth = (unsigned long)return_to_handler;
|
||||
unsigned long mrth = -1;
|
||||
#ifdef CONFIG_PPC64
|
||||
extern void mod_return_to_handler(void);
|
||||
rth = *(unsigned long *)rth;
|
||||
mrth = (unsigned long)mod_return_to_handler;
|
||||
mrth = *(unsigned long *)mrth;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
sp = (unsigned long) stack;
|
||||
@ -1562,7 +1551,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
||||
if (!firstframe || ip != lr) {
|
||||
printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
if ((ip == rth || ip == mrth) && curr_frame >= 0) {
|
||||
if ((ip == rth) && curr_frame >= 0) {
|
||||
printk(" (%pS)",
|
||||
(void *)current->ret_stack[curr_frame].ret);
|
||||
curr_frame--;
|
||||
@ -1665,12 +1654,3 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
|
||||
return ret;
|
||||
}
|
||||
|
||||
unsigned long randomize_et_dyn(unsigned long base)
|
||||
{
|
||||
unsigned long ret = PAGE_ALIGN(base + brk_rnd());
|
||||
|
||||
if (ret < base)
|
||||
return base;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -160,6 +160,12 @@ static struct ibm_pa_feature {
|
||||
{CPU_FTR_NODSISRALIGN, 0, 0, 1, 1, 1},
|
||||
{0, MMU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0},
|
||||
{CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
|
||||
/*
|
||||
* If the kernel doesn't support TM (ie. CONFIG_PPC_TRANSACTIONAL_MEM=n),
|
||||
* we don't want to turn on CPU_FTR_TM here, so we use CPU_FTR_TM_COMP
|
||||
* which is 0 if the kernel doesn't support TM.
|
||||
*/
|
||||
{CPU_FTR_TM_COMP, 0, 0, 22, 0, 0},
|
||||
};
|
||||
|
||||
static void __init scan_features(unsigned long node, const unsigned char *ftrs,
|
||||
@ -696,10 +702,7 @@ void __init early_init_devtree(void *params)
|
||||
reserve_crashkernel();
|
||||
early_reserve_mem();
|
||||
|
||||
/*
|
||||
* Ensure that total memory size is page-aligned, because otherwise
|
||||
* mark_bootmem() gets upset.
|
||||
*/
|
||||
/* Ensure that total memory size is page-aligned. */
|
||||
limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
|
||||
memblock_enforce_memory_limit(limit);
|
||||
|
||||
|
@ -113,17 +113,6 @@
|
||||
#define SENSOR_PREFIX "ibm,sensor-"
|
||||
#define cel_to_fahr(x) ((x*9/5)+32)
|
||||
|
||||
|
||||
/* Globals */
|
||||
static struct rtas_sensors sensors;
|
||||
static struct device_node *rtas_node = NULL;
|
||||
static unsigned long power_on_time = 0; /* Save the time the user set */
|
||||
static char progress_led[MAX_LINELENGTH];
|
||||
|
||||
static unsigned long rtas_tone_frequency = 1000;
|
||||
static unsigned long rtas_tone_volume = 0;
|
||||
|
||||
/* ****************STRUCTS******************************************* */
|
||||
struct individual_sensor {
|
||||
unsigned int token;
|
||||
unsigned int quant;
|
||||
@ -134,6 +123,15 @@ struct rtas_sensors {
|
||||
unsigned int quant;
|
||||
};
|
||||
|
||||
/* Globals */
|
||||
static struct rtas_sensors sensors;
|
||||
static struct device_node *rtas_node = NULL;
|
||||
static unsigned long power_on_time = 0; /* Save the time the user set */
|
||||
static char progress_led[MAX_LINELENGTH];
|
||||
|
||||
static unsigned long rtas_tone_frequency = 1000;
|
||||
static unsigned long rtas_tone_volume = 0;
|
||||
|
||||
/* ****************************************************************** */
|
||||
/* Declarations */
|
||||
static int ppc_rtas_sensors_show(struct seq_file *m, void *v);
|
||||
|
@ -1091,8 +1091,8 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
|
||||
}
|
||||
|
||||
/*
|
||||
* Call early during boot, before mem init or bootmem, to retrieve the RTAS
|
||||
* informations from the device-tree and allocate the RMO buffer for userland
|
||||
* Call early during boot, before mem init, to retrieve the RTAS
|
||||
* information from the device-tree and allocate the RMO buffer for userland
|
||||
* accesses.
|
||||
*/
|
||||
void __init rtas_initialize(void)
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -139,8 +139,8 @@ void machine_restart(char *cmd)
|
||||
void machine_power_off(void)
|
||||
{
|
||||
machine_shutdown();
|
||||
if (ppc_md.power_off)
|
||||
ppc_md.power_off();
|
||||
if (pm_power_off)
|
||||
pm_power_off();
|
||||
#ifdef CONFIG_SMP
|
||||
smp_send_stop();
|
||||
#endif
|
||||
@ -151,7 +151,7 @@ void machine_power_off(void)
|
||||
/* Used by the G5 thermal driver */
|
||||
EXPORT_SYMBOL_GPL(machine_power_off);
|
||||
|
||||
void (*pm_power_off)(void) = machine_power_off;
|
||||
void (*pm_power_off)(void);
|
||||
EXPORT_SYMBOL_GPL(pm_power_off);
|
||||
|
||||
void machine_halt(void)
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/cpu.h>
|
||||
@ -53,11 +52,6 @@ unsigned long ISA_DMA_THRESHOLD;
|
||||
unsigned int DMA_MODE_READ;
|
||||
unsigned int DMA_MODE_WRITE;
|
||||
|
||||
#ifdef CONFIG_VGA_CONSOLE
|
||||
unsigned long vgacon_remap_base;
|
||||
EXPORT_SYMBOL(vgacon_remap_base);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These are used in binfmt_elf.c to put aux entries on the stack
|
||||
* for each elf executable being started.
|
||||
@ -311,9 +305,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
irqstack_early_init();
|
||||
|
||||
/* set up the bootmem stuff with available memory */
|
||||
do_init_bootmem();
|
||||
if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
|
||||
initmem_init();
|
||||
if ( ppc_md.progress ) ppc_md.progress("setup_arch: initmem", 0x3eab);
|
||||
|
||||
#ifdef CONFIG_DUMMY_CONSOLE
|
||||
conswitchp = &dummy_con;
|
||||
|
@ -660,13 +660,11 @@ static void __init emergency_stack_init(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Called into from start_kernel this initializes bootmem, which is used
|
||||
* Called into from start_kernel this initializes memblock, which is used
|
||||
* to manage page allocation until mem_init is called.
|
||||
*/
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
ppc64_boot_msg(0x12, "Setup Arch");
|
||||
|
||||
*cmdline_p = boot_command_line;
|
||||
|
||||
/*
|
||||
@ -691,9 +689,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
exc_lvl_early_init();
|
||||
emergency_stack_init();
|
||||
|
||||
/* set up the bootmem stuff with available memory */
|
||||
do_init_bootmem();
|
||||
sparse_init();
|
||||
initmem_init();
|
||||
|
||||
#ifdef CONFIG_DUMMY_CONSOLE
|
||||
conswitchp = &dummy_con;
|
||||
@ -711,33 +707,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
if ((unsigned long)_stext & 0xffff)
|
||||
panic("Kernelbase not 64K-aligned (0x%lx)!\n",
|
||||
(unsigned long)_stext);
|
||||
|
||||
ppc64_boot_msg(0x15, "Setup Done");
|
||||
}
|
||||
|
||||
|
||||
/* ToDo: do something useful if ppc_md is not yet setup. */
|
||||
#define PPC64_LINUX_FUNCTION 0x0f000000
|
||||
#define PPC64_IPL_MESSAGE 0xc0000000
|
||||
#define PPC64_TERM_MESSAGE 0xb0000000
|
||||
|
||||
static void ppc64_do_msg(unsigned int src, const char *msg)
|
||||
{
|
||||
if (ppc_md.progress) {
|
||||
char buf[128];
|
||||
|
||||
sprintf(buf, "%08X\n", src);
|
||||
ppc_md.progress(buf, 0);
|
||||
snprintf(buf, 128, "%s", msg);
|
||||
ppc_md.progress(buf, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Print a boot progress message. */
|
||||
void ppc64_boot_msg(unsigned int src, const char *msg)
|
||||
{
|
||||
ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_IPL_MESSAGE|src, msg);
|
||||
printk("[boot]%04x %s\n", src, msg);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -243,7 +243,7 @@ void smp_muxed_ipi_message_pass(int cpu, int msg)
|
||||
|
||||
irqreturn_t smp_ipi_demux(void)
|
||||
{
|
||||
struct cpu_messages *info = &__get_cpu_var(ipi_message);
|
||||
struct cpu_messages *info = this_cpu_ptr(&ipi_message);
|
||||
unsigned int all;
|
||||
|
||||
mb(); /* order any irq clear */
|
||||
@ -442,9 +442,9 @@ void generic_mach_cpu_die(void)
|
||||
idle_task_exit();
|
||||
cpu = smp_processor_id();
|
||||
printk(KERN_DEBUG "CPU%d offline\n", cpu);
|
||||
__get_cpu_var(cpu_state) = CPU_DEAD;
|
||||
__this_cpu_write(cpu_state, CPU_DEAD);
|
||||
smp_wmb();
|
||||
while (__get_cpu_var(cpu_state) != CPU_UP_PREPARE)
|
||||
while (__this_cpu_read(cpu_state) != CPU_UP_PREPARE)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
|
@ -394,10 +394,10 @@ void ppc_enable_pmcs(void)
|
||||
ppc_set_pmu_inuse(1);
|
||||
|
||||
/* Only need to enable them once */
|
||||
if (__get_cpu_var(pmcs_enabled))
|
||||
if (__this_cpu_read(pmcs_enabled))
|
||||
return;
|
||||
|
||||
__get_cpu_var(pmcs_enabled) = 1;
|
||||
__this_cpu_write(pmcs_enabled, 1);
|
||||
|
||||
if (ppc_md.enable_pmcs)
|
||||
ppc_md.enable_pmcs();
|
||||
|
@ -458,9 +458,9 @@ static inline void clear_irq_work_pending(void)
|
||||
|
||||
DEFINE_PER_CPU(u8, irq_work_pending);
|
||||
|
||||
#define set_irq_work_pending_flag() __get_cpu_var(irq_work_pending) = 1
|
||||
#define test_irq_work_pending() __get_cpu_var(irq_work_pending)
|
||||
#define clear_irq_work_pending() __get_cpu_var(irq_work_pending) = 0
|
||||
#define set_irq_work_pending_flag() __this_cpu_write(irq_work_pending, 1)
|
||||
#define test_irq_work_pending() __this_cpu_read(irq_work_pending)
|
||||
#define clear_irq_work_pending() __this_cpu_write(irq_work_pending, 0)
|
||||
|
||||
#endif /* 32 vs 64 bit */
|
||||
|
||||
@ -482,8 +482,8 @@ void arch_irq_work_raise(void)
|
||||
static void __timer_interrupt(void)
|
||||
{
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
|
||||
struct clock_event_device *evt = &__get_cpu_var(decrementers);
|
||||
u64 *next_tb = this_cpu_ptr(&decrementers_next_tb);
|
||||
struct clock_event_device *evt = this_cpu_ptr(&decrementers);
|
||||
u64 now;
|
||||
|
||||
trace_timer_interrupt_entry(regs);
|
||||
@ -498,7 +498,7 @@ static void __timer_interrupt(void)
|
||||
*next_tb = ~(u64)0;
|
||||
if (evt->event_handler)
|
||||
evt->event_handler(evt);
|
||||
__get_cpu_var(irq_stat).timer_irqs_event++;
|
||||
__this_cpu_inc(irq_stat.timer_irqs_event);
|
||||
} else {
|
||||
now = *next_tb - now;
|
||||
if (now <= DECREMENTER_MAX)
|
||||
@ -506,13 +506,13 @@ static void __timer_interrupt(void)
|
||||
/* We may have raced with new irq work */
|
||||
if (test_irq_work_pending())
|
||||
set_dec(1);
|
||||
__get_cpu_var(irq_stat).timer_irqs_others++;
|
||||
__this_cpu_inc(irq_stat.timer_irqs_others);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* collect purr register values often, for accurate calculations */
|
||||
if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
|
||||
struct cpu_usage *cu = &__get_cpu_var(cpu_usage_array);
|
||||
struct cpu_usage *cu = this_cpu_ptr(&cpu_usage_array);
|
||||
cu->current_tb = mfspr(SPRN_PURR);
|
||||
}
|
||||
#endif
|
||||
@ -527,7 +527,7 @@ static void __timer_interrupt(void)
|
||||
void timer_interrupt(struct pt_regs * regs)
|
||||
{
|
||||
struct pt_regs *old_regs;
|
||||
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
|
||||
u64 *next_tb = this_cpu_ptr(&decrementers_next_tb);
|
||||
|
||||
/* Ensure a positive value is written to the decrementer, or else
|
||||
* some CPUs will continue to take decrementer exceptions.
|
||||
@ -813,7 +813,7 @@ static void __init clocksource_init(void)
|
||||
static int decrementer_set_next_event(unsigned long evt,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
__get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
|
||||
__this_cpu_write(decrementers_next_tb, get_tb_or_rtc() + evt);
|
||||
set_dec(evt);
|
||||
|
||||
/* We may have raced with new irq work */
|
||||
@ -833,7 +833,7 @@ static void decrementer_set_mode(enum clock_event_mode mode,
|
||||
/* Interrupt handler for the timer broadcast IPI */
|
||||
void tick_broadcast_ipi_handler(void)
|
||||
{
|
||||
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
|
||||
u64 *next_tb = this_cpu_ptr(&decrementers_next_tb);
|
||||
|
||||
*next_tb = get_tb_or_rtc();
|
||||
__timer_interrupt();
|
||||
@ -989,6 +989,7 @@ void GregorianDay(struct rtc_time * tm)
|
||||
|
||||
tm->tm_wday = day % 7;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(GregorianDay);
|
||||
|
||||
void to_tm(int tim, struct rtc_time * tm)
|
||||
{
|
||||
|
@ -295,7 +295,7 @@ long machine_check_early(struct pt_regs *regs)
|
||||
{
|
||||
long handled = 0;
|
||||
|
||||
__get_cpu_var(irq_stat).mce_exceptions++;
|
||||
__this_cpu_inc(irq_stat.mce_exceptions);
|
||||
|
||||
if (cur_cpu_spec && cur_cpu_spec->machine_check_early)
|
||||
handled = cur_cpu_spec->machine_check_early(regs);
|
||||
@ -304,7 +304,7 @@ long machine_check_early(struct pt_regs *regs)
|
||||
|
||||
long hmi_exception_realmode(struct pt_regs *regs)
|
||||
{
|
||||
__get_cpu_var(irq_stat).hmi_exceptions++;
|
||||
__this_cpu_inc(irq_stat.hmi_exceptions);
|
||||
|
||||
if (ppc_md.hmi_exception_early)
|
||||
ppc_md.hmi_exception_early(regs);
|
||||
@ -700,7 +700,7 @@ void machine_check_exception(struct pt_regs *regs)
|
||||
enum ctx_state prev_state = exception_enter();
|
||||
int recover = 0;
|
||||
|
||||
__get_cpu_var(irq_stat).mce_exceptions++;
|
||||
__this_cpu_inc(irq_stat.mce_exceptions);
|
||||
|
||||
/* See if any machine dependent calls. In theory, we would want
|
||||
* to call the CPU first, and call the ppc_md. one if the CPU
|
||||
@ -1519,7 +1519,7 @@ void vsx_unavailable_tm(struct pt_regs *regs)
|
||||
|
||||
void performance_monitor_exception(struct pt_regs *regs)
|
||||
{
|
||||
__get_cpu_var(irq_stat).pmu_irqs++;
|
||||
__this_cpu_inc(irq_stat.pmu_irqs);
|
||||
|
||||
perf_irq(regs);
|
||||
}
|
||||
|
@ -69,8 +69,12 @@ static void udbg_uart_putc(char c)
|
||||
|
||||
static int udbg_uart_getc_poll(void)
|
||||
{
|
||||
if (!udbg_uart_in || !(udbg_uart_in(UART_LSR) & LSR_DR))
|
||||
if (!udbg_uart_in)
|
||||
return -1;
|
||||
|
||||
if (!(udbg_uart_in(UART_LSR) & LSR_DR))
|
||||
return udbg_uart_in(UART_RBR);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <linux/user.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/memblock.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/sizes.h>
|
||||
@ -154,7 +153,7 @@ EXPORT_SYMBOL_GPL(kvm_release_hpt);
|
||||
* kvm_cma_reserve() - reserve area for kvm hash pagetable
|
||||
*
|
||||
* This function reserves memory from early allocator. It should be
|
||||
* called by arch specific code once the early allocator (memblock or bootmem)
|
||||
* called by arch specific code once the memblock allocator
|
||||
* has been activated and all other subsystems have already allocated/reserved
|
||||
* memory.
|
||||
*/
|
||||
|
@ -201,8 +201,6 @@ kvmppc_primary_no_guest:
|
||||
bge kvm_novcpu_exit /* another thread already exiting */
|
||||
li r3, NAPPING_NOVCPU
|
||||
stb r3, HSTATE_NAPPING(r13)
|
||||
li r3, 1
|
||||
stb r3, HSTATE_HWTHREAD_REQ(r13)
|
||||
|
||||
b kvm_do_nap
|
||||
|
||||
@ -293,6 +291,8 @@ kvm_start_guest:
|
||||
/* if we have no vcpu to run, go back to sleep */
|
||||
beq kvm_no_guest
|
||||
|
||||
kvm_secondary_got_guest:
|
||||
|
||||
/* Set HSTATE_DSCR(r13) to something sensible */
|
||||
ld r6, PACA_DSCR(r13)
|
||||
std r6, HSTATE_DSCR(r13)
|
||||
@ -318,27 +318,46 @@ kvm_start_guest:
|
||||
stwcx. r3, 0, r4
|
||||
bne 51b
|
||||
|
||||
/*
|
||||
* At this point we have finished executing in the guest.
|
||||
* We need to wait for hwthread_req to become zero, since
|
||||
* we may not turn on the MMU while hwthread_req is non-zero.
|
||||
* While waiting we also need to check if we get given a vcpu to run.
|
||||
*/
|
||||
kvm_no_guest:
|
||||
li r0, KVM_HWTHREAD_IN_NAP
|
||||
lbz r3, HSTATE_HWTHREAD_REQ(r13)
|
||||
cmpwi r3, 0
|
||||
bne 53f
|
||||
HMT_MEDIUM
|
||||
li r0, KVM_HWTHREAD_IN_KERNEL
|
||||
stb r0, HSTATE_HWTHREAD_STATE(r13)
|
||||
kvm_do_nap:
|
||||
/* Clear the runlatch bit before napping */
|
||||
mfspr r2, SPRN_CTRLF
|
||||
clrrdi r2, r2, 1
|
||||
mtspr SPRN_CTRLT, r2
|
||||
|
||||
/* need to recheck hwthread_req after a barrier, to avoid race */
|
||||
sync
|
||||
lbz r3, HSTATE_HWTHREAD_REQ(r13)
|
||||
cmpwi r3, 0
|
||||
bne 54f
|
||||
/*
|
||||
* We jump to power7_wakeup_loss, which will return to the caller
|
||||
* of power7_nap in the powernv cpu offline loop. The value we
|
||||
* put in r3 becomes the return value for power7_nap.
|
||||
*/
|
||||
li r3, LPCR_PECE0
|
||||
mfspr r4, SPRN_LPCR
|
||||
rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1
|
||||
mtspr SPRN_LPCR, r4
|
||||
isync
|
||||
std r0, HSTATE_SCRATCH0(r13)
|
||||
ptesync
|
||||
ld r0, HSTATE_SCRATCH0(r13)
|
||||
1: cmpd r0, r0
|
||||
bne 1b
|
||||
nap
|
||||
b .
|
||||
li r3, 0
|
||||
b power7_wakeup_loss
|
||||
|
||||
53: HMT_LOW
|
||||
ld r4, HSTATE_KVM_VCPU(r13)
|
||||
cmpdi r4, 0
|
||||
beq kvm_no_guest
|
||||
HMT_MEDIUM
|
||||
b kvm_secondary_got_guest
|
||||
|
||||
54: li r0, KVM_HWTHREAD_IN_KVM
|
||||
stb r0, HSTATE_HWTHREAD_STATE(r13)
|
||||
b kvm_no_guest
|
||||
|
||||
/******************************************************************************
|
||||
* *
|
||||
@ -2172,6 +2191,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206)
|
||||
* occurs, with PECE1, PECE0 and PECEDP set in LPCR. Also clear the
|
||||
* runlatch bit before napping.
|
||||
*/
|
||||
kvm_do_nap:
|
||||
mfspr r2, SPRN_CTRLF
|
||||
clrrdi r2, r2, 1
|
||||
mtspr SPRN_CTRLT, r2
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user