Merge branch 'x86/cpufeature' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into kvm/next
Topic branch for AVX512_4VNNIW and AVX512_4FMAPS support in KVM.
This commit is contained in:
commit
813ae37e6a
5
CREDITS
5
CREDITS
|
@ -1864,10 +1864,11 @@ S: The Netherlands
|
||||||
|
|
||||||
N: Martin Kepplinger
|
N: Martin Kepplinger
|
||||||
E: martink@posteo.de
|
E: martink@posteo.de
|
||||||
E: martin.kepplinger@theobroma-systems.com
|
E: martin.kepplinger@ginzinger.com
|
||||||
W: http://www.martinkepplinger.com
|
W: http://www.martinkepplinger.com
|
||||||
D: mma8452 accelerators iio driver
|
D: mma8452 accelerators iio driver
|
||||||
D: Kernel cleanups
|
D: pegasus_notetaker input driver
|
||||||
|
D: Kernel fixes and cleanups
|
||||||
S: Garnisonstraße 26
|
S: Garnisonstraße 26
|
||||||
S: 4020 Linz
|
S: 4020 Linz
|
||||||
S: Austria
|
S: Austria
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
What: state
|
What: /sys/devices/system/ibm_rtl/state
|
||||||
Date: Sep 2010
|
Date: Sep 2010
|
||||||
KernelVersion: 2.6.37
|
KernelVersion: 2.6.37
|
||||||
Contact: Vernon Mauery <vernux@us.ibm.com>
|
Contact: Vernon Mauery <vernux@us.ibm.com>
|
||||||
|
@ -10,7 +10,7 @@ Description: The state file allows a means by which to change in and
|
||||||
Users: The ibm-prtm userspace daemon uses this interface.
|
Users: The ibm-prtm userspace daemon uses this interface.
|
||||||
|
|
||||||
|
|
||||||
What: version
|
What: /sys/devices/system/ibm_rtl/version
|
||||||
Date: Sep 2010
|
Date: Sep 2010
|
||||||
KernelVersion: 2.6.37
|
KernelVersion: 2.6.37
|
||||||
Contact: Vernon Mauery <vernux@us.ibm.com>
|
Contact: Vernon Mauery <vernux@us.ibm.com>
|
||||||
|
|
|
@ -309,3 +309,4 @@ Version History
|
||||||
with a reshape in progress.
|
with a reshape in progress.
|
||||||
1.9.0 Add support for RAID level takeover/reshape/region size
|
1.9.0 Add support for RAID level takeover/reshape/region size
|
||||||
and set size reduction.
|
and set size reduction.
|
||||||
|
1.9.1 Fix activation of existing RAID 4/10 mapped devices
|
||||||
|
|
|
@ -24,7 +24,7 @@ Example:
|
||||||
reg = <0x61840000 0x4000>;
|
reg = <0x61840000 0x4000>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-clock";
|
compatible = "socionext,uniphier-ld11-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ Provided clocks:
|
||||||
21: USB3 ch1 PHY1
|
21: USB3 ch1 PHY1
|
||||||
|
|
||||||
|
|
||||||
Media I/O (MIO) clock
|
Media I/O (MIO) clock, SD clock
|
||||||
---------------------
|
-------------------------------
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
|
@ -52,10 +52,10 @@ Required properties:
|
||||||
"socionext,uniphier-ld4-mio-clock" - for LD4 SoC.
|
"socionext,uniphier-ld4-mio-clock" - for LD4 SoC.
|
||||||
"socionext,uniphier-pro4-mio-clock" - for Pro4 SoC.
|
"socionext,uniphier-pro4-mio-clock" - for Pro4 SoC.
|
||||||
"socionext,uniphier-sld8-mio-clock" - for sLD8 SoC.
|
"socionext,uniphier-sld8-mio-clock" - for sLD8 SoC.
|
||||||
"socionext,uniphier-pro5-mio-clock" - for Pro5 SoC.
|
"socionext,uniphier-pro5-sd-clock" - for Pro5 SoC.
|
||||||
"socionext,uniphier-pxs2-mio-clock" - for PXs2/LD6b SoC.
|
"socionext,uniphier-pxs2-sd-clock" - for PXs2/LD6b SoC.
|
||||||
"socionext,uniphier-ld11-mio-clock" - for LD11 SoC.
|
"socionext,uniphier-ld11-mio-clock" - for LD11 SoC.
|
||||||
"socionext,uniphier-ld20-mio-clock" - for LD20 SoC.
|
"socionext,uniphier-ld20-sd-clock" - for LD20 SoC.
|
||||||
- #clock-cells: should be 1.
|
- #clock-cells: should be 1.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@ -66,7 +66,7 @@ Example:
|
||||||
reg = <0x59810000 0x800>;
|
reg = <0x59810000 0x800>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-mio-clock";
|
compatible = "socionext,uniphier-ld11-mio-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ Example:
|
||||||
reg = <0x59820000 0x200>;
|
reg = <0x59820000 0x200>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-peri-clock";
|
compatible = "socionext,uniphier-ld11-peri-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,9 @@ Optional properties:
|
||||||
reset signal present internally in some host controller IC designs.
|
reset signal present internally in some host controller IC designs.
|
||||||
See Documentation/devicetree/bindings/reset/reset.txt for details.
|
See Documentation/devicetree/bindings/reset/reset.txt for details.
|
||||||
|
|
||||||
|
* reset-names: request name for using "resets" property. Must be "reset".
|
||||||
|
(It will be used together with "resets" property.)
|
||||||
|
|
||||||
* clocks: from common clock binding: handle to biu and ciu clocks for the
|
* clocks: from common clock binding: handle to biu and ciu clocks for the
|
||||||
bus interface unit clock and the card interface unit clock.
|
bus interface unit clock and the card interface unit clock.
|
||||||
|
|
||||||
|
@ -103,6 +106,8 @@ board specific portions as listed below.
|
||||||
interrupts = <0 75 0>;
|
interrupts = <0 75 0>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
resets = <&rst 20>;
|
||||||
|
reset-names = "reset";
|
||||||
};
|
};
|
||||||
|
|
||||||
[board specific internal DMA resources]
|
[board specific internal DMA resources]
|
||||||
|
|
|
@ -49,6 +49,7 @@ Optional port properties:
|
||||||
and
|
and
|
||||||
|
|
||||||
- phy-handle: See ethernet.txt file in the same directory.
|
- phy-handle: See ethernet.txt file in the same directory.
|
||||||
|
- phy-mode: See ethernet.txt file in the same directory.
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,16 @@ Required properties:
|
||||||
- "sys"
|
- "sys"
|
||||||
- "legacy"
|
- "legacy"
|
||||||
- "client"
|
- "client"
|
||||||
- resets: Must contain five entries for each entry in reset-names.
|
- resets: Must contain seven entries for each entry in reset-names.
|
||||||
See ../reset/reset.txt for details.
|
See ../reset/reset.txt for details.
|
||||||
- reset-names: Must include the following names
|
- reset-names: Must include the following names
|
||||||
- "core"
|
- "core"
|
||||||
- "mgmt"
|
- "mgmt"
|
||||||
- "mgmt-sticky"
|
- "mgmt-sticky"
|
||||||
- "pipe"
|
- "pipe"
|
||||||
|
- "pm"
|
||||||
|
- "aclk"
|
||||||
|
- "pclk"
|
||||||
- pinctrl-names : The pin control state names
|
- pinctrl-names : The pin control state names
|
||||||
- pinctrl-0: The "default" pinctrl state
|
- pinctrl-0: The "default" pinctrl state
|
||||||
- #interrupt-cells: specifies the number of cells needed to encode an
|
- #interrupt-cells: specifies the number of cells needed to encode an
|
||||||
|
@ -86,8 +89,10 @@ pcie0: pcie@f8000000 {
|
||||||
reg = <0x0 0xf8000000 0x0 0x2000000>, <0x0 0xfd000000 0x0 0x1000000>;
|
reg = <0x0 0xf8000000 0x0 0x2000000>, <0x0 0xfd000000 0x0 0x1000000>;
|
||||||
reg-names = "axi-base", "apb-base";
|
reg-names = "axi-base", "apb-base";
|
||||||
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
||||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>;
|
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE> ,
|
||||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe";
|
<&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>, <&cru SRST_A_PCIE>;
|
||||||
|
reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
|
||||||
|
"pm", "pclk", "aclk";
|
||||||
phys = <&pcie_phy>;
|
phys = <&pcie_phy>;
|
||||||
phy-names = "pcie-phy";
|
phy-names = "pcie-phy";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
|
|
@ -14,11 +14,6 @@ Required properies:
|
||||||
- #size-cells : The value of this property must be 1
|
- #size-cells : The value of this property must be 1
|
||||||
- ranges : defines mapping between pin controller node (parent) to
|
- ranges : defines mapping between pin controller node (parent) to
|
||||||
gpio-bank node (children).
|
gpio-bank node (children).
|
||||||
- interrupt-parent: phandle of the interrupt parent to which the external
|
|
||||||
GPIO interrupts are forwarded to.
|
|
||||||
- st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
|
|
||||||
which includes IRQ mux selection register, and the offset of the IRQ mux
|
|
||||||
selection register.
|
|
||||||
- pins-are-numbered: Specify the subnodes are using numbered pinmux to
|
- pins-are-numbered: Specify the subnodes are using numbered pinmux to
|
||||||
specify pins.
|
specify pins.
|
||||||
|
|
||||||
|
@ -37,6 +32,11 @@ Required properties:
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- reset: : Reference to the reset controller
|
- reset: : Reference to the reset controller
|
||||||
|
- interrupt-parent: phandle of the interrupt parent to which the external
|
||||||
|
GPIO interrupts are forwarded to.
|
||||||
|
- st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
|
||||||
|
which includes IRQ mux selection register, and the offset of the IRQ mux
|
||||||
|
selection register.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
||||||
|
|
|
@ -6,25 +6,25 @@ System reset
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
"socionext,uniphier-sld3-reset" - for PH1-sLD3 SoC.
|
"socionext,uniphier-sld3-reset" - for sLD3 SoC.
|
||||||
"socionext,uniphier-ld4-reset" - for PH1-LD4 SoC.
|
"socionext,uniphier-ld4-reset" - for LD4 SoC.
|
||||||
"socionext,uniphier-pro4-reset" - for PH1-Pro4 SoC.
|
"socionext,uniphier-pro4-reset" - for Pro4 SoC.
|
||||||
"socionext,uniphier-sld8-reset" - for PH1-sLD8 SoC.
|
"socionext,uniphier-sld8-reset" - for sLD8 SoC.
|
||||||
"socionext,uniphier-pro5-reset" - for PH1-Pro5 SoC.
|
"socionext,uniphier-pro5-reset" - for Pro5 SoC.
|
||||||
"socionext,uniphier-pxs2-reset" - for ProXstream2/PH1-LD6b SoC.
|
"socionext,uniphier-pxs2-reset" - for PXs2/LD6b SoC.
|
||||||
"socionext,uniphier-ld11-reset" - for PH1-LD11 SoC.
|
"socionext,uniphier-ld11-reset" - for LD11 SoC.
|
||||||
"socionext,uniphier-ld20-reset" - for PH1-LD20 SoC.
|
"socionext,uniphier-ld20-reset" - for LD20 SoC.
|
||||||
- #reset-cells: should be 1.
|
- #reset-cells: should be 1.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
sysctrl@61840000 {
|
sysctrl@61840000 {
|
||||||
compatible = "socionext,uniphier-ld20-sysctrl",
|
compatible = "socionext,uniphier-ld11-sysctrl",
|
||||||
"simple-mfd", "syscon";
|
"simple-mfd", "syscon";
|
||||||
reg = <0x61840000 0x4000>;
|
reg = <0x61840000 0x4000>;
|
||||||
|
|
||||||
reset {
|
reset {
|
||||||
compatible = "socionext,uniphier-ld20-reset";
|
compatible = "socionext,uniphier-ld11-reset";
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,30 +32,30 @@ Example:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Media I/O (MIO) reset
|
Media I/O (MIO) reset, SD reset
|
||||||
---------------------
|
-------------------------------
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
"socionext,uniphier-sld3-mio-reset" - for PH1-sLD3 SoC.
|
"socionext,uniphier-sld3-mio-reset" - for sLD3 SoC.
|
||||||
"socionext,uniphier-ld4-mio-reset" - for PH1-LD4 SoC.
|
"socionext,uniphier-ld4-mio-reset" - for LD4 SoC.
|
||||||
"socionext,uniphier-pro4-mio-reset" - for PH1-Pro4 SoC.
|
"socionext,uniphier-pro4-mio-reset" - for Pro4 SoC.
|
||||||
"socionext,uniphier-sld8-mio-reset" - for PH1-sLD8 SoC.
|
"socionext,uniphier-sld8-mio-reset" - for sLD8 SoC.
|
||||||
"socionext,uniphier-pro5-mio-reset" - for PH1-Pro5 SoC.
|
"socionext,uniphier-pro5-sd-reset" - for Pro5 SoC.
|
||||||
"socionext,uniphier-pxs2-mio-reset" - for ProXstream2/PH1-LD6b SoC.
|
"socionext,uniphier-pxs2-sd-reset" - for PXs2/LD6b SoC.
|
||||||
"socionext,uniphier-ld11-mio-reset" - for PH1-LD11 SoC.
|
"socionext,uniphier-ld11-mio-reset" - for LD11 SoC.
|
||||||
"socionext,uniphier-ld20-mio-reset" - for PH1-LD20 SoC.
|
"socionext,uniphier-ld20-sd-reset" - for LD20 SoC.
|
||||||
- #reset-cells: should be 1.
|
- #reset-cells: should be 1.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
mioctrl@59810000 {
|
mioctrl@59810000 {
|
||||||
compatible = "socionext,uniphier-ld20-mioctrl",
|
compatible = "socionext,uniphier-ld11-mioctrl",
|
||||||
"simple-mfd", "syscon";
|
"simple-mfd", "syscon";
|
||||||
reg = <0x59810000 0x800>;
|
reg = <0x59810000 0x800>;
|
||||||
|
|
||||||
reset {
|
reset {
|
||||||
compatible = "socionext,uniphier-ld20-mio-reset";
|
compatible = "socionext,uniphier-ld11-mio-reset";
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,24 +68,24 @@ Peripheral reset
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
"socionext,uniphier-ld4-peri-reset" - for PH1-LD4 SoC.
|
"socionext,uniphier-ld4-peri-reset" - for LD4 SoC.
|
||||||
"socionext,uniphier-pro4-peri-reset" - for PH1-Pro4 SoC.
|
"socionext,uniphier-pro4-peri-reset" - for Pro4 SoC.
|
||||||
"socionext,uniphier-sld8-peri-reset" - for PH1-sLD8 SoC.
|
"socionext,uniphier-sld8-peri-reset" - for sLD8 SoC.
|
||||||
"socionext,uniphier-pro5-peri-reset" - for PH1-Pro5 SoC.
|
"socionext,uniphier-pro5-peri-reset" - for Pro5 SoC.
|
||||||
"socionext,uniphier-pxs2-peri-reset" - for ProXstream2/PH1-LD6b SoC.
|
"socionext,uniphier-pxs2-peri-reset" - for PXs2/LD6b SoC.
|
||||||
"socionext,uniphier-ld11-peri-reset" - for PH1-LD11 SoC.
|
"socionext,uniphier-ld11-peri-reset" - for LD11 SoC.
|
||||||
"socionext,uniphier-ld20-peri-reset" - for PH1-LD20 SoC.
|
"socionext,uniphier-ld20-peri-reset" - for LD20 SoC.
|
||||||
- #reset-cells: should be 1.
|
- #reset-cells: should be 1.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
perictrl@59820000 {
|
perictrl@59820000 {
|
||||||
compatible = "socionext,uniphier-ld20-perictrl",
|
compatible = "socionext,uniphier-ld11-perictrl",
|
||||||
"simple-mfd", "syscon";
|
"simple-mfd", "syscon";
|
||||||
reg = <0x59820000 0x200>;
|
reg = <0x59820000 0x200>;
|
||||||
|
|
||||||
reset {
|
reset {
|
||||||
compatible = "socionext,uniphier-ld20-peri-reset";
|
compatible = "socionext,uniphier-ld11-peri-reset";
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
Binding for Cadence UART Controller
|
Binding for Cadence UART Controller
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : should be "cdns,uart-r1p8", or "xlnx,xuartps"
|
- compatible :
|
||||||
|
Use "xlnx,xuartps","cdns,uart-r1p8" for Zynq-7xxx SoC.
|
||||||
|
Use "xlnx,zynqmp-uart","cdns,uart-r1p12" for Zynq Ultrascale+ MPSoC.
|
||||||
- reg: Should contain UART controller registers location and length.
|
- reg: Should contain UART controller registers location and length.
|
||||||
- interrupts: Should contain UART controller interrupts.
|
- interrupts: Should contain UART controller interrupts.
|
||||||
- clocks: Must contain phandles to the UART clocks
|
- clocks: Must contain phandles to the UART clocks
|
||||||
|
|
|
@ -9,6 +9,14 @@ Required properties:
|
||||||
- "renesas,scifb-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFB compatible UART.
|
- "renesas,scifb-r8a73a4" for R8A73A4 (R-Mobile APE6) SCIFB compatible UART.
|
||||||
- "renesas,scifa-r8a7740" for R8A7740 (R-Mobile A1) SCIFA compatible UART.
|
- "renesas,scifa-r8a7740" for R8A7740 (R-Mobile A1) SCIFA compatible UART.
|
||||||
- "renesas,scifb-r8a7740" for R8A7740 (R-Mobile A1) SCIFB compatible UART.
|
- "renesas,scifb-r8a7740" for R8A7740 (R-Mobile A1) SCIFB compatible UART.
|
||||||
|
- "renesas,scif-r8a7743" for R8A7743 (RZ/G1M) SCIF compatible UART.
|
||||||
|
- "renesas,scifa-r8a7743" for R8A7743 (RZ/G1M) SCIFA compatible UART.
|
||||||
|
- "renesas,scifb-r8a7743" for R8A7743 (RZ/G1M) SCIFB compatible UART.
|
||||||
|
- "renesas,hscif-r8a7743" for R8A7743 (RZ/G1M) HSCIF compatible UART.
|
||||||
|
- "renesas,scif-r8a7745" for R8A7745 (RZ/G1E) SCIF compatible UART.
|
||||||
|
- "renesas,scifa-r8a7745" for R8A7745 (RZ/G1E) SCIFA compatible UART.
|
||||||
|
- "renesas,scifb-r8a7745" for R8A7745 (RZ/G1E) SCIFB compatible UART.
|
||||||
|
- "renesas,hscif-r8a7745" for R8A7745 (RZ/G1E) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF compatible UART.
|
- "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF compatible UART.
|
||||||
- "renesas,scif-r8a7779" for R8A7779 (R-Car H1) SCIF compatible UART.
|
- "renesas,scif-r8a7779" for R8A7779 (R-Car H1) SCIF compatible UART.
|
||||||
- "renesas,scif-r8a7790" for R8A7790 (R-Car H2) SCIF compatible UART.
|
- "renesas,scif-r8a7790" for R8A7790 (R-Car H2) SCIF compatible UART.
|
||||||
|
|
|
@ -28,10 +28,7 @@ Refer to phy/phy-bindings.txt for generic phy consumer properties
|
||||||
- g-use-dma: enable dma usage in gadget driver.
|
- g-use-dma: enable dma usage in gadget driver.
|
||||||
- g-rx-fifo-size: size of rx fifo size in gadget mode.
|
- g-rx-fifo-size: size of rx fifo size in gadget mode.
|
||||||
- g-np-tx-fifo-size: size of non-periodic tx fifo size in gadget mode.
|
- g-np-tx-fifo-size: size of non-periodic tx fifo size in gadget mode.
|
||||||
|
- g-tx-fifo-size: size of periodic tx fifo per endpoint (except ep0) in gadget mode.
|
||||||
Deprecated properties:
|
|
||||||
- g-tx-fifo-size: size of periodic tx fifo per endpoint (except ep0)
|
|
||||||
in gadget mode.
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
|
@ -447,7 +447,6 @@ prototypes:
|
||||||
int (*flush) (struct file *);
|
int (*flush) (struct file *);
|
||||||
int (*release) (struct inode *, struct file *);
|
int (*release) (struct inode *, struct file *);
|
||||||
int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
|
int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
|
||||||
int (*aio_fsync) (struct kiocb *, int datasync);
|
|
||||||
int (*fasync) (int, struct file *, int);
|
int (*fasync) (int, struct file *, int);
|
||||||
int (*lock) (struct file *, int, struct file_lock *);
|
int (*lock) (struct file *, int, struct file_lock *);
|
||||||
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
|
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
|
||||||
|
|
|
@ -828,7 +828,6 @@ struct file_operations {
|
||||||
int (*flush) (struct file *, fl_owner_t id);
|
int (*flush) (struct file *, fl_owner_t id);
|
||||||
int (*release) (struct inode *, struct file *);
|
int (*release) (struct inode *, struct file *);
|
||||||
int (*fsync) (struct file *, loff_t, loff_t, int datasync);
|
int (*fsync) (struct file *, loff_t, loff_t, int datasync);
|
||||||
int (*aio_fsync) (struct kiocb *, int datasync);
|
|
||||||
int (*fasync) (int, struct file *, int);
|
int (*fasync) (int, struct file *, int);
|
||||||
int (*lock) (struct file *, int, struct file_lock *);
|
int (*lock) (struct file *, int, struct file_lock *);
|
||||||
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
|
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
|
||||||
|
|
|
@ -6,7 +6,7 @@ Note that it only applies to the new descriptor-based interface. For a
|
||||||
description of the deprecated integer-based GPIO interface please refer to
|
description of the deprecated integer-based GPIO interface please refer to
|
||||||
gpio-legacy.txt (actually, there is no real mapping possible with the old
|
gpio-legacy.txt (actually, there is no real mapping possible with the old
|
||||||
interface; you just fetch an integer from somewhere and request the
|
interface; you just fetch an integer from somewhere and request the
|
||||||
corresponding GPIO.
|
corresponding GPIO).
|
||||||
|
|
||||||
All platforms can enable the GPIO library, but if the platform strictly
|
All platforms can enable the GPIO library, but if the platform strictly
|
||||||
requires GPIO functionality to be present, it needs to select GPIOLIB from its
|
requires GPIO functionality to be present, it needs to select GPIOLIB from its
|
||||||
|
@ -162,6 +162,9 @@ The driver controlling "foo.0" will then be able to obtain its GPIOs as follows:
|
||||||
|
|
||||||
Since the "led" GPIOs are mapped as active-high, this example will switch their
|
Since the "led" GPIOs are mapped as active-high, this example will switch their
|
||||||
signals to 1, i.e. enabling the LEDs. And for the "power" GPIO, which is mapped
|
signals to 1, i.e. enabling the LEDs. And for the "power" GPIO, which is mapped
|
||||||
as active-low, its actual signal will be 0 after this code. Contrary to the legacy
|
as active-low, its actual signal will be 0 after this code. Contrary to the
|
||||||
integer GPIO interface, the active-low property is handled during mapping and is
|
legacy integer GPIO interface, the active-low property is handled during
|
||||||
thus transparent to GPIO consumers.
|
mapping and is thus transparent to GPIO consumers.
|
||||||
|
|
||||||
|
A set of functions such as gpiod_set_value() is available to work with
|
||||||
|
the new descriptor-oriented interface.
|
||||||
|
|
|
@ -29,8 +29,8 @@ A: There are always two trees (git repositories) in play. Both are driven
|
||||||
Linus, and net-next is where the new code goes for the future release.
|
Linus, and net-next is where the new code goes for the future release.
|
||||||
You can find the trees here:
|
You can find the trees here:
|
||||||
|
|
||||||
http://git.kernel.org/?p=linux/kernel/git/davem/net.git
|
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
|
||||||
http://git.kernel.org/?p=linux/kernel/git/davem/net-next.git
|
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git
|
||||||
|
|
||||||
Q: How often do changes from these trees make it to the mainline Linus tree?
|
Q: How often do changes from these trees make it to the mainline Linus tree?
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ Q: So where are we now in this cycle?
|
||||||
|
|
||||||
A: Load the mainline (Linus) page here:
|
A: Load the mainline (Linus) page here:
|
||||||
|
|
||||||
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
|
||||||
|
|
||||||
and note the top of the "tags" section. If it is rc1, it is early
|
and note the top of the "tags" section. If it is rc1, it is early
|
||||||
in the dev cycle. If it was tagged rc7 a week ago, then a release
|
in the dev cycle. If it was tagged rc7 a week ago, then a release
|
||||||
|
@ -123,7 +123,7 @@ A: Normally Greg Kroah-Hartman collects stable commits himself, but
|
||||||
|
|
||||||
It contains the patches which Dave has selected, but not yet handed
|
It contains the patches which Dave has selected, but not yet handed
|
||||||
off to Greg. If Greg already has the patch, then it will be here:
|
off to Greg. If Greg already has the patch, then it will be here:
|
||||||
http://git.kernel.org/cgit/linux/kernel/git/stable/stable-queue.git
|
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git
|
||||||
|
|
||||||
A quick way to find whether the patch is in this stable-queue is
|
A quick way to find whether the patch is in this stable-queue is
|
||||||
to simply clone the repo, and then git grep the mainline commit ID, e.g.
|
to simply clone the repo, and then git grep the mainline commit ID, e.g.
|
||||||
|
|
|
@ -33,24 +33,6 @@ nf_conntrack_events - BOOLEAN
|
||||||
If this option is enabled, the connection tracking code will
|
If this option is enabled, the connection tracking code will
|
||||||
provide userspace with connection tracking events via ctnetlink.
|
provide userspace with connection tracking events via ctnetlink.
|
||||||
|
|
||||||
nf_conntrack_events_retry_timeout - INTEGER (seconds)
|
|
||||||
default 15
|
|
||||||
|
|
||||||
This option is only relevant when "reliable connection tracking
|
|
||||||
events" are used. Normally, ctnetlink is "lossy", that is,
|
|
||||||
events are normally dropped when userspace listeners can't keep up.
|
|
||||||
|
|
||||||
Userspace can request "reliable event mode". When this mode is
|
|
||||||
active, the conntrack will only be destroyed after the event was
|
|
||||||
delivered. If event delivery fails, the kernel periodically
|
|
||||||
re-tries to send the event to userspace.
|
|
||||||
|
|
||||||
This is the maximum interval the kernel should use when re-trying
|
|
||||||
to deliver the destroy event.
|
|
||||||
|
|
||||||
A higher number means there will be fewer delivery retries and it
|
|
||||||
will take longer for a backlog to be processed.
|
|
||||||
|
|
||||||
nf_conntrack_expect_max - INTEGER
|
nf_conntrack_expect_max - INTEGER
|
||||||
Maximum size of expectation table. Default value is
|
Maximum size of expectation table. Default value is
|
||||||
nf_conntrack_buckets / 256. Minimum is 1.
|
nf_conntrack_buckets / 256. Minimum is 1.
|
||||||
|
|
68
MAINTAINERS
68
MAINTAINERS
|
@ -1442,6 +1442,7 @@ F: drivers/cpufreq/mvebu-cpufreq.c
|
||||||
F: arch/arm/configs/mvebu_*_defconfig
|
F: arch/arm/configs/mvebu_*_defconfig
|
||||||
|
|
||||||
ARM/Marvell Berlin SoC support
|
ARM/Marvell Berlin SoC support
|
||||||
|
M: Jisheng Zhang <jszhang@marvell.com>
|
||||||
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -2551,15 +2552,18 @@ S: Supported
|
||||||
F: drivers/net/ethernet/broadcom/genet/
|
F: drivers/net/ethernet/broadcom/genet/
|
||||||
|
|
||||||
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
|
||||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
M: Rasesh Mody <rasesh.mody@cavium.com>
|
||||||
M: Dept-HSGLinuxNICDev@qlogic.com
|
M: Harish Patil <harish.patil@cavium.com>
|
||||||
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/broadcom/bnx2.*
|
F: drivers/net/ethernet/broadcom/bnx2.*
|
||||||
F: drivers/net/ethernet/broadcom/bnx2_*
|
F: drivers/net/ethernet/broadcom/bnx2_*
|
||||||
|
|
||||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Ariel Elior <ariel.elior@qlogic.com>
|
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||||
|
M: Ariel Elior <ariel.elior@cavium.com>
|
||||||
|
M: everest-linux-l2@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/broadcom/bnx2x/
|
F: drivers/net/ethernet/broadcom/bnx2x/
|
||||||
|
@ -2766,7 +2770,9 @@ S: Supported
|
||||||
F: drivers/scsi/bfa/
|
F: drivers/scsi/bfa/
|
||||||
|
|
||||||
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Rasesh Mody <rasesh.mody@qlogic.com>
|
M: Rasesh Mody <rasesh.mody@cavium.com>
|
||||||
|
M: Sudarsana Kalluru <sudarsana.kalluru@cavium.com>
|
||||||
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/brocade/bna/
|
F: drivers/net/ethernet/brocade/bna/
|
||||||
|
@ -5287,6 +5293,12 @@ M: Joe Perches <joe@perches.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: scripts/get_maintainer.pl
|
F: scripts/get_maintainer.pl
|
||||||
|
|
||||||
|
GENWQE (IBM Generic Workqueue Card)
|
||||||
|
M: Frank Haverkamp <haver@linux.vnet.ibm.com>
|
||||||
|
M: Gabriel Krisman Bertazi <krisman@linux.vnet.ibm.com>
|
||||||
|
S: Supported
|
||||||
|
F: drivers/misc/genwqe/
|
||||||
|
|
||||||
GFS2 FILE SYSTEM
|
GFS2 FILE SYSTEM
|
||||||
M: Steven Whitehouse <swhiteho@redhat.com>
|
M: Steven Whitehouse <swhiteho@redhat.com>
|
||||||
M: Bob Peterson <rpeterso@redhat.com>
|
M: Bob Peterson <rpeterso@redhat.com>
|
||||||
|
@ -7913,6 +7925,10 @@ F: mm/
|
||||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||||
M: David Woodhouse <dwmw2@infradead.org>
|
M: David Woodhouse <dwmw2@infradead.org>
|
||||||
M: Brian Norris <computersforpeace@gmail.com>
|
M: Brian Norris <computersforpeace@gmail.com>
|
||||||
|
M: Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||||
|
M: Marek Vasut <marek.vasut@gmail.com>
|
||||||
|
M: Richard Weinberger <richard@nod.at>
|
||||||
|
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||||
L: linux-mtd@lists.infradead.org
|
L: linux-mtd@lists.infradead.org
|
||||||
W: http://www.linux-mtd.infradead.org/
|
W: http://www.linux-mtd.infradead.org/
|
||||||
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||||
|
@ -8100,6 +8116,7 @@ S: Maintained
|
||||||
F: drivers/media/dvb-frontends/mn88473*
|
F: drivers/media/dvb-frontends/mn88473*
|
||||||
|
|
||||||
MODULE SUPPORT
|
MODULE SUPPORT
|
||||||
|
M: Jessica Yu <jeyu@redhat.com>
|
||||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/module.h
|
F: include/linux/module.h
|
||||||
|
@ -8509,11 +8526,10 @@ F: Documentation/devicetree/bindings/net/wireless/
|
||||||
F: drivers/net/wireless/
|
F: drivers/net/wireless/
|
||||||
|
|
||||||
NETXEN (1/10) GbE SUPPORT
|
NETXEN (1/10) GbE SUPPORT
|
||||||
M: Manish Chopra <manish.chopra@qlogic.com>
|
M: Manish Chopra <manish.chopra@cavium.com>
|
||||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
M: Rahul Verma <rahul.verma@cavium.com>
|
||||||
M: Rajesh Borundia <rajesh.borundia@qlogic.com>
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.qlogic.com
|
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/netxen/
|
F: drivers/net/ethernet/qlogic/netxen/
|
||||||
|
|
||||||
|
@ -9319,7 +9335,7 @@ PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
|
||||||
M: Keith Busch <keith.busch@intel.com>
|
M: Keith Busch <keith.busch@intel.com>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/pci/vmd.c
|
F: drivers/pci/host/vmd.c
|
||||||
|
|
||||||
PCIE DRIVER FOR ST SPEAR13XX
|
PCIE DRIVER FOR ST SPEAR13XX
|
||||||
M: Pratyush Anand <pratyush.anand@gmail.com>
|
M: Pratyush Anand <pratyush.anand@gmail.com>
|
||||||
|
@ -9889,33 +9905,32 @@ F: Documentation/scsi/LICENSE.qla4xxx
|
||||||
F: drivers/scsi/qla4xxx/
|
F: drivers/scsi/qla4xxx/
|
||||||
|
|
||||||
QLOGIC QLA3XXX NETWORK DRIVER
|
QLOGIC QLA3XXX NETWORK DRIVER
|
||||||
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
M: Ron Mercer <ron.mercer@qlogic.com>
|
|
||||||
M: linux-driver@qlogic.com
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/networking/LICENSE.qla3xxx
|
F: Documentation/networking/LICENSE.qla3xxx
|
||||||
F: drivers/net/ethernet/qlogic/qla3xxx.*
|
F: drivers/net/ethernet/qlogic/qla3xxx.*
|
||||||
|
|
||||||
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
||||||
M: Dept-GELinuxNICDev@qlogic.com
|
M: Harish Patil <harish.patil@cavium.com>
|
||||||
|
M: Manish Chopra <manish.chopra@cavium.com>
|
||||||
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qlcnic/
|
F: drivers/net/ethernet/qlogic/qlcnic/
|
||||||
|
|
||||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||||
M: Harish Patil <harish.patil@qlogic.com>
|
M: Harish Patil <harish.patil@cavium.com>
|
||||||
M: Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
|
M: Manish Chopra <manish.chopra@cavium.com>
|
||||||
M: Dept-GELinuxNICDev@qlogic.com
|
M: Dept-GELinuxNICDev@cavium.com
|
||||||
M: linux-driver@qlogic.com
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qlge/
|
F: drivers/net/ethernet/qlogic/qlge/
|
||||||
|
|
||||||
QLOGIC QL4xxx ETHERNET DRIVER
|
QLOGIC QL4xxx ETHERNET DRIVER
|
||||||
M: Yuval Mintz <Yuval.Mintz@qlogic.com>
|
M: Yuval Mintz <Yuval.Mintz@cavium.com>
|
||||||
M: Ariel Elior <Ariel.Elior@qlogic.com>
|
M: Ariel Elior <Ariel.Elior@cavium.com>
|
||||||
M: everest-linux-l2@qlogic.com
|
M: everest-linux-l2@cavium.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qed/
|
F: drivers/net/ethernet/qlogic/qed/
|
||||||
|
@ -11393,6 +11408,17 @@ W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/clk/spear/
|
F: drivers/clk/spear/
|
||||||
|
|
||||||
|
SPI NOR SUBSYSTEM
|
||||||
|
M: Cyrille Pitchen <cyrille.pitchen@atmel.com>
|
||||||
|
M: Marek Vasut <marek.vasut@gmail.com>
|
||||||
|
L: linux-mtd@lists.infradead.org
|
||||||
|
W: http://www.linux-mtd.infradead.org/
|
||||||
|
Q: http://patchwork.ozlabs.org/project/linux-mtd/list/
|
||||||
|
T: git git://github.com/spi-nor/linux.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/mtd/spi-nor/
|
||||||
|
F: include/linux/mtd/spi-nor.h
|
||||||
|
|
||||||
SPI SUBSYSTEM
|
SPI SUBSYSTEM
|
||||||
M: Mark Brown <broonie@kernel.org>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
L: linux-spi@vger.kernel.org
|
L: linux-spi@vger.kernel.org
|
||||||
|
@ -12772,6 +12798,7 @@ F: include/uapi/linux/virtio_console.h
|
||||||
|
|
||||||
VIRTIO CORE, NET AND BLOCK DRIVERS
|
VIRTIO CORE, NET AND BLOCK DRIVERS
|
||||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||||
|
M: Jason Wang <jasowang@redhat.com>
|
||||||
L: virtualization@lists.linux-foundation.org
|
L: virtualization@lists.linux-foundation.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/virtio/
|
F: Documentation/devicetree/bindings/virtio/
|
||||||
|
@ -12802,6 +12829,7 @@ F: include/uapi/linux/virtio_gpu.h
|
||||||
|
|
||||||
VIRTIO HOST (VHOST)
|
VIRTIO HOST (VHOST)
|
||||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||||
|
M: Jason Wang <jasowang@redhat.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
L: virtualization@lists.linux-foundation.org
|
L: virtualization@lists.linux-foundation.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
|
12
Makefile
12
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc5
|
||||||
NAME = Psychotic Stoned Sheep
|
NAME = Psychotic Stoned Sheep
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -370,7 +370,7 @@ LDFLAGS_MODULE =
|
||||||
CFLAGS_KERNEL =
|
CFLAGS_KERNEL =
|
||||||
AFLAGS_KERNEL =
|
AFLAGS_KERNEL =
|
||||||
LDFLAGS_vmlinux =
|
LDFLAGS_vmlinux =
|
||||||
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im
|
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized
|
||||||
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
|
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
|
||||||
|
|
||||||
|
|
||||||
|
@ -620,7 +620,6 @@ ARCH_CFLAGS :=
|
||||||
include arch/$(SRCARCH)/Makefile
|
include arch/$(SRCARCH)/Makefile
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,)
|
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
||||||
|
|
||||||
ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
|
ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
|
||||||
|
@ -629,15 +628,18 @@ KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||||
KBUILD_CFLAGS += -Os
|
KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
|
||||||
else
|
else
|
||||||
ifdef CONFIG_PROFILE_ALL_BRANCHES
|
ifdef CONFIG_PROFILE_ALL_BRANCHES
|
||||||
KBUILD_CFLAGS += -O2
|
KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
|
||||||
else
|
else
|
||||||
KBUILD_CFLAGS += -O2
|
KBUILD_CFLAGS += -O2
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
KBUILD_CFLAGS += $(call cc-ifversion, -lt, 0409, \
|
||||||
|
$(call cc-disable-warning,maybe-uninitialized,))
|
||||||
|
|
||||||
# Tell gcc to never replace conditional load with a non-conditional one
|
# Tell gcc to never replace conditional load with a non-conditional one
|
||||||
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,8 @@ config ARC
|
||||||
select PERF_USE_VMALLOC
|
select PERF_USE_VMALLOC
|
||||||
select HAVE_DEBUG_STACKOVERFLOW
|
select HAVE_DEBUG_STACKOVERFLOW
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
|
select HAVE_KERNEL_GZIP
|
||||||
|
select HAVE_KERNEL_LZMA
|
||||||
|
|
||||||
config MIGHT_HAVE_PCI
|
config MIGHT_HAVE_PCI
|
||||||
bool
|
bool
|
||||||
|
@ -186,14 +188,6 @@ if SMP
|
||||||
config ARC_HAS_COH_CACHES
|
config ARC_HAS_COH_CACHES
|
||||||
def_bool n
|
def_bool n
|
||||||
|
|
||||||
config ARC_MCIP
|
|
||||||
bool "ARConnect Multicore IP (MCIP) Support "
|
|
||||||
depends on ISA_ARCV2
|
|
||||||
help
|
|
||||||
This IP block enables SMP in ARC-HS38 cores.
|
|
||||||
It provides for cross-core interrupts, multi-core debug
|
|
||||||
hardware semaphores, shared memory,....
|
|
||||||
|
|
||||||
config NR_CPUS
|
config NR_CPUS
|
||||||
int "Maximum number of CPUs (2-4096)"
|
int "Maximum number of CPUs (2-4096)"
|
||||||
range 2 4096
|
range 2 4096
|
||||||
|
@ -211,6 +205,15 @@ config ARC_SMP_HALT_ON_RESET
|
||||||
|
|
||||||
endif #SMP
|
endif #SMP
|
||||||
|
|
||||||
|
config ARC_MCIP
|
||||||
|
bool "ARConnect Multicore IP (MCIP) Support "
|
||||||
|
depends on ISA_ARCV2
|
||||||
|
default y if SMP
|
||||||
|
help
|
||||||
|
This IP block enables SMP in ARC-HS38 cores.
|
||||||
|
It provides for cross-core interrupts, multi-core debug
|
||||||
|
hardware semaphores, shared memory,....
|
||||||
|
|
||||||
menuconfig ARC_CACHE
|
menuconfig ARC_CACHE
|
||||||
bool "Enable Cache Support"
|
bool "Enable Cache Support"
|
||||||
default y
|
default y
|
||||||
|
@ -537,14 +540,6 @@ config ARC_DBG_TLB_PARANOIA
|
||||||
bool "Paranoia Checks in Low Level TLB Handlers"
|
bool "Paranoia Checks in Low Level TLB Handlers"
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config ARC_DBG_TLB_MISS_COUNT
|
|
||||||
bool "Profile TLB Misses"
|
|
||||||
default n
|
|
||||||
select DEBUG_FS
|
|
||||||
help
|
|
||||||
Counts number of I and D TLB Misses and exports them via Debugfs
|
|
||||||
The counters can be cleared via Debugfs as well
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
config ARC_UBOOT_SUPPORT
|
config ARC_UBOOT_SUPPORT
|
||||||
|
|
|
@ -71,7 +71,9 @@ cflags-$(CONFIG_ARC_DW2_UNWIND) += -fasynchronous-unwind-tables $(cfi)
|
||||||
ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||||
# Generic build system uses -O2, we want -O3
|
# Generic build system uses -O2, we want -O3
|
||||||
# Note: No need to add to cflags-y as that happens anyways
|
# Note: No need to add to cflags-y as that happens anyways
|
||||||
ARCH_CFLAGS += -O3
|
#
|
||||||
|
# Disable the false maybe-uninitialized warings gcc spits out at -O3
|
||||||
|
ARCH_CFLAGS += -O3 $(call cc-disable-warning,maybe-uninitialized,)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# small data is default for elf32 tool-chain. If not usable, disable it
|
# small data is default for elf32 tool-chain. If not usable, disable it
|
||||||
|
|
|
@ -14,9 +14,15 @@ UIMAGE_ENTRYADDR = $(LINUX_START_TEXT)
|
||||||
|
|
||||||
suffix-y := bin
|
suffix-y := bin
|
||||||
suffix-$(CONFIG_KERNEL_GZIP) := gz
|
suffix-$(CONFIG_KERNEL_GZIP) := gz
|
||||||
|
suffix-$(CONFIG_KERNEL_LZMA) := lzma
|
||||||
|
|
||||||
targets += uImage uImage.bin uImage.gz
|
targets += uImage
|
||||||
extra-y += vmlinux.bin vmlinux.bin.gz
|
targets += uImage.bin
|
||||||
|
targets += uImage.gz
|
||||||
|
targets += uImage.lzma
|
||||||
|
extra-y += vmlinux.bin
|
||||||
|
extra-y += vmlinux.bin.gz
|
||||||
|
extra-y += vmlinux.bin.lzma
|
||||||
|
|
||||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
@ -24,12 +30,18 @@ $(obj)/vmlinux.bin: vmlinux FORCE
|
||||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||||
$(call if_changed,gzip)
|
$(call if_changed,gzip)
|
||||||
|
|
||||||
|
$(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE
|
||||||
|
$(call if_changed,lzma)
|
||||||
|
|
||||||
$(obj)/uImage.bin: $(obj)/vmlinux.bin FORCE
|
$(obj)/uImage.bin: $(obj)/vmlinux.bin FORCE
|
||||||
$(call if_changed,uimage,none)
|
$(call if_changed,uimage,none)
|
||||||
|
|
||||||
$(obj)/uImage.gz: $(obj)/vmlinux.bin.gz FORCE
|
$(obj)/uImage.gz: $(obj)/vmlinux.bin.gz FORCE
|
||||||
$(call if_changed,uimage,gzip)
|
$(call if_changed,uimage,gzip)
|
||||||
|
|
||||||
|
$(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma FORCE
|
||||||
|
$(call if_changed,uimage,lzma)
|
||||||
|
|
||||||
$(obj)/uImage: $(obj)/uImage.$(suffix-y)
|
$(obj)/uImage: $(obj)/uImage.$(suffix-y)
|
||||||
@ln -sf $(notdir $<) $@
|
@ln -sf $(notdir $<) $@
|
||||||
@echo ' Image $@ is ready'
|
@echo ' Image $@ is ready'
|
||||||
|
|
|
@ -71,7 +71,7 @@
|
||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
arcpmu0: pmu {
|
arcpct0: pct {
|
||||||
compatible = "snps,arc700-pct";
|
compatible = "snps,arc700-pct";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
arcpmu0: pmu {
|
arcpct0: pct {
|
||||||
compatible = "snps,arc700-pct";
|
compatible = "snps,arc700-pct";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -83,5 +83,9 @@
|
||||||
reg = <0xf0003000 0x44>;
|
reg = <0xf0003000 0x44>;
|
||||||
interrupts = <7>;
|
interrupts = <7>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
arcpct0: pct {
|
||||||
|
compatible = "snps,arc700-pct";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y
|
||||||
# CONFIG_PID_NS is not set
|
# CONFIG_PID_NS is not set
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
|
@ -34,7 +35,6 @@ CONFIG_INET=y
|
||||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_WIRELESS is not set
|
# CONFIG_WIRELESS is not set
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
|
@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
CONFIG_DRM=y
|
CONFIG_DRM=y
|
||||||
CONFIG_DRM_ARCPGU=y
|
CONFIG_DRM_ARCPGU=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
# CONFIG_HID is not set
|
# CONFIG_HID is not set
|
||||||
# CONFIG_USB_SUPPORT is not set
|
# CONFIG_USB_SUPPORT is not set
|
||||||
|
|
|
@ -43,12 +43,14 @@
|
||||||
#define STATUS_AE_BIT 5 /* Exception active */
|
#define STATUS_AE_BIT 5 /* Exception active */
|
||||||
#define STATUS_DE_BIT 6 /* PC is in delay slot */
|
#define STATUS_DE_BIT 6 /* PC is in delay slot */
|
||||||
#define STATUS_U_BIT 7 /* User/Kernel mode */
|
#define STATUS_U_BIT 7 /* User/Kernel mode */
|
||||||
|
#define STATUS_Z_BIT 11
|
||||||
#define STATUS_L_BIT 12 /* Loop inhibit */
|
#define STATUS_L_BIT 12 /* Loop inhibit */
|
||||||
|
|
||||||
/* These masks correspond to the status word(STATUS_32) bits */
|
/* These masks correspond to the status word(STATUS_32) bits */
|
||||||
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
||||||
#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
|
#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
|
||||||
#define STATUS_U_MASK (1<<STATUS_U_BIT)
|
#define STATUS_U_MASK (1<<STATUS_U_BIT)
|
||||||
|
#define STATUS_Z_MASK (1<<STATUS_Z_BIT)
|
||||||
#define STATUS_L_MASK (1<<STATUS_L_BIT)
|
#define STATUS_L_MASK (1<<STATUS_L_BIT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -349,10 +351,11 @@ struct cpuinfo_arc {
|
||||||
struct cpuinfo_arc_bpu bpu;
|
struct cpuinfo_arc_bpu bpu;
|
||||||
struct bcr_identity core;
|
struct bcr_identity core;
|
||||||
struct bcr_isa isa;
|
struct bcr_isa isa;
|
||||||
|
const char *details, *name;
|
||||||
unsigned int vec_base;
|
unsigned int vec_base;
|
||||||
struct cpuinfo_arc_ccm iccm, dccm;
|
struct cpuinfo_arc_ccm iccm, dccm;
|
||||||
struct {
|
struct {
|
||||||
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, pad1:3,
|
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, swape:1, pad1:2,
|
||||||
fpu_sp:1, fpu_dp:1, pad2:6,
|
fpu_sp:1, fpu_dp:1, pad2:6,
|
||||||
debug:1, ap:1, smart:1, rtt:1, pad3:4,
|
debug:1, ap:1, smart:1, rtt:1, pad3:4,
|
||||||
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
||||||
|
|
|
@ -53,7 +53,7 @@ extern void arc_cache_init(void);
|
||||||
extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len);
|
extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len);
|
||||||
extern void read_decode_cache_bcr(void);
|
extern void read_decode_cache_bcr(void);
|
||||||
|
|
||||||
extern int ioc_exists;
|
extern int ioc_enable;
|
||||||
extern unsigned long perip_base, perip_end;
|
extern unsigned long perip_base, perip_end;
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
|
@ -54,7 +54,7 @@ extern int elf_check_arch(const struct elf32_hdr *);
|
||||||
* the loader. We need to make sure that it is out of the way of the program
|
* 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.
|
* that it will "exec", and that there is sufficient room for the brk.
|
||||||
*/
|
*/
|
||||||
#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
|
#define ELF_ET_DYN_BASE (2UL * TASK_SIZE / 3)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When the program starts, a1 contains a pointer to a function to be
|
* When the program starts, a1 contains a pointer to a function to be
|
||||||
|
|
|
@ -55,6 +55,22 @@ struct mcip_cmd {
|
||||||
#define IDU_M_DISTRI_DEST 0x2
|
#define IDU_M_DISTRI_DEST 0x2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mcip_bcr {
|
||||||
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
|
unsigned int pad3:8,
|
||||||
|
idu:1, llm:1, num_cores:6,
|
||||||
|
iocoh:1, gfrc:1, dbg:1, pad2:1,
|
||||||
|
msg:1, sem:1, ipi:1, pad:1,
|
||||||
|
ver:8;
|
||||||
|
#else
|
||||||
|
unsigned int ver:8,
|
||||||
|
pad:1, ipi:1, sem:1, msg:1,
|
||||||
|
pad2:1, dbg:1, gfrc:1, iocoh:1,
|
||||||
|
num_cores:6, llm:1, idu:1,
|
||||||
|
pad3:8;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCIP programming model
|
* MCIP programming model
|
||||||
*
|
*
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
struct mod_arch_specific {
|
struct mod_arch_specific {
|
||||||
void *unw_info;
|
void *unw_info;
|
||||||
int unw_sec_idx;
|
int unw_sec_idx;
|
||||||
|
const char *secstr;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,6 @@ struct id_to_str {
|
||||||
const char *str;
|
const char *str;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cpuinfo_data {
|
|
||||||
struct id_to_str info;
|
|
||||||
int up_range;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int root_mountflags, end_mem;
|
extern int root_mountflags, end_mem;
|
||||||
|
|
||||||
void setup_processor(void);
|
void setup_processor(void);
|
||||||
|
@ -43,5 +38,6 @@ void __init setup_arch_memory(void);
|
||||||
#define IS_USED_RUN(v) ((v) ? "" : "(not used) ")
|
#define IS_USED_RUN(v) ((v) ? "" : "(not used) ")
|
||||||
#define IS_USED_CFG(cfg) IS_USED_RUN(IS_ENABLED(cfg))
|
#define IS_USED_CFG(cfg) IS_USED_RUN(IS_ENABLED(cfg))
|
||||||
#define IS_AVAIL2(v, s, cfg) IS_AVAIL1(v, s), IS_AVAIL1(v, IS_USED_CFG(cfg))
|
#define IS_AVAIL2(v, s, cfg) IS_AVAIL1(v, s), IS_AVAIL1(v, IS_USED_CFG(cfg))
|
||||||
|
#define IS_AVAIL3(v, v2, s) IS_AVAIL1(v, s), IS_AVAIL1(v, IS_DISABLED_RUN(v2))
|
||||||
|
|
||||||
#endif /* __ASMARC_SETUP_H */
|
#endif /* __ASMARC_SETUP_H */
|
||||||
|
|
|
@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void);
|
||||||
* API expected BY platform smp code (FROM arch smp code)
|
* API expected BY platform smp code (FROM arch smp code)
|
||||||
*
|
*
|
||||||
* smp_ipi_irq_setup:
|
* smp_ipi_irq_setup:
|
||||||
* Takes @cpu and @irq to which the arch-common ISR is hooked up
|
* Takes @cpu and @hwirq to which the arch-common ISR is hooked up
|
||||||
*/
|
*/
|
||||||
extern int smp_ipi_irq_setup(int cpu, int irq);
|
extern int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
|
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
|
||||||
|
|
|
@ -17,6 +17,7 @@ int sys_clone_wrapper(int, int, int, int, int);
|
||||||
int sys_cacheflush(uint32_t, uint32_t uint32_t);
|
int sys_cacheflush(uint32_t, uint32_t uint32_t);
|
||||||
int sys_arc_settls(void *);
|
int sys_arc_settls(void *);
|
||||||
int sys_arc_gettls(void);
|
int sys_arc_gettls(void);
|
||||||
|
int sys_arc_usr_cmpxchg(int *, int, int);
|
||||||
|
|
||||||
#include <asm-generic/syscalls.h>
|
#include <asm-generic/syscalls.h>
|
||||||
|
|
||||||
|
|
|
@ -27,18 +27,19 @@
|
||||||
|
|
||||||
#define NR_syscalls __NR_syscalls
|
#define NR_syscalls __NR_syscalls
|
||||||
|
|
||||||
|
/* Generic syscall (fs/filesystems.c - lost in asm-generic/unistd.h */
|
||||||
|
#define __NR_sysfs (__NR_arch_specific_syscall + 3)
|
||||||
|
|
||||||
/* ARC specific syscall */
|
/* ARC specific syscall */
|
||||||
#define __NR_cacheflush (__NR_arch_specific_syscall + 0)
|
#define __NR_cacheflush (__NR_arch_specific_syscall + 0)
|
||||||
#define __NR_arc_settls (__NR_arch_specific_syscall + 1)
|
#define __NR_arc_settls (__NR_arch_specific_syscall + 1)
|
||||||
#define __NR_arc_gettls (__NR_arch_specific_syscall + 2)
|
#define __NR_arc_gettls (__NR_arch_specific_syscall + 2)
|
||||||
|
#define __NR_arc_usr_cmpxchg (__NR_arch_specific_syscall + 4)
|
||||||
|
|
||||||
__SYSCALL(__NR_cacheflush, sys_cacheflush)
|
__SYSCALL(__NR_cacheflush, sys_cacheflush)
|
||||||
__SYSCALL(__NR_arc_settls, sys_arc_settls)
|
__SYSCALL(__NR_arc_settls, sys_arc_settls)
|
||||||
__SYSCALL(__NR_arc_gettls, sys_arc_gettls)
|
__SYSCALL(__NR_arc_gettls, sys_arc_gettls)
|
||||||
|
__SYSCALL(__NR_arc_usr_cmpxchg, sys_arc_usr_cmpxchg)
|
||||||
|
|
||||||
/* Generic syscall (fs/filesystems.c - lost in asm-generic/unistd.h */
|
|
||||||
#define __NR_sysfs (__NR_arch_specific_syscall + 3)
|
|
||||||
__SYSCALL(__NR_sysfs, sys_sysfs)
|
__SYSCALL(__NR_sysfs, sys_sysfs)
|
||||||
|
|
||||||
#undef __SYSCALL
|
#undef __SYSCALL
|
||||||
|
|
|
@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root)
|
||||||
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
|
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
|
||||||
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
|
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
|
||||||
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
|
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
|
||||||
|
else if (of_flat_dt_is_compatible(dt_root, "ezchip,arc-nps"))
|
||||||
|
arc_base_baud = 800000000; /* Fixed 800MHz clk (NPS) */
|
||||||
else
|
else
|
||||||
arc_base_baud = 50000000; /* Fixed default 50MHz */
|
arc_base_baud = 50000000; /* Fixed default 50MHz */
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,12 @@
|
||||||
#include <asm/mcip.h>
|
#include <asm/mcip.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
static char smp_cpuinfo_buf[128];
|
|
||||||
static int idu_detected;
|
|
||||||
|
|
||||||
static DEFINE_RAW_SPINLOCK(mcip_lock);
|
static DEFINE_RAW_SPINLOCK(mcip_lock);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
|
||||||
|
static char smp_cpuinfo_buf[128];
|
||||||
|
|
||||||
static void mcip_setup_per_cpu(int cpu)
|
static void mcip_setup_per_cpu(int cpu)
|
||||||
{
|
{
|
||||||
smp_ipi_irq_setup(cpu, IPI_IRQ);
|
smp_ipi_irq_setup(cpu, IPI_IRQ);
|
||||||
|
@ -86,21 +87,7 @@ static void mcip_ipi_clear(int irq)
|
||||||
|
|
||||||
static void mcip_probe_n_setup(void)
|
static void mcip_probe_n_setup(void)
|
||||||
{
|
{
|
||||||
struct mcip_bcr {
|
struct mcip_bcr mp;
|
||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
||||||
unsigned int pad3:8,
|
|
||||||
idu:1, llm:1, num_cores:6,
|
|
||||||
iocoh:1, gfrc:1, dbg:1, pad2:1,
|
|
||||||
msg:1, sem:1, ipi:1, pad:1,
|
|
||||||
ver:8;
|
|
||||||
#else
|
|
||||||
unsigned int ver:8,
|
|
||||||
pad:1, ipi:1, sem:1, msg:1,
|
|
||||||
pad2:1, dbg:1, gfrc:1, iocoh:1,
|
|
||||||
num_cores:6, llm:1, idu:1,
|
|
||||||
pad3:8;
|
|
||||||
#endif
|
|
||||||
} mp;
|
|
||||||
|
|
||||||
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
||||||
|
|
||||||
|
@ -114,7 +101,6 @@ static void mcip_probe_n_setup(void)
|
||||||
IS_AVAIL1(mp.gfrc, "GFRC"));
|
IS_AVAIL1(mp.gfrc, "GFRC"));
|
||||||
|
|
||||||
cpuinfo_arc700[0].extn.gfrc = mp.gfrc;
|
cpuinfo_arc700[0].extn.gfrc = mp.gfrc;
|
||||||
idu_detected = mp.idu;
|
|
||||||
|
|
||||||
if (mp.dbg) {
|
if (mp.dbg) {
|
||||||
__mcip_cmd_data(CMD_DEBUG_SET_SELECT, 0, 0xf);
|
__mcip_cmd_data(CMD_DEBUG_SET_SELECT, 0, 0xf);
|
||||||
|
@ -130,6 +116,8 @@ struct plat_smp_ops plat_smp_ops = {
|
||||||
.ipi_clear = mcip_ipi_clear,
|
.ipi_clear = mcip_ipi_clear,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* ARCv2 Interrupt Distribution Unit (IDU)
|
* ARCv2 Interrupt Distribution Unit (IDU)
|
||||||
*
|
*
|
||||||
|
@ -193,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
cpumask_t online;
|
cpumask_t online;
|
||||||
|
unsigned int destination_bits;
|
||||||
|
unsigned int distribution_mode;
|
||||||
|
|
||||||
/* errout if no online cpu per @cpumask */
|
/* errout if no online cpu per @cpumask */
|
||||||
if (!cpumask_and(&online, cpumask, cpu_online_mask))
|
if (!cpumask_and(&online, cpumask, cpu_online_mask))
|
||||||
|
@ -200,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&mcip_lock, flags);
|
raw_spin_lock_irqsave(&mcip_lock, flags);
|
||||||
|
|
||||||
idu_set_dest(data->hwirq, cpumask_bits(&online)[0]);
|
destination_bits = cpumask_bits(&online)[0];
|
||||||
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR);
|
idu_set_dest(data->hwirq, destination_bits);
|
||||||
|
|
||||||
|
if (ffs(destination_bits) == fls(destination_bits))
|
||||||
|
distribution_mode = IDU_M_DISTRI_DEST;
|
||||||
|
else
|
||||||
|
distribution_mode = IDU_M_DISTRI_RR;
|
||||||
|
|
||||||
|
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&mcip_lock, flags);
|
raw_spin_unlock_irqrestore(&mcip_lock, flags);
|
||||||
|
|
||||||
|
@ -219,16 +216,15 @@ static struct irq_chip idu_irq_chip = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int idu_first_irq;
|
static irq_hw_number_t idu_first_hwirq;
|
||||||
|
|
||||||
static void idu_cascade_isr(struct irq_desc *desc)
|
static void idu_cascade_isr(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct irq_domain *domain = irq_desc_get_handler_data(desc);
|
struct irq_domain *idu_domain = irq_desc_get_handler_data(desc);
|
||||||
unsigned int core_irq = irq_desc_get_irq(desc);
|
irq_hw_number_t core_hwirq = irqd_to_hwirq(irq_desc_get_irq_data(desc));
|
||||||
unsigned int idu_irq;
|
irq_hw_number_t idu_hwirq = core_hwirq - idu_first_hwirq;
|
||||||
|
|
||||||
idu_irq = core_irq - idu_first_irq;
|
generic_handle_irq(irq_find_mapping(idu_domain, idu_hwirq));
|
||||||
generic_handle_irq(irq_find_mapping(domain, idu_irq));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
|
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
|
||||||
|
@ -294,9 +290,12 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
||||||
struct irq_domain *domain;
|
struct irq_domain *domain;
|
||||||
/* Read IDU BCR to confirm nr_irqs */
|
/* Read IDU BCR to confirm nr_irqs */
|
||||||
int nr_irqs = of_irq_count(intc);
|
int nr_irqs = of_irq_count(intc);
|
||||||
int i, irq;
|
int i, virq;
|
||||||
|
struct mcip_bcr mp;
|
||||||
|
|
||||||
if (!idu_detected)
|
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
||||||
|
|
||||||
|
if (!mp.idu)
|
||||||
panic("IDU not detected, but DeviceTree using it");
|
panic("IDU not detected, but DeviceTree using it");
|
||||||
|
|
||||||
pr_info("MCIP: IDU referenced from Devicetree %d irqs\n", nr_irqs);
|
pr_info("MCIP: IDU referenced from Devicetree %d irqs\n", nr_irqs);
|
||||||
|
@ -312,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
||||||
* however we need it to get the parent virq and set IDU handler
|
* however we need it to get the parent virq and set IDU handler
|
||||||
* as first level isr
|
* as first level isr
|
||||||
*/
|
*/
|
||||||
irq = irq_of_parse_and_map(intc, i);
|
virq = irq_of_parse_and_map(intc, i);
|
||||||
if (!i)
|
if (!i)
|
||||||
idu_first_irq = irq;
|
idu_first_hwirq = irqd_to_hwirq(irq_get_irq_data(virq));
|
||||||
|
|
||||||
irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain);
|
irq_set_chained_handler_and_data(virq, idu_cascade_isr, domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
__mcip_cmd(CMD_IDU_ENABLE, 0);
|
__mcip_cmd(CMD_IDU_ENABLE, 0);
|
||||||
|
|
|
@ -30,17 +30,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||||
char *secstr, struct module *mod)
|
char *secstr, struct module *mod)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||||
int i;
|
|
||||||
|
|
||||||
mod->arch.unw_sec_idx = 0;
|
mod->arch.unw_sec_idx = 0;
|
||||||
mod->arch.unw_info = NULL;
|
mod->arch.unw_info = NULL;
|
||||||
|
mod->arch.secstr = secstr;
|
||||||
for (i = 1; i < hdr->e_shnum; i++) {
|
|
||||||
if (strcmp(secstr+sechdrs[i].sh_name, ".eh_frame") == 0) {
|
|
||||||
mod->arch.unw_sec_idx = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -59,29 +51,33 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||||
unsigned int relsec, /* sec index for relo sec */
|
unsigned int relsec, /* sec index for relo sec */
|
||||||
struct module *module)
|
struct module *module)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n, relo_type;
|
||||||
Elf32_Rela *rel_entry = (void *)sechdrs[relsec].sh_addr;
|
Elf32_Rela *rel_entry = (void *)sechdrs[relsec].sh_addr;
|
||||||
Elf32_Sym *sym_entry, *sym_sec;
|
Elf32_Sym *sym_entry, *sym_sec;
|
||||||
Elf32_Addr relocation;
|
Elf32_Addr relocation, location, tgt_addr;
|
||||||
Elf32_Addr location;
|
unsigned int tgtsec;
|
||||||
Elf32_Addr sec_to_patch;
|
|
||||||
int relo_type;
|
|
||||||
|
|
||||||
sec_to_patch = sechdrs[sechdrs[relsec].sh_info].sh_addr;
|
/*
|
||||||
|
* @relsec has relocations e.g. .rela.init.text
|
||||||
|
* @tgtsec is section to patch e.g. .init.text
|
||||||
|
*/
|
||||||
|
tgtsec = sechdrs[relsec].sh_info;
|
||||||
|
tgt_addr = sechdrs[tgtsec].sh_addr;
|
||||||
sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
|
sym_sec = (Elf32_Sym *) sechdrs[symindex].sh_addr;
|
||||||
n = sechdrs[relsec].sh_size / sizeof(*rel_entry);
|
n = sechdrs[relsec].sh_size / sizeof(*rel_entry);
|
||||||
|
|
||||||
pr_debug("\n========== Module Sym reloc ===========================\n");
|
pr_debug("\nSection to fixup %s @%x\n",
|
||||||
pr_debug("Section to fixup %x\n", sec_to_patch);
|
module->arch.secstr + sechdrs[tgtsec].sh_name, tgt_addr);
|
||||||
pr_debug("=========================================================\n");
|
pr_debug("=========================================================\n");
|
||||||
pr_debug("rela->r_off | rela->addend | sym->st_value | ADDR | VALUE\n");
|
pr_debug("r_off\tr_add\tst_value ADDRESS VALUE\n");
|
||||||
pr_debug("=========================================================\n");
|
pr_debug("=========================================================\n");
|
||||||
|
|
||||||
/* Loop thru entries in relocation section */
|
/* Loop thru entries in relocation section */
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
const char *s;
|
||||||
|
|
||||||
/* This is where to make the change */
|
/* This is where to make the change */
|
||||||
location = sec_to_patch + rel_entry[i].r_offset;
|
location = tgt_addr + rel_entry[i].r_offset;
|
||||||
|
|
||||||
/* This is the symbol it is referring to. Note that all
|
/* This is the symbol it is referring to. Note that all
|
||||||
undefined symbols have been resolved. */
|
undefined symbols have been resolved. */
|
||||||
|
@ -89,10 +85,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||||
|
|
||||||
relocation = sym_entry->st_value + rel_entry[i].r_addend;
|
relocation = sym_entry->st_value + rel_entry[i].r_addend;
|
||||||
|
|
||||||
pr_debug("\t%x\t\t%x\t\t%x %x %x [%s]\n",
|
if (sym_entry->st_name == 0 && ELF_ST_TYPE (sym_entry->st_info) == STT_SECTION) {
|
||||||
rel_entry[i].r_offset, rel_entry[i].r_addend,
|
s = module->arch.secstr + sechdrs[sym_entry->st_shndx].sh_name;
|
||||||
sym_entry->st_value, location, relocation,
|
} else {
|
||||||
strtab + sym_entry->st_name);
|
s = strtab + sym_entry->st_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
pr_debug(" %x\t%x\t%x %x %x [%s]\n",
|
||||||
|
rel_entry[i].r_offset, rel_entry[i].r_addend,
|
||||||
|
sym_entry->st_value, location, relocation, s);
|
||||||
|
|
||||||
/* This assumes modules are built with -mlong-calls
|
/* This assumes modules are built with -mlong-calls
|
||||||
* so any branches/jumps are absolute 32 bit jmps
|
* so any branches/jumps are absolute 32 bit jmps
|
||||||
|
@ -111,6 +112,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||||
goto relo_err;
|
goto relo_err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcmp(module->arch.secstr+sechdrs[tgtsec].sh_name, ".eh_frame") == 0)
|
||||||
|
module->arch.unw_sec_idx = tgtsec;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
relo_err:
|
relo_err:
|
||||||
|
|
|
@ -41,6 +41,41 @@ SYSCALL_DEFINE0(arc_gettls)
|
||||||
return task_thread_info(current)->thr_ptr;
|
return task_thread_info(current)->thr_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
||||||
|
{
|
||||||
|
struct pt_regs *regs = current_pt_regs();
|
||||||
|
int uval = -EFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
||||||
|
* can't possibly be SMP. Thus doesn't need to be SMP safe.
|
||||||
|
* And this also helps reduce the overhead for serializing in
|
||||||
|
* the UP case
|
||||||
|
*/
|
||||||
|
WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
|
||||||
|
|
||||||
|
/* Z indicates to userspace if operation succeded */
|
||||||
|
regs->status32 &= ~STATUS_Z_MASK;
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
|
||||||
|
if (__get_user(uval, uaddr))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (uval == expected) {
|
||||||
|
if (!__put_user(new, uaddr))
|
||||||
|
regs->status32 |= STATUS_Z_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
return uval;
|
||||||
|
}
|
||||||
|
|
||||||
void arch_cpu_idle(void)
|
void arch_cpu_idle(void)
|
||||||
{
|
{
|
||||||
/* sleep, but enable all interrupts before committing */
|
/* sleep, but enable all interrupts before committing */
|
||||||
|
|
|
@ -40,6 +40,29 @@ struct task_struct *_current_task[NR_CPUS]; /* For stack switching */
|
||||||
|
|
||||||
struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
|
struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
|
||||||
|
|
||||||
|
static const struct id_to_str arc_cpu_rel[] = {
|
||||||
|
#ifdef CONFIG_ISA_ARCOMPACT
|
||||||
|
{ 0x34, "R4.10"},
|
||||||
|
{ 0x35, "R4.11"},
|
||||||
|
#else
|
||||||
|
{ 0x51, "R2.0" },
|
||||||
|
{ 0x52, "R2.1" },
|
||||||
|
{ 0x53, "R3.0" },
|
||||||
|
#endif
|
||||||
|
{ 0x00, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct id_to_str arc_cpu_nm[] = {
|
||||||
|
#ifdef CONFIG_ISA_ARCOMPACT
|
||||||
|
{ 0x20, "ARC 600" },
|
||||||
|
{ 0x30, "ARC 770" }, /* 750 identified seperately */
|
||||||
|
#else
|
||||||
|
{ 0x40, "ARC EM" },
|
||||||
|
{ 0x50, "ARC HS38" },
|
||||||
|
#endif
|
||||||
|
{ 0x00, "Unknown" }
|
||||||
|
};
|
||||||
|
|
||||||
static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
|
static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
|
||||||
{
|
{
|
||||||
if (is_isa_arcompact()) {
|
if (is_isa_arcompact()) {
|
||||||
|
@ -92,11 +115,26 @@ static void read_arc_build_cfg_regs(void)
|
||||||
struct bcr_timer timer;
|
struct bcr_timer timer;
|
||||||
struct bcr_generic bcr;
|
struct bcr_generic bcr;
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
||||||
|
const struct id_to_str *tbl;
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
READ_BCR(AUX_IDENTITY, cpu->core);
|
READ_BCR(AUX_IDENTITY, cpu->core);
|
||||||
READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa);
|
READ_BCR(ARC_REG_ISA_CFG_BCR, cpu->isa);
|
||||||
|
|
||||||
|
for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
|
||||||
|
if (cpu->core.family == tbl->id) {
|
||||||
|
cpu->details = tbl->str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
|
||||||
|
if ((cpu->core.family & 0xF0) == tbl->id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cpu->name = tbl->str;
|
||||||
|
|
||||||
READ_BCR(ARC_REG_TIMERS_BCR, timer);
|
READ_BCR(ARC_REG_TIMERS_BCR, timer);
|
||||||
cpu->extn.timer0 = timer.t0;
|
cpu->extn.timer0 = timer.t0;
|
||||||
cpu->extn.timer1 = timer.t1;
|
cpu->extn.timer1 = timer.t1;
|
||||||
|
@ -111,6 +149,9 @@ static void read_arc_build_cfg_regs(void)
|
||||||
cpu->extn.swap = read_aux_reg(ARC_REG_SWAP_BCR) ? 1 : 0; /* 1,3 */
|
cpu->extn.swap = read_aux_reg(ARC_REG_SWAP_BCR) ? 1 : 0; /* 1,3 */
|
||||||
cpu->extn.crc = read_aux_reg(ARC_REG_CRC_BCR) ? 1 : 0;
|
cpu->extn.crc = read_aux_reg(ARC_REG_CRC_BCR) ? 1 : 0;
|
||||||
cpu->extn.minmax = read_aux_reg(ARC_REG_MIXMAX_BCR) > 1 ? 1 : 0; /* 2 */
|
cpu->extn.minmax = read_aux_reg(ARC_REG_MIXMAX_BCR) > 1 ? 1 : 0; /* 2 */
|
||||||
|
cpu->extn.swape = (cpu->core.family >= 0x34) ? 1 :
|
||||||
|
IS_ENABLED(CONFIG_ARC_HAS_SWAPE);
|
||||||
|
|
||||||
READ_BCR(ARC_REG_XY_MEM_BCR, cpu->extn_xymem);
|
READ_BCR(ARC_REG_XY_MEM_BCR, cpu->extn_xymem);
|
||||||
|
|
||||||
/* Read CCM BCRs for boot reporting even if not enabled in Kconfig */
|
/* Read CCM BCRs for boot reporting even if not enabled in Kconfig */
|
||||||
|
@ -160,64 +201,38 @@ static void read_arc_build_cfg_regs(void)
|
||||||
cpu->extn.rtt = bcr.ver ? 1 : 0;
|
cpu->extn.rtt = bcr.ver ? 1 : 0;
|
||||||
|
|
||||||
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
|
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
|
||||||
|
|
||||||
|
/* some hacks for lack of feature BCR info in old ARC700 cores */
|
||||||
|
if (is_isa_arcompact()) {
|
||||||
|
if (!cpu->isa.ver) /* ISA BCR absent, use Kconfig info */
|
||||||
|
cpu->isa.atomic = IS_ENABLED(CONFIG_ARC_HAS_LLSC);
|
||||||
|
else
|
||||||
|
cpu->isa.atomic = cpu->isa.atomic1;
|
||||||
|
|
||||||
|
cpu->isa.be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
|
||||||
|
|
||||||
|
/* there's no direct way to distinguish 750 vs. 770 */
|
||||||
|
if (unlikely(cpu->core.family < 0x34 || cpu->mmu.ver < 3))
|
||||||
|
cpu->name = "ARC750";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct cpuinfo_data arc_cpu_tbl[] = {
|
|
||||||
#ifdef CONFIG_ISA_ARCOMPACT
|
|
||||||
{ {0x20, "ARC 600" }, 0x2F},
|
|
||||||
{ {0x30, "ARC 700" }, 0x33},
|
|
||||||
{ {0x34, "ARC 700 R4.10"}, 0x34},
|
|
||||||
{ {0x35, "ARC 700 R4.11"}, 0x35},
|
|
||||||
#else
|
|
||||||
{ {0x50, "ARC HS38 R2.0"}, 0x51},
|
|
||||||
{ {0x52, "ARC HS38 R2.1"}, 0x52},
|
|
||||||
{ {0x53, "ARC HS38 R3.0"}, 0x53},
|
|
||||||
#endif
|
|
||||||
{ {0x00, NULL } }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
{
|
{
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id];
|
||||||
struct bcr_identity *core = &cpu->core;
|
struct bcr_identity *core = &cpu->core;
|
||||||
const struct cpuinfo_data *tbl;
|
int i, n = 0;
|
||||||
char *isa_nm;
|
|
||||||
int i, be, atomic;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
if (is_isa_arcompact()) {
|
|
||||||
isa_nm = "ARCompact";
|
|
||||||
be = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN);
|
|
||||||
|
|
||||||
atomic = cpu->isa.atomic1;
|
|
||||||
if (!cpu->isa.ver) /* ISA BCR absent, use Kconfig info */
|
|
||||||
atomic = IS_ENABLED(CONFIG_ARC_HAS_LLSC);
|
|
||||||
} else {
|
|
||||||
isa_nm = "ARCv2";
|
|
||||||
be = cpu->isa.be;
|
|
||||||
atomic = cpu->isa.atomic;
|
|
||||||
}
|
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n",
|
"\nIDENTITY\t: ARCVER [%#02x] ARCNUM [%#02x] CHIPID [%#4x]\n",
|
||||||
core->family, core->cpu_id, core->chip_id);
|
core->family, core->cpu_id, core->chip_id);
|
||||||
|
|
||||||
for (tbl = &arc_cpu_tbl[0]; tbl->info.id != 0; tbl++) {
|
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s\n",
|
||||||
if ((core->family >= tbl->info.id) &&
|
cpu_id, cpu->name, cpu->details,
|
||||||
(core->family <= tbl->up_range)) {
|
is_isa_arcompact() ? "ARCompact" : "ARCv2",
|
||||||
n += scnprintf(buf + n, len - n,
|
IS_AVAIL1(cpu->isa.be, "[Big-Endian]"));
|
||||||
"processor [%d]\t: %s (%s ISA) %s\n",
|
|
||||||
cpu_id, tbl->info.str, isa_nm,
|
|
||||||
IS_AVAIL1(be, "[Big-Endian]"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tbl->info.id == 0)
|
|
||||||
n += scnprintf(buf + n, len - n, "UNKNOWN ARC Processor\n");
|
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "Timers\t\t: %s%s%s%s\nISA Extn\t: ",
|
n += scnprintf(buf + n, len - n, "Timers\t\t: %s%s%s%s\nISA Extn\t: ",
|
||||||
IS_AVAIL1(cpu->extn.timer0, "Timer0 "),
|
IS_AVAIL1(cpu->extn.timer0, "Timer0 "),
|
||||||
|
@ -226,7 +241,7 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
CONFIG_ARC_HAS_RTC));
|
CONFIG_ARC_HAS_RTC));
|
||||||
|
|
||||||
n += i = scnprintf(buf + n, len - n, "%s%s%s%s%s",
|
n += i = scnprintf(buf + n, len - n, "%s%s%s%s%s",
|
||||||
IS_AVAIL2(atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
|
IS_AVAIL2(cpu->isa.atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
|
||||||
IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
|
IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
|
||||||
IS_AVAIL1(cpu->isa.unalign, "unalign (not used)"));
|
IS_AVAIL1(cpu->isa.unalign, "unalign (not used)"));
|
||||||
|
|
||||||
|
@ -253,7 +268,7 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
IS_AVAIL1(cpu->extn.swap, "swap "),
|
IS_AVAIL1(cpu->extn.swap, "swap "),
|
||||||
IS_AVAIL1(cpu->extn.minmax, "minmax "),
|
IS_AVAIL1(cpu->extn.minmax, "minmax "),
|
||||||
IS_AVAIL1(cpu->extn.crc, "crc "),
|
IS_AVAIL1(cpu->extn.crc, "crc "),
|
||||||
IS_AVAIL2(1, "swape", CONFIG_ARC_HAS_SWAPE));
|
IS_AVAIL2(cpu->extn.swape, "swape", CONFIG_ARC_HAS_SWAPE));
|
||||||
|
|
||||||
if (cpu->bpu.ver)
|
if (cpu->bpu.ver)
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
|
@ -272,9 +287,7 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n, "Vector Table\t: %#x\n", cpu->vec_base);
|
||||||
"Vector Table\t: %#x\nPeripherals\t: %#lx:%#lx\n",
|
|
||||||
cpu->vec_base, perip_base, perip_end);
|
|
||||||
|
|
||||||
if (cpu->extn.fpu_sp || cpu->extn.fpu_dp)
|
if (cpu->extn.fpu_sp || cpu->extn.fpu_dp)
|
||||||
n += scnprintf(buf + n, len - n, "FPU\t\t: %s%s\n",
|
n += scnprintf(buf + n, len - n, "FPU\t\t: %s%s\n",
|
||||||
|
@ -507,7 +520,7 @@ static void *c_start(struct seq_file *m, loff_t *pos)
|
||||||
* way to pass it w/o having to kmalloc/free a 2 byte string.
|
* way to pass it w/o having to kmalloc/free a 2 byte string.
|
||||||
* Encode cpu-id as 0xFFcccc, which is decoded by show routine.
|
* Encode cpu-id as 0xFFcccc, which is decoded by show routine.
|
||||||
*/
|
*/
|
||||||
return *pos < num_possible_cpus() ? cpu_to_ptr(*pos) : NULL;
|
return *pos < nr_cpu_ids ? cpu_to_ptr(*pos) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
|
#include <linux/irqdomain.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach_desc.h>
|
#include <asm/mach_desc.h>
|
||||||
|
@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise the present map, which describes the set of CPUs
|
* if platform didn't set the present map already, do it now
|
||||||
* actually populated at the present time.
|
* boot cpu is set to present already by init/main.c
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < max_cpus; i++)
|
if (num_present_cpus() <= 1) {
|
||||||
set_cpu_present(i, true);
|
for (i = 0; i < max_cpus; i++)
|
||||||
|
set_cpu_present(i, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init smp_cpus_done(unsigned int max_cpus)
|
void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
|
@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id)
|
||||||
*/
|
*/
|
||||||
static DEFINE_PER_CPU(int, ipi_dev);
|
static DEFINE_PER_CPU(int, ipi_dev);
|
||||||
|
|
||||||
int smp_ipi_irq_setup(int cpu, int irq)
|
int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq)
|
||||||
{
|
{
|
||||||
int *dev = per_cpu_ptr(&ipi_dev, cpu);
|
int *dev = per_cpu_ptr(&ipi_dev, cpu);
|
||||||
|
unsigned int virq = irq_find_mapping(NULL, hwirq);
|
||||||
|
|
||||||
|
if (!virq)
|
||||||
|
panic("Cannot find virq for root domain and hwirq=%lu", hwirq);
|
||||||
|
|
||||||
/* Boot cpu calls request, all call enable */
|
/* Boot cpu calls request, all call enable */
|
||||||
if (!cpu) {
|
if (!cpu) {
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev);
|
rc = request_percpu_irq(virq, do_IPI, "IPI Interrupt", dev);
|
||||||
if (rc)
|
if (rc)
|
||||||
panic("Percpu IRQ request failed for %d\n", irq);
|
panic("Percpu IRQ request failed for %u\n", virq);
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_percpu_irq(irq, 0);
|
enable_percpu_irq(virq, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
|
||||||
cycle_t full;
|
cycle_t full;
|
||||||
} stamp;
|
} stamp;
|
||||||
|
|
||||||
|
/*
|
||||||
__asm__ __volatile(
|
* hardware has an internal state machine which tracks readout of
|
||||||
"1: \n"
|
* low/high and updates the CTRL.status if
|
||||||
" lr %0, [AUX_RTC_LOW] \n"
|
* - interrupt/exception taken between the two reads
|
||||||
" lr %1, [AUX_RTC_HIGH] \n"
|
* - high increments after low has been read
|
||||||
" lr %2, [AUX_RTC_CTRL] \n"
|
*/
|
||||||
" bbit0.nt %2, 31, 1b \n"
|
do {
|
||||||
: "=r" (stamp.low), "=r" (stamp.high), "=r" (status));
|
stamp.low = read_aux_reg(AUX_RTC_LOW);
|
||||||
|
stamp.high = read_aux_reg(AUX_RTC_HIGH);
|
||||||
|
status = read_aux_reg(AUX_RTC_CTRL);
|
||||||
|
} while (!(status & _BITUL(31)));
|
||||||
|
|
||||||
return stamp.full;
|
return stamp.full;
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,113 +237,3 @@ void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
show_stacktrace(current, regs);
|
show_stacktrace(current, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/fs.h>
|
|
||||||
#include <linux/mount.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/namei.h>
|
|
||||||
#include <linux/debugfs.h>
|
|
||||||
|
|
||||||
static struct dentry *test_dentry;
|
|
||||||
static struct dentry *test_dir;
|
|
||||||
static struct dentry *test_u32_dentry;
|
|
||||||
|
|
||||||
static u32 clr_on_read = 1;
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
||||||
u32 numitlb, numdtlb, num_pte_not_present;
|
|
||||||
|
|
||||||
static int fill_display_data(char *kbuf)
|
|
||||||
{
|
|
||||||
size_t num = 0;
|
|
||||||
num += sprintf(kbuf + num, "I-TLB Miss %x\n", numitlb);
|
|
||||||
num += sprintf(kbuf + num, "D-TLB Miss %x\n", numdtlb);
|
|
||||||
num += sprintf(kbuf + num, "PTE not present %x\n", num_pte_not_present);
|
|
||||||
|
|
||||||
if (clr_on_read)
|
|
||||||
numitlb = numdtlb = num_pte_not_present = 0;
|
|
||||||
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tlb_stats_open(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
file->private_data = (void *)__get_free_page(GFP_KERNEL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* called on user read(): display the counters */
|
|
||||||
static ssize_t tlb_stats_output(struct file *file, /* file descriptor */
|
|
||||||
char __user *user_buf, /* user buffer */
|
|
||||||
size_t len, /* length of buffer */
|
|
||||||
loff_t *offset) /* offset in the file */
|
|
||||||
{
|
|
||||||
size_t num;
|
|
||||||
char *kbuf = (char *)file->private_data;
|
|
||||||
|
|
||||||
/* All of the data can he shoved in one iteration */
|
|
||||||
if (*offset != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
num = fill_display_data(kbuf);
|
|
||||||
|
|
||||||
/* simple_read_from_buffer() is helper for copy to user space
|
|
||||||
It copies up to @2 (num) bytes from kernel buffer @4 (kbuf) at offset
|
|
||||||
@3 (offset) into the user space address starting at @1 (user_buf).
|
|
||||||
@5 (len) is max size of user buffer
|
|
||||||
*/
|
|
||||||
return simple_read_from_buffer(user_buf, num, offset, kbuf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* called on user write : clears the counters */
|
|
||||||
static ssize_t tlb_stats_clear(struct file *file, const char __user *user_buf,
|
|
||||||
size_t length, loff_t *offset)
|
|
||||||
{
|
|
||||||
numitlb = numdtlb = num_pte_not_present = 0;
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tlb_stats_close(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
free_page((unsigned long)(file->private_data));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct file_operations tlb_stats_file_ops = {
|
|
||||||
.read = tlb_stats_output,
|
|
||||||
.write = tlb_stats_clear,
|
|
||||||
.open = tlb_stats_open,
|
|
||||||
.release = tlb_stats_close
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int __init arc_debugfs_init(void)
|
|
||||||
{
|
|
||||||
test_dir = debugfs_create_dir("arc", NULL);
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
||||||
test_dentry = debugfs_create_file("tlb_stats", 0444, test_dir, NULL,
|
|
||||||
&tlb_stats_file_ops);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
test_u32_dentry =
|
|
||||||
debugfs_create_u32("clr_on_read", 0444, test_dir, &clr_on_read);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(arc_debugfs_init);
|
|
||||||
|
|
||||||
static void __exit arc_debugfs_exit(void)
|
|
||||||
{
|
|
||||||
debugfs_remove(test_u32_dentry);
|
|
||||||
debugfs_remove(test_dentry);
|
|
||||||
debugfs_remove(test_dir);
|
|
||||||
}
|
|
||||||
module_exit(arc_debugfs_exit);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
static int l2_line_sz;
|
static int l2_line_sz;
|
||||||
int ioc_exists;
|
static int ioc_exists;
|
||||||
volatile int slc_enable = 1, ioc_enable = 1;
|
int slc_enable = 1, ioc_enable = 1;
|
||||||
unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
|
unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
|
||||||
unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
|
unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
|
||||||
|
|
||||||
|
@ -53,18 +53,15 @@ char *arc_cache_mumbojumbo(int c, char *buf, int len)
|
||||||
PR_CACHE(&cpuinfo_arc700[c].icache, CONFIG_ARC_HAS_ICACHE, "I-Cache");
|
PR_CACHE(&cpuinfo_arc700[c].icache, CONFIG_ARC_HAS_ICACHE, "I-Cache");
|
||||||
PR_CACHE(&cpuinfo_arc700[c].dcache, CONFIG_ARC_HAS_DCACHE, "D-Cache");
|
PR_CACHE(&cpuinfo_arc700[c].dcache, CONFIG_ARC_HAS_DCACHE, "D-Cache");
|
||||||
|
|
||||||
if (!is_isa_arcv2())
|
|
||||||
return buf;
|
|
||||||
|
|
||||||
p = &cpuinfo_arc700[c].slc;
|
p = &cpuinfo_arc700[c].slc;
|
||||||
if (p->ver)
|
if (p->ver)
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"SLC\t\t: %uK, %uB Line%s\n",
|
"SLC\t\t: %uK, %uB Line%s\n",
|
||||||
p->sz_k, p->line_len, IS_USED_RUN(slc_enable));
|
p->sz_k, p->line_len, IS_USED_RUN(slc_enable));
|
||||||
|
|
||||||
if (ioc_exists)
|
n += scnprintf(buf + n, len - n, "Peripherals\t: %#lx%s%s\n",
|
||||||
n += scnprintf(buf + n, len - n, "IOC\t\t:%s\n",
|
perip_base,
|
||||||
IS_DISABLED_RUN(ioc_enable));
|
IS_AVAIL3(ioc_exists, ioc_enable, ", IO-Coherency "));
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -113,8 +110,10 @@ static void read_decode_cache_bcr_arcv2(int cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
READ_BCR(ARC_REG_CLUSTER_BCR, cbcr);
|
READ_BCR(ARC_REG_CLUSTER_BCR, cbcr);
|
||||||
if (cbcr.c && ioc_enable)
|
if (cbcr.c)
|
||||||
ioc_exists = 1;
|
ioc_exists = 1;
|
||||||
|
else
|
||||||
|
ioc_enable = 0;
|
||||||
|
|
||||||
/* HS 2.0 didn't have AUX_VOL */
|
/* HS 2.0 didn't have AUX_VOL */
|
||||||
if (cpuinfo_arc700[cpu].core.family > 0x51) {
|
if (cpuinfo_arc700[cpu].core.family > 0x51) {
|
||||||
|
@ -1002,7 +1001,7 @@ void arc_cache_init(void)
|
||||||
read_aux_reg(ARC_REG_SLC_CTRL) | SLC_CTRL_DISABLE);
|
read_aux_reg(ARC_REG_SLC_CTRL) | SLC_CTRL_DISABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_isa_arcv2() && ioc_exists) {
|
if (is_isa_arcv2() && ioc_enable) {
|
||||||
/* IO coherency base - 0x8z */
|
/* IO coherency base - 0x8z */
|
||||||
write_aux_reg(ARC_REG_IO_COH_AP0_BASE, 0x80000);
|
write_aux_reg(ARC_REG_IO_COH_AP0_BASE, 0x80000);
|
||||||
/* IO coherency aperture size - 512Mb: 0x8z-0xAz */
|
/* IO coherency aperture size - 512Mb: 0x8z-0xAz */
|
||||||
|
|
|
@ -45,7 +45,7 @@ static void *arc_dma_alloc(struct device *dev, size_t size,
|
||||||
* -For coherent data, Read/Write to buffers terminate early in cache
|
* -For coherent data, Read/Write to buffers terminate early in cache
|
||||||
* (vs. always going to memory - thus are faster)
|
* (vs. always going to memory - thus are faster)
|
||||||
*/
|
*/
|
||||||
if ((is_isa_arcv2() && ioc_exists) ||
|
if ((is_isa_arcv2() && ioc_enable) ||
|
||||||
(attrs & DMA_ATTR_NON_CONSISTENT))
|
(attrs & DMA_ATTR_NON_CONSISTENT))
|
||||||
need_coh = 0;
|
need_coh = 0;
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
|
||||||
int is_non_coh = 1;
|
int is_non_coh = 1;
|
||||||
|
|
||||||
is_non_coh = (attrs & DMA_ATTR_NON_CONSISTENT) ||
|
is_non_coh = (attrs & DMA_ATTR_NON_CONSISTENT) ||
|
||||||
(is_isa_arcv2() && ioc_exists);
|
(is_isa_arcv2() && ioc_enable);
|
||||||
|
|
||||||
if (PageHighMem(page) || !is_non_coh)
|
if (PageHighMem(page) || !is_non_coh)
|
||||||
iounmap((void __force __iomem *)vaddr);
|
iounmap((void __force __iomem *)vaddr);
|
||||||
|
@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
|
||||||
__free_pages(page, get_order(size));
|
__free_pages(page, get_order(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int arc_dma_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||||
|
void *cpu_addr, dma_addr_t dma_addr, size_t size,
|
||||||
|
unsigned long attrs)
|
||||||
|
{
|
||||||
|
unsigned long user_count = vma_pages(vma);
|
||||||
|
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
||||||
|
unsigned long pfn = __phys_to_pfn(plat_dma_to_phys(dev, dma_addr));
|
||||||
|
unsigned long off = vma->vm_pgoff;
|
||||||
|
int ret = -ENXIO;
|
||||||
|
|
||||||
|
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||||
|
|
||||||
|
if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (off < count && user_count <= (count - off)) {
|
||||||
|
ret = remap_pfn_range(vma, vma->vm_start,
|
||||||
|
pfn + off,
|
||||||
|
user_count << PAGE_SHIFT,
|
||||||
|
vma->vm_page_prot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* streaming DMA Mapping API...
|
* streaming DMA Mapping API...
|
||||||
* CPU accesses page via normal paddr, thus needs to explicitly made
|
* CPU accesses page via normal paddr, thus needs to explicitly made
|
||||||
|
@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)
|
||||||
struct dma_map_ops arc_dma_ops = {
|
struct dma_map_ops arc_dma_ops = {
|
||||||
.alloc = arc_dma_alloc,
|
.alloc = arc_dma_alloc,
|
||||||
.free = arc_dma_free,
|
.free = arc_dma_free,
|
||||||
|
.mmap = arc_dma_mmap,
|
||||||
.map_page = arc_dma_map_page,
|
.map_page = arc_dma_map_page,
|
||||||
.map_sg = arc_dma_map_sg,
|
.map_sg = arc_dma_map_sg,
|
||||||
.sync_single_for_device = arc_dma_sync_single_for_device,
|
.sync_single_for_device = arc_dma_sync_single_for_device,
|
||||||
|
|
|
@ -793,16 +793,16 @@ char *arc_mmu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
char super_pg[64] = "";
|
char super_pg[64] = "";
|
||||||
|
|
||||||
if (p_mmu->s_pg_sz_m)
|
if (p_mmu->s_pg_sz_m)
|
||||||
scnprintf(super_pg, 64, "%dM Super Page%s, ",
|
scnprintf(super_pg, 64, "%dM Super Page %s",
|
||||||
p_mmu->s_pg_sz_m,
|
p_mmu->s_pg_sz_m,
|
||||||
IS_USED_CFG(CONFIG_TRANSPARENT_HUGEPAGE));
|
IS_USED_CFG(CONFIG_TRANSPARENT_HUGEPAGE));
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"MMU [v%x]\t: %dk PAGE, %sJTLB %d (%dx%d), uDTLB %d, uITLB %d %s%s\n",
|
"MMU [v%x]\t: %dk PAGE, %sJTLB %d (%dx%d), uDTLB %d, uITLB %d%s%s\n",
|
||||||
p_mmu->ver, p_mmu->pg_sz_k, super_pg,
|
p_mmu->ver, p_mmu->pg_sz_k, super_pg,
|
||||||
p_mmu->sets * p_mmu->ways, p_mmu->sets, p_mmu->ways,
|
p_mmu->sets * p_mmu->ways, p_mmu->sets, p_mmu->ways,
|
||||||
p_mmu->u_dtlb, p_mmu->u_itlb,
|
p_mmu->u_dtlb, p_mmu->u_itlb,
|
||||||
IS_AVAIL2(p_mmu->pae, "PAE40 ", CONFIG_ARC_HAS_PAE40));
|
IS_AVAIL2(p_mmu->pae, ", PAE40 ", CONFIG_ARC_HAS_PAE40));
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,15 +237,6 @@ ex_saved_reg1:
|
||||||
|
|
||||||
2:
|
2:
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
||||||
and.f 0, r0, _PAGE_PRESENT
|
|
||||||
bz 1f
|
|
||||||
ld r3, [num_pte_not_present]
|
|
||||||
add r3, r3, 1
|
|
||||||
st r3, [num_pte_not_present]
|
|
||||||
1:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
|
@ -309,12 +300,6 @@ ENTRY(EV_TLBMissI)
|
||||||
|
|
||||||
TLBMISS_FREEUP_REGS
|
TLBMISS_FREEUP_REGS
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
||||||
ld r0, [@numitlb]
|
|
||||||
add r0, r0, 1
|
|
||||||
st r0, [@numitlb]
|
|
||||||
#endif
|
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
; Get the PTE corresponding to V-addr accessed, r2 is setup with EFA
|
; Get the PTE corresponding to V-addr accessed, r2 is setup with EFA
|
||||||
LOAD_FAULT_PTE
|
LOAD_FAULT_PTE
|
||||||
|
@ -349,12 +334,6 @@ ENTRY(EV_TLBMissD)
|
||||||
|
|
||||||
TLBMISS_FREEUP_REGS
|
TLBMISS_FREEUP_REGS
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
||||||
ld r0, [@numdtlb]
|
|
||||||
add r0, r0, 1
|
|
||||||
st r0, [@numdtlb]
|
|
||||||
#endif
|
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
; Get the PTE corresponding to V-addr accessed
|
; Get the PTE corresponding to V-addr accessed
|
||||||
; If PTE exists, it will setup, r0 = PTE, r1 = Ptr to PTE, r2 = EFA
|
; If PTE exists, it will setup, r0 = PTE, r1 = Ptr to PTE, r2 = EFA
|
||||||
|
|
|
@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu)
|
||||||
mtm_enable_core(cpu);
|
mtm_enable_core(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eznps_ipi_clear(int irq)
|
|
||||||
{
|
|
||||||
write_aux_reg(CTOP_AUX_IACK, 1 << irq);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct plat_smp_ops plat_smp_ops = {
|
struct plat_smp_ops plat_smp_ops = {
|
||||||
.info = smp_cpuinfo_buf,
|
.info = smp_cpuinfo_buf,
|
||||||
.init_early_smp = eznps_init_cpumasks,
|
.init_early_smp = eznps_init_cpumasks,
|
||||||
.cpu_kick = eznps_smp_wakeup_cpu,
|
.cpu_kick = eznps_smp_wakeup_cpu,
|
||||||
.ipi_send = eznps_ipi_send,
|
.ipi_send = eznps_ipi_send,
|
||||||
.init_per_cpu = eznps_init_per_cpu,
|
.init_per_cpu = eznps_init_per_cpu,
|
||||||
.ipi_clear = eznps_ipi_clear,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -239,14 +239,25 @@
|
||||||
arm,primecell-periphid = <0x10480180>;
|
arm,primecell-periphid = <0x10480180>;
|
||||||
max-frequency = <100000000>;
|
max-frequency = <100000000>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
|
cap-sd-highspeed;
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
|
sd-uhs-sdr12;
|
||||||
|
sd-uhs-sdr25;
|
||||||
|
/* All direction control is used */
|
||||||
|
st,sig-dir-cmd;
|
||||||
|
st,sig-dir-dat0;
|
||||||
|
st,sig-dir-dat2;
|
||||||
|
st,sig-dir-dat31;
|
||||||
|
st,sig-pin-fbclk;
|
||||||
|
full-pwr-cycle;
|
||||||
vmmc-supply = <&ab8500_ldo_aux3_reg>;
|
vmmc-supply = <&ab8500_ldo_aux3_reg>;
|
||||||
vqmmc-supply = <&vmmci>;
|
vqmmc-supply = <&vmmci>;
|
||||||
pinctrl-names = "default", "sleep";
|
pinctrl-names = "default", "sleep";
|
||||||
pinctrl-0 = <&sdi0_default_mode>;
|
pinctrl-0 = <&sdi0_default_mode>;
|
||||||
pinctrl-1 = <&sdi0_sleep_mode>;
|
pinctrl-1 = <&sdi0_sleep_mode>;
|
||||||
|
|
||||||
cd-gpios = <&gpio6 26 GPIO_ACTIVE_LOW>; // 218
|
/* GPIO218 MMC_CD */
|
||||||
|
cd-gpios = <&gpio6 26 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -549,7 +560,7 @@
|
||||||
/* VMMCI level-shifter enable */
|
/* VMMCI level-shifter enable */
|
||||||
snowball_cfg3 {
|
snowball_cfg3 {
|
||||||
pins = "GPIO217_AH12";
|
pins = "GPIO217_AH12";
|
||||||
ste,config = <&gpio_out_lo>;
|
ste,config = <&gpio_out_hi>;
|
||||||
};
|
};
|
||||||
/* VMMCI level-shifter voltage select */
|
/* VMMCI level-shifter voltage select */
|
||||||
snowball_cfg4 {
|
snowball_cfg4 {
|
||||||
|
|
|
@ -184,11 +184,11 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&mio_clk {
|
&mio_clk {
|
||||||
compatible = "socionext,uniphier-pro5-mio-clock";
|
compatible = "socionext,uniphier-pro5-sd-clock";
|
||||||
};
|
};
|
||||||
|
|
||||||
&mio_rst {
|
&mio_rst {
|
||||||
compatible = "socionext,uniphier-pro5-mio-reset";
|
compatible = "socionext,uniphier-pro5-sd-reset";
|
||||||
};
|
};
|
||||||
|
|
||||||
&peri_clk {
|
&peri_clk {
|
||||||
|
|
|
@ -197,11 +197,11 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&mio_clk {
|
&mio_clk {
|
||||||
compatible = "socionext,uniphier-pxs2-mio-clock";
|
compatible = "socionext,uniphier-pxs2-sd-clock";
|
||||||
};
|
};
|
||||||
|
|
||||||
&mio_rst {
|
&mio_rst {
|
||||||
compatible = "socionext,uniphier-pxs2-mio-reset";
|
compatible = "socionext,uniphier-pxs2-sd-reset";
|
||||||
};
|
};
|
||||||
|
|
||||||
&peri_clk {
|
&peri_clk {
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
global_timer: timer@40002200 {
|
global_timer: timer@40002200 {
|
||||||
compatible = "arm,cortex-a9-global-timer";
|
compatible = "arm,cortex-a9-global-timer";
|
||||||
reg = <0x40002200 0x20>;
|
reg = <0x40002200 0x20>;
|
||||||
interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
|
||||||
interrupt-parent = <&intc>;
|
interrupt-parent = <&intc>;
|
||||||
clocks = <&clks VF610_CLK_PLATFORM_BUS>;
|
clocks = <&clks VF610_CLK_PLATFORM_BUS>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -850,6 +850,7 @@ CONFIG_PWM_SUN4I=y
|
||||||
CONFIG_PWM_TEGRA=y
|
CONFIG_PWM_TEGRA=y
|
||||||
CONFIG_PWM_VT8500=y
|
CONFIG_PWM_VT8500=y
|
||||||
CONFIG_PHY_HIX5HD2_SATA=y
|
CONFIG_PHY_HIX5HD2_SATA=y
|
||||||
|
CONFIG_E1000E=y
|
||||||
CONFIG_PWM_STI=y
|
CONFIG_PWM_STI=y
|
||||||
CONFIG_PWM_BCM2835=y
|
CONFIG_PWM_BCM2835=y
|
||||||
CONFIG_PWM_BRCMSTB=m
|
CONFIG_PWM_BRCMSTB=m
|
||||||
|
|
|
@ -66,6 +66,7 @@ extern char __kvm_hyp_vector[];
|
||||||
extern void __kvm_flush_vm_context(void);
|
extern void __kvm_flush_vm_context(void);
|
||||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||||
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
||||||
|
extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,9 @@ struct kvm_arch {
|
||||||
/* VTTBR value associated with below pgd and vmid */
|
/* VTTBR value associated with below pgd and vmid */
|
||||||
u64 vttbr;
|
u64 vttbr;
|
||||||
|
|
||||||
|
/* The last vcpu id that ran on each physical CPU */
|
||||||
|
int __percpu *last_vcpu_ran;
|
||||||
|
|
||||||
/* Timer */
|
/* Timer */
|
||||||
struct arch_timer_kvm timer;
|
struct arch_timer_kvm timer;
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
#define ICIALLUIS __ACCESS_CP15(c7, 0, c1, 0)
|
#define ICIALLUIS __ACCESS_CP15(c7, 0, c1, 0)
|
||||||
#define ATS1CPR __ACCESS_CP15(c7, 0, c8, 0)
|
#define ATS1CPR __ACCESS_CP15(c7, 0, c8, 0)
|
||||||
#define TLBIALLIS __ACCESS_CP15(c8, 0, c3, 0)
|
#define TLBIALLIS __ACCESS_CP15(c8, 0, c3, 0)
|
||||||
|
#define TLBIALL __ACCESS_CP15(c8, 0, c7, 0)
|
||||||
#define TLBIALLNSNHIS __ACCESS_CP15(c8, 4, c3, 4)
|
#define TLBIALLNSNHIS __ACCESS_CP15(c8, 4, c3, 4)
|
||||||
#define PRRR __ACCESS_CP15(c10, 0, c2, 0)
|
#define PRRR __ACCESS_CP15(c10, 0, c2, 0)
|
||||||
#define NMRR __ACCESS_CP15(c10, 0, c2, 1)
|
#define NMRR __ACCESS_CP15(c10, 0, c2, 1)
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
* This may need to be greater than __NR_last_syscall+1 in order to
|
* This may need to be greater than __NR_last_syscall+1 in order to
|
||||||
* account for the padding in the syscall table
|
* account for the padding in the syscall table
|
||||||
*/
|
*/
|
||||||
#define __NR_syscalls (396)
|
#define __NR_syscalls (400)
|
||||||
|
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
|
|
|
@ -420,6 +420,9 @@
|
||||||
#define __NR_copy_file_range (__NR_SYSCALL_BASE+391)
|
#define __NR_copy_file_range (__NR_SYSCALL_BASE+391)
|
||||||
#define __NR_preadv2 (__NR_SYSCALL_BASE+392)
|
#define __NR_preadv2 (__NR_SYSCALL_BASE+392)
|
||||||
#define __NR_pwritev2 (__NR_SYSCALL_BASE+393)
|
#define __NR_pwritev2 (__NR_SYSCALL_BASE+393)
|
||||||
|
#define __NR_pkey_mprotect (__NR_SYSCALL_BASE+394)
|
||||||
|
#define __NR_pkey_alloc (__NR_SYSCALL_BASE+395)
|
||||||
|
#define __NR_pkey_free (__NR_SYSCALL_BASE+396)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following SWIs are ARM private.
|
* The following SWIs are ARM private.
|
||||||
|
|
|
@ -403,6 +403,9 @@
|
||||||
CALL(sys_copy_file_range)
|
CALL(sys_copy_file_range)
|
||||||
CALL(sys_preadv2)
|
CALL(sys_preadv2)
|
||||||
CALL(sys_pwritev2)
|
CALL(sys_pwritev2)
|
||||||
|
CALL(sys_pkey_mprotect)
|
||||||
|
/* 395 */ CALL(sys_pkey_alloc)
|
||||||
|
CALL(sys_pkey_free)
|
||||||
#ifndef syscalls_counted
|
#ifndef syscalls_counted
|
||||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||||
#define syscalls_counted
|
#define syscalls_counted
|
||||||
|
|
|
@ -114,11 +114,18 @@ void kvm_arch_check_processor_compat(void *rtn)
|
||||||
*/
|
*/
|
||||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret, cpu;
|
||||||
|
|
||||||
if (type)
|
if (type)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
|
||||||
|
if (!kvm->arch.last_vcpu_ran)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu)
|
||||||
|
*per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
|
||||||
|
|
||||||
ret = kvm_alloc_stage2_pgd(kvm);
|
ret = kvm_alloc_stage2_pgd(kvm);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_fail_alloc;
|
goto out_fail_alloc;
|
||||||
|
@ -141,6 +148,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||||
out_free_stage2_pgd:
|
out_free_stage2_pgd:
|
||||||
kvm_free_stage2_pgd(kvm);
|
kvm_free_stage2_pgd(kvm);
|
||||||
out_fail_alloc:
|
out_fail_alloc:
|
||||||
|
free_percpu(kvm->arch.last_vcpu_ran);
|
||||||
|
kvm->arch.last_vcpu_ran = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,6 +177,9 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
free_percpu(kvm->arch.last_vcpu_ran);
|
||||||
|
kvm->arch.last_vcpu_ran = NULL;
|
||||||
|
|
||||||
for (i = 0; i < KVM_MAX_VCPUS; ++i) {
|
for (i = 0; i < KVM_MAX_VCPUS; ++i) {
|
||||||
if (kvm->vcpus[i]) {
|
if (kvm->vcpus[i]) {
|
||||||
kvm_arch_vcpu_free(kvm->vcpus[i]);
|
kvm_arch_vcpu_free(kvm->vcpus[i]);
|
||||||
|
@ -312,6 +324,19 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
{
|
{
|
||||||
|
int *last_ran;
|
||||||
|
|
||||||
|
last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We might get preempted before the vCPU actually runs, but
|
||||||
|
* over-invalidation doesn't affect correctness.
|
||||||
|
*/
|
||||||
|
if (*last_ran != vcpu->vcpu_id) {
|
||||||
|
kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu);
|
||||||
|
*last_ran = vcpu->vcpu_id;
|
||||||
|
}
|
||||||
|
|
||||||
vcpu->cpu = cpu;
|
vcpu->cpu = cpu;
|
||||||
vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
|
vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,21 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
||||||
__kvm_tlb_flush_vmid(kvm);
|
__kvm_tlb_flush_vmid(kvm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||||
|
|
||||||
|
/* Switch to requested VMID */
|
||||||
|
write_sysreg(kvm->arch.vttbr, VTTBR);
|
||||||
|
isb();
|
||||||
|
|
||||||
|
write_sysreg(0, TLBIALL);
|
||||||
|
dsb(nsh);
|
||||||
|
isb();
|
||||||
|
|
||||||
|
write_sysreg(0, VTTBR);
|
||||||
|
}
|
||||||
|
|
||||||
void __hyp_text __kvm_flush_vm_context(void)
|
void __hyp_text __kvm_flush_vm_context(void)
|
||||||
{
|
{
|
||||||
write_sysreg(0, TLBIALLNSNHIS);
|
write_sysreg(0, TLBIALLNSNHIS);
|
||||||
|
|
|
@ -408,7 +408,7 @@ static struct genpd_onecell_data imx_gpc_onecell_data = {
|
||||||
static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg)
|
static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg)
|
||||||
{
|
{
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
int i;
|
int i, ret;
|
||||||
|
|
||||||
imx6q_pu_domain.reg = pu_reg;
|
imx6q_pu_domain.reg = pu_reg;
|
||||||
|
|
||||||
|
@ -430,13 +430,22 @@ static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg)
|
||||||
if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS))
|
if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pm_genpd_init(&imx6q_pu_domain.base, NULL, false);
|
for (i = 0; i < ARRAY_SIZE(imx_gpc_domains); i++)
|
||||||
return of_genpd_add_provider_onecell(dev->of_node,
|
pm_genpd_init(imx_gpc_domains[i], NULL, false);
|
||||||
&imx_gpc_onecell_data);
|
|
||||||
|
|
||||||
|
ret = of_genpd_add_provider_onecell(dev->of_node,
|
||||||
|
&imx_gpc_onecell_data);
|
||||||
|
if (ret)
|
||||||
|
goto power_off;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
power_off:
|
||||||
|
imx6q_pm_pu_power_off(&imx6q_pu_domain.base);
|
||||||
clk_err:
|
clk_err:
|
||||||
while (i--)
|
while (i--)
|
||||||
clk_put(imx6q_pu_domain.clk[i]);
|
clk_put(imx6q_pu_domain.clk[i]);
|
||||||
|
imx6q_pu_domain.reg = NULL;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -173,7 +173,7 @@ static void __init imx6q_enet_phy_init(void)
|
||||||
ksz9021rn_phy_fixup);
|
ksz9021rn_phy_fixup);
|
||||||
phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,
|
phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,
|
||||||
ksz9031rn_phy_fixup);
|
ksz9031rn_phy_fixup);
|
||||||
phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,
|
phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffef,
|
||||||
ar8031_phy_fixup);
|
ar8031_phy_fixup);
|
||||||
phy_register_fixup_for_uid(PHY_ID_AR8035, 0xffffffef,
|
phy_register_fixup_for_uid(PHY_ID_AR8035, 0xffffffef,
|
||||||
ar8035_phy_fixup);
|
ar8035_phy_fixup);
|
||||||
|
|
|
@ -23,6 +23,7 @@ config MACH_MVEBU_V7
|
||||||
select CACHE_L2X0
|
select CACHE_L2X0
|
||||||
select ARM_CPU_SUSPEND
|
select ARM_CPU_SUSPEND
|
||||||
select MACH_MVEBU_ANY
|
select MACH_MVEBU_ANY
|
||||||
|
select MVEBU_CLK_COREDIV
|
||||||
|
|
||||||
config MACH_ARMADA_370
|
config MACH_ARMADA_370
|
||||||
bool "Marvell Armada 370 boards"
|
bool "Marvell Armada 370 boards"
|
||||||
|
@ -32,7 +33,6 @@ config MACH_ARMADA_370
|
||||||
select CPU_PJ4B
|
select CPU_PJ4B
|
||||||
select MACH_MVEBU_V7
|
select MACH_MVEBU_V7
|
||||||
select PINCTRL_ARMADA_370
|
select PINCTRL_ARMADA_370
|
||||||
select MVEBU_CLK_COREDIV
|
|
||||||
help
|
help
|
||||||
Say 'Y' here if you want your kernel to support boards based
|
Say 'Y' here if you want your kernel to support boards based
|
||||||
on the Marvell Armada 370 SoC with device tree.
|
on the Marvell Armada 370 SoC with device tree.
|
||||||
|
@ -50,7 +50,6 @@ config MACH_ARMADA_375
|
||||||
select HAVE_SMP
|
select HAVE_SMP
|
||||||
select MACH_MVEBU_V7
|
select MACH_MVEBU_V7
|
||||||
select PINCTRL_ARMADA_375
|
select PINCTRL_ARMADA_375
|
||||||
select MVEBU_CLK_COREDIV
|
|
||||||
help
|
help
|
||||||
Say 'Y' here if you want your kernel to support boards based
|
Say 'Y' here if you want your kernel to support boards based
|
||||||
on the Marvell Armada 375 SoC with device tree.
|
on the Marvell Armada 375 SoC with device tree.
|
||||||
|
@ -68,7 +67,6 @@ config MACH_ARMADA_38X
|
||||||
select HAVE_SMP
|
select HAVE_SMP
|
||||||
select MACH_MVEBU_V7
|
select MACH_MVEBU_V7
|
||||||
select PINCTRL_ARMADA_38X
|
select PINCTRL_ARMADA_38X
|
||||||
select MVEBU_CLK_COREDIV
|
|
||||||
help
|
help
|
||||||
Say 'Y' here if you want your kernel to support boards based
|
Say 'Y' here if you want your kernel to support boards based
|
||||||
on the Marvell Armada 380/385 SoC with device tree.
|
on the Marvell Armada 380/385 SoC with device tree.
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
config ARCH_UNIPHIER
|
config ARCH_UNIPHIER
|
||||||
bool "Socionext UniPhier SoCs"
|
bool "Socionext UniPhier SoCs"
|
||||||
depends on ARCH_MULTI_V7
|
depends on ARCH_MULTI_V7
|
||||||
|
select ARCH_HAS_RESET_CONTROLLER
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select ARM_GLOBAL_TIMER
|
select ARM_GLOBAL_TIMER
|
||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* : r4 = aborted context pc
|
* : r4 = aborted context pc
|
||||||
* : r5 = aborted context psr
|
* : r5 = aborted context psr
|
||||||
*
|
*
|
||||||
* Returns : r4-r5, r10-r11, r13 preserved
|
* Returns : r4-r5, r9-r11, r13 preserved
|
||||||
*
|
*
|
||||||
* Purpose : obtain information about current aborted instruction.
|
* Purpose : obtain information about current aborted instruction.
|
||||||
* Note: we read user space. This means we might cause a data
|
* Note: we read user space. This means we might cause a data
|
||||||
|
@ -48,7 +48,10 @@ ENTRY(v4t_late_abort)
|
||||||
/* c */ b do_DataAbort @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m
|
/* c */ b do_DataAbort @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m
|
||||||
/* d */ b do_DataAbort @ ldc rd, [rn, #m]
|
/* d */ b do_DataAbort @ ldc rd, [rn, #m]
|
||||||
/* e */ b .data_unknown
|
/* e */ b .data_unknown
|
||||||
/* f */
|
/* f */ b .data_unknown
|
||||||
|
|
||||||
|
.data_unknown_r9:
|
||||||
|
ldr r9, [sp], #4
|
||||||
.data_unknown: @ Part of jumptable
|
.data_unknown: @ Part of jumptable
|
||||||
mov r0, r4
|
mov r0, r4
|
||||||
mov r1, r8
|
mov r1, r8
|
||||||
|
@ -57,6 +60,7 @@ ENTRY(v4t_late_abort)
|
||||||
.data_arm_ldmstm:
|
.data_arm_ldmstm:
|
||||||
tst r8, #1 << 21 @ check writeback bit
|
tst r8, #1 << 21 @ check writeback bit
|
||||||
beq do_DataAbort @ no writeback -> no fixup
|
beq do_DataAbort @ no writeback -> no fixup
|
||||||
|
str r9, [sp, #-4]!
|
||||||
mov r7, #0x11
|
mov r7, #0x11
|
||||||
orr r7, r7, #0x1100
|
orr r7, r7, #0x1100
|
||||||
and r6, r8, r7
|
and r6, r8, r7
|
||||||
|
@ -75,12 +79,14 @@ ENTRY(v4t_late_abort)
|
||||||
subne r7, r7, r6, lsl #2 @ Undo increment
|
subne r7, r7, r6, lsl #2 @ Undo increment
|
||||||
addeq r7, r7, r6, lsl #2 @ Undo decrement
|
addeq r7, r7, r6, lsl #2 @ Undo decrement
|
||||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||||
|
ldr r9, [sp], #4
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
|
|
||||||
.data_arm_lateldrhpre:
|
.data_arm_lateldrhpre:
|
||||||
tst r8, #1 << 21 @ Check writeback bit
|
tst r8, #1 << 21 @ Check writeback bit
|
||||||
beq do_DataAbort @ No writeback -> no fixup
|
beq do_DataAbort @ No writeback -> no fixup
|
||||||
.data_arm_lateldrhpost:
|
.data_arm_lateldrhpost:
|
||||||
|
str r9, [sp, #-4]!
|
||||||
and r9, r8, #0x00f @ get Rm / low nibble of immediate value
|
and r9, r8, #0x00f @ get Rm / low nibble of immediate value
|
||||||
tst r8, #1 << 22 @ if (immediate offset)
|
tst r8, #1 << 22 @ if (immediate offset)
|
||||||
andne r6, r8, #0xf00 @ { immediate high nibble
|
andne r6, r8, #0xf00 @ { immediate high nibble
|
||||||
|
@ -93,6 +99,7 @@ ENTRY(v4t_late_abort)
|
||||||
subne r7, r7, r6 @ Undo incrmenet
|
subne r7, r7, r6 @ Undo incrmenet
|
||||||
addeq r7, r7, r6 @ Undo decrement
|
addeq r7, r7, r6 @ Undo decrement
|
||||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||||
|
ldr r9, [sp], #4
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
|
|
||||||
.data_arm_lateldrpreconst:
|
.data_arm_lateldrpreconst:
|
||||||
|
@ -101,12 +108,14 @@ ENTRY(v4t_late_abort)
|
||||||
.data_arm_lateldrpostconst:
|
.data_arm_lateldrpostconst:
|
||||||
movs r6, r8, lsl #20 @ Get offset
|
movs r6, r8, lsl #20 @ Get offset
|
||||||
beq do_DataAbort @ zero -> no fixup
|
beq do_DataAbort @ zero -> no fixup
|
||||||
|
str r9, [sp, #-4]!
|
||||||
and r9, r8, #15 << 16 @ Extract 'n' from instruction
|
and r9, r8, #15 << 16 @ Extract 'n' from instruction
|
||||||
ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
|
ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
|
||||||
tst r8, #1 << 23 @ Check U bit
|
tst r8, #1 << 23 @ Check U bit
|
||||||
subne r7, r7, r6, lsr #20 @ Undo increment
|
subne r7, r7, r6, lsr #20 @ Undo increment
|
||||||
addeq r7, r7, r6, lsr #20 @ Undo decrement
|
addeq r7, r7, r6, lsr #20 @ Undo decrement
|
||||||
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
str r7, [r2, r9, lsr #14] @ Put register 'Rn'
|
||||||
|
ldr r9, [sp], #4
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
|
|
||||||
.data_arm_lateldrprereg:
|
.data_arm_lateldrprereg:
|
||||||
|
@ -115,6 +124,7 @@ ENTRY(v4t_late_abort)
|
||||||
.data_arm_lateldrpostreg:
|
.data_arm_lateldrpostreg:
|
||||||
and r7, r8, #15 @ Extract 'm' from instruction
|
and r7, r8, #15 @ Extract 'm' from instruction
|
||||||
ldr r6, [r2, r7, lsl #2] @ Get register 'Rm'
|
ldr r6, [r2, r7, lsl #2] @ Get register 'Rm'
|
||||||
|
str r9, [sp, #-4]!
|
||||||
mov r9, r8, lsr #7 @ get shift count
|
mov r9, r8, lsr #7 @ get shift count
|
||||||
ands r9, r9, #31
|
ands r9, r9, #31
|
||||||
and r7, r8, #0x70 @ get shift type
|
and r7, r8, #0x70 @ get shift type
|
||||||
|
@ -126,33 +136,33 @@ ENTRY(v4t_late_abort)
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
b .data_arm_apply_r6_and_rn @ 1: LSL #0
|
b .data_arm_apply_r6_and_rn @ 1: LSL #0
|
||||||
nop
|
nop
|
||||||
b .data_unknown @ 2: MUL?
|
b .data_unknown_r9 @ 2: MUL?
|
||||||
nop
|
nop
|
||||||
b .data_unknown @ 3: MUL?
|
b .data_unknown_r9 @ 3: MUL?
|
||||||
nop
|
nop
|
||||||
mov r6, r6, lsr r9 @ 4: LSR #!0
|
mov r6, r6, lsr r9 @ 4: LSR #!0
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
mov r6, r6, lsr #32 @ 5: LSR #32
|
mov r6, r6, lsr #32 @ 5: LSR #32
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
b .data_unknown @ 6: MUL?
|
b .data_unknown_r9 @ 6: MUL?
|
||||||
nop
|
nop
|
||||||
b .data_unknown @ 7: MUL?
|
b .data_unknown_r9 @ 7: MUL?
|
||||||
nop
|
nop
|
||||||
mov r6, r6, asr r9 @ 8: ASR #!0
|
mov r6, r6, asr r9 @ 8: ASR #!0
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
mov r6, r6, asr #32 @ 9: ASR #32
|
mov r6, r6, asr #32 @ 9: ASR #32
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
b .data_unknown @ A: MUL?
|
b .data_unknown_r9 @ A: MUL?
|
||||||
nop
|
nop
|
||||||
b .data_unknown @ B: MUL?
|
b .data_unknown_r9 @ B: MUL?
|
||||||
nop
|
nop
|
||||||
mov r6, r6, ror r9 @ C: ROR #!0
|
mov r6, r6, ror r9 @ C: ROR #!0
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
mov r6, r6, rrx @ D: RRX
|
mov r6, r6, rrx @ D: RRX
|
||||||
b .data_arm_apply_r6_and_rn
|
b .data_arm_apply_r6_and_rn
|
||||||
b .data_unknown @ E: MUL?
|
b .data_unknown_r9 @ E: MUL?
|
||||||
nop
|
nop
|
||||||
b .data_unknown @ F: MUL?
|
b .data_unknown_r9 @ F: MUL?
|
||||||
|
|
||||||
.data_thumb_abort:
|
.data_thumb_abort:
|
||||||
ldrh r8, [r4] @ read instruction
|
ldrh r8, [r4] @ read instruction
|
||||||
|
@ -190,6 +200,7 @@ ENTRY(v4t_late_abort)
|
||||||
.data_thumb_pushpop:
|
.data_thumb_pushpop:
|
||||||
tst r8, #1 << 10
|
tst r8, #1 << 10
|
||||||
beq .data_unknown
|
beq .data_unknown
|
||||||
|
str r9, [sp, #-4]!
|
||||||
and r6, r8, #0x55 @ hweight8(r8) + R bit
|
and r6, r8, #0x55 @ hweight8(r8) + R bit
|
||||||
and r9, r8, #0xaa
|
and r9, r8, #0xaa
|
||||||
add r6, r6, r9, lsr #1
|
add r6, r6, r9, lsr #1
|
||||||
|
@ -204,9 +215,11 @@ ENTRY(v4t_late_abort)
|
||||||
addeq r7, r7, r6, lsl #2 @ increment SP if PUSH
|
addeq r7, r7, r6, lsl #2 @ increment SP if PUSH
|
||||||
subne r7, r7, r6, lsl #2 @ decrement SP if POP
|
subne r7, r7, r6, lsl #2 @ decrement SP if POP
|
||||||
str r7, [r2, #13 << 2]
|
str r7, [r2, #13 << 2]
|
||||||
|
ldr r9, [sp], #4
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
|
|
||||||
.data_thumb_ldmstm:
|
.data_thumb_ldmstm:
|
||||||
|
str r9, [sp, #-4]!
|
||||||
and r6, r8, #0x55 @ hweight8(r8)
|
and r6, r8, #0x55 @ hweight8(r8)
|
||||||
and r9, r8, #0xaa
|
and r9, r8, #0xaa
|
||||||
add r6, r6, r9, lsr #1
|
add r6, r6, r9, lsr #1
|
||||||
|
@ -219,4 +232,5 @@ ENTRY(v4t_late_abort)
|
||||||
and r6, r6, #15 @ number of regs to transfer
|
and r6, r6, #15 @ number of regs to transfer
|
||||||
sub r7, r7, r6, lsl #2 @ always decrement
|
sub r7, r7, r6, lsl #2 @ always decrement
|
||||||
str r7, [r2, r9, lsr #6]
|
str r7, [r2, r9, lsr #6]
|
||||||
|
ldr r9, [sp], #4
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
|
|
|
@ -190,6 +190,7 @@ config ARCH_THUNDER
|
||||||
|
|
||||||
config ARCH_UNIPHIER
|
config ARCH_UNIPHIER
|
||||||
bool "Socionext UniPhier SoC Family"
|
bool "Socionext UniPhier SoC Family"
|
||||||
|
select ARCH_HAS_RESET_CONTROLLER
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
help
|
help
|
||||||
This enables support for Socionext UniPhier SoC family.
|
This enables support for Socionext UniPhier SoC family.
|
||||||
|
|
|
@ -164,6 +164,8 @@
|
||||||
nand-ecc-mode = "hw";
|
nand-ecc-mode = "hw";
|
||||||
nand-ecc-strength = <8>;
|
nand-ecc-strength = <8>;
|
||||||
nand-ecc-step-size = <512>;
|
nand-ecc-step-size = <512>;
|
||||||
|
nand-bus-width = <16>;
|
||||||
|
brcm,nand-oob-sector-size = <16>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -123,6 +123,7 @@
|
||||||
<1 14 0xf08>, /* Physical Non-Secure PPI */
|
<1 14 0xf08>, /* Physical Non-Secure PPI */
|
||||||
<1 11 0xf08>, /* Virtual PPI */
|
<1 11 0xf08>, /* Virtual PPI */
|
||||||
<1 10 0xf08>; /* Hypervisor PPI */
|
<1 10 0xf08>; /* Hypervisor PPI */
|
||||||
|
fsl,erratum-a008585;
|
||||||
};
|
};
|
||||||
|
|
||||||
pmu {
|
pmu {
|
||||||
|
|
|
@ -195,6 +195,7 @@
|
||||||
<1 14 4>, /* Physical Non-Secure PPI, active-low */
|
<1 14 4>, /* Physical Non-Secure PPI, active-low */
|
||||||
<1 11 4>, /* Virtual PPI, active-low */
|
<1 11 4>, /* Virtual PPI, active-low */
|
||||||
<1 10 4>; /* Hypervisor PPI, active-low */
|
<1 10 4>; /* Hypervisor PPI, active-low */
|
||||||
|
fsl,erratum-a008585;
|
||||||
};
|
};
|
||||||
|
|
||||||
pmu {
|
pmu {
|
||||||
|
|
|
@ -131,7 +131,7 @@
|
||||||
#address-cells = <0x1>;
|
#address-cells = <0x1>;
|
||||||
#size-cells = <0x0>;
|
#size-cells = <0x0>;
|
||||||
cell-index = <1>;
|
cell-index = <1>;
|
||||||
clocks = <&cpm_syscon0 0 3>;
|
clocks = <&cpm_syscon0 1 21>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,6 @@
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
clock-frequency = <150000000>;
|
clock-frequency = <150000000>;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
keep-power-in-suspend;
|
|
||||||
non-removable;
|
non-removable;
|
||||||
num-slots = <1>;
|
num-slots = <1>;
|
||||||
vmmc-supply = <&vcc_io>;
|
vmmc-supply = <&vcc_io>;
|
||||||
|
@ -258,8 +257,6 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
vcc_sd: SWITCH_REG1 {
|
vcc_sd: SWITCH_REG1 {
|
||||||
regulator-always-on;
|
|
||||||
regulator-boot-on;
|
|
||||||
regulator-name = "vcc_sd";
|
regulator-name = "vcc_sd";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -152,8 +152,6 @@
|
||||||
gpio = <&gpio3 11 GPIO_ACTIVE_LOW>;
|
gpio = <&gpio3 11 GPIO_ACTIVE_LOW>;
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <3300000>;
|
regulator-max-microvolt = <3300000>;
|
||||||
regulator-always-on;
|
|
||||||
regulator-boot-on;
|
|
||||||
vin-supply = <&vcc_io>;
|
vin-supply = <&vcc_io>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -201,7 +199,6 @@
|
||||||
bus-width = <8>;
|
bus-width = <8>;
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
disable-wp;
|
disable-wp;
|
||||||
keep-power-in-suspend;
|
|
||||||
mmc-pwrseq = <&emmc_pwrseq>;
|
mmc-pwrseq = <&emmc_pwrseq>;
|
||||||
mmc-hs200-1_2v;
|
mmc-hs200-1_2v;
|
||||||
mmc-hs200-1_8v;
|
mmc-hs200-1_8v;
|
||||||
|
@ -350,7 +347,6 @@
|
||||||
clock-freq-min-max = <400000 50000000>;
|
clock-freq-min-max = <400000 50000000>;
|
||||||
cap-sd-highspeed;
|
cap-sd-highspeed;
|
||||||
card-detect-delay = <200>;
|
card-detect-delay = <200>;
|
||||||
keep-power-in-suspend;
|
|
||||||
num-slots = <1>;
|
num-slots = <1>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
|
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
|
||||||
|
|
|
@ -300,8 +300,11 @@
|
||||||
ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x600000
|
ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x600000
|
||||||
0x81000000 0x0 0xfa600000 0x0 0xfa600000 0x0 0x100000>;
|
0x81000000 0x0 0xfa600000 0x0 0xfa600000 0x0 0x100000>;
|
||||||
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
||||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>;
|
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>,
|
||||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe";
|
<&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>,
|
||||||
|
<&cru SRST_A_PCIE>;
|
||||||
|
reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
|
||||||
|
"pm", "pclk", "aclk";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
pcie0_intc: interrupt-controller {
|
pcie0_intc: interrupt-controller {
|
||||||
|
|
|
@ -257,18 +257,18 @@
|
||||||
reg = <0x59801000 0x400>;
|
reg = <0x59801000 0x400>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mioctrl@59810000 {
|
sdctrl@59810000 {
|
||||||
compatible = "socionext,uniphier-mioctrl",
|
compatible = "socionext,uniphier-ld20-sdctrl",
|
||||||
"simple-mfd", "syscon";
|
"simple-mfd", "syscon";
|
||||||
reg = <0x59810000 0x800>;
|
reg = <0x59810000 0x800>;
|
||||||
|
|
||||||
mio_clk: clock {
|
sd_clk: clock {
|
||||||
compatible = "socionext,uniphier-ld20-mio-clock";
|
compatible = "socionext,uniphier-ld20-sd-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mio_rst: reset {
|
sd_rst: reset {
|
||||||
compatible = "socionext,uniphier-ld20-mio-reset";
|
compatible = "socionext,uniphier-ld20-sd-reset";
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __ASM_ALTERNATIVE_H
|
#ifndef __ASM_ALTERNATIVE_H
|
||||||
#define __ASM_ALTERNATIVE_H
|
#define __ASM_ALTERNATIVE_H
|
||||||
|
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpucaps.h>
|
||||||
#include <asm/insn.h>
|
#include <asm/insn.h>
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* arch/arm64/include/asm/cpucaps.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 ARM Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_CPUCAPS_H
|
||||||
|
#define __ASM_CPUCAPS_H
|
||||||
|
|
||||||
|
#define ARM64_WORKAROUND_CLEAN_CACHE 0
|
||||||
|
#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
|
||||||
|
#define ARM64_WORKAROUND_845719 2
|
||||||
|
#define ARM64_HAS_SYSREG_GIC_CPUIF 3
|
||||||
|
#define ARM64_HAS_PAN 4
|
||||||
|
#define ARM64_HAS_LSE_ATOMICS 5
|
||||||
|
#define ARM64_WORKAROUND_CAVIUM_23154 6
|
||||||
|
#define ARM64_WORKAROUND_834220 7
|
||||||
|
#define ARM64_HAS_NO_HW_PREFETCH 8
|
||||||
|
#define ARM64_HAS_UAO 9
|
||||||
|
#define ARM64_ALT_PAN_NOT_UAO 10
|
||||||
|
#define ARM64_HAS_VIRT_HOST_EXTN 11
|
||||||
|
#define ARM64_WORKAROUND_CAVIUM_27456 12
|
||||||
|
#define ARM64_HAS_32BIT_EL0 13
|
||||||
|
#define ARM64_HYP_OFFSET_LOW 14
|
||||||
|
#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
|
||||||
|
|
||||||
|
#define ARM64_NCAPS 16
|
||||||
|
|
||||||
|
#endif /* __ASM_CPUCAPS_H */
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <linux/jump_label.h>
|
#include <linux/jump_label.h>
|
||||||
|
|
||||||
|
#include <asm/cpucaps.h>
|
||||||
#include <asm/hwcap.h>
|
#include <asm/hwcap.h>
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
|
@ -24,25 +25,6 @@
|
||||||
#define MAX_CPU_FEATURES (8 * sizeof(elf_hwcap))
|
#define MAX_CPU_FEATURES (8 * sizeof(elf_hwcap))
|
||||||
#define cpu_feature(x) ilog2(HWCAP_ ## x)
|
#define cpu_feature(x) ilog2(HWCAP_ ## x)
|
||||||
|
|
||||||
#define ARM64_WORKAROUND_CLEAN_CACHE 0
|
|
||||||
#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
|
|
||||||
#define ARM64_WORKAROUND_845719 2
|
|
||||||
#define ARM64_HAS_SYSREG_GIC_CPUIF 3
|
|
||||||
#define ARM64_HAS_PAN 4
|
|
||||||
#define ARM64_HAS_LSE_ATOMICS 5
|
|
||||||
#define ARM64_WORKAROUND_CAVIUM_23154 6
|
|
||||||
#define ARM64_WORKAROUND_834220 7
|
|
||||||
#define ARM64_HAS_NO_HW_PREFETCH 8
|
|
||||||
#define ARM64_HAS_UAO 9
|
|
||||||
#define ARM64_ALT_PAN_NOT_UAO 10
|
|
||||||
#define ARM64_HAS_VIRT_HOST_EXTN 11
|
|
||||||
#define ARM64_WORKAROUND_CAVIUM_27456 12
|
|
||||||
#define ARM64_HAS_32BIT_EL0 13
|
|
||||||
#define ARM64_HYP_OFFSET_LOW 14
|
|
||||||
#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
|
|
||||||
|
|
||||||
#define ARM64_NCAPS 16
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -54,6 +54,7 @@ extern char __kvm_hyp_vector[];
|
||||||
extern void __kvm_flush_vm_context(void);
|
extern void __kvm_flush_vm_context(void);
|
||||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||||
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
||||||
|
extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,9 @@ struct kvm_arch {
|
||||||
/* VTTBR value associated with above pgd and vmid */
|
/* VTTBR value associated with above pgd and vmid */
|
||||||
u64 vttbr;
|
u64 vttbr;
|
||||||
|
|
||||||
|
/* The last vcpu id that ran on each physical CPU */
|
||||||
|
int __percpu *last_vcpu_ran;
|
||||||
|
|
||||||
/* The maximum number of vCPUs depends on the used GIC model */
|
/* The maximum number of vCPUs depends on the used GIC model */
|
||||||
int max_vcpus;
|
int max_vcpus;
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ static inline unsigned long __kern_hyp_va(unsigned long v)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define kern_hyp_va(v) (typeof(v))(__kern_hyp_va((unsigned long)(v)))
|
#define kern_hyp_va(v) ((typeof(v))(__kern_hyp_va((unsigned long)(v))))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We currently only support a 40bit IPA.
|
* We currently only support a 40bit IPA.
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
#include <asm/alternative.h>
|
#include <asm/alternative.h>
|
||||||
#include <asm/cpufeature.h>
|
|
||||||
|
|
||||||
#ifdef __ASSEMBLER__
|
#ifdef __ASSEMBLER__
|
||||||
|
|
||||||
|
|
|
@ -217,7 +217,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
||||||
#define _virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
#define _virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||||
#else
|
#else
|
||||||
#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
|
#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
|
||||||
#define __page_to_voff(kaddr) (((u64)(page) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
#define __page_to_voff(page) (((u64)(page) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
||||||
|
|
||||||
#define page_to_virt(page) ((void *)((__page_to_voff(page)) | PAGE_OFFSET))
|
#define page_to_virt(page) ((void *)((__page_to_voff(page)) | PAGE_OFFSET))
|
||||||
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
|
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
|
||||||
|
|
|
@ -64,6 +64,21 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
||||||
write_sysreg(0, vttbr_el2);
|
write_sysreg(0, vttbr_el2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||||
|
|
||||||
|
/* Switch to requested VMID */
|
||||||
|
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
||||||
|
isb();
|
||||||
|
|
||||||
|
asm volatile("tlbi vmalle1" : : );
|
||||||
|
dsb(nsh);
|
||||||
|
isb();
|
||||||
|
|
||||||
|
write_sysreg(0, vttbr_el2);
|
||||||
|
}
|
||||||
|
|
||||||
void __hyp_text __kvm_flush_vm_context(void)
|
void __hyp_text __kvm_flush_vm_context(void)
|
||||||
{
|
{
|
||||||
dsb(ishst);
|
dsb(ishst);
|
||||||
|
|
|
@ -147,7 +147,7 @@ static int __init early_cpu_to_node(int cpu)
|
||||||
|
|
||||||
static int __init pcpu_cpu_distance(unsigned int from, unsigned int to)
|
static int __init pcpu_cpu_distance(unsigned int from, unsigned int to)
|
||||||
{
|
{
|
||||||
return node_distance(from, to);
|
return node_distance(early_cpu_to_node(from), early_cpu_to_node(to));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * __init pcpu_fc_alloc(unsigned int cpu, size_t size,
|
static void * __init pcpu_fc_alloc(unsigned int cpu, size_t size,
|
||||||
|
@ -223,8 +223,11 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn)
|
||||||
void *nd;
|
void *nd;
|
||||||
int tnid;
|
int tnid;
|
||||||
|
|
||||||
pr_info("Initmem setup node %d [mem %#010Lx-%#010Lx]\n",
|
if (start_pfn < end_pfn)
|
||||||
nid, start_pfn << PAGE_SHIFT, (end_pfn << PAGE_SHIFT) - 1);
|
pr_info("Initmem setup node %d [mem %#010Lx-%#010Lx]\n", nid,
|
||||||
|
start_pfn << PAGE_SHIFT, (end_pfn << PAGE_SHIFT) - 1);
|
||||||
|
else
|
||||||
|
pr_info("Initmem setup node %d [<memory-less node>]\n", nid);
|
||||||
|
|
||||||
nd_pa = memblock_alloc_try_nid(nd_size, SMP_CACHE_BYTES, nid);
|
nd_pa = memblock_alloc_try_nid(nd_size, SMP_CACHE_BYTES, nid);
|
||||||
nd = __va(nd_pa);
|
nd = __va(nd_pa);
|
||||||
|
|
|
@ -3149,7 +3149,7 @@ static void print_dma_descriptors(struct cryptocop_int_operation *iop)
|
||||||
printk("print_dma_descriptors start\n");
|
printk("print_dma_descriptors start\n");
|
||||||
|
|
||||||
printk("iop:\n");
|
printk("iop:\n");
|
||||||
printk("\tsid: 0x%lld\n", iop->sid);
|
printk("\tsid: 0x%llx\n", iop->sid);
|
||||||
|
|
||||||
printk("\tcdesc_out: 0x%p\n", iop->cdesc_out);
|
printk("\tcdesc_out: 0x%p\n", iop->cdesc_out);
|
||||||
printk("\tcdesc_in: 0x%p\n", iop->cdesc_in);
|
printk("\tcdesc_in: 0x%p\n", iop->cdesc_in);
|
||||||
|
|
|
@ -31,7 +31,6 @@ struct thread_info {
|
||||||
int cpu; /* cpu we're on */
|
int cpu; /* cpu we're on */
|
||||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||||
mm_segment_t addr_limit;
|
mm_segment_t addr_limit;
|
||||||
struct restart_block restart_block;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -44,9 +43,6 @@ struct thread_info {
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.restart_block = { \
|
|
||||||
.fn = do_no_restart_syscall, \
|
|
||||||
}, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define init_thread_info (init_thread_union.thread_info)
|
#define init_thread_info (init_thread_union.thread_info)
|
||||||
|
|
|
@ -79,7 +79,7 @@ restore_sigcontext(struct sigcontext *usc, int *pd0)
|
||||||
unsigned int er0;
|
unsigned int er0;
|
||||||
|
|
||||||
/* Always make any pending restarted system calls return -EINTR */
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
current->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
/* restore passed registers */
|
/* restore passed registers */
|
||||||
#define COPY(r) do { err |= get_user(regs->r, &usc->sc_##r); } while (0)
|
#define COPY(r) do { err |= get_user(regs->r, &usc->sc_##r); } while (0)
|
||||||
|
|
|
@ -263,7 +263,7 @@ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
|
||||||
|
|
||||||
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
|
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
|
||||||
VMLINUX_ENTRY_ADDRESS=$(entry-y) \
|
VMLINUX_ENTRY_ADDRESS=$(entry-y) \
|
||||||
PLATFORM=$(platform-y)
|
PLATFORM="$(platform-y)"
|
||||||
ifdef CONFIG_32BIT
|
ifdef CONFIG_32BIT
|
||||||
bootvars-y += ADDR_BITS=32
|
bootvars-y += ADDR_BITS=32
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -84,12 +84,13 @@
|
||||||
fpga_regs: system-controller@1f000000 {
|
fpga_regs: system-controller@1f000000 {
|
||||||
compatible = "mti,malta-fpga", "syscon", "simple-mfd";
|
compatible = "mti,malta-fpga", "syscon", "simple-mfd";
|
||||||
reg = <0x1f000000 0x1000>;
|
reg = <0x1f000000 0x1000>;
|
||||||
|
native-endian;
|
||||||
|
|
||||||
reboot {
|
reboot {
|
||||||
compatible = "syscon-reboot";
|
compatible = "syscon-reboot";
|
||||||
regmap = <&fpga_regs>;
|
regmap = <&fpga_regs>;
|
||||||
offset = <0x500>;
|
offset = <0x500>;
|
||||||
mask = <0x4d>;
|
mask = <0x42>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,20 @@ static __initdata const struct mips_machine *mach;
|
||||||
static __initdata const void *mach_match_data;
|
static __initdata const void *mach_match_data;
|
||||||
|
|
||||||
void __init prom_init(void)
|
void __init prom_init(void)
|
||||||
|
{
|
||||||
|
plat_get_fdt();
|
||||||
|
BUG_ON(!fdt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init *plat_get_fdt(void)
|
||||||
{
|
{
|
||||||
const struct mips_machine *check_mach;
|
const struct mips_machine *check_mach;
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
|
|
||||||
|
if (fdt)
|
||||||
|
/* Already set up */
|
||||||
|
return (void *)fdt;
|
||||||
|
|
||||||
if ((fw_arg0 == -2) && !fdt_check_header((void *)fw_arg1)) {
|
if ((fw_arg0 == -2) && !fdt_check_header((void *)fw_arg1)) {
|
||||||
/*
|
/*
|
||||||
* We booted using the UHI boot protocol, so we have been
|
* We booted using the UHI boot protocol, so we have been
|
||||||
|
@ -75,12 +85,6 @@ void __init prom_init(void)
|
||||||
/* Retrieve the machine's FDT */
|
/* Retrieve the machine's FDT */
|
||||||
fdt = mach->fdt;
|
fdt = mach->fdt;
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON(!fdt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init *plat_get_fdt(void)
|
|
||||||
{
|
|
||||||
return (void *)fdt;
|
return (void *)fdt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,8 @@ do { \
|
||||||
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
|
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
|
||||||
struct mips_fpu_struct *ctx, int has_fpu,
|
struct mips_fpu_struct *ctx, int has_fpu,
|
||||||
void *__user *fault_addr);
|
void *__user *fault_addr);
|
||||||
|
void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
|
||||||
|
struct task_struct *tsk);
|
||||||
int process_fpemu_return(int sig, void __user *fault_addr,
|
int process_fpemu_return(int sig, void __user *fault_addr,
|
||||||
unsigned long fcr31);
|
unsigned long fcr31);
|
||||||
int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
|
int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
|
||||||
|
@ -81,4 +83,15 @@ static inline void fpu_emulator_init_fpu(void)
|
||||||
set_fpr64(&t->thread.fpu.fpr[i], 0, SIGNALLING_NAN);
|
set_fpr64(&t->thread.fpu.fpr[i], 0, SIGNALLING_NAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mask the FCSR Cause bits according to the Enable bits, observing
|
||||||
|
* that Unimplemented is always enabled.
|
||||||
|
*/
|
||||||
|
static inline unsigned long mask_fcr31_x(unsigned long fcr31)
|
||||||
|
{
|
||||||
|
return fcr31 & (FPU_CSR_UNI_X |
|
||||||
|
((fcr31 & FPU_CSR_ALL_E) <<
|
||||||
|
(ffs(FPU_CSR_ALL_X) - ffs(FPU_CSR_ALL_E))));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _ASM_FPU_EMULATOR_H */
|
#endif /* _ASM_FPU_EMULATOR_H */
|
||||||
|
|
|
@ -75,6 +75,22 @@ do { if (cpu_has_rw_llb) { \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check FCSR for any unmasked exceptions pending set with `ptrace',
|
||||||
|
* clear them and send a signal.
|
||||||
|
*/
|
||||||
|
#define __sanitize_fcr31(next) \
|
||||||
|
do { \
|
||||||
|
unsigned long fcr31 = mask_fcr31_x(next->thread.fpu.fcr31); \
|
||||||
|
void __user *pc; \
|
||||||
|
\
|
||||||
|
if (unlikely(fcr31)) { \
|
||||||
|
pc = (void __user *)task_pt_regs(next)->cp0_epc; \
|
||||||
|
next->thread.fpu.fcr31 &= ~fcr31; \
|
||||||
|
force_fcr31_sig(fcr31, pc, next); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For newly created kernel threads switch_to() will return to
|
* For newly created kernel threads switch_to() will return to
|
||||||
* ret_from_kernel_thread, newly created user threads to ret_from_fork.
|
* ret_from_kernel_thread, newly created user threads to ret_from_fork.
|
||||||
|
@ -85,6 +101,8 @@ do { if (cpu_has_rw_llb) { \
|
||||||
do { \
|
do { \
|
||||||
__mips_mt_fpaff_switch_to(prev); \
|
__mips_mt_fpaff_switch_to(prev); \
|
||||||
lose_fpu_inatomic(1, prev); \
|
lose_fpu_inatomic(1, prev); \
|
||||||
|
if (tsk_used_math(next)) \
|
||||||
|
__sanitize_fcr31(next); \
|
||||||
if (cpu_has_dsp) { \
|
if (cpu_has_dsp) { \
|
||||||
__save_dsp(prev); \
|
__save_dsp(prev); \
|
||||||
__restore_dsp(next); \
|
__restore_dsp(next); \
|
||||||
|
|
|
@ -21,6 +21,11 @@ static DEFINE_PER_CPU_ALIGNED(spinlock_t, cpc_core_lock);
|
||||||
|
|
||||||
static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags);
|
static DEFINE_PER_CPU_ALIGNED(unsigned long, cpc_core_lock_flags);
|
||||||
|
|
||||||
|
phys_addr_t __weak mips_cpc_default_phys_base(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mips_cpc_phys_base - retrieve the physical base address of the CPC
|
* mips_cpc_phys_base - retrieve the physical base address of the CPC
|
||||||
*
|
*
|
||||||
|
@ -43,8 +48,12 @@ static phys_addr_t mips_cpc_phys_base(void)
|
||||||
if (cpc_base & CM_GCR_CPC_BASE_CPCEN_MSK)
|
if (cpc_base & CM_GCR_CPC_BASE_CPCEN_MSK)
|
||||||
return cpc_base & CM_GCR_CPC_BASE_CPCBASE_MSK;
|
return cpc_base & CM_GCR_CPC_BASE_CPCBASE_MSK;
|
||||||
|
|
||||||
/* Otherwise, give it the default address & enable it */
|
/* Otherwise, use the default address */
|
||||||
cpc_base = mips_cpc_default_phys_base();
|
cpc_base = mips_cpc_default_phys_base();
|
||||||
|
if (!cpc_base)
|
||||||
|
return cpc_base;
|
||||||
|
|
||||||
|
/* Enable the CPC, mapped at the default address */
|
||||||
write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN_MSK);
|
write_gcr_cpc_base(cpc_base | CM_GCR_CPC_BASE_CPCEN_MSK);
|
||||||
return cpc_base;
|
return cpc_base;
|
||||||
}
|
}
|
||||||
|
|
|
@ -899,7 +899,7 @@ static inline int mipsr2_find_op_func(struct pt_regs *regs, u32 inst,
|
||||||
* mipsr2_decoder: Decode and emulate a MIPS R2 instruction
|
* mipsr2_decoder: Decode and emulate a MIPS R2 instruction
|
||||||
* @regs: Process register set
|
* @regs: Process register set
|
||||||
* @inst: Instruction to decode and emulate
|
* @inst: Instruction to decode and emulate
|
||||||
* @fcr31: Floating Point Control and Status Register returned
|
* @fcr31: Floating Point Control and Status Register Cause bits returned
|
||||||
*/
|
*/
|
||||||
int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
|
int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31)
|
||||||
{
|
{
|
||||||
|
@ -1172,13 +1172,13 @@ fpu_emul:
|
||||||
|
|
||||||
err = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0,
|
err = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0,
|
||||||
&fault_addr);
|
&fault_addr);
|
||||||
*fcr31 = current->thread.fpu.fcr31;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't allow the emulated instruction to leave any of
|
* We can't allow the emulated instruction to leave any
|
||||||
* the cause bits set in $fcr31.
|
* enabled Cause bits set in $fcr31.
|
||||||
*/
|
*/
|
||||||
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
*fcr31 = res = mask_fcr31_x(current->thread.fpu.fcr31);
|
||||||
|
current->thread.fpu.fcr31 &= ~res;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this is a tricky issue - lose_fpu() uses LL/SC atomics
|
* this is a tricky issue - lose_fpu() uses LL/SC atomics
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue