mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
spi: sun6i: fix RX data corruption in DMA mode
Merge series from Tobias Schramm <t.schramm@manjaro.org>: This set of patches fixes two bugs in the sun6i SPI driver that result in corruption of received data in DMA RX mode. The first bug seems to be related to an incompatibility of the SPI RX FIFO with wider than single byte read accesses during SPI transfers. I'm not sure if this bug affects all types of SPI controllers found in Allwinner SoCs supported by this driver. However reducing the access width should always be safe. I've tested this change on a V3s SoC. Further testing to narrow down the set of affected SoCs in the future would be welcome. The second bug is a race between SPI RX DMA and FIFO drain logic for interrupt-based SPI operation. This bug affects all SPI controllers supported by this driver. Once again this change has been tested on the Allwinner V3s SoC.
This commit is contained in:
commit
578464679f
2
.mailmap
2
.mailmap
|
|
@ -538,6 +538,8 @@ Shuah Khan <shuah@kernel.org> <shuah.kh@samsung.com>
|
|||
Sibi Sankar <quic_sibis@quicinc.com> <sibis@codeaurora.org>
|
||||
Sid Manning <quic_sidneym@quicinc.com> <sidneym@codeaurora.org>
|
||||
Simon Arlott <simon@octiron.net> <simon@fire.lp0.eu>
|
||||
Simon Horman <horms@kernel.org> <simon.horman@corigine.com>
|
||||
Simon Horman <horms@kernel.org> <simon.horman@netronome.com>
|
||||
Simon Kelley <simon@thekelleys.org.uk>
|
||||
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
|
||||
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ Description:
|
|||
Specifies the duration of the LED blink in milliseconds.
|
||||
Defaults to 50 ms.
|
||||
|
||||
With hw_control ON, the interval value MUST be set to the
|
||||
When offloaded is true, the interval value MUST be set to the
|
||||
default value and cannot be changed.
|
||||
Trying to set any value in this specific mode will return
|
||||
an EINVAL error.
|
||||
|
|
@ -44,8 +44,8 @@ Description:
|
|||
If set to 1, the LED will blink for the milliseconds specified
|
||||
in interval to signal transmission.
|
||||
|
||||
With hw_control ON, the blink interval is controlled by hardware
|
||||
and won't reflect the value set in interval.
|
||||
When offloaded is true, the blink interval is controlled by
|
||||
hardware and won't reflect the value set in interval.
|
||||
|
||||
What: /sys/class/leds/<led>/rx
|
||||
Date: Dec 2017
|
||||
|
|
@ -59,21 +59,21 @@ Description:
|
|||
If set to 1, the LED will blink for the milliseconds specified
|
||||
in interval to signal reception.
|
||||
|
||||
With hw_control ON, the blink interval is controlled by hardware
|
||||
and won't reflect the value set in interval.
|
||||
When offloaded is true, the blink interval is controlled by
|
||||
hardware and won't reflect the value set in interval.
|
||||
|
||||
What: /sys/class/leds/<led>/hw_control
|
||||
What: /sys/class/leds/<led>/offloaded
|
||||
Date: Jun 2023
|
||||
KernelVersion: 6.5
|
||||
Contact: linux-leds@vger.kernel.org
|
||||
Description:
|
||||
Communicate whether the LED trigger modes are driven by hardware
|
||||
or software fallback is used.
|
||||
Communicate whether the LED trigger modes are offloaded to
|
||||
hardware or whether software fallback is used.
|
||||
|
||||
If 0, the LED is using software fallback to blink.
|
||||
|
||||
If 1, the LED is using hardware control to blink and signal the
|
||||
requested modes.
|
||||
If 1, the LED blinking in requested mode is offloaded to
|
||||
hardware.
|
||||
|
||||
What: /sys/class/leds/<led>/link_10
|
||||
Date: Jun 2023
|
||||
|
|
|
|||
|
|
@ -141,8 +141,8 @@ sequence.
|
|||
To ensure the safety of this mitigation, the kernel must ensure that the
|
||||
safe return sequence is itself free from attacker interference. In Zen3
|
||||
and Zen4, this is accomplished by creating a BTB alias between the
|
||||
untraining function srso_untrain_ret_alias() and the safe return
|
||||
function srso_safe_ret_alias() which results in evicting a potentially
|
||||
untraining function srso_alias_untrain_ret() and the safe return
|
||||
function srso_alias_safe_ret() which results in evicting a potentially
|
||||
poisoned BTB entry and using that safe one for all function returns.
|
||||
|
||||
In older Zen1 and Zen2, this is accomplished using a reinterpretation
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ $defs:
|
|||
emac0_mdc, emac0_mdio, emac0_ptp_aux, emac0_ptp_pps, emac1_mcg0,
|
||||
emac1_mcg1, emac1_mcg2, emac1_mcg3, emac1_mdc, emac1_mdio,
|
||||
emac1_ptp_aux, emac1_ptp_pps, gcc_gp1, gcc_gp2, gcc_gp3,
|
||||
gcc_gp4, gcc_gp5, hs0_mi2s, hs1_mi2s, hs2_mi2s, ibi_i3c,
|
||||
gcc_gp4, gcc_gp5, gpio, hs0_mi2s, hs1_mi2s, hs2_mi2s, ibi_i3c,
|
||||
jitter_bist, mdp0_vsync0, mdp0_vsync1, mdp0_vsync2, mdp0_vsync3,
|
||||
mdp0_vsync4, mdp0_vsync5, mdp0_vsync6, mdp0_vsync7, mdp0_vsync8,
|
||||
mdp1_vsync0, mdp1_vsync1, mdp1_vsync2, mdp1_vsync3, mdp1_vsync4,
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ driver model device node, and its I2C address.
|
|||
},
|
||||
|
||||
.id_table = foo_idtable,
|
||||
.probe_new = foo_probe,
|
||||
.probe = foo_probe,
|
||||
.remove = foo_remove,
|
||||
/* if device autodetection is needed: */
|
||||
.class = I2C_CLASS_SOMETHING,
|
||||
|
|
|
|||
|
|
@ -178,10 +178,10 @@ nf_conntrack_sctp_timeout_established - INTEGER (seconds)
|
|||
Default is set to (hb_interval * path_max_retrans + rto_max)
|
||||
|
||||
nf_conntrack_sctp_timeout_shutdown_sent - INTEGER (seconds)
|
||||
default 0.3
|
||||
default 3
|
||||
|
||||
nf_conntrack_sctp_timeout_shutdown_recd - INTEGER (seconds)
|
||||
default 0.3
|
||||
default 3
|
||||
|
||||
nf_conntrack_sctp_timeout_shutdown_ack_sent - INTEGER (seconds)
|
||||
default 3
|
||||
|
|
|
|||
70
MAINTAINERS
70
MAINTAINERS
|
|
@ -8816,6 +8816,7 @@ R: Michael Walle <michael@walle.cc>
|
|||
S: Maintained
|
||||
F: drivers/gpio/gpio-regmap.c
|
||||
F: include/linux/gpio/regmap.h
|
||||
K: (devm_)?gpio_regmap_(un)?register
|
||||
|
||||
GPIO SUBSYSTEM
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
|
|
@ -14816,6 +14817,16 @@ F: net/netfilter/xt_CONNSECMARK.c
|
|||
F: net/netfilter/xt_SECMARK.c
|
||||
F: net/netlabel/
|
||||
|
||||
NETWORKING [MACSEC]
|
||||
M: Sabrina Dubroca <sd@queasysnail.net>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/macsec.c
|
||||
F: include/net/macsec.h
|
||||
F: include/uapi/linux/if_macsec.h
|
||||
K: macsec
|
||||
K: \bmdo_
|
||||
|
||||
NETWORKING [MPTCP]
|
||||
M: Matthieu Baerts <matthieu.baerts@tessares.net>
|
||||
M: Mat Martineau <martineau@kernel.org>
|
||||
|
|
@ -19237,13 +19248,6 @@ F: Documentation/devicetree/bindings/serial/serial.yaml
|
|||
F: drivers/tty/serdev/
|
||||
F: include/linux/serdev.h
|
||||
|
||||
SERIAL DRIVERS
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-serial@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/serial/
|
||||
F: drivers/tty/serial/
|
||||
|
||||
SERIAL IR RECEIVER
|
||||
M: Sean Young <sean@mess.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
|
@ -21072,6 +21076,39 @@ S: Maintained
|
|||
F: Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml
|
||||
F: sound/soc/ti/
|
||||
|
||||
TEXAS INSTRUMENTS AUDIO (ASoC/HDA) DRIVERS
|
||||
M: Shenghao Ding <shenghao-ding@ti.com>
|
||||
M: Kevin Lu <kevin-lu@ti.com>
|
||||
M: Baojun Xu <x1077012@ti.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/tas2552.txt
|
||||
F: Documentation/devicetree/bindings/sound/tas2562.yaml
|
||||
F: Documentation/devicetree/bindings/sound/tas2770.yaml
|
||||
F: Documentation/devicetree/bindings/sound/tas27xx.yaml
|
||||
F: Documentation/devicetree/bindings/sound/ti,pcm1681.txt
|
||||
F: Documentation/devicetree/bindings/sound/ti,pcm3168a.yaml
|
||||
F: Documentation/devicetree/bindings/sound/ti,tlv320*.yaml
|
||||
F: Documentation/devicetree/bindings/sound/tlv320adcx140.yaml
|
||||
F: Documentation/devicetree/bindings/sound/tlv320aic31xx.txt
|
||||
F: Documentation/devicetree/bindings/sound/tpa6130a2.txt
|
||||
F: include/sound/tas2*.h
|
||||
F: include/sound/tlv320*.h
|
||||
F: include/sound/tpa6130a2-plat.h
|
||||
F: sound/pci/hda/tas2781_hda_i2c.c
|
||||
F: sound/soc/codecs/pcm1681.c
|
||||
F: sound/soc/codecs/pcm1789*.*
|
||||
F: sound/soc/codecs/pcm179x*.*
|
||||
F: sound/soc/codecs/pcm186x*.*
|
||||
F: sound/soc/codecs/pcm3008.*
|
||||
F: sound/soc/codecs/pcm3060*.*
|
||||
F: sound/soc/codecs/pcm3168a*.*
|
||||
F: sound/soc/codecs/pcm5102a.c
|
||||
F: sound/soc/codecs/pcm512x*.*
|
||||
F: sound/soc/codecs/tas2*.*
|
||||
F: sound/soc/codecs/tlv320*.*
|
||||
F: sound/soc/codecs/tpa6130a2.*
|
||||
|
||||
TEXAS INSTRUMENTS DMA DRIVERS
|
||||
M: Peter Ujfalusi <peter.ujfalusi@gmail.com>
|
||||
L: dmaengine@vger.kernel.org
|
||||
|
|
@ -21648,20 +21685,16 @@ W: https://github.com/srcres258/linux-doc
|
|||
T: git git://github.com/srcres258/linux-doc.git doc-zh-tw
|
||||
F: Documentation/translations/zh_TW/
|
||||
|
||||
TTY LAYER
|
||||
TTY LAYER AND SERIAL DRIVERS
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
M: Jiri Slaby <jirislaby@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-serial@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
|
||||
F: Documentation/devicetree/bindings/serial/
|
||||
F: Documentation/driver-api/serial/
|
||||
F: drivers/tty/
|
||||
F: drivers/tty/serial/serial_base.h
|
||||
F: drivers/tty/serial/serial_base_bus.c
|
||||
F: drivers/tty/serial/serial_core.c
|
||||
F: drivers/tty/serial/serial_ctrl.c
|
||||
F: drivers/tty/serial/serial_port.c
|
||||
F: include/linux/selection.h
|
||||
F: include/linux/serial.h
|
||||
F: include/linux/serial_core.h
|
||||
|
|
@ -22488,7 +22521,6 @@ L: virtualization@lists.linux-foundation.org
|
|||
S: Maintained
|
||||
F: drivers/block/virtio_blk.c
|
||||
F: drivers/scsi/virtio_scsi.c
|
||||
F: drivers/vhost/scsi.c
|
||||
F: include/uapi/linux/virtio_blk.h
|
||||
F: include/uapi/linux/virtio_scsi.h
|
||||
|
||||
|
|
@ -22587,6 +22619,16 @@ F: include/linux/vhost_iotlb.h
|
|||
F: include/uapi/linux/vhost.h
|
||||
F: kernel/vhost_task.c
|
||||
|
||||
VIRTIO HOST (VHOST-SCSI)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Mike Christie <michael.christie@oracle.com>
|
||||
R: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: drivers/vhost/scsi.c
|
||||
|
||||
VIRTIO I2C DRIVER
|
||||
M: Conghui Chen <conghui.chen@intel.com>
|
||||
M: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 6
|
||||
PATCHLEVEL = 5
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION =
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ pic: pic@14000000 {
|
|||
valid-mask = <0x003fffff>;
|
||||
};
|
||||
|
||||
pci: pciv3@62000000 {
|
||||
pci: pci@62000000 {
|
||||
compatible = "arm,integrator-ap-pci", "v3,v360epc-pci";
|
||||
device_type = "pci";
|
||||
#interrupt-cells = <1>;
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ i2c_rtc: rtc@68 {
|
|||
pinctrl-0 = <&pinctrl_rtc_int>;
|
||||
reg = <0x68>;
|
||||
interrupt-parent = <&gpio7>;
|
||||
interrupts = <8 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -863,7 +863,6 @@ port@0 {
|
|||
reg = <0>;
|
||||
|
||||
ldb_from_lcdif1: endpoint {
|
||||
remote-endpoint = <&lcdif1_to_ldb>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -1010,6 +1009,8 @@ usdhc1: mmc@2190000 {
|
|||
<&clks IMX6SX_CLK_USDHC1>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
fsl,tuning-step= <2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -1022,6 +1023,8 @@ usdhc2: mmc@2194000 {
|
|||
<&clks IMX6SX_CLK_USDHC2>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
fsl,tuning-step= <2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -1034,6 +1037,8 @@ usdhc3: mmc@2198000 {
|
|||
<&clks IMX6SX_CLK_USDHC3>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
fsl,tuning-step= <2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -1309,11 +1314,8 @@ lcdif1: lcdif@2220000 {
|
|||
power-domains = <&pd_disp>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
port {
|
||||
lcdif1_to_ldb: endpoint {
|
||||
remote-endpoint = <&ldb_from_lcdif1>;
|
||||
};
|
||||
port {
|
||||
lcdif1_to_ldb: endpoint {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1184,6 +1184,8 @@ usdhc1: mmc@30b40000 {
|
|||
<&clks IMX7D_USDHC1_ROOT_CLK>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-step = <2>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -1196,6 +1198,8 @@ usdhc2: mmc@30b50000 {
|
|||
<&clks IMX7D_USDHC2_ROOT_CLK>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-step = <2>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
@ -1208,6 +1212,8 @@ usdhc3: mmc@30b60000 {
|
|||
<&clks IMX7D_USDHC3_ROOT_CLK>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
bus-width = <4>;
|
||||
fsl,tuning-step = <2>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -145,6 +145,8 @@ davinci_mdio_default: davinci-mdio-default-pins {
|
|||
/* MDIO */
|
||||
AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLUP | SLEWCTRL_FAST, MUX_MODE0)
|
||||
AM33XX_PADCONF(AM335X_PIN_MDC, PIN_OUTPUT_PULLUP, MUX_MODE0)
|
||||
/* Added to support GPIO controlled PHY reset */
|
||||
AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_OUTPUT_PULLUP, MUX_MODE7)
|
||||
>;
|
||||
};
|
||||
|
||||
|
|
@ -153,6 +155,8 @@ davinci_mdio_sleep: davinci-mdio-sleep-pins {
|
|||
/* MDIO reset value */
|
||||
AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLDOWN, MUX_MODE7)
|
||||
AM33XX_PADCONF(AM335X_PIN_MDC, PIN_INPUT_PULLDOWN, MUX_MODE7)
|
||||
/* Added to support GPIO controlled PHY reset */
|
||||
AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_INPUT_PULLDOWN, MUX_MODE7)
|
||||
>;
|
||||
};
|
||||
|
||||
|
|
@ -215,6 +219,7 @@ tps: tps@24 {
|
|||
baseboard_eeprom: baseboard_eeprom@50 {
|
||||
compatible = "atmel,24c256";
|
||||
reg = <0x50>;
|
||||
vcc-supply = <&ldo4_reg>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
|
@ -377,6 +382,10 @@ &davinci_mdio_sw {
|
|||
|
||||
ethphy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
/* Support GPIO reset on revision C3 boards */
|
||||
reset-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
|
||||
reset-assert-us = <300>;
|
||||
reset-deassert-us = <6500>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@
|
|||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include "common.h"
|
||||
|
||||
/* register offsets */
|
||||
|
|
|
|||
|
|
@ -1221,10 +1221,9 @@ mipi_csi: mipi-csi@32e30000 {
|
|||
compatible = "fsl,imx8mm-mipi-csi2";
|
||||
reg = <0x32e30000 0x1000>;
|
||||
interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
|
||||
assigned-clocks = <&clk IMX8MM_CLK_CSI1_CORE>,
|
||||
<&clk IMX8MM_CLK_CSI1_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_1000M>,
|
||||
<&clk IMX8MM_SYS_PLL2_1000M>;
|
||||
assigned-clocks = <&clk IMX8MM_CLK_CSI1_CORE>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_1000M>;
|
||||
|
||||
clock-frequency = <333000000>;
|
||||
clocks = <&clk IMX8MM_CLK_DISP_APB_ROOT>,
|
||||
<&clk IMX8MM_CLK_CSI1_ROOT>,
|
||||
|
|
|
|||
|
|
@ -1175,10 +1175,8 @@ mipi_csi: mipi-csi@32e30000 {
|
|||
compatible = "fsl,imx8mm-mipi-csi2";
|
||||
reg = <0x32e30000 0x1000>;
|
||||
interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
|
||||
assigned-clocks = <&clk IMX8MN_CLK_CAMERA_PIXEL>,
|
||||
<&clk IMX8MN_CLK_CSI1_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL2_1000M>,
|
||||
<&clk IMX8MN_SYS_PLL2_1000M>;
|
||||
assigned-clocks = <&clk IMX8MN_CLK_CAMERA_PIXEL>;
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL2_1000M>;
|
||||
assigned-clock-rates = <333000000>;
|
||||
clock-frequency = <333000000>;
|
||||
clocks = <&clk IMX8MN_CLK_DISP_APB_ROOT>,
|
||||
|
|
|
|||
|
|
@ -340,7 +340,7 @@ mediamix: power-domain@44462400 {
|
|||
|
||||
anatop: anatop@44480000 {
|
||||
compatible = "fsl,imx93-anatop", "syscon";
|
||||
reg = <0x44480000 0x10000>;
|
||||
reg = <0x44480000 0x2000>;
|
||||
};
|
||||
|
||||
adc1: adc@44530000 {
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ active-config0 {
|
|||
};
|
||||
};
|
||||
|
||||
pm8150l-thermal {
|
||||
pm8150l-pcb-thermal {
|
||||
polling-delay-passive = <0>;
|
||||
polling-delay = <0>;
|
||||
thermal-sensors = <&pm8150l_adc_tm 1>;
|
||||
|
|
|
|||
|
|
@ -153,8 +153,8 @@ vreg_l3c: ldo3 {
|
|||
|
||||
vreg_l4c: ldo4 {
|
||||
regulator-name = "vreg_l4c";
|
||||
regulator-min-microvolt = <1100000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
|
||||
/*
|
||||
* FIXME: This should have regulator-allow-set-load but
|
||||
|
|
|
|||
|
|
@ -3120,8 +3120,8 @@ mdss_dsi0_phy: phy@ae94400 {
|
|||
reg = <0 0x0ae94400 0 0x200>,
|
||||
<0 0x0ae94600 0 0x280>,
|
||||
<0 0x0ae94a00 0 0x1e0>;
|
||||
reg-names = "dsi0_phy",
|
||||
"dsi0_phy_lane",
|
||||
reg-names = "dsi_phy",
|
||||
"dsi_phy_lane",
|
||||
"dsi_pll";
|
||||
|
||||
#clock-cells = <1>;
|
||||
|
|
|
|||
|
|
@ -3561,7 +3561,7 @@ rpmhpd_opp_turbo_l1: opp10 {
|
|||
};
|
||||
|
||||
osm_l3: interconnect@18321000 {
|
||||
compatible = "qcom,sc8180x-osm-l3";
|
||||
compatible = "qcom,sc8180x-osm-l3", "qcom,osm-l3";
|
||||
reg = <0 0x18321000 0 0x1400>;
|
||||
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>;
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ CPU0: cpu@0 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD0>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -85,7 +85,7 @@ CPU1: cpu@100 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD1>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -109,7 +109,7 @@ CPU2: cpu@200 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD2>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -133,7 +133,7 @@ CPU3: cpu@300 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD3>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -157,7 +157,7 @@ CPU4: cpu@400 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD4>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -181,7 +181,7 @@ CPU5: cpu@500 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD5>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -205,7 +205,7 @@ CPU6: cpu@600 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD6>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -229,7 +229,7 @@ CPU7: cpu@700 {
|
|||
qcom,freq-domain = <&cpufreq_hw 2>;
|
||||
operating-points-v2 = <&cpu7_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&osm_l3 MASTER_OSM_L3_APPS 0 &osm_l3 SLAVE_OSM_L3 0>;
|
||||
<&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>;
|
||||
power-domains = <&CPU_PD7>;
|
||||
power-domain-names = "psci";
|
||||
#cooling-cells = <2>;
|
||||
|
|
@ -4342,7 +4342,7 @@ osm_l3: interconnect@18321000 {
|
|||
clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>;
|
||||
clock-names = "xo", "alternate";
|
||||
|
||||
#interconnect-cells = <2>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
cpufreq_hw: cpufreq@18323000 {
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ CPU0: cpu@0 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_0: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -138,7 +138,7 @@ CPU1: cpu@100 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_100: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -163,7 +163,7 @@ CPU2: cpu@200 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_200: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -188,7 +188,7 @@ CPU3: cpu@300 {
|
|||
qcom,freq-domain = <&cpufreq_hw 0>;
|
||||
operating-points-v2 = <&cpu0_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_300: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -213,7 +213,7 @@ CPU4: cpu@400 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_400: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -238,7 +238,7 @@ CPU5: cpu@500 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_500: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -263,7 +263,7 @@ CPU6: cpu@600 {
|
|||
qcom,freq-domain = <&cpufreq_hw 1>;
|
||||
operating-points-v2 = <&cpu4_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_600: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -288,7 +288,7 @@ CPU7: cpu@700 {
|
|||
qcom,freq-domain = <&cpufreq_hw 2>;
|
||||
operating-points-v2 = <&cpu7_opp_table>;
|
||||
interconnects = <&gem_noc MASTER_AMPSS_M0 0 &mc_virt SLAVE_EBI_CH0 0>,
|
||||
<&epss_l3 MASTER_OSM_L3_APPS 0 &epss_l3 SLAVE_OSM_L3 0>;
|
||||
<&epss_l3 MASTER_OSM_L3_APPS &epss_l3 SLAVE_OSM_L3>;
|
||||
#cooling-cells = <2>;
|
||||
L2_700: l2-cache {
|
||||
compatible = "cache";
|
||||
|
|
@ -5679,7 +5679,7 @@ epss_l3: interconnect@18590000 {
|
|||
clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>;
|
||||
clock-names = "xo", "alternate";
|
||||
|
||||
#interconnect-cells = <2>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
cpufreq_hw: cpufreq@18591000 {
|
||||
|
|
|
|||
|
|
@ -1744,6 +1744,8 @@ cryptobam: dma-controller@1dc4000 {
|
|||
qcom,controlled-remotely;
|
||||
iommus = <&apps_smmu 0x594 0x0011>,
|
||||
<&apps_smmu 0x596 0x0011>;
|
||||
/* FIXME: Probing BAM DMA causes some abort and system hang */
|
||||
status = "fail";
|
||||
};
|
||||
|
||||
crypto: crypto@1dfa000 {
|
||||
|
|
@ -1755,6 +1757,8 @@ crypto: crypto@1dfa000 {
|
|||
<&apps_smmu 0x596 0x0011>;
|
||||
interconnects = <&aggre2_noc MASTER_CRYPTO 0 &mc_virt SLAVE_EBI1 0>;
|
||||
interconnect-names = "memory";
|
||||
/* FIXME: dependency BAM DMA is disabled */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ipa: ipa@1e40000 {
|
||||
|
|
|
|||
|
|
@ -291,14 +291,14 @@ power-domain@PX30_PD_GMAC {
|
|||
};
|
||||
power-domain@PX30_PD_MMC_NAND {
|
||||
reg = <PX30_PD_MMC_NAND>;
|
||||
clocks = <&cru HCLK_NANDC>,
|
||||
<&cru HCLK_EMMC>,
|
||||
<&cru HCLK_SDIO>,
|
||||
<&cru HCLK_SFC>,
|
||||
<&cru SCLK_EMMC>,
|
||||
<&cru SCLK_NANDC>,
|
||||
<&cru SCLK_SDIO>,
|
||||
<&cru SCLK_SFC>;
|
||||
clocks = <&cru HCLK_NANDC>,
|
||||
<&cru HCLK_EMMC>,
|
||||
<&cru HCLK_SDIO>,
|
||||
<&cru HCLK_SFC>,
|
||||
<&cru SCLK_EMMC>,
|
||||
<&cru SCLK_NANDC>,
|
||||
<&cru SCLK_SDIO>,
|
||||
<&cru SCLK_SFC>;
|
||||
pm_qos = <&qos_emmc>, <&qos_nand>,
|
||||
<&qos_sdio>, <&qos_sfc>;
|
||||
#power-domain-cells = <0>;
|
||||
|
|
|
|||
|
|
@ -106,7 +106,6 @@ vdd_core: vdd-core {
|
|||
regulator-name = "vdd_core";
|
||||
regulator-min-microvolt = <827000>;
|
||||
regulator-max-microvolt = <1340000>;
|
||||
regulator-init-microvolt = <1015000>;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
|
|
|
|||
|
|
@ -105,7 +105,6 @@ vdd_core: vdd-core {
|
|||
regulator-name = "vdd_core";
|
||||
regulator-min-microvolt = <827000>;
|
||||
regulator-max-microvolt = <1340000>;
|
||||
regulator-init-microvolt = <1015000>;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
|
|
|
|||
|
|
@ -773,7 +773,7 @@ brcmf: wifi@1 {
|
|||
compatible = "brcm,bcm4329-fmac";
|
||||
reg = <1>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
interrupts = <RK_PA3 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wake";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_host_wake_l>;
|
||||
|
|
|
|||
|
|
@ -375,7 +375,6 @@ regulator-state-mem {
|
|||
vcc_sdio: LDO_REG4 {
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <3000000>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-name = "vcc_sdio";
|
||||
|
|
|
|||
|
|
@ -548,9 +548,8 @@ &saradc {
|
|||
&sdhci {
|
||||
max-frequency = <150000000>;
|
||||
bus-width = <8>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs200-1_8v;
|
||||
non-removable;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ led-0 {
|
|||
sdio_pwrseq: sdio-pwrseq {
|
||||
compatible = "mmc-pwrseq-simple";
|
||||
clocks = <&rk808 1>;
|
||||
clock-names = "ext_clock";
|
||||
clock-names = "lpo";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_enable_h>;
|
||||
reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
|
||||
|
|
@ -645,9 +645,9 @@ &saradc {
|
|||
};
|
||||
|
||||
&sdhci {
|
||||
max-frequency = <150000000>;
|
||||
bus-width = <8>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
mmc-hs200-1_8v;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ brcmf: wifi@1 {
|
|||
compatible = "brcm,bcm4329-fmac";
|
||||
reg = <1>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
interrupts = <RK_PA3 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wake";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_host_wake_l>;
|
||||
|
|
|
|||
|
|
@ -356,7 +356,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-name = "vdd_logic";
|
||||
|
|
@ -371,7 +370,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-name = "vdd_gpu";
|
||||
|
|
@ -533,7 +531,6 @@ vdd_cpu: regulator@40 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <712500>;
|
||||
regulator-max-microvolt = <1390000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-name = "vdd_cpu";
|
||||
regulator-ramp-delay = <2300>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
|
|
|
|||
|
|
@ -239,7 +239,7 @@ &cpu3 {
|
|||
|
||||
&gmac1 {
|
||||
assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
|
||||
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>;
|
||||
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>;
|
||||
phy-mode = "rgmii";
|
||||
clock_in_out = "input";
|
||||
pinctrl-names = "default";
|
||||
|
|
@ -416,7 +416,7 @@ brcmf: wifi@1 {
|
|||
compatible = "brcm,bcm4329-fmac";
|
||||
reg = <1>;
|
||||
interrupt-parent = <&gpio2>;
|
||||
interrupts = <RK_PB2 GPIO_ACTIVE_HIGH>;
|
||||
interrupts = <RK_PB2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wake";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_host_wake_h>;
|
||||
|
|
|
|||
|
|
@ -218,7 +218,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
@ -233,7 +232,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
@ -259,7 +257,6 @@ vdd_npu: DCDC_REG4 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
|
|||
|
|
@ -264,7 +264,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-always-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
@ -278,7 +277,6 @@ vdd_gpu_npu: DCDC_REG2 {
|
|||
regulator-name = "vdd_gpu_npu";
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
|
|||
|
|
@ -366,7 +366,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-name = "vdd_logic";
|
||||
|
|
@ -381,7 +380,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-name = "vdd_gpu";
|
||||
|
|
|
|||
|
|
@ -277,7 +277,6 @@ vdd_log: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
|
||||
regulator-state-mem {
|
||||
|
|
@ -292,7 +291,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
|
||||
regulator-state-mem {
|
||||
|
|
|
|||
|
|
@ -137,8 +137,8 @@ &hdmi_sound {
|
|||
|
||||
&mdio1 {
|
||||
rgmii_phy1: ethernet-phy@0 {
|
||||
compatible="ethernet-phy-ieee802.3-c22";
|
||||
reg= <0x0>;
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -278,7 +278,6 @@ vdd_log: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
|
||||
regulator-state-mem {
|
||||
|
|
@ -291,7 +290,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-name = "vdd_gpu";
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
|
||||
regulator-state-mem {
|
||||
|
|
|
|||
|
|
@ -234,7 +234,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-state-mem {
|
||||
|
|
@ -249,7 +248,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-state-mem {
|
||||
|
|
@ -272,7 +270,6 @@ vdd_npu: DCDC_REG4 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-state-mem {
|
||||
|
|
|
|||
|
|
@ -308,7 +308,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -322,7 +321,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -346,7 +344,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -293,7 +293,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -307,7 +306,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -331,7 +329,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -173,7 +173,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -187,7 +186,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -211,7 +209,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -330,7 +327,6 @@ regulator-state-mem {
|
|||
|
||||
vcca1v8_image: LDO_REG9 {
|
||||
regulator-name = "vcca1v8_image";
|
||||
regulator-init-microvolt = <950000>;
|
||||
regulator-min-microvolt = <950000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
|
||||
|
|
|
|||
|
|
@ -243,7 +243,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
@ -258,7 +257,6 @@ vdd_gpu: DCDC_REG2 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
@ -284,7 +282,6 @@ vdd_npu: DCDC_REG4 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-ramp-delay = <6001>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
|
||||
|
|
|
|||
|
|
@ -232,7 +232,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -246,7 +245,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -270,7 +268,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -291,7 +291,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -305,7 +304,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -329,7 +327,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -163,7 +163,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -177,7 +176,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -201,7 +199,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -350,7 +350,6 @@ vdd_logic: DCDC_REG1 {
|
|||
regulator-name = "vdd_logic";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -364,7 +363,6 @@ regulator-state-mem {
|
|||
vdd_gpu: DCDC_REG2 {
|
||||
regulator-name = "vdd_gpu";
|
||||
regulator-always-on;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
@ -388,7 +386,6 @@ regulator-state-mem {
|
|||
|
||||
vdd_npu: DCDC_REG4 {
|
||||
regulator-name = "vdd_npu";
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-initial-mode = <0x2>;
|
||||
regulator-min-microvolt = <500000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
|
|
|
|||
|
|
@ -337,7 +337,6 @@ vdd_vdenc_s0: vdd_vdenc_mem_s0: dcdc-reg4 {
|
|||
regulator-boot-on;
|
||||
regulator-min-microvolt = <550000>;
|
||||
regulator-max-microvolt = <950000>;
|
||||
regulator-init-microvolt = <750000>;
|
||||
regulator-ramp-delay = <12500>;
|
||||
regulator-name = "vdd_vdenc_s0";
|
||||
|
||||
|
|
|
|||
|
|
@ -125,19 +125,19 @@ &cpu_l3 {
|
|||
cpu-supply = <&vdd_cpu_lit_s0>;
|
||||
};
|
||||
|
||||
&cpu_b0{
|
||||
&cpu_b0 {
|
||||
cpu-supply = <&vdd_cpu_big0_s0>;
|
||||
};
|
||||
|
||||
&cpu_b1{
|
||||
&cpu_b1 {
|
||||
cpu-supply = <&vdd_cpu_big0_s0>;
|
||||
};
|
||||
|
||||
&cpu_b2{
|
||||
&cpu_b2 {
|
||||
cpu-supply = <&vdd_cpu_big1_s0>;
|
||||
};
|
||||
|
||||
&cpu_b3{
|
||||
&cpu_b3 {
|
||||
cpu-supply = <&vdd_cpu_big1_s0>;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -356,7 +356,7 @@ static inline int sme_max_virtualisable_vl(void)
|
|||
return vec_max_virtualisable_vl(ARM64_VEC_SME);
|
||||
}
|
||||
|
||||
extern void sme_alloc(struct task_struct *task);
|
||||
extern void sme_alloc(struct task_struct *task, bool flush);
|
||||
extern unsigned int sme_get_vl(void);
|
||||
extern int sme_set_current_vl(unsigned long arg);
|
||||
extern int sme_get_current_vl(void);
|
||||
|
|
@ -388,7 +388,7 @@ static inline void sme_smstart_sm(void) { }
|
|||
static inline void sme_smstop_sm(void) { }
|
||||
static inline void sme_smstop(void) { }
|
||||
|
||||
static inline void sme_alloc(struct task_struct *task) { }
|
||||
static inline void sme_alloc(struct task_struct *task, bool flush) { }
|
||||
static inline void sme_setup(void) { }
|
||||
static inline unsigned int sme_get_vl(void) { return 0; }
|
||||
static inline int sme_max_vl(void) { return 0; }
|
||||
|
|
|
|||
24
arch/arm64/include/uapi/asm/bitsperlong.h
Normal file
24
arch/arm64/include/uapi/asm/bitsperlong.h
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2012 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_BITSPERLONG_H
|
||||
#define __ASM_BITSPERLONG_H
|
||||
|
||||
#define __BITS_PER_LONG 64
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
#endif /* __ASM_BITSPERLONG_H */
|
||||
|
|
@ -1285,9 +1285,9 @@ void fpsimd_release_task(struct task_struct *dead_task)
|
|||
* the interest of testability and predictability, the architecture
|
||||
* guarantees that when ZA is enabled it will be zeroed.
|
||||
*/
|
||||
void sme_alloc(struct task_struct *task)
|
||||
void sme_alloc(struct task_struct *task, bool flush)
|
||||
{
|
||||
if (task->thread.sme_state) {
|
||||
if (task->thread.sme_state && flush) {
|
||||
memset(task->thread.sme_state, 0, sme_state_size(task));
|
||||
return;
|
||||
}
|
||||
|
|
@ -1515,7 +1515,7 @@ void do_sme_acc(unsigned long esr, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
sve_alloc(current, false);
|
||||
sme_alloc(current);
|
||||
sme_alloc(current, true);
|
||||
if (!current->thread.sve_state || !current->thread.sme_state) {
|
||||
force_sig(SIGKILL);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -881,6 +881,13 @@ static int sve_set_common(struct task_struct *target,
|
|||
break;
|
||||
case ARM64_VEC_SME:
|
||||
target->thread.svcr |= SVCR_SM_MASK;
|
||||
|
||||
/*
|
||||
* Disable traps and ensure there is SME storage but
|
||||
* preserve any currently set values in ZA/ZT.
|
||||
*/
|
||||
sme_alloc(target, false);
|
||||
set_tsk_thread_flag(target, TIF_SME);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
|
|
@ -1100,7 +1107,7 @@ static int za_set(struct task_struct *target,
|
|||
}
|
||||
|
||||
/* Allocate/reinit ZA storage */
|
||||
sme_alloc(target);
|
||||
sme_alloc(target, true);
|
||||
if (!target->thread.sme_state) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
|
|
@ -1170,8 +1177,13 @@ static int zt_set(struct task_struct *target,
|
|||
if (!system_supports_sme2())
|
||||
return -EINVAL;
|
||||
|
||||
/* Ensure SVE storage in case this is first use of SME */
|
||||
sve_alloc(target, false);
|
||||
if (!target->thread.sve_state)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!thread_za_enabled(&target->thread)) {
|
||||
sme_alloc(target);
|
||||
sme_alloc(target, true);
|
||||
if (!target->thread.sme_state)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
@ -1179,8 +1191,10 @@ static int zt_set(struct task_struct *target,
|
|||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
thread_zt_state(&target->thread),
|
||||
0, ZT_SIG_REG_BYTES);
|
||||
if (ret == 0)
|
||||
if (ret == 0) {
|
||||
target->thread.svcr |= SVCR_ZA_MASK;
|
||||
set_tsk_thread_flag(target, TIF_SME);
|
||||
}
|
||||
|
||||
fpsimd_flush_task_state(target);
|
||||
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ static int restore_za_context(struct user_ctxs *user)
|
|||
fpsimd_flush_task_state(current);
|
||||
/* From now, fpsimd_thread_switch() won't touch thread.sve_state */
|
||||
|
||||
sme_alloc(current);
|
||||
sme_alloc(current, true);
|
||||
if (!current->thread.sme_state) {
|
||||
current->thread.svcr &= ~SVCR_ZA_MASK;
|
||||
clear_thread_flag(TIF_SME);
|
||||
|
|
|
|||
|
|
@ -662,5 +662,3 @@ source "kernel/power/Kconfig"
|
|||
source "drivers/acpi/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
source "drivers/firmware/Kconfig"
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@ KBUILD_CFLAGS_KERNEL += -fPIE
|
|||
LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext
|
||||
endif
|
||||
|
||||
cflags-y += -ffreestanding
|
||||
cflags-y += $(call cc-option, -mno-check-zero-division)
|
||||
cflags-y += -fno-builtin-memcpy -fno-builtin-memmove -fno-builtin-memset
|
||||
|
||||
load-y = 0x9000000000200000
|
||||
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
generic-y += dma-contiguous.h
|
||||
generic-y += export.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += parport.h
|
||||
generic-y += early_ioremap.h
|
||||
|
|
|
|||
|
|
@ -173,16 +173,30 @@ static inline void restore_fp(struct task_struct *tsk)
|
|||
_restore_fp(&tsk->thread.fpu);
|
||||
}
|
||||
|
||||
static inline union fpureg *get_fpu_regs(struct task_struct *tsk)
|
||||
static inline void save_fpu_regs(struct task_struct *tsk)
|
||||
{
|
||||
unsigned int euen;
|
||||
|
||||
if (tsk == current) {
|
||||
preempt_disable();
|
||||
if (is_fpu_owner())
|
||||
|
||||
euen = csr_read32(LOONGARCH_CSR_EUEN);
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_LASX
|
||||
if (euen & CSR_EUEN_LASXEN)
|
||||
_save_lasx(¤t->thread.fpu);
|
||||
else
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_HAS_LSX
|
||||
if (euen & CSR_EUEN_LSXEN)
|
||||
_save_lsx(¤t->thread.fpu);
|
||||
else
|
||||
#endif
|
||||
if (euen & CSR_EUEN_FPEN)
|
||||
_save_fp(¤t->thread.fpu);
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
return tsk->thread.fpu.fpr;
|
||||
}
|
||||
|
||||
static inline int is_simd_owner(void)
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ static inline void regs_set_return_value(struct pt_regs *regs, unsigned long val
|
|||
#define instruction_pointer(regs) ((regs)->csr_era)
|
||||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
|
||||
extern void die(const char *, struct pt_regs *) __noreturn;
|
||||
extern void die(const char *str, struct pt_regs *regs);
|
||||
|
||||
static inline void die_if_kernel(const char *str, struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -98,8 +98,6 @@ static inline void __cpu_die(unsigned int cpu)
|
|||
{
|
||||
loongson_cpu_die(cpu);
|
||||
}
|
||||
|
||||
extern void __noreturn play_dead(void);
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_SMP_H */
|
||||
|
|
|
|||
|
|
@ -6,12 +6,12 @@
|
|||
*
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/fpregdef.h>
|
||||
#include <asm/loongarch.h>
|
||||
#include <asm/regdef.h>
|
||||
|
|
|
|||
|
|
@ -207,8 +207,7 @@ static int hw_breakpoint_control(struct perf_event *bp,
|
|||
write_wb_reg(CSR_CFG_CTRL, i, 0, CTRL_PLV_ENABLE);
|
||||
} else {
|
||||
ctrl = encode_ctrl_reg(info->ctrl);
|
||||
write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | CTRL_PLV_ENABLE |
|
||||
1 << MWPnCFG3_LoadEn | 1 << MWPnCFG3_StoreEn);
|
||||
write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | CTRL_PLV_ENABLE);
|
||||
}
|
||||
enable = csr_read64(LOONGARCH_CSR_CRMD);
|
||||
csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* Copyright (C) 2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <asm/export.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <asm/stackframe.h>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
* Copyright (C) 2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <asm/export.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <asm/stackframe.h>
|
||||
|
|
|
|||
|
|
@ -61,13 +61,6 @@ EXPORT_SYMBOL(__stack_chk_guard);
|
|||
unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
|
||||
EXPORT_SYMBOL(boot_option_idle_override);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
void __noreturn arch_cpu_idle_dead(void)
|
||||
{
|
||||
play_dead();
|
||||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void ret_from_fork(void);
|
||||
asmlinkage void ret_from_kernel_thread(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,8 @@ static int fpr_get(struct task_struct *target,
|
|||
{
|
||||
int r;
|
||||
|
||||
save_fpu_regs(target);
|
||||
|
||||
if (sizeof(target->thread.fpu.fpr[0]) == sizeof(elf_fpreg_t))
|
||||
r = gfpr_get(target, &to);
|
||||
else
|
||||
|
|
@ -278,6 +280,8 @@ static int simd_get(struct task_struct *target,
|
|||
{
|
||||
const unsigned int wr_size = NUM_FPU_REGS * regset->size;
|
||||
|
||||
save_fpu_regs(target);
|
||||
|
||||
if (!tsk_used_math(target)) {
|
||||
/* The task hasn't used FP or LSX, fill with 0xff */
|
||||
copy_pad_fprs(target, regset, &to, 0);
|
||||
|
|
|
|||
|
|
@ -317,7 +317,7 @@ void loongson_cpu_die(unsigned int cpu)
|
|||
mb();
|
||||
}
|
||||
|
||||
void play_dead(void)
|
||||
void __noreturn arch_cpu_idle_dead(void)
|
||||
{
|
||||
register uint64_t addr;
|
||||
register void (*init_fn)(void);
|
||||
|
|
|
|||
|
|
@ -383,16 +383,15 @@ void show_registers(struct pt_regs *regs)
|
|||
|
||||
static DEFINE_RAW_SPINLOCK(die_lock);
|
||||
|
||||
void __noreturn die(const char *str, struct pt_regs *regs)
|
||||
void die(const char *str, struct pt_regs *regs)
|
||||
{
|
||||
int ret;
|
||||
static int die_counter;
|
||||
int sig = SIGSEGV;
|
||||
|
||||
oops_enter();
|
||||
|
||||
if (notify_die(DIE_OOPS, str, regs, 0, current->thread.trap_nr,
|
||||
SIGSEGV) == NOTIFY_STOP)
|
||||
sig = 0;
|
||||
ret = notify_die(DIE_OOPS, str, regs, 0,
|
||||
current->thread.trap_nr, SIGSEGV);
|
||||
|
||||
console_verbose();
|
||||
raw_spin_lock_irq(&die_lock);
|
||||
|
|
@ -405,6 +404,9 @@ void __noreturn die(const char *str, struct pt_regs *regs)
|
|||
|
||||
oops_exit();
|
||||
|
||||
if (ret == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
if (regs && kexec_should_crash(current))
|
||||
crash_kexec(regs);
|
||||
|
||||
|
|
@ -414,7 +416,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)
|
|||
if (panic_on_oops)
|
||||
panic("Fatal exception");
|
||||
|
||||
make_task_dead(sig);
|
||||
make_task_dead(SIGSEGV);
|
||||
}
|
||||
|
||||
static inline void setup_vint_size(unsigned int size)
|
||||
|
|
|
|||
|
|
@ -3,12 +3,12 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/alternative-asm.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
.irp to, 0, 1, 2, 3, 4, 5, 6, 7
|
||||
|
|
|
|||
|
|
@ -3,12 +3,12 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/alternative-asm.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
.irp to, 0, 1, 2, 3, 4, 5, 6, 7
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/alternative-asm.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
SYM_FUNC_START(memcpy)
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/alternative-asm.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
SYM_FUNC_START(memmove)
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/alternative-asm.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
.macro fill_to_64 r0
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
#include <asm/asmmacro.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
.L_fixup_handle_unaligned:
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
/*
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/regdef.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <asm/asm.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/loongarch.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <asm/traps.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/spinlock_types.h>
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/pgtable.h>
|
||||
|
|
@ -406,7 +407,7 @@
|
|||
LDREG 0(\ptp),\pte
|
||||
bb,<,n \pte,_PAGE_PRESENT_BIT,3f
|
||||
b \fault
|
||||
stw \spc,0(\tmp)
|
||||
stw \tmp1,0(\tmp)
|
||||
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
|
||||
#endif
|
||||
2: LDREG 0(\ptp),\pte
|
||||
|
|
@ -415,24 +416,22 @@
|
|||
.endm
|
||||
|
||||
/* Release page_table_lock without reloading lock address.
|
||||
Note that the values in the register spc are limited to
|
||||
NR_SPACE_IDS (262144). Thus, the stw instruction always
|
||||
stores a nonzero value even when register spc is 64 bits.
|
||||
We use an ordered store to ensure all prior accesses are
|
||||
performed prior to releasing the lock. */
|
||||
.macro ptl_unlock0 spc,tmp
|
||||
.macro ptl_unlock0 spc,tmp,tmp2
|
||||
#ifdef CONFIG_TLB_PTLOCK
|
||||
98: or,COND(=) %r0,\spc,%r0
|
||||
stw,ma \spc,0(\tmp)
|
||||
98: ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2
|
||||
or,COND(=) %r0,\spc,%r0
|
||||
stw,ma \tmp2,0(\tmp)
|
||||
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/* Release page_table_lock. */
|
||||
.macro ptl_unlock1 spc,tmp
|
||||
.macro ptl_unlock1 spc,tmp,tmp2
|
||||
#ifdef CONFIG_TLB_PTLOCK
|
||||
98: get_ptl \tmp
|
||||
ptl_unlock0 \spc,\tmp
|
||||
ptl_unlock0 \spc,\tmp,\tmp2
|
||||
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
|
||||
#endif
|
||||
.endm
|
||||
|
|
@ -1125,7 +1124,7 @@ dtlb_miss_20w:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1151,7 +1150,7 @@ nadtlb_miss_20w:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1185,7 +1184,7 @@ dtlb_miss_11:
|
|||
|
||||
mtsp t1, %sr1 /* Restore sr1 */
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1218,7 +1217,7 @@ nadtlb_miss_11:
|
|||
|
||||
mtsp t1, %sr1 /* Restore sr1 */
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1247,7 +1246,7 @@ dtlb_miss_20:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1275,7 +1274,7 @@ nadtlb_miss_20:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1320,7 +1319,7 @@ itlb_miss_20w:
|
|||
|
||||
iitlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1344,7 +1343,7 @@ naitlb_miss_20w:
|
|||
|
||||
iitlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1378,7 +1377,7 @@ itlb_miss_11:
|
|||
|
||||
mtsp t1, %sr1 /* Restore sr1 */
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1402,7 +1401,7 @@ naitlb_miss_11:
|
|||
|
||||
mtsp t1, %sr1 /* Restore sr1 */
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1432,7 +1431,7 @@ itlb_miss_20:
|
|||
|
||||
iitlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1452,7 +1451,7 @@ naitlb_miss_20:
|
|||
|
||||
iitlbt pte,prot
|
||||
|
||||
ptl_unlock1 spc,t0
|
||||
ptl_unlock1 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1482,7 +1481,7 @@ dbit_trap_20w:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock0 spc,t0
|
||||
ptl_unlock0 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
#else
|
||||
|
|
@ -1508,7 +1507,7 @@ dbit_trap_11:
|
|||
|
||||
mtsp t1, %sr1 /* Restore sr1 */
|
||||
|
||||
ptl_unlock0 spc,t0
|
||||
ptl_unlock0 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
|
||||
|
|
@ -1528,7 +1527,7 @@ dbit_trap_20:
|
|||
|
||||
idtlbt pte,prot
|
||||
|
||||
ptl_unlock0 spc,t0
|
||||
ptl_unlock0 spc,t0,t1
|
||||
rfir
|
||||
nop
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -709,9 +709,9 @@ static int __init rtas_flash_init(void)
|
|||
if (!rtas_validate_flash_data.buf)
|
||||
return -ENOMEM;
|
||||
|
||||
flash_block_cache = kmem_cache_create("rtas_flash_cache",
|
||||
RTAS_BLK_SIZE, RTAS_BLK_SIZE, 0,
|
||||
NULL);
|
||||
flash_block_cache = kmem_cache_create_usercopy("rtas_flash_cache",
|
||||
RTAS_BLK_SIZE, RTAS_BLK_SIZE,
|
||||
0, 0, RTAS_BLK_SIZE, NULL);
|
||||
if (!flash_block_cache) {
|
||||
printk(KERN_ERR "%s: failed to create block cache\n",
|
||||
__func__);
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ static int subpage_walk_pmd_entry(pmd_t *pmd, unsigned long addr,
|
|||
|
||||
static const struct mm_walk_ops subpage_walk_ops = {
|
||||
.pmd_entry = subpage_walk_pmd_entry,
|
||||
.walk_lock = PGWALK_WRLOCK_VERIFY,
|
||||
};
|
||||
|
||||
static void subpage_mark_vma_nohuge(struct mm_struct *mm, unsigned long addr,
|
||||
|
|
|
|||
|
|
@ -570,24 +570,30 @@ config TOOLCHAIN_HAS_ZIHINTPAUSE
|
|||
config TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||
def_bool y
|
||||
# https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=aed44286efa8ae8717a77d94b51ac3614e2ca6dc
|
||||
depends on AS_IS_GNU && AS_VERSION >= 23800
|
||||
# https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=98416dbb0a62579d4a7a4a76bab51b5b52fec2cd
|
||||
depends on AS_IS_GNU && AS_VERSION >= 23600
|
||||
help
|
||||
Newer binutils versions default to ISA spec version 20191213 which
|
||||
moves some instructions from the I extension to the Zicsr and Zifencei
|
||||
extensions.
|
||||
Binutils-2.38 and GCC-12.1.0 bumped the default ISA spec to the newer
|
||||
20191213 version, which moves some instructions from the I extension to
|
||||
the Zicsr and Zifencei extensions. This requires explicitly specifying
|
||||
Zicsr and Zifencei when binutils >= 2.38 or GCC >= 12.1.0. Zicsr
|
||||
and Zifencei are supported in binutils from version 2.36 onwards.
|
||||
To make life easier, and avoid forcing toolchains that default to a
|
||||
newer ISA spec to version 2.2, relax the check to binutils >= 2.36.
|
||||
For clang < 17 or GCC < 11.3.0, for which this is not possible or need
|
||||
special treatment, this is dealt with in TOOLCHAIN_NEEDS_OLD_ISA_SPEC.
|
||||
|
||||
config TOOLCHAIN_NEEDS_OLD_ISA_SPEC
|
||||
def_bool y
|
||||
depends on TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||
# https://github.com/llvm/llvm-project/commit/22e199e6afb1263c943c0c0d4498694e15bf8a16
|
||||
depends on CC_IS_CLANG && CLANG_VERSION < 170000
|
||||
# https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d29f5d6ab513c52fd872f532c492e35ae9fd6671
|
||||
depends on (CC_IS_CLANG && CLANG_VERSION < 170000) || (CC_IS_GCC && GCC_VERSION < 110300)
|
||||
help
|
||||
Certain versions of clang do not support zicsr and zifencei via -march
|
||||
but newer versions of binutils require it for the reasons noted in the
|
||||
help text of CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI. This
|
||||
option causes an older ISA spec compatible with these older versions
|
||||
of clang to be passed to GAS, which has the same result as passing zicsr
|
||||
and zifencei to -march.
|
||||
Certain versions of clang and GCC do not support zicsr and zifencei via
|
||||
-march. This option causes an older ISA spec compatible with these older
|
||||
versions of clang and GCC to be passed to GAS, which has the same result
|
||||
as passing zicsr and zifencei to -march.
|
||||
|
||||
config FPU
|
||||
bool "FPU support"
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@
|
|||
#define RVC_INSN_FUNCT4_OPOFF 12
|
||||
#define RVC_INSN_FUNCT3_MASK GENMASK(15, 13)
|
||||
#define RVC_INSN_FUNCT3_OPOFF 13
|
||||
#define RVC_INSN_J_RS1_MASK GENMASK(11, 7)
|
||||
#define RVC_INSN_J_RS2_MASK GENMASK(6, 2)
|
||||
#define RVC_INSN_OPCODE_MASK GENMASK(1, 0)
|
||||
#define RVC_ENCODE_FUNCT3(f_) (RVC_FUNCT3_##f_ << RVC_INSN_FUNCT3_OPOFF)
|
||||
|
|
@ -245,8 +246,6 @@ __RISCV_INSN_FUNCS(c_jal, RVC_MASK_C_JAL, RVC_MATCH_C_JAL)
|
|||
__RISCV_INSN_FUNCS(auipc, RVG_MASK_AUIPC, RVG_MATCH_AUIPC)
|
||||
__RISCV_INSN_FUNCS(jalr, RVG_MASK_JALR, RVG_MATCH_JALR)
|
||||
__RISCV_INSN_FUNCS(jal, RVG_MASK_JAL, RVG_MATCH_JAL)
|
||||
__RISCV_INSN_FUNCS(c_jr, RVC_MASK_C_JR, RVC_MATCH_C_JR)
|
||||
__RISCV_INSN_FUNCS(c_jalr, RVC_MASK_C_JALR, RVC_MATCH_C_JALR)
|
||||
__RISCV_INSN_FUNCS(c_j, RVC_MASK_C_J, RVC_MATCH_C_J)
|
||||
__RISCV_INSN_FUNCS(beq, RVG_MASK_BEQ, RVG_MATCH_BEQ)
|
||||
__RISCV_INSN_FUNCS(bne, RVG_MASK_BNE, RVG_MATCH_BNE)
|
||||
|
|
@ -273,6 +272,18 @@ static __always_inline bool riscv_insn_is_branch(u32 code)
|
|||
return (code & RV_INSN_OPCODE_MASK) == RVG_OPCODE_BRANCH;
|
||||
}
|
||||
|
||||
static __always_inline bool riscv_insn_is_c_jr(u32 code)
|
||||
{
|
||||
return (code & RVC_MASK_C_JR) == RVC_MATCH_C_JR &&
|
||||
(code & RVC_INSN_J_RS1_MASK) != 0;
|
||||
}
|
||||
|
||||
static __always_inline bool riscv_insn_is_c_jalr(u32 code)
|
||||
{
|
||||
return (code & RVC_MASK_C_JALR) == RVC_MATCH_C_JALR &&
|
||||
(code & RVC_INSN_J_RS1_MASK) != 0;
|
||||
}
|
||||
|
||||
#define RV_IMM_SIGN(x) (-(((x) >> 31) & 1))
|
||||
#define RVC_IMM_SIGN(x) (-(((x) >> 12) & 1))
|
||||
#define RV_X(X, s, mask) (((X) >> (s)) & (mask))
|
||||
|
|
|
|||
|
|
@ -70,8 +70,9 @@ static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest)
|
|||
"csrr %1, " __stringify(CSR_VTYPE) "\n\t"
|
||||
"csrr %2, " __stringify(CSR_VL) "\n\t"
|
||||
"csrr %3, " __stringify(CSR_VCSR) "\n\t"
|
||||
"csrr %4, " __stringify(CSR_VLENB) "\n\t"
|
||||
: "=r" (dest->vstart), "=r" (dest->vtype), "=r" (dest->vl),
|
||||
"=r" (dest->vcsr) : :);
|
||||
"=r" (dest->vcsr), "=r" (dest->vlenb) : :);
|
||||
}
|
||||
|
||||
static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src)
|
||||
|
|
|
|||
14
arch/riscv/include/uapi/asm/bitsperlong.h
Normal file
14
arch/riscv/include/uapi/asm/bitsperlong.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2012 ARM Ltd.
|
||||
* Copyright (C) 2015 Regents of the University of California
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_RISCV_BITSPERLONG_H
|
||||
#define _UAPI_ASM_RISCV_BITSPERLONG_H
|
||||
|
||||
#define __BITS_PER_LONG (__SIZEOF_POINTER__ * 8)
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
#endif /* _UAPI_ASM_RISCV_BITSPERLONG_H */
|
||||
|
|
@ -97,6 +97,7 @@ struct __riscv_v_ext_state {
|
|||
unsigned long vl;
|
||||
unsigned long vtype;
|
||||
unsigned long vcsr;
|
||||
unsigned long vlenb;
|
||||
void *datap;
|
||||
/*
|
||||
* In signal handler, datap will be set a correct user stack offset
|
||||
|
|
|
|||
|
|
@ -11,7 +11,13 @@ compat_vdso-syms += flush_icache
|
|||
COMPAT_CC := $(CC)
|
||||
COMPAT_LD := $(LD)
|
||||
|
||||
COMPAT_CC_FLAGS := -march=rv32g -mabi=ilp32
|
||||
# binutils 2.35 does not support the zifencei extension, but in the ISA
|
||||
# spec 20191213, G stands for IMAFD_ZICSR_ZIFENCEI.
|
||||
ifdef CONFIG_TOOLCHAIN_NEEDS_EXPLICIT_ZICSR_ZIFENCEI
|
||||
COMPAT_CC_FLAGS := -march=rv32g -mabi=ilp32
|
||||
else
|
||||
COMPAT_CC_FLAGS := -march=rv32imafd -mabi=ilp32
|
||||
endif
|
||||
COMPAT_LD_FLAGS := -melf32lriscv
|
||||
|
||||
# Disable attributes, as they're useless and break the build.
|
||||
|
|
|
|||
|
|
@ -84,6 +84,9 @@ void do_softirq_own_stack(void)
|
|||
: [sp] "r" (sp)
|
||||
: "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
|
||||
"t0", "t1", "t2", "t3", "t4", "t5", "t6",
|
||||
#ifndef CONFIG_FRAME_POINTER
|
||||
"s0",
|
||||
#endif
|
||||
"memory");
|
||||
} else
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,9 +25,6 @@ enum riscv_regset {
|
|||
#ifdef CONFIG_FPU
|
||||
REGSET_F,
|
||||
#endif
|
||||
#ifdef CONFIG_RISCV_ISA_V
|
||||
REGSET_V,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int riscv_gpr_get(struct task_struct *target,
|
||||
|
|
@ -84,61 +81,6 @@ static int riscv_fpr_set(struct task_struct *target,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RISCV_ISA_V
|
||||
static int riscv_vr_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
struct membuf to)
|
||||
{
|
||||
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
|
||||
|
||||
if (!riscv_v_vstate_query(task_pt_regs(target)))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Ensure the vector registers have been saved to the memory before
|
||||
* copying them to membuf.
|
||||
*/
|
||||
if (target == current)
|
||||
riscv_v_vstate_save(current, task_pt_regs(current));
|
||||
|
||||
/* Copy vector header from vstate. */
|
||||
membuf_write(&to, vstate, offsetof(struct __riscv_v_ext_state, datap));
|
||||
membuf_zero(&to, sizeof(vstate->datap));
|
||||
|
||||
/* Copy all the vector registers from vstate. */
|
||||
return membuf_write(&to, vstate->datap, riscv_v_vsize);
|
||||
}
|
||||
|
||||
static int riscv_vr_set(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret, size;
|
||||
struct __riscv_v_ext_state *vstate = &target->thread.vstate;
|
||||
|
||||
if (!riscv_v_vstate_query(task_pt_regs(target)))
|
||||
return -EINVAL;
|
||||
|
||||
/* Copy rest of the vstate except datap */
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vstate, 0,
|
||||
offsetof(struct __riscv_v_ext_state, datap));
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
|
||||
/* Skip copy datap. */
|
||||
size = sizeof(vstate->datap);
|
||||
count -= size;
|
||||
ubuf += size;
|
||||
|
||||
/* Copy all the vector registers. */
|
||||
pos = 0;
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vstate->datap,
|
||||
0, riscv_v_vsize);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct user_regset riscv_user_regset[] = {
|
||||
[REGSET_X] = {
|
||||
.core_note_type = NT_PRSTATUS,
|
||||
|
|
@ -158,17 +100,6 @@ static const struct user_regset riscv_user_regset[] = {
|
|||
.set = riscv_fpr_set,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_RISCV_ISA_V
|
||||
[REGSET_V] = {
|
||||
.core_note_type = NT_RISCV_VECTOR,
|
||||
.align = 16,
|
||||
.n = ((32 * RISCV_MAX_VLENB) +
|
||||
sizeof(struct __riscv_v_ext_state)) / sizeof(__u32),
|
||||
.size = sizeof(__u32),
|
||||
.regset_get = riscv_vr_get,
|
||||
.set = riscv_vr_set,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct user_regset_view riscv_user_native_view = {
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
|
|||
asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs)
|
||||
{
|
||||
if (user_mode(regs)) {
|
||||
ulong syscall = regs->a7;
|
||||
long syscall = regs->a7;
|
||||
|
||||
regs->epc += 4;
|
||||
regs->orig_a0 = regs->a0;
|
||||
|
|
@ -306,9 +306,9 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs)
|
|||
|
||||
syscall = syscall_enter_from_user_mode(regs, syscall);
|
||||
|
||||
if (syscall < NR_syscalls)
|
||||
if (syscall >= 0 && syscall < NR_syscalls)
|
||||
syscall_handler(regs, syscall);
|
||||
else
|
||||
else if (syscall != -1)
|
||||
regs->a0 = -ENOSYS;
|
||||
|
||||
syscall_exit_to_user_mode(regs);
|
||||
|
|
@ -372,6 +372,9 @@ asmlinkage void noinstr do_irq(struct pt_regs *regs)
|
|||
: [sp] "r" (sp), [regs] "r" (regs)
|
||||
: "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
|
||||
"t0", "t1", "t2", "t3", "t4", "t5", "t6",
|
||||
#ifndef CONFIG_FRAME_POINTER
|
||||
"s0",
|
||||
#endif
|
||||
"memory");
|
||||
} else
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -17,8 +17,11 @@ ENTRY(__asm_copy_from_user)
|
|||
li t6, SR_SUM
|
||||
csrs CSR_STATUS, t6
|
||||
|
||||
/* Save for return value */
|
||||
mv t5, a2
|
||||
/*
|
||||
* Save the terminal address which will be used to compute the number
|
||||
* of bytes copied in case of a fixup exception.
|
||||
*/
|
||||
add t5, a0, a2
|
||||
|
||||
/*
|
||||
* Register allocation for code below:
|
||||
|
|
@ -176,7 +179,7 @@ ENTRY(__asm_copy_from_user)
|
|||
10:
|
||||
/* Disable access to user memory */
|
||||
csrc CSR_STATUS, t6
|
||||
mv a0, t5
|
||||
sub a0, t5, a0
|
||||
ret
|
||||
ENDPROC(__asm_copy_to_user)
|
||||
ENDPROC(__asm_copy_from_user)
|
||||
|
|
@ -228,7 +231,7 @@ ENTRY(__clear_user)
|
|||
11:
|
||||
/* Disable access to user memory */
|
||||
csrc CSR_STATUS, t6
|
||||
mv a0, a1
|
||||
sub a0, a3, a0
|
||||
ret
|
||||
ENDPROC(__clear_user)
|
||||
EXPORT_SYMBOL(__clear_user)
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ static const struct mm_walk_ops pageattr_ops = {
|
|||
.pmd_entry = pageattr_pmd_entry,
|
||||
.pte_entry = pageattr_pte_entry,
|
||||
.pte_hole = pageattr_pte_hole,
|
||||
.walk_lock = PGWALK_RDLOCK,
|
||||
};
|
||||
|
||||
static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,
|
||||
|
|
|
|||
|
|
@ -2514,6 +2514,7 @@ static int thp_split_walk_pmd_entry(pmd_t *pmd, unsigned long addr,
|
|||
|
||||
static const struct mm_walk_ops thp_split_walk_ops = {
|
||||
.pmd_entry = thp_split_walk_pmd_entry,
|
||||
.walk_lock = PGWALK_WRLOCK_VERIFY,
|
||||
};
|
||||
|
||||
static inline void thp_split_mm(struct mm_struct *mm)
|
||||
|
|
@ -2565,6 +2566,7 @@ static int __zap_zero_pages(pmd_t *pmd, unsigned long start,
|
|||
|
||||
static const struct mm_walk_ops zap_zero_walk_ops = {
|
||||
.pmd_entry = __zap_zero_pages,
|
||||
.walk_lock = PGWALK_WRLOCK,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -2655,6 +2657,7 @@ static const struct mm_walk_ops enable_skey_walk_ops = {
|
|||
.hugetlb_entry = __s390_enable_skey_hugetlb,
|
||||
.pte_entry = __s390_enable_skey_pte,
|
||||
.pmd_entry = __s390_enable_skey_pmd,
|
||||
.walk_lock = PGWALK_WRLOCK,
|
||||
};
|
||||
|
||||
int s390_enable_skey(void)
|
||||
|
|
@ -2692,6 +2695,7 @@ static int __s390_reset_cmma(pte_t *pte, unsigned long addr,
|
|||
|
||||
static const struct mm_walk_ops reset_cmma_walk_ops = {
|
||||
.pte_entry = __s390_reset_cmma,
|
||||
.walk_lock = PGWALK_WRLOCK,
|
||||
};
|
||||
|
||||
void s390_reset_cmma(struct mm_struct *mm)
|
||||
|
|
@ -2728,6 +2732,7 @@ static int s390_gather_pages(pte_t *ptep, unsigned long addr,
|
|||
|
||||
static const struct mm_walk_ops gather_pages_ops = {
|
||||
.pte_entry = s390_gather_pages,
|
||||
.walk_lock = PGWALK_RDLOCK,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
|
|||
static __always_inline void arch_exit_to_user_mode(void)
|
||||
{
|
||||
mds_user_clear_cpu_buffers();
|
||||
amd_clear_divider();
|
||||
}
|
||||
#define arch_exit_to_user_mode arch_exit_to_user_mode
|
||||
|
||||
|
|
|
|||
|
|
@ -272,9 +272,9 @@
|
|||
.endm
|
||||
|
||||
#ifdef CONFIG_CPU_UNRET_ENTRY
|
||||
#define CALL_ZEN_UNTRAIN_RET "call zen_untrain_ret"
|
||||
#define CALL_UNTRAIN_RET "call entry_untrain_ret"
|
||||
#else
|
||||
#define CALL_ZEN_UNTRAIN_RET ""
|
||||
#define CALL_UNTRAIN_RET ""
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -282,7 +282,7 @@
|
|||
* return thunk isn't mapped into the userspace tables (then again, AMD
|
||||
* typically has NO_MELTDOWN).
|
||||
*
|
||||
* While zen_untrain_ret() doesn't clobber anything but requires stack,
|
||||
* While retbleed_untrain_ret() doesn't clobber anything but requires stack,
|
||||
* entry_ibpb() will clobber AX, CX, DX.
|
||||
*
|
||||
* As such, this must be placed after every *SWITCH_TO_KERNEL_CR3 at a point
|
||||
|
|
@ -293,14 +293,20 @@
|
|||
defined(CONFIG_CALL_DEPTH_TRACKING) || defined(CONFIG_CPU_SRSO)
|
||||
VALIDATE_UNRET_END
|
||||
ALTERNATIVE_3 "", \
|
||||
CALL_ZEN_UNTRAIN_RET, X86_FEATURE_UNRET, \
|
||||
CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \
|
||||
"call entry_ibpb", X86_FEATURE_ENTRY_IBPB, \
|
||||
__stringify(RESET_CALL_DEPTH), X86_FEATURE_CALL_DEPTH
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#ifdef CONFIG_CPU_SRSO
|
||||
ALTERNATIVE_2 "", "call srso_untrain_ret", X86_FEATURE_SRSO, \
|
||||
"call srso_untrain_ret_alias", X86_FEATURE_SRSO_ALIAS
|
||||
.macro UNTRAIN_RET_VM
|
||||
#if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_IBPB_ENTRY) || \
|
||||
defined(CONFIG_CALL_DEPTH_TRACKING) || defined(CONFIG_CPU_SRSO)
|
||||
VALIDATE_UNRET_END
|
||||
ALTERNATIVE_3 "", \
|
||||
CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \
|
||||
"call entry_ibpb", X86_FEATURE_IBPB_ON_VMEXIT, \
|
||||
__stringify(RESET_CALL_DEPTH), X86_FEATURE_CALL_DEPTH
|
||||
#endif
|
||||
.endm
|
||||
|
||||
|
|
@ -309,15 +315,10 @@
|
|||
defined(CONFIG_CALL_DEPTH_TRACKING)
|
||||
VALIDATE_UNRET_END
|
||||
ALTERNATIVE_3 "", \
|
||||
CALL_ZEN_UNTRAIN_RET, X86_FEATURE_UNRET, \
|
||||
CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \
|
||||
"call entry_ibpb", X86_FEATURE_ENTRY_IBPB, \
|
||||
__stringify(RESET_CALL_DEPTH_FROM_CALL), X86_FEATURE_CALL_DEPTH
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_SRSO
|
||||
ALTERNATIVE_2 "", "call srso_untrain_ret", X86_FEATURE_SRSO, \
|
||||
"call srso_untrain_ret_alias", X86_FEATURE_SRSO_ALIAS
|
||||
#endif
|
||||
.endm
|
||||
|
||||
|
||||
|
|
@ -341,17 +342,24 @@ extern retpoline_thunk_t __x86_indirect_thunk_array[];
|
|||
extern retpoline_thunk_t __x86_indirect_call_thunk_array[];
|
||||
extern retpoline_thunk_t __x86_indirect_jump_thunk_array[];
|
||||
|
||||
#ifdef CONFIG_RETHUNK
|
||||
extern void __x86_return_thunk(void);
|
||||
extern void zen_untrain_ret(void);
|
||||
#else
|
||||
static inline void __x86_return_thunk(void) {}
|
||||
#endif
|
||||
|
||||
extern void retbleed_return_thunk(void);
|
||||
extern void srso_return_thunk(void);
|
||||
extern void srso_alias_return_thunk(void);
|
||||
|
||||
extern void retbleed_untrain_ret(void);
|
||||
extern void srso_untrain_ret(void);
|
||||
extern void srso_untrain_ret_alias(void);
|
||||
extern void srso_alias_untrain_ret(void);
|
||||
|
||||
extern void entry_untrain_ret(void);
|
||||
extern void entry_ibpb(void);
|
||||
|
||||
#ifdef CONFIG_CALL_THUNKS
|
||||
extern void (*x86_return_thunk)(void);
|
||||
#else
|
||||
#define x86_return_thunk (&__x86_return_thunk)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CALL_DEPTH_TRACKING
|
||||
extern void __x86_return_skl(void);
|
||||
|
|
@ -478,9 +486,6 @@ enum ssb_mitigation {
|
|||
SPEC_STORE_BYPASS_SECCOMP,
|
||||
};
|
||||
|
||||
extern char __indirect_thunk_start[];
|
||||
extern char __indirect_thunk_end[];
|
||||
|
||||
static __always_inline
|
||||
void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -687,10 +687,6 @@ void __init_or_module noinline apply_retpolines(s32 *start, s32 *end)
|
|||
|
||||
#ifdef CONFIG_RETHUNK
|
||||
|
||||
#ifdef CONFIG_CALL_THUNKS
|
||||
void (*x86_return_thunk)(void) __ro_after_init = &__x86_return_thunk;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Rewrite the compiler generated return thunk tail-calls.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1329,3 +1329,4 @@ void noinstr amd_clear_divider(void)
|
|||
asm volatile(ALTERNATIVE("", "div %2\n\t", X86_BUG_DIV0)
|
||||
:: "a" (0), "d" (0), "r" (1));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amd_clear_divider);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@ EXPORT_SYMBOL_GPL(x86_pred_cmd);
|
|||
|
||||
static DEFINE_MUTEX(spec_ctrl_mutex);
|
||||
|
||||
void (*x86_return_thunk)(void) __ro_after_init = &__x86_return_thunk;
|
||||
|
||||
/* Update SPEC_CTRL MSR and its cached copy unconditionally */
|
||||
static void update_spec_ctrl(u64 val)
|
||||
{
|
||||
|
|
@ -165,6 +167,11 @@ void __init cpu_select_mitigations(void)
|
|||
md_clear_select_mitigation();
|
||||
srbds_select_mitigation();
|
||||
l1d_flush_select_mitigation();
|
||||
|
||||
/*
|
||||
* srso_select_mitigation() depends and must run after
|
||||
* retbleed_select_mitigation().
|
||||
*/
|
||||
srso_select_mitigation();
|
||||
gds_select_mitigation();
|
||||
}
|
||||
|
|
@ -1035,6 +1042,9 @@ static void __init retbleed_select_mitigation(void)
|
|||
setup_force_cpu_cap(X86_FEATURE_RETHUNK);
|
||||
setup_force_cpu_cap(X86_FEATURE_UNRET);
|
||||
|
||||
if (IS_ENABLED(CONFIG_RETHUNK))
|
||||
x86_return_thunk = retbleed_return_thunk;
|
||||
|
||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
|
||||
boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
|
||||
pr_err(RETBLEED_UNTRAIN_MSG);
|
||||
|
|
@ -1044,6 +1054,7 @@ static void __init retbleed_select_mitigation(void)
|
|||
|
||||
case RETBLEED_MITIGATION_IBPB:
|
||||
setup_force_cpu_cap(X86_FEATURE_ENTRY_IBPB);
|
||||
setup_force_cpu_cap(X86_FEATURE_IBPB_ON_VMEXIT);
|
||||
mitigate_smt = true;
|
||||
break;
|
||||
|
||||
|
|
@ -2417,9 +2428,10 @@ static void __init srso_select_mitigation(void)
|
|||
* Zen1/2 with SMT off aren't vulnerable after the right
|
||||
* IBPB microcode has been applied.
|
||||
*/
|
||||
if ((boot_cpu_data.x86 < 0x19) &&
|
||||
(!cpu_smt_possible() || (cpu_smt_control == CPU_SMT_DISABLED)))
|
||||
if (boot_cpu_data.x86 < 0x19 && !cpu_smt_possible()) {
|
||||
setup_force_cpu_cap(X86_FEATURE_SRSO_NO);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (retbleed_mitigation == RETBLEED_MITIGATION_IBPB) {
|
||||
|
|
@ -2448,11 +2460,15 @@ static void __init srso_select_mitigation(void)
|
|||
* like ftrace, static_call, etc.
|
||||
*/
|
||||
setup_force_cpu_cap(X86_FEATURE_RETHUNK);
|
||||
setup_force_cpu_cap(X86_FEATURE_UNRET);
|
||||
|
||||
if (boot_cpu_data.x86 == 0x19)
|
||||
if (boot_cpu_data.x86 == 0x19) {
|
||||
setup_force_cpu_cap(X86_FEATURE_SRSO_ALIAS);
|
||||
else
|
||||
x86_return_thunk = srso_alias_return_thunk;
|
||||
} else {
|
||||
setup_force_cpu_cap(X86_FEATURE_SRSO);
|
||||
x86_return_thunk = srso_return_thunk;
|
||||
}
|
||||
srso_mitigation = SRSO_MITIGATION_SAFE_RET;
|
||||
} else {
|
||||
pr_err("WARNING: kernel not compiled with CPU_SRSO.\n");
|
||||
|
|
@ -2696,6 +2712,9 @@ static ssize_t retbleed_show_state(char *buf)
|
|||
|
||||
static ssize_t srso_show_state(char *buf)
|
||||
{
|
||||
if (boot_cpu_has(X86_FEATURE_SRSO_NO))
|
||||
return sysfs_emit(buf, "Mitigation: SMT disabled\n");
|
||||
|
||||
return sysfs_emit(buf, "%s%s\n",
|
||||
srso_strings[srso_mitigation],
|
||||
(cpu_has_ibpb_brtype_microcode() ? "" : ", no microcode"));
|
||||
|
|
|
|||
|
|
@ -19,8 +19,7 @@
|
|||
* FPU state for a task MUST let the rest of the kernel know that the
|
||||
* FPU registers are no longer valid for this task.
|
||||
*
|
||||
* Either one of these invalidation functions is enough. Invalidate
|
||||
* a resource you control: CPU if using the CPU for something else
|
||||
* Invalidate a resource you control: CPU if using the CPU for something else
|
||||
* (with preemption disabled), FPU for the current task, or a task that
|
||||
* is prevented from running by the current task.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -679,7 +679,7 @@ static void fpu_reset_fpregs(void)
|
|||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
|
||||
fpregs_lock();
|
||||
fpu__drop(fpu);
|
||||
__fpu_invalidate_fpregs_state(fpu);
|
||||
/*
|
||||
* This does not change the actual hardware registers. It just
|
||||
* resets the memory image and sets TIF_NEED_FPU_LOAD so a
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user