mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/can/pch_can.cae64438be1
("can: dev: fix skb drop check")1dd1b521be
("can: remove obsolete PCH CAN driver") https://lore.kernel.org/all/20221110102509.1f7d63cc@canb.auug.org.au/ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
966a9b4903
5
CREDITS
5
CREDITS
@ -918,6 +918,11 @@ S: Ottawa, Ontario
|
||||
S: K1N 6Z9
|
||||
S: CANADA
|
||||
|
||||
N: Vivien Didelot
|
||||
E: vivien.didelot@gmail.com
|
||||
D: DSA framework and MV88E6XXX driver
|
||||
S: Montreal, Quebec, Canada
|
||||
|
||||
N: Jeff Dike
|
||||
E: jdike@karaya.com
|
||||
W: http://user-mode-linux.sourceforge.net
|
||||
|
@ -340,6 +340,14 @@ Before jumping into the kernel, the following conditions must be met:
|
||||
- SMCR_EL2.LEN must be initialised to the same value for all CPUs the
|
||||
kernel will execute on.
|
||||
|
||||
- HWFGRTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01.
|
||||
|
||||
- HWFGWTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01.
|
||||
|
||||
- HWFGRTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01.
|
||||
|
||||
- HWFGWTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01.
|
||||
|
||||
For CPUs with the Scalable Matrix Extension FA64 feature (FEAT_SME_FA64)
|
||||
|
||||
- If EL3 is present:
|
||||
|
@ -92,7 +92,7 @@ operation if the source belongs to the supported system register space.
|
||||
|
||||
The infrastructure emulates only the following system register space::
|
||||
|
||||
Op0=3, Op1=0, CRn=0, CRm=0,4,5,6,7
|
||||
Op0=3, Op1=0, CRn=0, CRm=0,2,3,4,5,6,7
|
||||
|
||||
(See Table C5-6 'System instruction encodings for non-Debug System
|
||||
register accesses' in ARMv8 ARM DDI 0487A.h, for the list of
|
||||
@ -293,6 +293,42 @@ infrastructure:
|
||||
| WFXT | [3-0] | y |
|
||||
+------------------------------+---------+---------+
|
||||
|
||||
10) MVFR0_EL1 - AArch32 Media and VFP Feature Register 0
|
||||
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| FPDP | [11-8] | y |
|
||||
+------------------------------+---------+---------+
|
||||
|
||||
11) MVFR1_EL1 - AArch32 Media and VFP Feature Register 1
|
||||
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| SIMDFMAC | [31-28] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SIMDSP | [19-16] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SIMDInt | [15-12] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SIMDLS | [11-8] | y |
|
||||
+------------------------------+---------+---------+
|
||||
|
||||
12) ID_ISAR5_EL1 - AArch32 Instruction Set Attribute Register 5
|
||||
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| CRC32 | [19-16] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SHA2 | [15-12] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| SHA1 | [11-8] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| AES | [7-4] | y |
|
||||
+------------------------------+---------+---------+
|
||||
|
||||
|
||||
Appendix I: Example
|
||||
-------------------
|
||||
|
@ -15,9 +15,22 @@ description:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sfpb-mutex
|
||||
- qcom,tcsr-mutex
|
||||
oneOf:
|
||||
- enum:
|
||||
- qcom,sfpb-mutex
|
||||
- qcom,tcsr-mutex
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,apq8084-tcsr-mutex
|
||||
- qcom,ipq6018-tcsr-mutex
|
||||
- qcom,msm8226-tcsr-mutex
|
||||
- qcom,msm8994-tcsr-mutex
|
||||
- const: qcom,tcsr-mutex
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,msm8974-tcsr-mutex
|
||||
- const: qcom,tcsr-mutex
|
||||
- const: syscon
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@ -34,9 +47,9 @@ additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
tcsr_mutex: hwlock@1f40000 {
|
||||
compatible = "qcom,tcsr-mutex";
|
||||
reg = <0x01f40000 0x40000>;
|
||||
#hwlock-cells = <1>;
|
||||
};
|
||||
hwlock@1f40000 {
|
||||
compatible = "qcom,tcsr-mutex";
|
||||
reg = <0x01f40000 0x40000>;
|
||||
#hwlock-cells = <1>;
|
||||
};
|
||||
...
|
||||
|
@ -47,7 +47,7 @@ properties:
|
||||
|
||||
nvmem-cells: true
|
||||
|
||||
nvmem-cells-names: true
|
||||
nvmem-cell-names: true
|
||||
|
||||
phy-connection-type:
|
||||
enum:
|
||||
|
@ -81,6 +81,9 @@ properties:
|
||||
|
||||
power-supply: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
description: |
|
||||
A number of phandles to resets that need to be asserted during
|
||||
|
@ -279,6 +279,7 @@ GPIO
|
||||
devm_gpio_request_one()
|
||||
|
||||
I2C
|
||||
devm_i2c_add_adapter()
|
||||
devm_i2c_new_dummy_device()
|
||||
|
||||
IIO
|
||||
|
@ -119,6 +119,16 @@ To avoid this, you can make the vDSO different for different
|
||||
kernel versions by including an arbitrary string of "salt" in it.
|
||||
This is specified by the Kconfig symbol ``CONFIG_BUILD_SALT``.
|
||||
|
||||
Git
|
||||
---
|
||||
|
||||
Uncommitted changes or different commit ids in git can also lead
|
||||
to different compilation results. For example, after executing
|
||||
``git reset HEAD^``, even if the code is the same, the
|
||||
``include/config/kernel.release`` generated during compilation
|
||||
will be different, which will eventually lead to binary differences.
|
||||
See ``scripts/setlocalversion`` for details.
|
||||
|
||||
.. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp
|
||||
.. _KBUILD_BUILD_USER and KBUILD_BUILD_HOST: kbuild.html#kbuild-build-user-kbuild-build-host
|
||||
.. _KCFLAGS: kbuild.html#kcflags
|
||||
|
20
MAINTAINERS
20
MAINTAINERS
@ -3985,7 +3985,7 @@ M: Rafał Miłecki <rafal@milecki.pl>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
|
||||
F: arch/arm64/boot/dts/broadcom/bcmbca/*
|
||||
N: bcmbca
|
||||
@ -4010,7 +4010,7 @@ R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: drivers/pci/controller/pcie-brcmstb.c
|
||||
F: drivers/staging/vc04_services
|
||||
@ -4024,7 +4024,7 @@ M: Ray Jui <rjui@broadcom.com>
|
||||
M: Scott Branden <sbranden@broadcom.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/mach-bcm
|
||||
T: git https://github.com/broadcom/mach-bcm
|
||||
F: arch/arm/mach-bcm/
|
||||
N: bcm281*
|
||||
N: bcm113*
|
||||
@ -4089,7 +4089,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: arch/arm/boot/dts/bcm7*.dts*
|
||||
F: arch/arm/include/asm/hardware/cache-b15-rac.h
|
||||
@ -4122,7 +4122,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-mips@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: arch/mips/bmips/*
|
||||
F: arch/mips/boot/dts/brcm/bcm*.dts*
|
||||
F: arch/mips/include/asm/mach-bmips/*
|
||||
@ -4263,7 +4263,7 @@ M: Scott Branden <sbranden@broadcom.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: arch/arm64/boot/dts/broadcom/northstar2/*
|
||||
F: arch/arm64/boot/dts/broadcom/stingray/*
|
||||
F: drivers/clk/bcm/clk-ns*
|
||||
@ -4333,7 +4333,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: drivers/soc/bcm/bcm63xx/bcm-pmb.c
|
||||
F: include/dt-bindings/soc/bcm-pmb.h
|
||||
|
||||
@ -8604,8 +8604,8 @@ F: include/asm-generic/
|
||||
F: include/uapi/asm-generic/
|
||||
|
||||
GENERIC PHY FRAMEWORK
|
||||
M: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
M: Vinod Koul <vkoul@kernel.org>
|
||||
M: Kishon Vijay Abraham I <kishon@kernel.org>
|
||||
L: linux-phy@lists.infradead.org
|
||||
S: Supported
|
||||
Q: https://patchwork.kernel.org/project/linux-phy/list/
|
||||
@ -9219,7 +9219,7 @@ W: https://www.hisilicon.com
|
||||
F: drivers/i2c/busses/i2c-hisi.c
|
||||
|
||||
HISILICON LPC BUS DRIVER
|
||||
M: john.garry@huawei.com
|
||||
M: Jay Fang <f.fangjian@huawei.com>
|
||||
S: Maintained
|
||||
W: http://www.hisilicon.com
|
||||
F: Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml
|
||||
@ -12229,7 +12229,6 @@ F: arch/mips/boot/dts/img/pistachio*
|
||||
|
||||
MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
M: Vivien Didelot <vivien.didelot@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/net/dsa/marvell.txt
|
||||
@ -14328,7 +14327,6 @@ F: drivers/net/wireless/
|
||||
|
||||
NETWORKING [DSA]
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
M: Vivien Didelot <vivien.didelot@gmail.com>
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
M: Vladimir Oltean <olteanv@gmail.com>
|
||||
S: Maintained
|
||||
|
4
Makefile
4
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 1
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -1218,7 +1218,7 @@ quiet_cmd_ar_vmlinux.a = AR $@
|
||||
cmd_ar_vmlinux.a = \
|
||||
rm -f $@; \
|
||||
$(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
|
||||
$(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)
|
||||
$(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
|
||||
|
||||
targets += vmlinux.a
|
||||
vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE
|
||||
|
@ -33,6 +33,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_pu {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
®_usb_h1_vbus {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
user-pb {
|
||||
label = "user_pb";
|
||||
gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gsc_gpio 2 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_0>;
|
||||
};
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
user-pb {
|
||||
label = "user_pb";
|
||||
gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gsc_gpio 2 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_0>;
|
||||
};
|
||||
|
||||
|
@ -33,6 +33,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_pu {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
®_usb_h1_vbus {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -24,6 +24,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -28,6 +28,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -44,6 +44,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -57,6 +57,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -34,6 +34,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -751,12 +751,26 @@
|
||||
polling-delay = <1000>;
|
||||
polling-delay-passive = <100>;
|
||||
thermal-sensors = <&scpi_sensors0 0>;
|
||||
trips {
|
||||
pmic_crit0: trip0 {
|
||||
temperature = <90000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
polling-delay = <1000>;
|
||||
polling-delay-passive = <100>;
|
||||
thermal-sensors = <&scpi_sensors0 3>;
|
||||
trips {
|
||||
soc_crit0: trip0 {
|
||||
temperature = <80000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
big_cluster_thermal_zone: big-cluster {
|
||||
|
@ -779,6 +779,9 @@
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(1)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -788,6 +791,9 @@
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(1)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -532,6 +532,9 @@
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -541,6 +544,9 @@
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -1385,6 +1385,9 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
little-endian;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1395,6 +1398,9 @@
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -38,9 +38,9 @@ conn_subsys: bus@5b000000 {
|
||||
interrupts = <GIC_SPI 232 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b010000 0x10000>;
|
||||
clocks = <&sdhc0_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_0>;
|
||||
status = "disabled";
|
||||
};
|
||||
@ -49,9 +49,9 @@ conn_subsys: bus@5b000000 {
|
||||
interrupts = <GIC_SPI 233 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b020000 0x10000>;
|
||||
clocks = <&sdhc1_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_1>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
fsl,tuning-step = <2>;
|
||||
@ -62,9 +62,9 @@ conn_subsys: bus@5b000000 {
|
||||
interrupts = <GIC_SPI 234 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b030000 0x10000>;
|
||||
clocks = <&sdhc2_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -250,21 +250,21 @@
|
||||
/* SODIMM 96 */
|
||||
MX8MM_IOMUXC_SAI1_RXD2_GPIO4_IO4 0x1c4
|
||||
/* CPLD_D[7] */
|
||||
MX8MM_IOMUXC_SAI1_RXD3_GPIO4_IO5 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_RXD3_GPIO4_IO5 0x184
|
||||
/* CPLD_D[6] */
|
||||
MX8MM_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x184
|
||||
/* CPLD_D[5] */
|
||||
MX8MM_IOMUXC_SAI1_TXC_GPIO4_IO11 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXC_GPIO4_IO11 0x184
|
||||
/* CPLD_D[4] */
|
||||
MX8MM_IOMUXC_SAI1_TXD0_GPIO4_IO12 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD0_GPIO4_IO12 0x184
|
||||
/* CPLD_D[3] */
|
||||
MX8MM_IOMUXC_SAI1_TXD1_GPIO4_IO13 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD1_GPIO4_IO13 0x184
|
||||
/* CPLD_D[2] */
|
||||
MX8MM_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x184
|
||||
/* CPLD_D[1] */
|
||||
MX8MM_IOMUXC_SAI1_TXD3_GPIO4_IO15 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD3_GPIO4_IO15 0x184
|
||||
/* CPLD_D[0] */
|
||||
MX8MM_IOMUXC_SAI1_TXD4_GPIO4_IO16 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD4_GPIO4_IO16 0x184
|
||||
/* KBD_intK */
|
||||
MX8MM_IOMUXC_SAI2_MCLK_GPIO4_IO27 0x1c4
|
||||
/* DISP_reset */
|
||||
|
@ -276,6 +276,7 @@
|
||||
assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg1>;
|
||||
};
|
||||
|
||||
usbphynop2: usbphynop2 {
|
||||
@ -285,6 +286,7 @@
|
||||
assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg2>;
|
||||
};
|
||||
|
||||
soc: soc@0 {
|
||||
@ -674,13 +676,11 @@
|
||||
pgc_otg1: power-domain@2 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MM_POWER_DOMAIN_OTG1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_otg2: power-domain@3 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MM_POWER_DOMAIN_OTG2>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_gpumix: power-domain@4 {
|
||||
@ -1186,7 +1186,7 @@
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop1>;
|
||||
fsl,usbmisc = <&usbmisc1 0>;
|
||||
power-domains = <&pgc_otg1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1206,7 +1206,7 @@
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop2>;
|
||||
fsl,usbmisc = <&usbmisc2 0>;
|
||||
power-domains = <&pgc_otg2>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -662,7 +662,6 @@
|
||||
pgc_otg1: power-domain@1 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MN_POWER_DOMAIN_OTG1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_gpumix: power-domain@2 {
|
||||
@ -1076,7 +1075,7 @@
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop1>;
|
||||
fsl,usbmisc = <&usbmisc1 0>;
|
||||
power-domains = <&pgc_otg1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1175,5 +1174,6 @@
|
||||
assigned-clocks = <&clk IMX8MN_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg1>;
|
||||
};
|
||||
};
|
||||
|
@ -354,16 +354,6 @@
|
||||
"SODIMM_82",
|
||||
"SODIMM_70",
|
||||
"SODIMM_72";
|
||||
|
||||
ctrl-sleep-moci-hog {
|
||||
gpio-hog;
|
||||
/* Verdin CTRL_SLEEP_MOCI# (SODIMM 256) */
|
||||
gpios = <29 GPIO_ACTIVE_HIGH>;
|
||||
line-name = "CTRL_SLEEP_MOCI#";
|
||||
output-high;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ctrl_sleep_moci>;
|
||||
};
|
||||
};
|
||||
|
||||
&gpio3 {
|
||||
@ -432,6 +422,16 @@
|
||||
"SODIMM_256",
|
||||
"SODIMM_48",
|
||||
"SODIMM_44";
|
||||
|
||||
ctrl-sleep-moci-hog {
|
||||
gpio-hog;
|
||||
/* Verdin CTRL_SLEEP_MOCI# (SODIMM 256) */
|
||||
gpios = <29 GPIO_ACTIVE_HIGH>;
|
||||
line-name = "CTRL_SLEEP_MOCI#";
|
||||
output-high;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ctrl_sleep_moci>;
|
||||
};
|
||||
};
|
||||
|
||||
/* On-module I2C */
|
||||
|
@ -451,7 +451,7 @@
|
||||
clocks = <&clk IMX93_CLK_GPIO2_GATE>,
|
||||
<&clk IMX93_CLK_GPIO2_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 32 32>;
|
||||
gpio-ranges = <&iomuxc 0 4 30>;
|
||||
};
|
||||
|
||||
gpio3: gpio@43820080 {
|
||||
@ -465,7 +465,8 @@
|
||||
clocks = <&clk IMX93_CLK_GPIO3_GATE>,
|
||||
<&clk IMX93_CLK_GPIO3_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 64 32>;
|
||||
gpio-ranges = <&iomuxc 0 84 8>, <&iomuxc 8 66 18>,
|
||||
<&iomuxc 26 34 2>, <&iomuxc 28 0 4>;
|
||||
};
|
||||
|
||||
gpio4: gpio@43830080 {
|
||||
@ -479,7 +480,7 @@
|
||||
clocks = <&clk IMX93_CLK_GPIO4_GATE>,
|
||||
<&clk IMX93_CLK_GPIO4_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 96 32>;
|
||||
gpio-ranges = <&iomuxc 0 38 28>, <&iomuxc 28 36 2>;
|
||||
};
|
||||
|
||||
gpio1: gpio@47400080 {
|
||||
@ -493,7 +494,7 @@
|
||||
clocks = <&clk IMX93_CLK_GPIO1_GATE>,
|
||||
<&clk IMX93_CLK_GPIO1_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 0 32>;
|
||||
gpio-ranges = <&iomuxc 0 92 16>;
|
||||
};
|
||||
|
||||
s4muap: mailbox@47520000 {
|
||||
@ -501,7 +502,7 @@
|
||||
reg = <0x47520000 0x10000>;
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "txirq", "rxirq";
|
||||
interrupt-names = "tx", "rx";
|
||||
#mbox-cells = <2>;
|
||||
};
|
||||
|
||||
|
@ -14,8 +14,16 @@
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
extern void efi_init(void);
|
||||
|
||||
bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg);
|
||||
#else
|
||||
#define efi_init()
|
||||
|
||||
static inline
|
||||
bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);
|
||||
|
@ -428,6 +428,30 @@ static const struct arm64_ftr_bits ftr_id_aa64dfr0[] = {
|
||||
ARM64_FTR_END,
|
||||
};
|
||||
|
||||
static const struct arm64_ftr_bits ftr_mvfr0[] = {
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPROUND_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPSHVEC_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPSQRT_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPDIVIDE_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPTRAP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPDP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_FPSP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR0_SIMD_SHIFT, 4, 0),
|
||||
ARM64_FTR_END,
|
||||
};
|
||||
|
||||
static const struct arm64_ftr_bits ftr_mvfr1[] = {
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_SIMDFMAC_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_FPHP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_SIMDHP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_SIMDSP_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_SIMDINT_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_SIMDLS_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_FPDNAN_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR1_FPFTZ_SHIFT, 4, 0),
|
||||
ARM64_FTR_END,
|
||||
};
|
||||
|
||||
static const struct arm64_ftr_bits ftr_mvfr2[] = {
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR2_FPMISC_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MVFR2_SIMDMISC_SHIFT, 4, 0),
|
||||
@ -458,10 +482,10 @@ static const struct arm64_ftr_bits ftr_id_isar0[] = {
|
||||
|
||||
static const struct arm64_ftr_bits ftr_id_isar5[] = {
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_RDM_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_CRC32_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_SHA2_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_SHA1_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_AES_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_CRC32_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_SHA2_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_SHA1_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_AES_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_ISAR5_SEVL_SHIFT, 4, 0),
|
||||
ARM64_FTR_END,
|
||||
};
|
||||
@ -574,7 +598,7 @@ static const struct arm64_ftr_bits ftr_smcr[] = {
|
||||
* Common ftr bits for a 32bit register with all hidden, strict
|
||||
* attributes, with 4bit feature fields and a default safe value of
|
||||
* 0. Covers the following 32bit registers:
|
||||
* id_isar[1-4], id_mmfr[1-3], id_pfr1, mvfr[0-1]
|
||||
* id_isar[1-3], id_mmfr[1-3]
|
||||
*/
|
||||
static const struct arm64_ftr_bits ftr_generic_32bits[] = {
|
||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 28, 4, 0),
|
||||
@ -645,8 +669,8 @@ static const struct __ftr_reg_entry {
|
||||
ARM64_FTR_REG(SYS_ID_ISAR6_EL1, ftr_id_isar6),
|
||||
|
||||
/* Op1 = 0, CRn = 0, CRm = 3 */
|
||||
ARM64_FTR_REG(SYS_MVFR0_EL1, ftr_generic_32bits),
|
||||
ARM64_FTR_REG(SYS_MVFR1_EL1, ftr_generic_32bits),
|
||||
ARM64_FTR_REG(SYS_MVFR0_EL1, ftr_mvfr0),
|
||||
ARM64_FTR_REG(SYS_MVFR1_EL1, ftr_mvfr1),
|
||||
ARM64_FTR_REG(SYS_MVFR2_EL1, ftr_mvfr2),
|
||||
ARM64_FTR_REG(SYS_ID_PFR2_EL1, ftr_id_pfr2),
|
||||
ARM64_FTR_REG(SYS_ID_DFR1_EL1, ftr_id_dfr1),
|
||||
@ -3339,7 +3363,7 @@ static void __maybe_unused cpu_enable_cnp(struct arm64_cpu_capabilities const *c
|
||||
|
||||
/*
|
||||
* We emulate only the following system register space.
|
||||
* Op0 = 0x3, CRn = 0x0, Op1 = 0x0, CRm = [0, 4 - 7]
|
||||
* Op0 = 0x3, CRn = 0x0, Op1 = 0x0, CRm = [0, 2 - 7]
|
||||
* See Table C5-6 System instruction encodings for System register accesses,
|
||||
* ARMv8 ARM(ARM DDI 0487A.f) for more details.
|
||||
*/
|
||||
@ -3349,7 +3373,7 @@ static inline bool __attribute_const__ is_emulated(u32 id)
|
||||
sys_reg_CRn(id) == 0x0 &&
|
||||
sys_reg_Op1(id) == 0x0 &&
|
||||
(sys_reg_CRm(id) == 0 ||
|
||||
((sys_reg_CRm(id) >= 4) && (sys_reg_CRm(id) <= 7))));
|
||||
((sys_reg_CRm(id) >= 2) && (sys_reg_CRm(id) <= 7))));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include <linux/linkage.h>
|
||||
|
||||
SYM_FUNC_START(__efi_rt_asm_wrapper)
|
||||
stp x29, x30, [sp, #-32]!
|
||||
stp x29, x30, [sp, #-112]!
|
||||
mov x29, sp
|
||||
|
||||
/*
|
||||
@ -16,6 +16,20 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
|
||||
*/
|
||||
stp x1, x18, [sp, #16]
|
||||
|
||||
/*
|
||||
* Preserve all callee saved registers and record the stack pointer
|
||||
* value in a per-CPU variable so we can recover from synchronous
|
||||
* exceptions occurring while running the firmware routines.
|
||||
*/
|
||||
stp x19, x20, [sp, #32]
|
||||
stp x21, x22, [sp, #48]
|
||||
stp x23, x24, [sp, #64]
|
||||
stp x25, x26, [sp, #80]
|
||||
stp x27, x28, [sp, #96]
|
||||
|
||||
adr_this_cpu x8, __efi_rt_asm_recover_sp, x9
|
||||
str x29, [x8]
|
||||
|
||||
/*
|
||||
* We are lucky enough that no EFI runtime services take more than
|
||||
* 5 arguments, so all are passed in registers rather than via the
|
||||
@ -31,7 +45,7 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
|
||||
|
||||
ldp x1, x2, [sp, #16]
|
||||
cmp x2, x18
|
||||
ldp x29, x30, [sp], #32
|
||||
ldp x29, x30, [sp], #112
|
||||
b.ne 0f
|
||||
ret
|
||||
0:
|
||||
@ -45,3 +59,18 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
|
||||
mov x18, x2
|
||||
b efi_handle_corrupted_x18 // tail call
|
||||
SYM_FUNC_END(__efi_rt_asm_wrapper)
|
||||
|
||||
SYM_FUNC_START(__efi_rt_asm_recover)
|
||||
ldr_this_cpu x8, __efi_rt_asm_recover_sp, x9
|
||||
mov sp, x8
|
||||
|
||||
ldp x0, x18, [sp, #16]
|
||||
ldp x19, x20, [sp, #32]
|
||||
ldp x21, x22, [sp, #48]
|
||||
ldp x23, x24, [sp, #64]
|
||||
ldp x25, x26, [sp, #80]
|
||||
ldp x27, x28, [sp, #96]
|
||||
ldp x29, x30, [sp], #112
|
||||
|
||||
b efi_handle_runtime_exception
|
||||
SYM_FUNC_END(__efi_rt_asm_recover)
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/efi.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#include <asm/efi.h>
|
||||
|
||||
@ -128,3 +129,28 @@ asmlinkage efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f)
|
||||
pr_err_ratelimited(FW_BUG "register x18 corrupted by EFI %s\n", f);
|
||||
return s;
|
||||
}
|
||||
|
||||
asmlinkage DEFINE_PER_CPU(u64, __efi_rt_asm_recover_sp);
|
||||
|
||||
asmlinkage efi_status_t __efi_rt_asm_recover(void);
|
||||
|
||||
asmlinkage efi_status_t efi_handle_runtime_exception(const char *f)
|
||||
{
|
||||
pr_err(FW_BUG "Synchronous exception occurred in EFI runtime service %s()\n", f);
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)
|
||||
{
|
||||
/* Check whether the exception occurred while running the firmware */
|
||||
if (current_work() != &efi_rts_work.work || regs->pc >= TASK_SIZE_64)
|
||||
return false;
|
||||
|
||||
pr_err(FW_BUG "Unable to handle %s in EFI runtime service\n", msg);
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
dump_stack();
|
||||
|
||||
regs->pc = (u64)__efi_rt_asm_recover;
|
||||
return true;
|
||||
}
|
||||
|
@ -329,7 +329,8 @@ static void cortex_a76_erratum_1463225_svc_handler(void)
|
||||
__this_cpu_write(__in_cortex_a76_erratum_1463225_wa, 0);
|
||||
}
|
||||
|
||||
static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
||||
static __always_inline bool
|
||||
cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
||||
{
|
||||
if (!__this_cpu_read(__in_cortex_a76_erratum_1463225_wa))
|
||||
return false;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <hyp/adjust_pc.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <asm/kvm_emulate.h>
|
||||
#include <asm/kvm_mmu.h>
|
||||
|
||||
#if !defined (__KVM_NVHE_HYPERVISOR__) && !defined (__KVM_VHE_HYPERVISOR__)
|
||||
#error Hypervisor code only!
|
||||
@ -115,7 +116,7 @@ static void enter_exception64(struct kvm_vcpu *vcpu, unsigned long target_mode,
|
||||
new |= (old & PSR_C_BIT);
|
||||
new |= (old & PSR_V_BIT);
|
||||
|
||||
if (kvm_has_mte(vcpu->kvm))
|
||||
if (kvm_has_mte(kern_hyp_va(vcpu->kvm)))
|
||||
new |= PSR_TCO_BIT;
|
||||
|
||||
new |= (old & PSR_DIT_BIT);
|
||||
|
@ -87,6 +87,17 @@ static inline void __activate_traps_common(struct kvm_vcpu *vcpu)
|
||||
|
||||
vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
|
||||
write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME)) {
|
||||
sysreg_clear_set_s(SYS_HFGRTR_EL2,
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK |
|
||||
HFGxTR_EL2_nTPIDR2_EL0_MASK,
|
||||
0);
|
||||
sysreg_clear_set_s(SYS_HFGWTR_EL2,
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK |
|
||||
HFGxTR_EL2_nTPIDR2_EL0_MASK,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu)
|
||||
@ -96,6 +107,15 @@ static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu)
|
||||
write_sysreg(0, hstr_el2);
|
||||
if (kvm_arm_support_pmu_v3())
|
||||
write_sysreg(0, pmuserenr_el0);
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME)) {
|
||||
sysreg_clear_set_s(SYS_HFGRTR_EL2, 0,
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK |
|
||||
HFGxTR_EL2_nTPIDR2_EL0_MASK);
|
||||
sysreg_clear_set_s(SYS_HFGWTR_EL2, 0,
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK |
|
||||
HFGxTR_EL2_nTPIDR2_EL0_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ___activate_traps(struct kvm_vcpu *vcpu)
|
||||
|
@ -516,7 +516,7 @@ static enum pkvm_page_state hyp_get_page_state(kvm_pte_t pte)
|
||||
if (!kvm_pte_valid(pte))
|
||||
return PKVM_NOPAGE;
|
||||
|
||||
return pkvm_getstate(kvm_pgtable_stage2_pte_prot(pte));
|
||||
return pkvm_getstate(kvm_pgtable_hyp_pte_prot(pte));
|
||||
}
|
||||
|
||||
static int __hyp_check_page_state_range(u64 addr, u64 size,
|
||||
|
@ -55,18 +55,6 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
|
||||
write_sysreg(val, cptr_el2);
|
||||
write_sysreg(__this_cpu_read(kvm_hyp_vector), vbar_el2);
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME)) {
|
||||
val = read_sysreg_s(SYS_HFGRTR_EL2);
|
||||
val &= ~(HFGxTR_EL2_nTPIDR2_EL0_MASK |
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK);
|
||||
write_sysreg_s(val, SYS_HFGRTR_EL2);
|
||||
|
||||
val = read_sysreg_s(SYS_HFGWTR_EL2);
|
||||
val &= ~(HFGxTR_EL2_nTPIDR2_EL0_MASK |
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK);
|
||||
write_sysreg_s(val, SYS_HFGWTR_EL2);
|
||||
}
|
||||
|
||||
if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) {
|
||||
struct kvm_cpu_context *ctxt = &vcpu->arch.ctxt;
|
||||
|
||||
@ -110,20 +98,6 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
|
||||
|
||||
write_sysreg(this_cpu_ptr(&kvm_init_params)->hcr_el2, hcr_el2);
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME)) {
|
||||
u64 val;
|
||||
|
||||
val = read_sysreg_s(SYS_HFGRTR_EL2);
|
||||
val |= HFGxTR_EL2_nTPIDR2_EL0_MASK |
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK;
|
||||
write_sysreg_s(val, SYS_HFGRTR_EL2);
|
||||
|
||||
val = read_sysreg_s(SYS_HFGWTR_EL2);
|
||||
val |= HFGxTR_EL2_nTPIDR2_EL0_MASK |
|
||||
HFGxTR_EL2_nSMPRI_EL1_MASK;
|
||||
write_sysreg_s(val, SYS_HFGWTR_EL2);
|
||||
}
|
||||
|
||||
cptr = CPTR_EL2_DEFAULT;
|
||||
if (vcpu_has_sve(vcpu) && (vcpu->arch.fp_state == FP_STATE_GUEST_OWNED))
|
||||
cptr |= CPTR_EL2_TZ;
|
||||
|
@ -63,10 +63,6 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
|
||||
__activate_traps_fpsimd32(vcpu);
|
||||
}
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME))
|
||||
write_sysreg(read_sysreg(sctlr_el2) & ~SCTLR_ELx_ENTP2,
|
||||
sctlr_el2);
|
||||
|
||||
write_sysreg(val, cpacr_el1);
|
||||
|
||||
write_sysreg(__this_cpu_read(kvm_hyp_vector), vbar_el1);
|
||||
@ -88,10 +84,6 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));
|
||||
|
||||
if (cpus_have_final_cap(ARM64_SME))
|
||||
write_sysreg(read_sysreg(sctlr_el2) | SCTLR_ELx_ENTP2,
|
||||
sctlr_el2);
|
||||
|
||||
write_sysreg(CPACR_EL1_DEFAULT, cpacr_el1);
|
||||
|
||||
if (!arm64_kernel_unmapped_at_el0())
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <asm/bug.h>
|
||||
#include <asm/cmpxchg.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/efi.h>
|
||||
#include <asm/exception.h>
|
||||
#include <asm/daifflags.h>
|
||||
#include <asm/debug-monitors.h>
|
||||
@ -391,6 +392,9 @@ static void __do_kernel_fault(unsigned long addr, unsigned long esr,
|
||||
msg = "paging request";
|
||||
}
|
||||
|
||||
if (efi_runtime_fixup_exception(regs, msg))
|
||||
return;
|
||||
|
||||
die_kernel_fault(msg, addr, esr, regs);
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,8 @@
|
||||
#define VE_GET_PORT_NUM(e) ((e) >> 16)
|
||||
#define VE_IS_IO_STRING(e) ((e) & BIT(4))
|
||||
|
||||
#define ATTR_SEPT_VE_DISABLE BIT(28)
|
||||
|
||||
/*
|
||||
* Wrapper for standard use of __tdx_hypercall with no output aside from
|
||||
* return code.
|
||||
@ -98,10 +100,11 @@ static inline void tdx_module_call(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
|
||||
panic("TDCALL %lld failed (Buggy TDX module!)\n", fn);
|
||||
}
|
||||
|
||||
static u64 get_cc_mask(void)
|
||||
static void tdx_parse_tdinfo(u64 *cc_mask)
|
||||
{
|
||||
struct tdx_module_output out;
|
||||
unsigned int gpa_width;
|
||||
u64 td_attr;
|
||||
|
||||
/*
|
||||
* TDINFO TDX module call is used to get the TD execution environment
|
||||
@ -109,19 +112,27 @@ static u64 get_cc_mask(void)
|
||||
* information, etc. More details about the ABI can be found in TDX
|
||||
* Guest-Host-Communication Interface (GHCI), section 2.4.2 TDCALL
|
||||
* [TDG.VP.INFO].
|
||||
*
|
||||
* The GPA width that comes out of this call is critical. TDX guests
|
||||
* can not meaningfully run without it.
|
||||
*/
|
||||
tdx_module_call(TDX_GET_INFO, 0, 0, 0, 0, &out);
|
||||
|
||||
gpa_width = out.rcx & GENMASK(5, 0);
|
||||
|
||||
/*
|
||||
* The highest bit of a guest physical address is the "sharing" bit.
|
||||
* Set it for shared pages and clear it for private pages.
|
||||
*
|
||||
* The GPA width that comes out of this call is critical. TDX guests
|
||||
* can not meaningfully run without it.
|
||||
*/
|
||||
return BIT_ULL(gpa_width - 1);
|
||||
gpa_width = out.rcx & GENMASK(5, 0);
|
||||
*cc_mask = BIT_ULL(gpa_width - 1);
|
||||
|
||||
/*
|
||||
* The kernel can not handle #VE's when accessing normal kernel
|
||||
* memory. Ensure that no #VE will be delivered for accesses to
|
||||
* TD-private memory. Only VMM-shared memory (MMIO) will #VE.
|
||||
*/
|
||||
td_attr = out.rdx;
|
||||
if (!(td_attr & ATTR_SEPT_VE_DISABLE))
|
||||
panic("TD misconfiguration: SEPT_VE_DISABLE attibute must be set.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -758,7 +769,7 @@ void __init tdx_early_init(void)
|
||||
setup_force_cpu_cap(X86_FEATURE_TDX_GUEST);
|
||||
|
||||
cc_set_vendor(CC_VENDOR_INTEL);
|
||||
cc_mask = get_cc_mask();
|
||||
tdx_parse_tdinfo(&cc_mask);
|
||||
cc_set_mask(cc_mask);
|
||||
|
||||
/*
|
||||
|
@ -4911,6 +4911,7 @@ static const struct x86_cpu_desc isolation_ucodes[] = {
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X, 5, 0x00000000),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X, 6, 0x00000000),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X, 7, 0x00000000),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X, 11, 0x00000000),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_L, 3, 0x0000007c),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE, 3, 0x0000007c),
|
||||
INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE, 9, 0x0000004e),
|
||||
|
@ -982,8 +982,13 @@ struct event_constraint intel_icl_pebs_event_constraints[] = {
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT(0x0400, 0x800000000ULL), /* SLOTS */
|
||||
|
||||
INTEL_PLD_CONSTRAINT(0x1cd, 0xff), /* MEM_TRANS_RETIRED.LOAD_LATENCY */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x1d0, 0xf), /* MEM_INST_RETIRED.LOAD */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x2d0, 0xf), /* MEM_INST_RETIRED.STORE */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x11d0, 0xf), /* MEM_INST_RETIRED.STLB_MISS_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x12d0, 0xf), /* MEM_INST_RETIRED.STLB_MISS_STORES */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x21d0, 0xf), /* MEM_INST_RETIRED.LOCK_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x41d0, 0xf), /* MEM_INST_RETIRED.SPLIT_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x42d0, 0xf), /* MEM_INST_RETIRED.SPLIT_STORES */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x81d0, 0xf), /* MEM_INST_RETIRED.ALL_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x82d0, 0xf), /* MEM_INST_RETIRED.ALL_STORES */
|
||||
|
||||
INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_LD_RANGE(0xd1, 0xd4, 0xf), /* MEM_LOAD_*_RETIRED.* */
|
||||
|
||||
@ -1004,8 +1009,13 @@ struct event_constraint intel_spr_pebs_event_constraints[] = {
|
||||
INTEL_FLAGS_EVENT_CONSTRAINT(0xc0, 0xfe),
|
||||
INTEL_PLD_CONSTRAINT(0x1cd, 0xfe),
|
||||
INTEL_PSD_CONSTRAINT(0x2cd, 0x1),
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x1d0, 0xf),
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x2d0, 0xf),
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x11d0, 0xf), /* MEM_INST_RETIRED.STLB_MISS_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x12d0, 0xf), /* MEM_INST_RETIRED.STLB_MISS_STORES */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x21d0, 0xf), /* MEM_INST_RETIRED.LOCK_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x41d0, 0xf), /* MEM_INST_RETIRED.SPLIT_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x42d0, 0xf), /* MEM_INST_RETIRED.SPLIT_STORES */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x81d0, 0xf), /* MEM_INST_RETIRED.ALL_LOADS */
|
||||
INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_ST(0x82d0, 0xf), /* MEM_INST_RETIRED.ALL_STORES */
|
||||
|
||||
INTEL_FLAGS_EVENT_CONSTRAINT_DATALA_LD_RANGE(0xd1, 0xd4, 0xf),
|
||||
|
||||
|
@ -619,12 +619,8 @@ static int rapl_check_hw_unit(struct rapl_model *rm)
|
||||
case RAPL_UNIT_QUIRK_INTEL_HSW:
|
||||
rapl_hw_unit[PERF_RAPL_RAM] = 16;
|
||||
break;
|
||||
/*
|
||||
* SPR shares the same DRAM domain energy unit as HSW, plus it
|
||||
* also has a fixed energy unit for Psys domain.
|
||||
*/
|
||||
/* SPR uses a fixed energy unit for Psys domain. */
|
||||
case RAPL_UNIT_QUIRK_INTEL_SPR:
|
||||
rapl_hw_unit[PERF_RAPL_RAM] = 16;
|
||||
rapl_hw_unit[PERF_RAPL_PSYS] = 0;
|
||||
break;
|
||||
default:
|
||||
|
@ -107,6 +107,11 @@
|
||||
|
||||
#define INTEL_FAM6_SAPPHIRERAPIDS_X 0x8F /* Golden Cove */
|
||||
|
||||
#define INTEL_FAM6_EMERALDRAPIDS_X 0xCF
|
||||
|
||||
#define INTEL_FAM6_GRANITERAPIDS_X 0xAD
|
||||
#define INTEL_FAM6_GRANITERAPIDS_D 0xAE
|
||||
|
||||
#define INTEL_FAM6_ALDERLAKE 0x97 /* Golden Cove / Gracemont */
|
||||
#define INTEL_FAM6_ALDERLAKE_L 0x9A /* Golden Cove / Gracemont */
|
||||
#define INTEL_FAM6_ALDERLAKE_N 0xBE
|
||||
@ -118,7 +123,7 @@
|
||||
#define INTEL_FAM6_METEORLAKE 0xAC
|
||||
#define INTEL_FAM6_METEORLAKE_L 0xAA
|
||||
|
||||
/* "Small Core" Processors (Atom) */
|
||||
/* "Small Core" Processors (Atom/E-Core) */
|
||||
|
||||
#define INTEL_FAM6_ATOM_BONNELL 0x1C /* Diamondville, Pineview */
|
||||
#define INTEL_FAM6_ATOM_BONNELL_MID 0x26 /* Silverthorne, Lincroft */
|
||||
@ -145,6 +150,10 @@
|
||||
#define INTEL_FAM6_ATOM_TREMONT 0x96 /* Elkhart Lake */
|
||||
#define INTEL_FAM6_ATOM_TREMONT_L 0x9C /* Jasper Lake */
|
||||
|
||||
#define INTEL_FAM6_SIERRAFOREST_X 0xAF
|
||||
|
||||
#define INTEL_FAM6_GRANDRIDGE 0xB6
|
||||
|
||||
/* Xeon Phi */
|
||||
|
||||
#define INTEL_FAM6_XEON_PHI_KNL 0x57 /* Knights Landing */
|
||||
|
@ -6,7 +6,7 @@
|
||||
#ifndef _ASM_X86_SYSCALL_WRAPPER_H
|
||||
#define _ASM_X86_SYSCALL_WRAPPER_H
|
||||
|
||||
struct pt_regs;
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
extern long __x64_sys_ni_syscall(const struct pt_regs *regs);
|
||||
extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
||||
|
@ -1338,7 +1338,7 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid,
|
||||
if (sanity_check_entries(entries, cpuid->nent, type))
|
||||
return -EINVAL;
|
||||
|
||||
array.entries = kvcalloc(sizeof(struct kvm_cpuid_entry2), cpuid->nent, GFP_KERNEL);
|
||||
array.entries = kvcalloc(cpuid->nent, sizeof(struct kvm_cpuid_entry2), GFP_KERNEL);
|
||||
if (!array.entries)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -24,8 +24,6 @@ extern int __read_mostly pt_mode;
|
||||
#define PMU_CAP_FW_WRITES (1ULL << 13)
|
||||
#define PMU_CAP_LBR_FMT 0x3f
|
||||
|
||||
#define DEBUGCTLMSR_LBR_MASK (DEBUGCTLMSR_LBR | DEBUGCTLMSR_FREEZE_LBRS_ON_PMI)
|
||||
|
||||
struct nested_vmx_msrs {
|
||||
/*
|
||||
* We only store the "true" versions of the VMX capability MSRs. We
|
||||
@ -400,6 +398,7 @@ static inline bool vmx_pebs_supported(void)
|
||||
static inline u64 vmx_get_perf_capabilities(void)
|
||||
{
|
||||
u64 perf_cap = PMU_CAP_FW_WRITES;
|
||||
struct x86_pmu_lbr lbr;
|
||||
u64 host_perf_cap = 0;
|
||||
|
||||
if (!enable_pmu)
|
||||
@ -408,7 +407,8 @@ static inline u64 vmx_get_perf_capabilities(void)
|
||||
if (boot_cpu_has(X86_FEATURE_PDCM))
|
||||
rdmsrl(MSR_IA32_PERF_CAPABILITIES, host_perf_cap);
|
||||
|
||||
perf_cap |= host_perf_cap & PMU_CAP_LBR_FMT;
|
||||
if (x86_perf_get_lbr(&lbr) >= 0 && lbr.nr)
|
||||
perf_cap |= host_perf_cap & PMU_CAP_LBR_FMT;
|
||||
|
||||
if (vmx_pebs_supported()) {
|
||||
perf_cap |= host_perf_cap & PERF_CAP_PEBS_MASK;
|
||||
@ -419,19 +419,6 @@ static inline u64 vmx_get_perf_capabilities(void)
|
||||
return perf_cap;
|
||||
}
|
||||
|
||||
static inline u64 vmx_supported_debugctl(void)
|
||||
{
|
||||
u64 debugctl = 0;
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
|
||||
debugctl |= DEBUGCTLMSR_BUS_LOCK_DETECT;
|
||||
|
||||
if (vmx_get_perf_capabilities() & PMU_CAP_LBR_FMT)
|
||||
debugctl |= DEBUGCTLMSR_LBR_MASK;
|
||||
|
||||
return debugctl;
|
||||
}
|
||||
|
||||
static inline bool cpu_has_notify_vmexit(void)
|
||||
{
|
||||
return vmcs_config.cpu_based_2nd_exec_ctrl &
|
||||
|
@ -2021,15 +2021,17 @@ static u64 nested_vmx_truncate_sysenter_addr(struct kvm_vcpu *vcpu,
|
||||
return (unsigned long)data;
|
||||
}
|
||||
|
||||
static u64 vcpu_supported_debugctl(struct kvm_vcpu *vcpu)
|
||||
static u64 vmx_get_supported_debugctl(struct kvm_vcpu *vcpu, bool host_initiated)
|
||||
{
|
||||
u64 debugctl = vmx_supported_debugctl();
|
||||
u64 debugctl = 0;
|
||||
|
||||
if (!intel_pmu_lbr_is_enabled(vcpu))
|
||||
debugctl &= ~DEBUGCTLMSR_LBR_MASK;
|
||||
if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) &&
|
||||
(host_initiated || guest_cpuid_has(vcpu, X86_FEATURE_BUS_LOCK_DETECT)))
|
||||
debugctl |= DEBUGCTLMSR_BUS_LOCK_DETECT;
|
||||
|
||||
if (!guest_cpuid_has(vcpu, X86_FEATURE_BUS_LOCK_DETECT))
|
||||
debugctl &= ~DEBUGCTLMSR_BUS_LOCK_DETECT;
|
||||
if ((vmx_get_perf_capabilities() & PMU_CAP_LBR_FMT) &&
|
||||
(host_initiated || intel_pmu_lbr_is_enabled(vcpu)))
|
||||
debugctl |= DEBUGCTLMSR_LBR | DEBUGCTLMSR_FREEZE_LBRS_ON_PMI;
|
||||
|
||||
return debugctl;
|
||||
}
|
||||
@ -2103,7 +2105,9 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
vmcs_writel(GUEST_SYSENTER_ESP, data);
|
||||
break;
|
||||
case MSR_IA32_DEBUGCTLMSR: {
|
||||
u64 invalid = data & ~vcpu_supported_debugctl(vcpu);
|
||||
u64 invalid;
|
||||
|
||||
invalid = data & ~vmx_get_supported_debugctl(vcpu, msr_info->host_initiated);
|
||||
if (invalid & (DEBUGCTLMSR_BTF|DEBUGCTLMSR_LBR)) {
|
||||
if (report_ignored_msrs)
|
||||
vcpu_unimpl(vcpu, "%s: BTF|LBR in IA32_DEBUGCTLMSR 0x%llx, nop\n",
|
||||
|
@ -10404,7 +10404,10 @@ void __kvm_set_or_clear_apicv_inhibit(struct kvm *kvm,
|
||||
kvm->arch.apicv_inhibit_reasons = new;
|
||||
if (new) {
|
||||
unsigned long gfn = gpa_to_gfn(APIC_DEFAULT_PHYS_BASE);
|
||||
int idx = srcu_read_lock(&kvm->srcu);
|
||||
|
||||
kvm_zap_gfn_range(kvm, gfn, gfn+1);
|
||||
srcu_read_unlock(&kvm->srcu, idx);
|
||||
}
|
||||
} else {
|
||||
kvm->arch.apicv_inhibit_reasons = new;
|
||||
|
@ -302,7 +302,7 @@ static bool xen_amd_pmu_emulate(unsigned int msr, u64 *val, bool is_read)
|
||||
static bool pmu_msr_chk_emulated(unsigned int msr, uint64_t *val, bool is_read,
|
||||
bool *emul)
|
||||
{
|
||||
int type, index;
|
||||
int type, index = 0;
|
||||
|
||||
if (is_amd_pmu_msr(msr))
|
||||
*emul = xen_amd_pmu_emulate(msr, val, is_read);
|
||||
|
@ -910,17 +910,9 @@ static int register_callback(unsigned type, const void *func)
|
||||
|
||||
void xen_enable_sysenter(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned sysenter_feature;
|
||||
|
||||
sysenter_feature = X86_FEATURE_SYSENTER32;
|
||||
|
||||
if (!boot_cpu_has(sysenter_feature))
|
||||
return;
|
||||
|
||||
ret = register_callback(CALLBACKTYPE_sysenter, xen_entry_SYSENTER_compat);
|
||||
if(ret != 0)
|
||||
setup_clear_cpu_cap(sysenter_feature);
|
||||
if (cpu_feature_enabled(X86_FEATURE_SYSENTER32) &&
|
||||
register_callback(CALLBACKTYPE_sysenter, xen_entry_SYSENTER_compat))
|
||||
setup_clear_cpu_cap(X86_FEATURE_SYSENTER32);
|
||||
}
|
||||
|
||||
void xen_enable_syscall(void)
|
||||
@ -934,12 +926,9 @@ void xen_enable_syscall(void)
|
||||
mechanism for syscalls. */
|
||||
}
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_SYSCALL32)) {
|
||||
ret = register_callback(CALLBACKTYPE_syscall32,
|
||||
xen_entry_SYSCALL_compat);
|
||||
if (ret != 0)
|
||||
setup_clear_cpu_cap(X86_FEATURE_SYSCALL32);
|
||||
}
|
||||
if (cpu_feature_enabled(X86_FEATURE_SYSCALL32) &&
|
||||
register_callback(CALLBACKTYPE_syscall32, xen_entry_SYSCALL_compat))
|
||||
setup_clear_cpu_cap(X86_FEATURE_SYSCALL32);
|
||||
}
|
||||
|
||||
static void __init xen_pvmmu_arch_setup(void)
|
||||
|
@ -1262,6 +1262,7 @@ static void blk_add_rq_to_plug(struct blk_plug *plug, struct request *rq)
|
||||
(!blk_queue_nomerges(rq->q) &&
|
||||
blk_rq_bytes(last) >= BLK_PLUG_FLUSH_SIZE)) {
|
||||
blk_mq_flush_plug_list(plug, false);
|
||||
last = NULL;
|
||||
trace_block_plug(rq->q);
|
||||
}
|
||||
|
||||
@ -4193,9 +4194,7 @@ int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
|
||||
return 0;
|
||||
|
||||
err_hctxs:
|
||||
xa_destroy(&q->hctx_table);
|
||||
q->nr_hw_queues = 0;
|
||||
blk_mq_sysfs_deinit(q);
|
||||
blk_mq_release(q);
|
||||
err_poll:
|
||||
blk_stat_free_callback(q->poll_cb);
|
||||
q->poll_cb = NULL;
|
||||
|
@ -527,6 +527,7 @@ out_unregister_bdi:
|
||||
bdi_unregister(disk->bdi);
|
||||
out_unregister_queue:
|
||||
blk_unregister_queue(disk);
|
||||
rq_qos_exit(disk->queue);
|
||||
out_put_slave_dir:
|
||||
kobject_put(disk->slave_dir);
|
||||
out_put_holder_dir:
|
||||
|
@ -327,6 +327,7 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header,
|
||||
pr_warn("ACPI NUMA: Failed to add memblk for CFMWS node %d [mem %#llx-%#llx]\n",
|
||||
node, start, end);
|
||||
}
|
||||
node_set(node, numa_nodes_parsed);
|
||||
|
||||
/* Set the next available fake_pxm value */
|
||||
(*fake_pxm)++;
|
||||
|
@ -645,6 +645,20 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Models which have nvidia-ec-wmi support, but should not use it.
|
||||
* Note this indicates a likely firmware bug on these models and should
|
||||
* be revisited if/when Linux gets support for dynamic mux mode.
|
||||
*/
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
/* Dell G15 5515 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Desktops which falsely report a backlight and which our heuristics
|
||||
* for this do not catch.
|
||||
@ -670,7 +684,7 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
|
||||
static bool google_cros_ec_present(void)
|
||||
{
|
||||
return acpi_dev_found("GOOG0004");
|
||||
return acpi_dev_found("GOOG0004") || acpi_dev_found("GOOG000C");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -718,6 +732,10 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
|
||||
if (apple_gmux_present())
|
||||
return acpi_backlight_apple_gmux;
|
||||
|
||||
/* Chromebooks should always prefer native backlight control. */
|
||||
if (google_cros_ec_present() && native_available)
|
||||
return acpi_backlight_native;
|
||||
|
||||
/* On systems with ACPI video use either native or ACPI video. */
|
||||
if (video_caps & ACPI_VIDEO_BACKLIGHT) {
|
||||
/*
|
||||
@ -735,13 +753,6 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
|
||||
return acpi_backlight_video;
|
||||
}
|
||||
|
||||
/*
|
||||
* Chromebooks that don't have backlight handle in ACPI table
|
||||
* are supposed to use native backlight if it's available.
|
||||
*/
|
||||
if (google_cros_ec_present() && native_available)
|
||||
return acpi_backlight_native;
|
||||
|
||||
/* No ACPI video (old hw), use vendor specific fw methods. */
|
||||
return acpi_backlight_vendor;
|
||||
}
|
||||
@ -754,6 +765,18 @@ EXPORT_SYMBOL(acpi_video_get_backlight_type);
|
||||
|
||||
bool acpi_video_backlight_use_native(void)
|
||||
{
|
||||
return __acpi_video_get_backlight_type(true) == acpi_backlight_native;
|
||||
/*
|
||||
* Call __acpi_video_get_backlight_type() to let it know that
|
||||
* a native backlight is available.
|
||||
*/
|
||||
__acpi_video_get_backlight_type(true);
|
||||
|
||||
/*
|
||||
* For now just always return true. There is a whole bunch of laptop
|
||||
* models where (video_caps & ACPI_VIDEO_BACKLIGHT) is false causing
|
||||
* __acpi_video_get_backlight_type() to return vendor, while these
|
||||
* models only have a native backlight control.
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_backlight_use_native);
|
||||
|
@ -219,6 +219,12 @@ static const struct dmi_system_id force_storage_d3_dmi[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 14 7425 2-in-1"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 16 5625"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -315,9 +315,10 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
outb(inb(0x1F4) & 0x07, 0x1F4);
|
||||
|
||||
rt = inb(0x1F3);
|
||||
rt &= 0x07 << (3 * adev->devno);
|
||||
rt &= ~(0x07 << (3 * !adev->devno));
|
||||
if (pio)
|
||||
rt |= (1 + 3 * pio) << (3 * adev->devno);
|
||||
rt |= (1 + 3 * pio) << (3 * !adev->devno);
|
||||
outb(rt, 0x1F3);
|
||||
|
||||
udelay(100);
|
||||
outb(inb(0x1F2) | 0x01, 0x1F2);
|
||||
|
@ -63,8 +63,8 @@ static int palmld_pata_probe(struct platform_device *pdev)
|
||||
|
||||
/* remap drive's physical memory address */
|
||||
mem = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (!mem)
|
||||
return -ENOMEM;
|
||||
if (IS_ERR(mem))
|
||||
return PTR_ERR(mem);
|
||||
|
||||
/* request and activate power and reset GPIOs */
|
||||
lda->power = devm_gpiod_get(dev, "power", GPIOD_OUT_HIGH);
|
||||
|
@ -408,6 +408,12 @@ config BLK_DEV_UBLK
|
||||
definition isn't finalized yet, and might change according to future
|
||||
requirement, so mark is as experimental now.
|
||||
|
||||
Say Y if you want to get better performance because task_work_add()
|
||||
can be used in IO path for replacing io_uring cmd, which will become
|
||||
shared between IO tasks and ubq daemon, meantime task_work_add() can
|
||||
can handle batch more effectively, but task_work_add() isn't exported
|
||||
for module, so ublk has to be built to kernel.
|
||||
|
||||
source "drivers/block/rnbd/Kconfig"
|
||||
|
||||
endif # BLK_DEV
|
||||
|
@ -57,11 +57,14 @@
|
||||
#define UBLK_PARAM_TYPE_ALL (UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD)
|
||||
|
||||
struct ublk_rq_data {
|
||||
struct callback_head work;
|
||||
union {
|
||||
struct callback_head work;
|
||||
struct llist_node node;
|
||||
};
|
||||
};
|
||||
|
||||
struct ublk_uring_cmd_pdu {
|
||||
struct request *req;
|
||||
struct ublk_queue *ubq;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -119,6 +122,8 @@ struct ublk_queue {
|
||||
struct task_struct *ubq_daemon;
|
||||
char *io_cmd_buf;
|
||||
|
||||
struct llist_head io_cmds;
|
||||
|
||||
unsigned long io_addr; /* mapped vm address */
|
||||
unsigned int max_io_sz;
|
||||
bool force_abort;
|
||||
@ -764,8 +769,12 @@ static inline void __ublk_rq_task_work(struct request *req)
|
||||
static void ublk_rq_task_work_cb(struct io_uring_cmd *cmd)
|
||||
{
|
||||
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
|
||||
struct ublk_queue *ubq = pdu->ubq;
|
||||
struct llist_node *io_cmds = llist_del_all(&ubq->io_cmds);
|
||||
struct ublk_rq_data *data;
|
||||
|
||||
__ublk_rq_task_work(pdu->req);
|
||||
llist_for_each_entry(data, io_cmds, node)
|
||||
__ublk_rq_task_work(blk_mq_rq_from_pdu(data));
|
||||
}
|
||||
|
||||
static void ublk_rq_task_work_fn(struct callback_head *work)
|
||||
@ -777,6 +786,54 @@ static void ublk_rq_task_work_fn(struct callback_head *work)
|
||||
__ublk_rq_task_work(req);
|
||||
}
|
||||
|
||||
static void ublk_submit_cmd(struct ublk_queue *ubq, const struct request *rq)
|
||||
{
|
||||
struct ublk_io *io = &ubq->ios[rq->tag];
|
||||
|
||||
/*
|
||||
* If the check pass, we know that this is a re-issued request aborted
|
||||
* previously in monitor_work because the ubq_daemon(cmd's task) is
|
||||
* PF_EXITING. We cannot call io_uring_cmd_complete_in_task() anymore
|
||||
* because this ioucmd's io_uring context may be freed now if no inflight
|
||||
* ioucmd exists. Otherwise we may cause null-deref in ctx->fallback_work.
|
||||
*
|
||||
* Note: monitor_work sets UBLK_IO_FLAG_ABORTED and ends this request(releasing
|
||||
* the tag). Then the request is re-started(allocating the tag) and we are here.
|
||||
* Since releasing/allocating a tag implies smp_mb(), finding UBLK_IO_FLAG_ABORTED
|
||||
* guarantees that here is a re-issued request aborted previously.
|
||||
*/
|
||||
if (unlikely(io->flags & UBLK_IO_FLAG_ABORTED)) {
|
||||
struct llist_node *io_cmds = llist_del_all(&ubq->io_cmds);
|
||||
struct ublk_rq_data *data;
|
||||
|
||||
llist_for_each_entry(data, io_cmds, node)
|
||||
__ublk_abort_rq(ubq, blk_mq_rq_from_pdu(data));
|
||||
} else {
|
||||
struct io_uring_cmd *cmd = io->cmd;
|
||||
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
|
||||
|
||||
pdu->ubq = ubq;
|
||||
io_uring_cmd_complete_in_task(cmd, ublk_rq_task_work_cb);
|
||||
}
|
||||
}
|
||||
|
||||
static void ublk_queue_cmd(struct ublk_queue *ubq, struct request *rq,
|
||||
bool last)
|
||||
{
|
||||
struct ublk_rq_data *data = blk_mq_rq_to_pdu(rq);
|
||||
|
||||
if (ublk_can_use_task_work(ubq)) {
|
||||
enum task_work_notify_mode notify_mode = last ?
|
||||
TWA_SIGNAL_NO_IPI : TWA_NONE;
|
||||
|
||||
if (task_work_add(ubq->ubq_daemon, &data->work, notify_mode))
|
||||
__ublk_abort_rq(ubq, rq);
|
||||
} else {
|
||||
if (llist_add(&data->node, &ubq->io_cmds))
|
||||
ublk_submit_cmd(ubq, rq);
|
||||
}
|
||||
}
|
||||
|
||||
static blk_status_t ublk_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
const struct blk_mq_queue_data *bd)
|
||||
{
|
||||
@ -788,6 +845,7 @@ static blk_status_t ublk_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
res = ublk_setup_iod(ubq, rq);
|
||||
if (unlikely(res != BLK_STS_OK))
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
/* With recovery feature enabled, force_abort is set in
|
||||
* ublk_stop_dev() before calling del_gendisk(). We have to
|
||||
* abort all requeued and new rqs here to let del_gendisk()
|
||||
@ -803,41 +861,11 @@ static blk_status_t ublk_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
blk_mq_start_request(bd->rq);
|
||||
|
||||
if (unlikely(ubq_daemon_is_dying(ubq))) {
|
||||
fail:
|
||||
__ublk_abort_rq(ubq, rq);
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
if (ublk_can_use_task_work(ubq)) {
|
||||
struct ublk_rq_data *data = blk_mq_rq_to_pdu(rq);
|
||||
enum task_work_notify_mode notify_mode = bd->last ?
|
||||
TWA_SIGNAL_NO_IPI : TWA_NONE;
|
||||
|
||||
if (task_work_add(ubq->ubq_daemon, &data->work, notify_mode))
|
||||
goto fail;
|
||||
} else {
|
||||
struct ublk_io *io = &ubq->ios[rq->tag];
|
||||
struct io_uring_cmd *cmd = io->cmd;
|
||||
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
|
||||
|
||||
/*
|
||||
* If the check pass, we know that this is a re-issued request aborted
|
||||
* previously in monitor_work because the ubq_daemon(cmd's task) is
|
||||
* PF_EXITING. We cannot call io_uring_cmd_complete_in_task() anymore
|
||||
* because this ioucmd's io_uring context may be freed now if no inflight
|
||||
* ioucmd exists. Otherwise we may cause null-deref in ctx->fallback_work.
|
||||
*
|
||||
* Note: monitor_work sets UBLK_IO_FLAG_ABORTED and ends this request(releasing
|
||||
* the tag). Then the request is re-started(allocating the tag) and we are here.
|
||||
* Since releasing/allocating a tag implies smp_mb(), finding UBLK_IO_FLAG_ABORTED
|
||||
* guarantees that here is a re-issued request aborted previously.
|
||||
*/
|
||||
if ((io->flags & UBLK_IO_FLAG_ABORTED))
|
||||
goto fail;
|
||||
|
||||
pdu->req = rq;
|
||||
io_uring_cmd_complete_in_task(cmd, ublk_rq_task_work_cb);
|
||||
}
|
||||
ublk_queue_cmd(ubq, rq, bd->last);
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
@ -1164,22 +1192,12 @@ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq)
|
||||
}
|
||||
|
||||
static void ublk_handle_need_get_data(struct ublk_device *ub, int q_id,
|
||||
int tag, struct io_uring_cmd *cmd)
|
||||
int tag)
|
||||
{
|
||||
struct ublk_queue *ubq = ublk_get_queue(ub, q_id);
|
||||
struct request *req = blk_mq_tag_to_rq(ub->tag_set.tags[q_id], tag);
|
||||
|
||||
if (ublk_can_use_task_work(ubq)) {
|
||||
struct ublk_rq_data *data = blk_mq_rq_to_pdu(req);
|
||||
|
||||
/* should not fail since we call it just in ubq->ubq_daemon */
|
||||
task_work_add(ubq->ubq_daemon, &data->work, TWA_SIGNAL_NO_IPI);
|
||||
} else {
|
||||
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
|
||||
|
||||
pdu->req = req;
|
||||
io_uring_cmd_complete_in_task(cmd, ublk_rq_task_work_cb);
|
||||
}
|
||||
ublk_queue_cmd(ubq, req, true);
|
||||
}
|
||||
|
||||
static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags)
|
||||
@ -1267,7 +1285,7 @@ static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags)
|
||||
io->addr = ub_cmd->addr;
|
||||
io->cmd = cmd;
|
||||
io->flags |= UBLK_IO_FLAG_ACTIVE;
|
||||
ublk_handle_need_get_data(ub, ub_cmd->q_id, ub_cmd->tag, cmd);
|
||||
ublk_handle_need_get_data(ub, ub_cmd->q_id, ub_cmd->tag);
|
||||
break;
|
||||
default:
|
||||
goto out;
|
||||
@ -1658,6 +1676,9 @@ static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd)
|
||||
*/
|
||||
ub->dev_info.flags &= UBLK_F_ALL;
|
||||
|
||||
if (!IS_BUILTIN(CONFIG_BLK_DEV_UBLK))
|
||||
ub->dev_info.flags |= UBLK_F_URING_CMD_COMP_IN_TASK;
|
||||
|
||||
/* We are not ready to support zero copy */
|
||||
ub->dev_info.flags &= ~UBLK_F_SUPPORT_ZERO_COPY;
|
||||
|
||||
|
@ -90,13 +90,66 @@ static const struct regmap_access_table rs9_writeable_table = {
|
||||
.n_yes_ranges = ARRAY_SIZE(rs9_writeable_ranges),
|
||||
};
|
||||
|
||||
static int rs9_regmap_i2c_write(void *context,
|
||||
unsigned int reg, unsigned int val)
|
||||
{
|
||||
struct i2c_client *i2c = context;
|
||||
const u8 data[3] = { reg, 1, val };
|
||||
const int count = ARRAY_SIZE(data);
|
||||
int ret;
|
||||
|
||||
ret = i2c_master_send(i2c, data, count);
|
||||
if (ret == count)
|
||||
return 0;
|
||||
else if (ret < 0)
|
||||
return ret;
|
||||
else
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int rs9_regmap_i2c_read(void *context,
|
||||
unsigned int reg, unsigned int *val)
|
||||
{
|
||||
struct i2c_client *i2c = context;
|
||||
struct i2c_msg xfer[2];
|
||||
u8 txdata = reg;
|
||||
u8 rxdata[2];
|
||||
int ret;
|
||||
|
||||
xfer[0].addr = i2c->addr;
|
||||
xfer[0].flags = 0;
|
||||
xfer[0].len = 1;
|
||||
xfer[0].buf = (void *)&txdata;
|
||||
|
||||
xfer[1].addr = i2c->addr;
|
||||
xfer[1].flags = I2C_M_RD;
|
||||
xfer[1].len = 2;
|
||||
xfer[1].buf = (void *)rxdata;
|
||||
|
||||
ret = i2c_transfer(i2c->adapter, xfer, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != 2)
|
||||
return -EIO;
|
||||
|
||||
/*
|
||||
* Byte 0 is transfer length, which is always 1 due
|
||||
* to BCP register programming to 1 in rs9_probe(),
|
||||
* ignore it and use data from Byte 1.
|
||||
*/
|
||||
*val = rxdata[1];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct regmap_config rs9_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.max_register = 0x8,
|
||||
.cache_type = REGCACHE_NONE,
|
||||
.max_register = RS9_REG_BCP,
|
||||
.rd_table = &rs9_readable_table,
|
||||
.wr_table = &rs9_writeable_table,
|
||||
.reg_write = rs9_regmap_i2c_write,
|
||||
.reg_read = rs9_regmap_i2c_read,
|
||||
};
|
||||
|
||||
static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx)
|
||||
@ -242,11 +295,17 @@ static int rs9_probe(struct i2c_client *client)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rs9->regmap = devm_regmap_init_i2c(client, &rs9_regmap_config);
|
||||
rs9->regmap = devm_regmap_init(&client->dev, NULL,
|
||||
client, &rs9_regmap_config);
|
||||
if (IS_ERR(rs9->regmap))
|
||||
return dev_err_probe(&client->dev, PTR_ERR(rs9->regmap),
|
||||
"Failed to allocate register map\n");
|
||||
|
||||
/* Always read back 1 Byte via I2C */
|
||||
ret = regmap_write(rs9->regmap, RS9_REG_BCP, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Register clock */
|
||||
for (i = 0; i < rs9->chip_info->num_clks; i++) {
|
||||
snprintf(name, 5, "DIF%d", i);
|
||||
|
@ -1459,10 +1459,14 @@ static void clk_core_init_rate_req(struct clk_core * const core,
|
||||
{
|
||||
struct clk_core *parent;
|
||||
|
||||
if (WARN_ON(!core || !req))
|
||||
if (WARN_ON(!req))
|
||||
return;
|
||||
|
||||
memset(req, 0, sizeof(*req));
|
||||
req->max_rate = ULONG_MAX;
|
||||
|
||||
if (!core)
|
||||
return;
|
||||
|
||||
req->rate = rate;
|
||||
clk_core_get_boundaries(core, &req->min_rate, &req->max_rate);
|
||||
|
@ -1270,8 +1270,10 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
|
||||
hw = devm_clk_hw_register_mux(&pdev->dev, "mfg_ck_fast_ref", mfg_fast_parents,
|
||||
ARRAY_SIZE(mfg_fast_parents), CLK_SET_RATE_PARENT,
|
||||
(base + 0x250), 8, 1, 0, &mt8195_clk_lock);
|
||||
if (IS_ERR(hw))
|
||||
if (IS_ERR(hw)) {
|
||||
r = PTR_ERR(hw);
|
||||
goto unregister_muxes;
|
||||
}
|
||||
top_clk_data->hws[CLK_TOP_MFG_CK_FAST_REF] = hw;
|
||||
|
||||
r = clk_mt8195_reg_mfg_mux_notifier(&pdev->dev,
|
||||
|
@ -3467,6 +3467,7 @@ static int gcc_sc7280_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, 0x28004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28014, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x7100C, BIT(13), BIT(13));
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
|
||||
ARRAY_SIZE(gcc_dfs_clocks));
|
||||
|
@ -463,6 +463,7 @@ static int gpu_cc_sc7280_probe(struct platform_device *pdev)
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x1098, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x1098, BIT(13), BIT(13));
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sc7280_desc, regmap);
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ enum clk_ids {
|
||||
CLK_S0_VIO,
|
||||
CLK_S0_VC,
|
||||
CLK_S0_HSC,
|
||||
CLK_SASYNCPER,
|
||||
CLK_SV_VIP,
|
||||
CLK_SV_IR,
|
||||
CLK_SDSRC,
|
||||
@ -84,6 +85,7 @@ static const struct cpg_core_clk r8a779g0_core_clks[] __initconst = {
|
||||
DEF_FIXED(".s0_vio", CLK_S0_VIO, CLK_PLL1_DIV2, 2, 1),
|
||||
DEF_FIXED(".s0_vc", CLK_S0_VC, CLK_PLL1_DIV2, 2, 1),
|
||||
DEF_FIXED(".s0_hsc", CLK_S0_HSC, CLK_PLL1_DIV2, 2, 1),
|
||||
DEF_FIXED(".sasyncper", CLK_SASYNCPER, CLK_PLL5_DIV4, 3, 1),
|
||||
DEF_FIXED(".sv_vip", CLK_SV_VIP, CLK_PLL1, 5, 1),
|
||||
DEF_FIXED(".sv_ir", CLK_SV_IR, CLK_PLL1, 5, 1),
|
||||
DEF_BASE(".sdsrc", CLK_SDSRC, CLK_TYPE_GEN4_SDSRC, CLK_PLL5),
|
||||
@ -128,6 +130,9 @@ static const struct cpg_core_clk r8a779g0_core_clks[] __initconst = {
|
||||
DEF_FIXED("s0d4_hsc", R8A779G0_CLK_S0D4_HSC, CLK_S0_HSC, 4, 1),
|
||||
DEF_FIXED("cl16m_hsc", R8A779G0_CLK_CL16M_HSC, CLK_S0_HSC, 48, 1),
|
||||
DEF_FIXED("s0d2_cc", R8A779G0_CLK_S0D2_CC, CLK_S0, 2, 1),
|
||||
DEF_FIXED("sasyncperd1",R8A779G0_CLK_SASYNCPERD1, CLK_SASYNCPER,1, 1),
|
||||
DEF_FIXED("sasyncperd2",R8A779G0_CLK_SASYNCPERD2, CLK_SASYNCPER,2, 1),
|
||||
DEF_FIXED("sasyncperd4",R8A779G0_CLK_SASYNCPERD4, CLK_SASYNCPER,4, 1),
|
||||
DEF_FIXED("svd1_ir", R8A779G0_CLK_SVD1_IR, CLK_SV_IR, 1, 1),
|
||||
DEF_FIXED("svd2_ir", R8A779G0_CLK_SVD2_IR, CLK_SV_IR, 2, 1),
|
||||
DEF_FIXED("svd1_vip", R8A779G0_CLK_SVD1_VIP, CLK_SV_VIP, 1, 1),
|
||||
@ -153,10 +158,10 @@ static const struct mssr_mod_clk r8a779g0_mod_clks[] __initconst = {
|
||||
DEF_MOD("avb0", 211, R8A779G0_CLK_S0D4_HSC),
|
||||
DEF_MOD("avb1", 212, R8A779G0_CLK_S0D4_HSC),
|
||||
DEF_MOD("avb2", 213, R8A779G0_CLK_S0D4_HSC),
|
||||
DEF_MOD("hscif0", 514, R8A779G0_CLK_S0D3_PER),
|
||||
DEF_MOD("hscif1", 515, R8A779G0_CLK_S0D3_PER),
|
||||
DEF_MOD("hscif2", 516, R8A779G0_CLK_S0D3_PER),
|
||||
DEF_MOD("hscif3", 517, R8A779G0_CLK_S0D3_PER),
|
||||
DEF_MOD("hscif0", 514, R8A779G0_CLK_SASYNCPERD1),
|
||||
DEF_MOD("hscif1", 515, R8A779G0_CLK_SASYNCPERD1),
|
||||
DEF_MOD("hscif2", 516, R8A779G0_CLK_SASYNCPERD1),
|
||||
DEF_MOD("hscif3", 517, R8A779G0_CLK_SASYNCPERD1),
|
||||
DEF_MOD("i2c0", 518, R8A779G0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c1", 519, R8A779G0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c2", 520, R8A779G0_CLK_S0D6_PER),
|
||||
|
@ -2,7 +2,8 @@
|
||||
|
||||
menuconfig CLK_SIFIVE
|
||||
bool "SiFive SoC driver support"
|
||||
depends on RISCV || COMPILE_TEST
|
||||
depends on SOC_SIFIVE || COMPILE_TEST
|
||||
default SOC_SIFIVE
|
||||
help
|
||||
SoC drivers for SiFive Linux-capable SoCs.
|
||||
|
||||
@ -10,6 +11,7 @@ if CLK_SIFIVE
|
||||
|
||||
config CLK_SIFIVE_PRCI
|
||||
bool "PRCI driver for SiFive SoCs"
|
||||
default SOC_SIFIVE
|
||||
select RESET_CONTROLLER
|
||||
select RESET_SIMPLE
|
||||
select CLK_ANALOGBITS_WRPLL_CLN28HPC
|
||||
|
@ -174,7 +174,7 @@ int cxl_mbox_send_cmd(struct cxl_dev_state *cxlds, u16 opcode, void *in,
|
||||
};
|
||||
int rc;
|
||||
|
||||
if (out_size > cxlds->payload_size)
|
||||
if (in_size > cxlds->payload_size || out_size > cxlds->payload_size)
|
||||
return -E2BIG;
|
||||
|
||||
rc = cxlds->mbox_send(cxlds, &mbox_cmd);
|
||||
|
@ -188,6 +188,7 @@ static void cxl_nvdimm_release(struct device *dev)
|
||||
{
|
||||
struct cxl_nvdimm *cxl_nvd = to_cxl_nvdimm(dev);
|
||||
|
||||
xa_destroy(&cxl_nvd->pmem_regions);
|
||||
kfree(cxl_nvd);
|
||||
}
|
||||
|
||||
@ -230,6 +231,7 @@ static struct cxl_nvdimm *cxl_nvdimm_alloc(struct cxl_memdev *cxlmd)
|
||||
|
||||
dev = &cxl_nvd->dev;
|
||||
cxl_nvd->cxlmd = cxlmd;
|
||||
xa_init(&cxl_nvd->pmem_regions);
|
||||
device_initialize(dev);
|
||||
lockdep_set_class(&dev->mutex, &cxl_nvdimm_key);
|
||||
device_set_pm_not_required(dev);
|
||||
|
@ -811,6 +811,7 @@ static struct cxl_dport *find_dport(struct cxl_port *port, int id)
|
||||
static int add_dport(struct cxl_port *port, struct cxl_dport *new)
|
||||
{
|
||||
struct cxl_dport *dup;
|
||||
int rc;
|
||||
|
||||
device_lock_assert(&port->dev);
|
||||
dup = find_dport(port, new->port_id);
|
||||
@ -821,8 +822,14 @@ static int add_dport(struct cxl_port *port, struct cxl_dport *new)
|
||||
dev_name(dup->dport));
|
||||
return -EBUSY;
|
||||
}
|
||||
return xa_insert(&port->dports, (unsigned long)new->dport, new,
|
||||
GFP_KERNEL);
|
||||
|
||||
rc = xa_insert(&port->dports, (unsigned long)new->dport, new,
|
||||
GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
port->nr_dports++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -174,7 +174,8 @@ static int cxl_region_decode_commit(struct cxl_region *cxlr)
|
||||
iter = to_cxl_port(iter->dev.parent)) {
|
||||
cxl_rr = cxl_rr_load(iter, cxlr);
|
||||
cxld = cxl_rr->decoder;
|
||||
rc = cxld->commit(cxld);
|
||||
if (cxld->commit)
|
||||
rc = cxld->commit(cxld);
|
||||
if (rc)
|
||||
break;
|
||||
}
|
||||
@ -657,6 +658,9 @@ static struct cxl_region_ref *alloc_region_ref(struct cxl_port *port,
|
||||
xa_for_each(&port->regions, index, iter) {
|
||||
struct cxl_region_params *ip = &iter->region->params;
|
||||
|
||||
if (!ip->res)
|
||||
continue;
|
||||
|
||||
if (ip->res->start > p->res->start) {
|
||||
dev_dbg(&cxlr->dev,
|
||||
"%s: HPA order violation %s:%pr vs %pr\n",
|
||||
@ -686,18 +690,27 @@ static struct cxl_region_ref *alloc_region_ref(struct cxl_port *port,
|
||||
return cxl_rr;
|
||||
}
|
||||
|
||||
static void free_region_ref(struct cxl_region_ref *cxl_rr)
|
||||
static void cxl_rr_free_decoder(struct cxl_region_ref *cxl_rr)
|
||||
{
|
||||
struct cxl_port *port = cxl_rr->port;
|
||||
struct cxl_region *cxlr = cxl_rr->region;
|
||||
struct cxl_decoder *cxld = cxl_rr->decoder;
|
||||
|
||||
if (!cxld)
|
||||
return;
|
||||
|
||||
dev_WARN_ONCE(&cxlr->dev, cxld->region != cxlr, "region mismatch\n");
|
||||
if (cxld->region == cxlr) {
|
||||
cxld->region = NULL;
|
||||
put_device(&cxlr->dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void free_region_ref(struct cxl_region_ref *cxl_rr)
|
||||
{
|
||||
struct cxl_port *port = cxl_rr->port;
|
||||
struct cxl_region *cxlr = cxl_rr->region;
|
||||
|
||||
cxl_rr_free_decoder(cxl_rr);
|
||||
xa_erase(&port->regions, (unsigned long)cxlr);
|
||||
xa_destroy(&cxl_rr->endpoints);
|
||||
kfree(cxl_rr);
|
||||
@ -728,6 +741,33 @@ static int cxl_rr_ep_add(struct cxl_region_ref *cxl_rr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxl_rr_alloc_decoder(struct cxl_port *port, struct cxl_region *cxlr,
|
||||
struct cxl_endpoint_decoder *cxled,
|
||||
struct cxl_region_ref *cxl_rr)
|
||||
{
|
||||
struct cxl_decoder *cxld;
|
||||
|
||||
if (port == cxled_to_port(cxled))
|
||||
cxld = &cxled->cxld;
|
||||
else
|
||||
cxld = cxl_region_find_decoder(port, cxlr);
|
||||
if (!cxld) {
|
||||
dev_dbg(&cxlr->dev, "%s: no decoder available\n",
|
||||
dev_name(&port->dev));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (cxld->region) {
|
||||
dev_dbg(&cxlr->dev, "%s: %s already attached to %s\n",
|
||||
dev_name(&port->dev), dev_name(&cxld->dev),
|
||||
dev_name(&cxld->region->dev));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
cxl_rr->decoder = cxld;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cxl_port_attach_region() - track a region's interest in a port by endpoint
|
||||
* @port: port to add a new region reference 'struct cxl_region_ref'
|
||||
@ -794,12 +834,6 @@ static int cxl_port_attach_region(struct cxl_port *port,
|
||||
cxl_rr->nr_targets++;
|
||||
nr_targets_inc = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* The decoder for @cxlr was allocated when the region was first
|
||||
* attached to @port.
|
||||
*/
|
||||
cxld = cxl_rr->decoder;
|
||||
} else {
|
||||
cxl_rr = alloc_region_ref(port, cxlr);
|
||||
if (IS_ERR(cxl_rr)) {
|
||||
@ -810,26 +844,11 @@ static int cxl_port_attach_region(struct cxl_port *port,
|
||||
}
|
||||
nr_targets_inc = true;
|
||||
|
||||
if (port == cxled_to_port(cxled))
|
||||
cxld = &cxled->cxld;
|
||||
else
|
||||
cxld = cxl_region_find_decoder(port, cxlr);
|
||||
if (!cxld) {
|
||||
dev_dbg(&cxlr->dev, "%s: no decoder available\n",
|
||||
dev_name(&port->dev));
|
||||
rc = cxl_rr_alloc_decoder(port, cxlr, cxled, cxl_rr);
|
||||
if (rc)
|
||||
goto out_erase;
|
||||
}
|
||||
|
||||
if (cxld->region) {
|
||||
dev_dbg(&cxlr->dev, "%s: %s already attached to %s\n",
|
||||
dev_name(&port->dev), dev_name(&cxld->dev),
|
||||
dev_name(&cxld->region->dev));
|
||||
rc = -EBUSY;
|
||||
goto out_erase;
|
||||
}
|
||||
|
||||
cxl_rr->decoder = cxld;
|
||||
}
|
||||
cxld = cxl_rr->decoder;
|
||||
|
||||
rc = cxl_rr_ep_add(cxl_rr, cxled);
|
||||
if (rc) {
|
||||
@ -971,7 +990,14 @@ static int cxl_port_setup_targets(struct cxl_port *port,
|
||||
if (cxl_rr->nr_targets_set) {
|
||||
int i, distance;
|
||||
|
||||
distance = p->nr_targets / cxl_rr->nr_targets;
|
||||
/*
|
||||
* Passthrough ports impose no distance requirements between
|
||||
* peers
|
||||
*/
|
||||
if (port->nr_dports == 1)
|
||||
distance = 0;
|
||||
else
|
||||
distance = p->nr_targets / cxl_rr->nr_targets;
|
||||
for (i = 0; i < cxl_rr->nr_targets_set; i++)
|
||||
if (ep->dport == cxlsd->target[i]) {
|
||||
rc = check_last_peer(cxled, ep, cxl_rr,
|
||||
@ -1508,9 +1534,24 @@ static const struct attribute_group *region_groups[] = {
|
||||
|
||||
static void cxl_region_release(struct device *dev)
|
||||
{
|
||||
struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev->parent);
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
int id = atomic_read(&cxlrd->region_id);
|
||||
|
||||
/*
|
||||
* Try to reuse the recently idled id rather than the cached
|
||||
* next id to prevent the region id space from increasing
|
||||
* unnecessarily.
|
||||
*/
|
||||
if (cxlr->id < id)
|
||||
if (atomic_try_cmpxchg(&cxlrd->region_id, &id, cxlr->id)) {
|
||||
memregion_free(id);
|
||||
goto out;
|
||||
}
|
||||
|
||||
memregion_free(cxlr->id);
|
||||
out:
|
||||
put_device(dev->parent);
|
||||
kfree(cxlr);
|
||||
}
|
||||
|
||||
@ -1538,8 +1579,19 @@ static struct cxl_region *to_cxl_region(struct device *dev)
|
||||
static void unregister_region(void *dev)
|
||||
{
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
int i;
|
||||
|
||||
device_del(dev);
|
||||
|
||||
/*
|
||||
* Now that region sysfs is shutdown, the parameter block is now
|
||||
* read-only, so no need to hold the region rwsem to access the
|
||||
* region parameters.
|
||||
*/
|
||||
for (i = 0; i < p->interleave_ways; i++)
|
||||
detach_target(cxlr, i);
|
||||
|
||||
cxl_region_iomem_release(cxlr);
|
||||
put_device(dev);
|
||||
}
|
||||
@ -1561,6 +1613,11 @@ static struct cxl_region *cxl_region_alloc(struct cxl_root_decoder *cxlrd, int i
|
||||
device_initialize(dev);
|
||||
lockdep_set_class(&dev->mutex, &cxl_region_key);
|
||||
dev->parent = &cxlrd->cxlsd.cxld.dev;
|
||||
/*
|
||||
* Keep root decoder pinned through cxl_region_release to fixup
|
||||
* region id allocations
|
||||
*/
|
||||
get_device(dev->parent);
|
||||
device_set_pm_not_required(dev);
|
||||
dev->bus = &cxl_bus_type;
|
||||
dev->type = &cxl_region_type;
|
||||
|
@ -423,7 +423,7 @@ struct cxl_nvdimm {
|
||||
struct device dev;
|
||||
struct cxl_memdev *cxlmd;
|
||||
struct cxl_nvdimm_bridge *bridge;
|
||||
struct cxl_pmem_region *region;
|
||||
struct xarray pmem_regions;
|
||||
};
|
||||
|
||||
struct cxl_pmem_region_mapping {
|
||||
@ -457,6 +457,7 @@ struct cxl_pmem_region {
|
||||
* @regions: cxl_region_ref instances, regions mapped by this port
|
||||
* @parent_dport: dport that points to this port in the parent
|
||||
* @decoder_ida: allocator for decoder ids
|
||||
* @nr_dports: number of entries in @dports
|
||||
* @hdm_end: track last allocated HDM decoder instance for allocation ordering
|
||||
* @commit_end: cursor to track highest committed decoder for commit ordering
|
||||
* @component_reg_phys: component register capability base address (optional)
|
||||
@ -475,6 +476,7 @@ struct cxl_port {
|
||||
struct xarray regions;
|
||||
struct cxl_dport *parent_dport;
|
||||
struct ida decoder_ida;
|
||||
int nr_dports;
|
||||
int hdm_end;
|
||||
int commit_end;
|
||||
resource_size_t component_reg_phys;
|
||||
|
@ -30,17 +30,20 @@ static void unregister_nvdimm(void *nvdimm)
|
||||
struct cxl_nvdimm *cxl_nvd = nvdimm_provider_data(nvdimm);
|
||||
struct cxl_nvdimm_bridge *cxl_nvb = cxl_nvd->bridge;
|
||||
struct cxl_pmem_region *cxlr_pmem;
|
||||
unsigned long index;
|
||||
|
||||
device_lock(&cxl_nvb->dev);
|
||||
cxlr_pmem = cxl_nvd->region;
|
||||
dev_set_drvdata(&cxl_nvd->dev, NULL);
|
||||
cxl_nvd->region = NULL;
|
||||
device_unlock(&cxl_nvb->dev);
|
||||
xa_for_each(&cxl_nvd->pmem_regions, index, cxlr_pmem) {
|
||||
get_device(&cxlr_pmem->dev);
|
||||
device_unlock(&cxl_nvb->dev);
|
||||
|
||||
if (cxlr_pmem) {
|
||||
device_release_driver(&cxlr_pmem->dev);
|
||||
put_device(&cxlr_pmem->dev);
|
||||
|
||||
device_lock(&cxl_nvb->dev);
|
||||
}
|
||||
device_unlock(&cxl_nvb->dev);
|
||||
|
||||
nvdimm_delete(nvdimm);
|
||||
cxl_nvd->bridge = NULL;
|
||||
@ -107,7 +110,7 @@ static int cxl_pmem_get_config_size(struct cxl_dev_state *cxlds,
|
||||
|
||||
*cmd = (struct nd_cmd_get_config_size) {
|
||||
.config_size = cxlds->lsa_size,
|
||||
.max_xfer = cxlds->payload_size,
|
||||
.max_xfer = cxlds->payload_size - sizeof(struct cxl_mbox_set_lsa),
|
||||
};
|
||||
|
||||
return 0;
|
||||
@ -148,7 +151,7 @@ static int cxl_pmem_set_config_data(struct cxl_dev_state *cxlds,
|
||||
return -EINVAL;
|
||||
|
||||
/* 4-byte status follows the input data in the payload */
|
||||
if (struct_size(cmd, in_buf, cmd->in_length) + 4 > buf_len)
|
||||
if (size_add(struct_size(cmd, in_buf, cmd->in_length), 4) > buf_len)
|
||||
return -EINVAL;
|
||||
|
||||
set_lsa =
|
||||
@ -366,25 +369,49 @@ static int match_cxl_nvdimm(struct device *dev, void *data)
|
||||
|
||||
static void unregister_nvdimm_region(void *nd_region)
|
||||
{
|
||||
struct cxl_nvdimm_bridge *cxl_nvb;
|
||||
struct cxl_pmem_region *cxlr_pmem;
|
||||
int i;
|
||||
nvdimm_region_delete(nd_region);
|
||||
}
|
||||
|
||||
static int cxl_nvdimm_add_region(struct cxl_nvdimm *cxl_nvd,
|
||||
struct cxl_pmem_region *cxlr_pmem)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = xa_insert(&cxl_nvd->pmem_regions, (unsigned long)cxlr_pmem,
|
||||
cxlr_pmem, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
get_device(&cxlr_pmem->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cxl_nvdimm_del_region(struct cxl_nvdimm *cxl_nvd,
|
||||
struct cxl_pmem_region *cxlr_pmem)
|
||||
{
|
||||
/*
|
||||
* It is possible this is called without a corresponding
|
||||
* cxl_nvdimm_add_region for @cxlr_pmem
|
||||
*/
|
||||
cxlr_pmem = xa_erase(&cxl_nvd->pmem_regions, (unsigned long)cxlr_pmem);
|
||||
if (cxlr_pmem)
|
||||
put_device(&cxlr_pmem->dev);
|
||||
}
|
||||
|
||||
static void release_mappings(void *data)
|
||||
{
|
||||
int i;
|
||||
struct cxl_pmem_region *cxlr_pmem = data;
|
||||
struct cxl_nvdimm_bridge *cxl_nvb = cxlr_pmem->bridge;
|
||||
|
||||
cxlr_pmem = nd_region_provider_data(nd_region);
|
||||
cxl_nvb = cxlr_pmem->bridge;
|
||||
device_lock(&cxl_nvb->dev);
|
||||
for (i = 0; i < cxlr_pmem->nr_mappings; i++) {
|
||||
struct cxl_pmem_region_mapping *m = &cxlr_pmem->mapping[i];
|
||||
struct cxl_nvdimm *cxl_nvd = m->cxl_nvd;
|
||||
|
||||
if (cxl_nvd->region) {
|
||||
put_device(&cxlr_pmem->dev);
|
||||
cxl_nvd->region = NULL;
|
||||
}
|
||||
cxl_nvdimm_del_region(cxl_nvd, cxlr_pmem);
|
||||
}
|
||||
device_unlock(&cxl_nvb->dev);
|
||||
|
||||
nvdimm_region_delete(nd_region);
|
||||
}
|
||||
|
||||
static void cxlr_pmem_remove_resource(void *res)
|
||||
@ -422,7 +449,7 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
if (!cxl_nvb->nvdimm_bus) {
|
||||
dev_dbg(dev, "nvdimm bus not found\n");
|
||||
rc = -ENXIO;
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
}
|
||||
|
||||
memset(&mappings, 0, sizeof(mappings));
|
||||
@ -431,7 +458,7 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
res = devm_kzalloc(dev, sizeof(*res), GFP_KERNEL);
|
||||
if (!res) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
}
|
||||
|
||||
res->name = "Persistent Memory";
|
||||
@ -442,11 +469,11 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
|
||||
rc = insert_resource(&iomem_resource, res);
|
||||
if (rc)
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
|
||||
rc = devm_add_action_or_reset(dev, cxlr_pmem_remove_resource, res);
|
||||
if (rc)
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
|
||||
ndr_desc.res = res;
|
||||
ndr_desc.provider_data = cxlr_pmem;
|
||||
@ -462,7 +489,7 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
nd_set = devm_kzalloc(dev, sizeof(*nd_set), GFP_KERNEL);
|
||||
if (!nd_set) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
}
|
||||
|
||||
ndr_desc.memregion = cxlr->id;
|
||||
@ -472,9 +499,13 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
info = kmalloc_array(cxlr_pmem->nr_mappings, sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
goto out_nvb;
|
||||
}
|
||||
|
||||
rc = devm_add_action_or_reset(dev, release_mappings, cxlr_pmem);
|
||||
if (rc)
|
||||
goto out_nvd;
|
||||
|
||||
for (i = 0; i < cxlr_pmem->nr_mappings; i++) {
|
||||
struct cxl_pmem_region_mapping *m = &cxlr_pmem->mapping[i];
|
||||
struct cxl_memdev *cxlmd = m->cxlmd;
|
||||
@ -486,7 +517,7 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
dev_dbg(dev, "[%d]: %s: no cxl_nvdimm found\n", i,
|
||||
dev_name(&cxlmd->dev));
|
||||
rc = -ENODEV;
|
||||
goto err;
|
||||
goto out_nvd;
|
||||
}
|
||||
|
||||
/* safe to drop ref now with bridge lock held */
|
||||
@ -498,10 +529,17 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
dev_dbg(dev, "[%d]: %s: no nvdimm found\n", i,
|
||||
dev_name(&cxlmd->dev));
|
||||
rc = -ENODEV;
|
||||
goto err;
|
||||
goto out_nvd;
|
||||
}
|
||||
cxl_nvd->region = cxlr_pmem;
|
||||
get_device(&cxlr_pmem->dev);
|
||||
|
||||
/*
|
||||
* Pin the region per nvdimm device as those may be released
|
||||
* out-of-order with respect to the region, and a single nvdimm
|
||||
* maybe associated with multiple regions
|
||||
*/
|
||||
rc = cxl_nvdimm_add_region(cxl_nvd, cxlr_pmem);
|
||||
if (rc)
|
||||
goto out_nvd;
|
||||
m->cxl_nvd = cxl_nvd;
|
||||
mappings[i] = (struct nd_mapping_desc) {
|
||||
.nvdimm = nvdimm,
|
||||
@ -527,27 +565,18 @@ static int cxl_pmem_region_probe(struct device *dev)
|
||||
nvdimm_pmem_region_create(cxl_nvb->nvdimm_bus, &ndr_desc);
|
||||
if (!cxlr_pmem->nd_region) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
goto out_nvd;
|
||||
}
|
||||
|
||||
rc = devm_add_action_or_reset(dev, unregister_nvdimm_region,
|
||||
cxlr_pmem->nd_region);
|
||||
out:
|
||||
out_nvd:
|
||||
kfree(info);
|
||||
out_nvb:
|
||||
device_unlock(&cxl_nvb->dev);
|
||||
put_device(&cxl_nvb->dev);
|
||||
|
||||
return rc;
|
||||
|
||||
err:
|
||||
dev_dbg(dev, "failed to create nvdimm region\n");
|
||||
for (i--; i >= 0; i--) {
|
||||
nvdimm = mappings[i].nvdimm;
|
||||
cxl_nvd = nvdimm_provider_data(nvdimm);
|
||||
put_device(&cxl_nvd->region->dev);
|
||||
cxl_nvd->region = NULL;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
static struct cxl_driver cxl_pmem_region_driver = {
|
||||
|
@ -216,9 +216,20 @@ void scmi_device_destroy(struct scmi_device *scmi_dev)
|
||||
device_unregister(&scmi_dev->dev);
|
||||
}
|
||||
|
||||
void scmi_device_link_add(struct device *consumer, struct device *supplier)
|
||||
{
|
||||
struct device_link *link;
|
||||
|
||||
link = device_link_add(consumer, supplier, DL_FLAG_AUTOREMOVE_CONSUMER);
|
||||
|
||||
WARN_ON(!link);
|
||||
}
|
||||
|
||||
void scmi_set_handle(struct scmi_device *scmi_dev)
|
||||
{
|
||||
scmi_dev->handle = scmi_handle_get(&scmi_dev->dev);
|
||||
if (scmi_dev->handle)
|
||||
scmi_device_link_add(&scmi_dev->dev, scmi_dev->handle->dev);
|
||||
}
|
||||
|
||||
int scmi_protocol_register(const struct scmi_protocol *proto)
|
||||
|
@ -97,6 +97,7 @@ static inline void unpack_scmi_header(u32 msg_hdr, struct scmi_msg_hdr *hdr)
|
||||
struct scmi_revision_info *
|
||||
scmi_revision_area_get(const struct scmi_protocol_handle *ph);
|
||||
int scmi_handle_put(const struct scmi_handle *handle);
|
||||
void scmi_device_link_add(struct device *consumer, struct device *supplier);
|
||||
struct scmi_handle *scmi_handle_get(struct device *dev);
|
||||
void scmi_set_handle(struct scmi_device *scmi_dev);
|
||||
void scmi_setup_protocol_implemented(const struct scmi_protocol_handle *ph,
|
||||
@ -117,6 +118,7 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id);
|
||||
*
|
||||
* @dev: Reference to device in the SCMI hierarchy corresponding to this
|
||||
* channel
|
||||
* @rx_timeout_ms: The configured RX timeout in milliseconds.
|
||||
* @handle: Pointer to SCMI entity handle
|
||||
* @no_completion_irq: Flag to indicate that this channel has no completion
|
||||
* interrupt mechanism for synchronous commands.
|
||||
@ -126,6 +128,7 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id);
|
||||
*/
|
||||
struct scmi_chan_info {
|
||||
struct device *dev;
|
||||
unsigned int rx_timeout_ms;
|
||||
struct scmi_handle *handle;
|
||||
bool no_completion_irq;
|
||||
void *transport_info;
|
||||
@ -232,7 +235,7 @@ void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id);
|
||||
struct scmi_shared_mem;
|
||||
|
||||
void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer);
|
||||
struct scmi_xfer *xfer, struct scmi_chan_info *cinfo);
|
||||
u32 shmem_read_header(struct scmi_shared_mem __iomem *shmem);
|
||||
void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer);
|
||||
|
@ -2013,6 +2013,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device *dev,
|
||||
return -ENOMEM;
|
||||
|
||||
cinfo->dev = dev;
|
||||
cinfo->rx_timeout_ms = info->desc->max_rx_timeout_ms;
|
||||
|
||||
ret = info->desc->ops->chan_setup(cinfo, info->dev, tx);
|
||||
if (ret)
|
||||
@ -2044,8 +2045,12 @@ scmi_txrx_setup(struct scmi_info *info, struct device *dev, int prot_id)
|
||||
{
|
||||
int ret = scmi_chan_setup(info, dev, prot_id, true);
|
||||
|
||||
if (!ret) /* Rx is optional, hence no error check */
|
||||
scmi_chan_setup(info, dev, prot_id, false);
|
||||
if (!ret) {
|
||||
/* Rx is optional, report only memory errors */
|
||||
ret = scmi_chan_setup(info, dev, prot_id, false);
|
||||
if (ret && ret != -ENOMEM)
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -2273,10 +2278,16 @@ int scmi_protocol_device_request(const struct scmi_device_id *id_table)
|
||||
sdev = scmi_get_protocol_device(child, info,
|
||||
id_table->protocol_id,
|
||||
id_table->name);
|
||||
/* Set handle if not already set: device existed */
|
||||
if (sdev && !sdev->handle)
|
||||
sdev->handle =
|
||||
scmi_handle_get_from_info_unlocked(info);
|
||||
if (sdev) {
|
||||
/* Set handle if not already set: device existed */
|
||||
if (!sdev->handle)
|
||||
sdev->handle =
|
||||
scmi_handle_get_from_info_unlocked(info);
|
||||
/* Relink consumer and suppliers */
|
||||
if (sdev->handle)
|
||||
scmi_device_link_add(&sdev->dev,
|
||||
sdev->handle->dev);
|
||||
}
|
||||
} else {
|
||||
dev_err(info->dev,
|
||||
"Failed. SCMI protocol %d not active.\n",
|
||||
@ -2475,20 +2486,17 @@ void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id)
|
||||
|
||||
static int scmi_remove(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0, id;
|
||||
int ret, id;
|
||||
struct scmi_info *info = platform_get_drvdata(pdev);
|
||||
struct device_node *child;
|
||||
|
||||
mutex_lock(&scmi_list_mutex);
|
||||
if (info->users)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
list_del(&info->node);
|
||||
dev_warn(&pdev->dev,
|
||||
"Still active SCMI users will be forcibly unbound.\n");
|
||||
list_del(&info->node);
|
||||
mutex_unlock(&scmi_list_mutex);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
scmi_notification_exit(&info->handle);
|
||||
|
||||
mutex_lock(&info->protocols_mtx);
|
||||
@ -2500,7 +2508,11 @@ static int scmi_remove(struct platform_device *pdev)
|
||||
idr_destroy(&info->active_protocols);
|
||||
|
||||
/* Safe to free channels since no more users */
|
||||
return scmi_cleanup_txrx_channels(info);
|
||||
ret = scmi_cleanup_txrx_channels(info);
|
||||
if (ret)
|
||||
dev_warn(&pdev->dev, "Failed to cleanup SCMI channels.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t protocol_version_show(struct device *dev,
|
||||
@ -2571,6 +2583,7 @@ MODULE_DEVICE_TABLE(of, scmi_of_match);
|
||||
static struct platform_driver scmi_driver = {
|
||||
.driver = {
|
||||
.name = "arm-scmi",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = scmi_of_match,
|
||||
.dev_groups = versions_groups,
|
||||
},
|
||||
|
@ -36,7 +36,7 @@ static void tx_prepare(struct mbox_client *cl, void *m)
|
||||
{
|
||||
struct scmi_mailbox *smbox = client_to_scmi_mailbox(cl);
|
||||
|
||||
shmem_tx_prepare(smbox->shmem, m);
|
||||
shmem_tx_prepare(smbox->shmem, m, smbox->cinfo);
|
||||
}
|
||||
|
||||
static void rx_callback(struct mbox_client *cl, void *m)
|
||||
|
@ -498,7 +498,7 @@ static int scmi_optee_send_message(struct scmi_chan_info *cinfo,
|
||||
msg_tx_prepare(channel->req.msg, xfer);
|
||||
ret = invoke_process_msg_channel(channel, msg_command_size(xfer));
|
||||
} else {
|
||||
shmem_tx_prepare(channel->req.shmem, xfer);
|
||||
shmem_tx_prepare(channel->req.shmem, xfer, cinfo);
|
||||
ret = invoke_process_smt_channel(channel);
|
||||
}
|
||||
|
||||
|
@ -5,10 +5,13 @@
|
||||
* Copyright (C) 2019 ARM Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/processor.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
@ -30,16 +33,36 @@ struct scmi_shared_mem {
|
||||
};
|
||||
|
||||
void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer)
|
||||
struct scmi_xfer *xfer, struct scmi_chan_info *cinfo)
|
||||
{
|
||||
ktime_t stop;
|
||||
|
||||
/*
|
||||
* Ideally channel must be free by now unless OS timeout last
|
||||
* request and platform continued to process the same, wait
|
||||
* until it releases the shared memory, otherwise we may endup
|
||||
* overwriting its response with new message payload or vice-versa
|
||||
* overwriting its response with new message payload or vice-versa.
|
||||
* Giving up anyway after twice the expected channel timeout so as
|
||||
* not to bail-out on intermittent issues where the platform is
|
||||
* occasionally a bit slower to answer.
|
||||
*
|
||||
* Note that after a timeout is detected we bail-out and carry on but
|
||||
* the transport functionality is probably permanently compromised:
|
||||
* this is just to ease debugging and avoid complete hangs on boot
|
||||
* due to a misbehaving SCMI firmware.
|
||||
*/
|
||||
spin_until_cond(ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE);
|
||||
stop = ktime_add_ms(ktime_get(), 2 * cinfo->rx_timeout_ms);
|
||||
spin_until_cond((ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE) ||
|
||||
ktime_after(ktime_get(), stop));
|
||||
if (!(ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE)) {
|
||||
WARN_ON_ONCE(1);
|
||||
dev_err(cinfo->dev,
|
||||
"Timeout waiting for a free TX channel !\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Mark channel busy + clear error */
|
||||
iowrite32(0x0, &shmem->channel_status);
|
||||
iowrite32(xfer->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED,
|
||||
|
@ -188,7 +188,7 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
|
||||
*/
|
||||
smc_channel_lock_acquire(scmi_info, xfer);
|
||||
|
||||
shmem_tx_prepare(scmi_info->shmem, xfer);
|
||||
shmem_tx_prepare(scmi_info->shmem, xfer, cinfo);
|
||||
|
||||
arm_smccc_1_1_invoke(scmi_info->func_id, 0, 0, 0, 0, 0, 0, 0, &res);
|
||||
|
||||
|
@ -148,7 +148,6 @@ static void scmi_vio_channel_cleanup_sync(struct scmi_vio_channel *vioch)
|
||||
{
|
||||
unsigned long flags;
|
||||
DECLARE_COMPLETION_ONSTACK(vioch_shutdown_done);
|
||||
void *deferred_wq = NULL;
|
||||
|
||||
/*
|
||||
* Prepare to wait for the last release if not already released
|
||||
@ -162,16 +161,11 @@ static void scmi_vio_channel_cleanup_sync(struct scmi_vio_channel *vioch)
|
||||
|
||||
vioch->shutdown_done = &vioch_shutdown_done;
|
||||
virtio_break_device(vioch->vqueue->vdev);
|
||||
if (!vioch->is_rx && vioch->deferred_tx_wq) {
|
||||
deferred_wq = vioch->deferred_tx_wq;
|
||||
if (!vioch->is_rx && vioch->deferred_tx_wq)
|
||||
/* Cannot be kicked anymore after this...*/
|
||||
vioch->deferred_tx_wq = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&vioch->lock, flags);
|
||||
|
||||
if (deferred_wq)
|
||||
destroy_workqueue(deferred_wq);
|
||||
|
||||
scmi_vio_channel_release(vioch);
|
||||
|
||||
/* Let any possibly concurrent RX path release the channel */
|
||||
@ -416,6 +410,11 @@ static bool virtio_chan_available(struct device *dev, int idx)
|
||||
return vioch && !vioch->cinfo;
|
||||
}
|
||||
|
||||
static void scmi_destroy_tx_workqueue(void *deferred_tx_wq)
|
||||
{
|
||||
destroy_workqueue(deferred_tx_wq);
|
||||
}
|
||||
|
||||
static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
bool tx)
|
||||
{
|
||||
@ -430,6 +429,8 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
|
||||
/* Setup a deferred worker for polling. */
|
||||
if (tx && !vioch->deferred_tx_wq) {
|
||||
int ret;
|
||||
|
||||
vioch->deferred_tx_wq =
|
||||
alloc_workqueue(dev_name(&scmi_vdev->dev),
|
||||
WQ_UNBOUND | WQ_FREEZABLE | WQ_SYSFS,
|
||||
@ -437,6 +438,11 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
if (!vioch->deferred_tx_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, scmi_destroy_tx_workqueue,
|
||||
vioch->deferred_tx_wq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
INIT_WORK(&vioch->deferred_tx_work,
|
||||
scmi_vio_deferred_tx_worker);
|
||||
}
|
||||
@ -444,12 +450,12 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
for (i = 0; i < vioch->max_msg; i++) {
|
||||
struct scmi_vio_msg *msg;
|
||||
|
||||
msg = devm_kzalloc(cinfo->dev, sizeof(*msg), GFP_KERNEL);
|
||||
msg = devm_kzalloc(dev, sizeof(*msg), GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
if (tx) {
|
||||
msg->request = devm_kzalloc(cinfo->dev,
|
||||
msg->request = devm_kzalloc(dev,
|
||||
VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!msg->request)
|
||||
@ -458,7 +464,7 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
refcount_set(&msg->users, 1);
|
||||
}
|
||||
|
||||
msg->input = devm_kzalloc(cinfo->dev, VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
msg->input = devm_kzalloc(dev, VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!msg->input)
|
||||
return -ENOMEM;
|
||||
|
@ -611,7 +611,7 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
|
||||
|
||||
seed = early_memremap(efi_rng_seed, sizeof(*seed));
|
||||
if (seed != NULL) {
|
||||
size = READ_ONCE(seed->size);
|
||||
size = min(seed->size, EFI_RANDOM_SEED_SIZE);
|
||||
early_memunmap(seed, sizeof(*seed));
|
||||
} else {
|
||||
pr_err("Could not map UEFI random seed!\n");
|
||||
|
@ -75,7 +75,12 @@ efi_status_t efi_random_get_seed(void)
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
status = efi_bs_call(allocate_pool, EFI_RUNTIME_SERVICES_DATA,
|
||||
/*
|
||||
* Use EFI_ACPI_RECLAIM_MEMORY here so that it is guaranteed that the
|
||||
* allocation will survive a kexec reboot (although we refresh the seed
|
||||
* beforehand)
|
||||
*/
|
||||
status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
|
||||
sizeof(*seed) + EFI_RANDOM_SEED_SIZE,
|
||||
(void **)&seed);
|
||||
if (status != EFI_SUCCESS)
|
||||
|
@ -97,7 +97,7 @@ int __init efi_tpm_eventlog_init(void)
|
||||
goto out_calc;
|
||||
}
|
||||
|
||||
memblock_reserve((unsigned long)final_tbl,
|
||||
memblock_reserve(efi.tpm_final_log,
|
||||
tbl_size + sizeof(*final_tbl));
|
||||
efi_tpm_final_log_size = tbl_size;
|
||||
|
||||
|
@ -21,29 +21,22 @@ static struct efivars *__efivars;
|
||||
|
||||
static DEFINE_SEMAPHORE(efivars_lock);
|
||||
|
||||
static efi_status_t check_var_size(u32 attributes, unsigned long size)
|
||||
static efi_status_t check_var_size(bool nonblocking, u32 attributes,
|
||||
unsigned long size)
|
||||
{
|
||||
const struct efivar_operations *fops;
|
||||
efi_status_t status;
|
||||
|
||||
fops = __efivars->ops;
|
||||
|
||||
if (!fops->query_variable_store)
|
||||
status = EFI_UNSUPPORTED;
|
||||
else
|
||||
status = fops->query_variable_store(attributes, size,
|
||||
nonblocking);
|
||||
if (status == EFI_UNSUPPORTED)
|
||||
return (size <= SZ_64K) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;
|
||||
|
||||
return fops->query_variable_store(attributes, size, false);
|
||||
}
|
||||
|
||||
static
|
||||
efi_status_t check_var_size_nonblocking(u32 attributes, unsigned long size)
|
||||
{
|
||||
const struct efivar_operations *fops;
|
||||
|
||||
fops = __efivars->ops;
|
||||
|
||||
if (!fops->query_variable_store)
|
||||
return (size <= SZ_64K) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;
|
||||
|
||||
return fops->query_variable_store(attributes, size, true);
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -195,26 +188,6 @@ efi_status_t efivar_get_next_variable(unsigned long *name_size,
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(efivar_get_next_variable, EFIVAR);
|
||||
|
||||
/*
|
||||
* efivar_set_variable_blocking() - local helper function for set_variable
|
||||
*
|
||||
* Must be called with efivars_lock held.
|
||||
*/
|
||||
static efi_status_t
|
||||
efivar_set_variable_blocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size, void *data)
|
||||
{
|
||||
efi_status_t status;
|
||||
|
||||
if (data_size > 0) {
|
||||
status = check_var_size(attr, data_size +
|
||||
ucs2_strsize(name, 1024));
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
return __efivars->ops->set_variable(name, vendor, attr, data_size, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* efivar_set_variable_locked() - set a variable identified by name/vendor
|
||||
*
|
||||
@ -228,23 +201,21 @@ efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
|
||||
efi_set_variable_t *setvar;
|
||||
efi_status_t status;
|
||||
|
||||
if (!nonblocking)
|
||||
return efivar_set_variable_blocking(name, vendor, attr,
|
||||
data_size, data);
|
||||
if (data_size > 0) {
|
||||
status = check_var_size(nonblocking, attr,
|
||||
data_size + ucs2_strsize(name, 1024));
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no _nonblocking variant exists, the ordinary one
|
||||
* is assumed to be non-blocking.
|
||||
*/
|
||||
setvar = __efivars->ops->set_variable_nonblocking ?:
|
||||
__efivars->ops->set_variable;
|
||||
setvar = __efivars->ops->set_variable_nonblocking;
|
||||
if (!setvar || !nonblocking)
|
||||
setvar = __efivars->ops->set_variable;
|
||||
|
||||
if (data_size > 0) {
|
||||
status = check_var_size_nonblocking(attr, data_size +
|
||||
ucs2_strsize(name, 1024));
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
return setvar(name, vendor, attr, data_size, data);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(efivar_set_variable_locked, EFIVAR);
|
||||
@ -264,7 +235,8 @@ efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
if (efivar_lock())
|
||||
return EFI_ABORTED;
|
||||
|
||||
status = efivar_set_variable_blocking(name, vendor, attr, data_size, data);
|
||||
status = efivar_set_variable_locked(name, vendor, attr, data_size,
|
||||
data, false);
|
||||
efivar_unlock();
|
||||
return status;
|
||||
}
|
||||
|
@ -706,6 +706,13 @@ err:
|
||||
|
||||
void amdgpu_amdkfd_set_compute_idle(struct amdgpu_device *adev, bool idle)
|
||||
{
|
||||
/* Temporary workaround to fix issues observed in some
|
||||
* compute applications when GFXOFF is enabled on GFX11.
|
||||
*/
|
||||
if (IP_VERSION_MAJ(adev->ip_versions[GC_HWIP][0]) == 11) {
|
||||
pr_debug("GFXOFF is %s\n", idle ? "enabled" : "disabled");
|
||||
amdgpu_gfx_off_ctrl(adev, idle);
|
||||
}
|
||||
amdgpu_dpm_switch_power_profile(adev,
|
||||
PP_SMC_POWER_PROFILE_COMPUTE,
|
||||
!idle);
|
||||
|
@ -4060,15 +4060,18 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)
|
||||
* at suspend time.
|
||||
*
|
||||
*/
|
||||
static void amdgpu_device_evict_resources(struct amdgpu_device *adev)
|
||||
static int amdgpu_device_evict_resources(struct amdgpu_device *adev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* No need to evict vram on APUs for suspend to ram or s2idle */
|
||||
if ((adev->in_s3 || adev->in_s0ix) && (adev->flags & AMD_IS_APU))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM))
|
||||
ret = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);
|
||||
if (ret)
|
||||
DRM_WARN("evicting device resources failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -4118,7 +4121,9 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
|
||||
if (!adev->in_s0ix)
|
||||
amdgpu_amdkfd_suspend(adev, adev->in_runpm);
|
||||
|
||||
amdgpu_device_evict_resources(adev);
|
||||
r = amdgpu_device_evict_resources(adev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
amdgpu_fence_driver_hw_fini(adev);
|
||||
|
||||
|
@ -2201,7 +2201,8 @@ amdgpu_pci_remove(struct pci_dev *pdev)
|
||||
pm_runtime_forbid(dev->dev);
|
||||
}
|
||||
|
||||
if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 2)) {
|
||||
if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 2) &&
|
||||
!amdgpu_sriov_vf(adev)) {
|
||||
bool need_to_reset_gpu = false;
|
||||
|
||||
if (adev->gmc.xgmi.num_physical_nodes > 1) {
|
||||
|
@ -337,12 +337,14 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
|
||||
fw_info->feature = adev->psp.cap_feature_version;
|
||||
break;
|
||||
case AMDGPU_INFO_FW_MES_KIQ:
|
||||
fw_info->ver = adev->mes.ucode_fw_version[0];
|
||||
fw_info->feature = 0;
|
||||
fw_info->ver = adev->mes.kiq_version & AMDGPU_MES_VERSION_MASK;
|
||||
fw_info->feature = (adev->mes.kiq_version & AMDGPU_MES_FEAT_VERSION_MASK)
|
||||
>> AMDGPU_MES_FEAT_VERSION_SHIFT;
|
||||
break;
|
||||
case AMDGPU_INFO_FW_MES:
|
||||
fw_info->ver = adev->mes.ucode_fw_version[1];
|
||||
fw_info->feature = 0;
|
||||
fw_info->ver = adev->mes.sched_version & AMDGPU_MES_VERSION_MASK;
|
||||
fw_info->feature = (adev->mes.sched_version & AMDGPU_MES_FEAT_VERSION_MASK)
|
||||
>> AMDGPU_MES_FEAT_VERSION_SHIFT;
|
||||
break;
|
||||
case AMDGPU_INFO_FW_IMU:
|
||||
fw_info->ver = adev->gfx.imu_fw_version;
|
||||
|
@ -500,6 +500,8 @@ static int amdgpu_vkms_sw_init(void *handle)
|
||||
|
||||
adev_to_drm(adev)->mode_config.fb_base = adev->gmc.aper_base;
|
||||
|
||||
adev_to_drm(adev)->mode_config.fb_modifiers_not_supported = true;
|
||||
|
||||
r = amdgpu_display_modeset_create_props(adev);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -2495,442 +2495,444 @@ static const uint32_t cwsr_trap_gfx10_hex[] = {
|
||||
0xbf9f0000, 0x00000000,
|
||||
};
|
||||
static const uint32_t cwsr_trap_gfx11_hex[] = {
|
||||
0xbfa00001, 0xbfa0021e,
|
||||
0xbfa00001, 0xbfa00221,
|
||||
0xb0804006, 0xb8f8f802,
|
||||
0x9178ff78, 0x00020006,
|
||||
0xb8fbf803, 0xbf0d9f6d,
|
||||
0xbfa20006, 0x8b6eff78,
|
||||
0x00002000, 0xbfa10009,
|
||||
0x8b6eff6d, 0x00ff0000,
|
||||
0xbfa2001e, 0x8b6eff7b,
|
||||
0x00000400, 0xbfa20041,
|
||||
0xbf830010, 0xb8fbf803,
|
||||
0xbfa0fffa, 0x8b6eff7b,
|
||||
0x00000900, 0xbfa20015,
|
||||
0x8b6eff7b, 0x000071ff,
|
||||
0xbfa10008, 0x8b6fff7b,
|
||||
0x00007080, 0xbfa10001,
|
||||
0xbeee1287, 0xb8eff801,
|
||||
0x846e8c6e, 0x8b6e6f6e,
|
||||
0xbfa2000a, 0x8b6eff6d,
|
||||
0x00ff0000, 0xbfa20007,
|
||||
0xb8eef801, 0x8b6eff6e,
|
||||
0x00000800, 0xbfa20003,
|
||||
0xb8fbf803, 0xbf0d9e6d,
|
||||
0xbfa10001, 0xbfbd0000,
|
||||
0xbf0d9f6d, 0xbfa20006,
|
||||
0x8b6eff78, 0x00002000,
|
||||
0xbfa10009, 0x8b6eff6d,
|
||||
0x00ff0000, 0xbfa2001e,
|
||||
0x8b6eff7b, 0x00000400,
|
||||
0xbfa20026, 0xbefa4d82,
|
||||
0xbf89fc07, 0x84fa887a,
|
||||
0xf4005bbd, 0xf8000010,
|
||||
0xbf89fc07, 0x846e976e,
|
||||
0x9177ff77, 0x00800000,
|
||||
0x8c776e77, 0xf4045bbd,
|
||||
0xf8000000, 0xbf89fc07,
|
||||
0xf4045ebd, 0xf8000008,
|
||||
0xbf89fc07, 0x8bee6e6e,
|
||||
0xbfa10001, 0xbe80486e,
|
||||
0x8b6eff6d, 0x01ff0000,
|
||||
0xbfa20005, 0x8c78ff78,
|
||||
0x00002000, 0x80ec886c,
|
||||
0x82ed806d, 0xbfa00005,
|
||||
0x8b6eff6d, 0x01000000,
|
||||
0xbfa20002, 0x806c846c,
|
||||
0x826d806d, 0x8b6dff6d,
|
||||
0x0000ffff, 0x8bfe7e7e,
|
||||
0x8bea6a6a, 0xb978f802,
|
||||
0xbe804a6c, 0x8b6dff6d,
|
||||
0x0000ffff, 0xbefa0080,
|
||||
0xb97a0283, 0xbeee007e,
|
||||
0xbeef007f, 0xbefe0180,
|
||||
0xbefe4d84, 0xbf89fc07,
|
||||
0x8b7aff7f, 0x04000000,
|
||||
0x847a857a, 0x8c6d7a6d,
|
||||
0xbefa007e, 0x8b7bff7f,
|
||||
0x0000ffff, 0xbefe00c1,
|
||||
0xbeff00c1, 0xdca6c000,
|
||||
0x007a0000, 0x7e000280,
|
||||
0xbefe007a, 0xbeff007b,
|
||||
0xb8fb02dc, 0x847b997b,
|
||||
0xb8fa3b05, 0x807a817a,
|
||||
0xbf0d997b, 0xbfa20002,
|
||||
0x847a897a, 0xbfa00001,
|
||||
0x847a8a7a, 0xb8fb1e06,
|
||||
0x847b8a7b, 0x807a7b7a,
|
||||
0xbfa20041, 0xbf830010,
|
||||
0xb8fbf803, 0xbfa0fffa,
|
||||
0x8b6eff7b, 0x00000900,
|
||||
0xbfa20015, 0x8b6eff7b,
|
||||
0x000071ff, 0xbfa10008,
|
||||
0x8b6fff7b, 0x00007080,
|
||||
0xbfa10001, 0xbeee1287,
|
||||
0xb8eff801, 0x846e8c6e,
|
||||
0x8b6e6f6e, 0xbfa2000a,
|
||||
0x8b6eff6d, 0x00ff0000,
|
||||
0xbfa20007, 0xb8eef801,
|
||||
0x8b6eff6e, 0x00000800,
|
||||
0xbfa20003, 0x8b6eff7b,
|
||||
0x00000400, 0xbfa20026,
|
||||
0xbefa4d82, 0xbf89fc07,
|
||||
0x84fa887a, 0xf4005bbd,
|
||||
0xf8000010, 0xbf89fc07,
|
||||
0x846e976e, 0x9177ff77,
|
||||
0x00800000, 0x8c776e77,
|
||||
0xf4045bbd, 0xf8000000,
|
||||
0xbf89fc07, 0xf4045ebd,
|
||||
0xf8000008, 0xbf89fc07,
|
||||
0x8bee6e6e, 0xbfa10001,
|
||||
0xbe80486e, 0x8b6eff6d,
|
||||
0x01ff0000, 0xbfa20005,
|
||||
0x8c78ff78, 0x00002000,
|
||||
0x80ec886c, 0x82ed806d,
|
||||
0xbfa00005, 0x8b6eff6d,
|
||||
0x01000000, 0xbfa20002,
|
||||
0x806c846c, 0x826d806d,
|
||||
0x8b6dff6d, 0x0000ffff,
|
||||
0x8bfe7e7e, 0x8bea6a6a,
|
||||
0xb978f802, 0xbe804a6c,
|
||||
0x8b6dff6d, 0x0000ffff,
|
||||
0xbefa0080, 0xb97a0283,
|
||||
0xbeee007e, 0xbeef007f,
|
||||
0xbefe0180, 0xbefe4d84,
|
||||
0xbf89fc07, 0x8b7aff7f,
|
||||
0x04000000, 0x847a857a,
|
||||
0x8c6d7a6d, 0xbefa007e,
|
||||
0x8b7bff7f, 0x0000ffff,
|
||||
0x807aff7a, 0x00000200,
|
||||
0x807a7e7a, 0x827b807b,
|
||||
0xd7610000, 0x00010870,
|
||||
0xd7610000, 0x00010a71,
|
||||
0xd7610000, 0x00010c72,
|
||||
0xd7610000, 0x00010e73,
|
||||
0xd7610000, 0x00011074,
|
||||
0xd7610000, 0x00011275,
|
||||
0xd7610000, 0x00011476,
|
||||
0xd7610000, 0x00011677,
|
||||
0xd7610000, 0x00011a79,
|
||||
0xd7610000, 0x00011c7e,
|
||||
0xd7610000, 0x00011e7f,
|
||||
0xbefe00ff, 0x00003fff,
|
||||
0xbeff0080, 0xdca6c040,
|
||||
0x007a0000, 0xd760007a,
|
||||
0x00011d00, 0xd760007b,
|
||||
0x00011f00, 0xbefe007a,
|
||||
0xbeff007b, 0xbef4007e,
|
||||
0x8b75ff7f, 0x0000ffff,
|
||||
0x8c75ff75, 0x00040000,
|
||||
0xbef60080, 0xbef700ff,
|
||||
0x10807fac, 0xbef1007d,
|
||||
0xbef00080, 0xb8f302dc,
|
||||
0x84739973, 0xbefe00c1,
|
||||
0x857d9973, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20002,
|
||||
0xbeff0080, 0xbfa00002,
|
||||
0xbeff00c1, 0xbfa00009,
|
||||
0xbefe00c1, 0xbeff00c1,
|
||||
0xdca6c000, 0x007a0000,
|
||||
0x7e000280, 0xbefe007a,
|
||||
0xbeff007b, 0xb8fb02dc,
|
||||
0x847b997b, 0xb8fa3b05,
|
||||
0x807a817a, 0xbf0d997b,
|
||||
0xbfa20002, 0x847a897a,
|
||||
0xbfa00001, 0x847a8a7a,
|
||||
0xb8fb1e06, 0x847b8a7b,
|
||||
0x807a7b7a, 0x8b7bff7f,
|
||||
0x0000ffff, 0x807aff7a,
|
||||
0x00000200, 0x807a7e7a,
|
||||
0x827b807b, 0xd7610000,
|
||||
0x00010870, 0xd7610000,
|
||||
0x00010a71, 0xd7610000,
|
||||
0x00010c72, 0xd7610000,
|
||||
0x00010e73, 0xd7610000,
|
||||
0x00011074, 0xd7610000,
|
||||
0x00011275, 0xd7610000,
|
||||
0x00011476, 0xd7610000,
|
||||
0x00011677, 0xd7610000,
|
||||
0x00011a79, 0xd7610000,
|
||||
0x00011c7e, 0xd7610000,
|
||||
0x00011e7f, 0xbefe00ff,
|
||||
0x00003fff, 0xbeff0080,
|
||||
0xdca6c040, 0x007a0000,
|
||||
0xd760007a, 0x00011d00,
|
||||
0xd760007b, 0x00011f00,
|
||||
0xbefe007a, 0xbeff007b,
|
||||
0xbef4007e, 0x8b75ff7f,
|
||||
0x0000ffff, 0x8c75ff75,
|
||||
0x00040000, 0xbef60080,
|
||||
0xbef700ff, 0x10807fac,
|
||||
0xbef1007d, 0xbef00080,
|
||||
0xb8f302dc, 0x84739973,
|
||||
0xbefe00c1, 0x857d9973,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbfa20002, 0xbeff0080,
|
||||
0xbfa00002, 0xbeff00c1,
|
||||
0xbfa00009, 0xbef600ff,
|
||||
0x01000000, 0xe0685080,
|
||||
0x701d0100, 0xe0685100,
|
||||
0x701d0200, 0xe0685180,
|
||||
0x701d0300, 0xbfa00008,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xe0685080, 0x701d0100,
|
||||
0xe0685100, 0x701d0200,
|
||||
0xe0685180, 0x701d0300,
|
||||
0xbfa00008, 0xbef600ff,
|
||||
0x01000000, 0xe0685100,
|
||||
0x701d0100, 0xe0685200,
|
||||
0x701d0200, 0xe0685300,
|
||||
0x701d0300, 0xb8f03b05,
|
||||
0x80708170, 0xbf0d9973,
|
||||
0xbfa20002, 0x84708970,
|
||||
0xbfa00001, 0x84708a70,
|
||||
0xb8fa1e06, 0x847a8a7a,
|
||||
0x80707a70, 0x8070ff70,
|
||||
0x00000200, 0xbef600ff,
|
||||
0x01000000, 0x7e000280,
|
||||
0x7e020280, 0x7e040280,
|
||||
0xbefd0080, 0xd7610002,
|
||||
0x0000fa71, 0x807d817d,
|
||||
0xd7610002, 0x0000fa6c,
|
||||
0x807d817d, 0x917aff6d,
|
||||
0x80000000, 0xd7610002,
|
||||
0x0000fa7a, 0x807d817d,
|
||||
0xd7610002, 0x0000fa6e,
|
||||
0x807d817d, 0xd7610002,
|
||||
0x0000fa6f, 0x807d817d,
|
||||
0xd7610002, 0x0000fa78,
|
||||
0x807d817d, 0xb8faf803,
|
||||
0xd7610002, 0x0000fa7a,
|
||||
0x807d817d, 0xd7610002,
|
||||
0x0000fa7b, 0x807d817d,
|
||||
0xb8f1f801, 0xd7610002,
|
||||
0x0000fa71, 0x807d817d,
|
||||
0xb8f1f814, 0xd7610002,
|
||||
0x0000fa71, 0x807d817d,
|
||||
0xb8f1f815, 0xd7610002,
|
||||
0x0000fa71, 0x807d817d,
|
||||
0xbefe00ff, 0x0000ffff,
|
||||
0xbeff0080, 0xe0685000,
|
||||
0x701d0200, 0xbefe00c1,
|
||||
0xe0685100, 0x701d0100,
|
||||
0xe0685200, 0x701d0200,
|
||||
0xe0685300, 0x701d0300,
|
||||
0xb8f03b05, 0x80708170,
|
||||
0xbf0d9973, 0xbfa20002,
|
||||
0x84708970, 0xbfa00001,
|
||||
0x84708a70, 0xb8fa1e06,
|
||||
0x847a8a7a, 0x80707a70,
|
||||
0x8070ff70, 0x00000200,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbef90080, 0xbefd0080,
|
||||
0xbf800000, 0xbe804100,
|
||||
0xbe824102, 0xbe844104,
|
||||
0xbe864106, 0xbe884108,
|
||||
0xbe8a410a, 0xbe8c410c,
|
||||
0xbe8e410e, 0xd7610002,
|
||||
0x0000f200, 0x80798179,
|
||||
0xd7610002, 0x0000f201,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f202, 0x80798179,
|
||||
0xd7610002, 0x0000f203,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f204, 0x80798179,
|
||||
0xd7610002, 0x0000f205,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f206, 0x80798179,
|
||||
0xd7610002, 0x0000f207,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f208, 0x80798179,
|
||||
0xd7610002, 0x0000f209,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20a, 0x80798179,
|
||||
0xd7610002, 0x0000f20b,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20c, 0x80798179,
|
||||
0xd7610002, 0x0000f20d,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20e, 0x80798179,
|
||||
0xd7610002, 0x0000f20f,
|
||||
0x80798179, 0xbf06a079,
|
||||
0xbfa10006, 0xe0685000,
|
||||
0x701d0200, 0x8070ff70,
|
||||
0x00000080, 0xbef90080,
|
||||
0x7e040280, 0x807d907d,
|
||||
0xbf0aff7d, 0x00000060,
|
||||
0xbfa2ffbc, 0xbe804100,
|
||||
0xbe824102, 0xbe844104,
|
||||
0xbe864106, 0xbe884108,
|
||||
0xbe8a410a, 0xd7610002,
|
||||
0x0000f200, 0x80798179,
|
||||
0xd7610002, 0x0000f201,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f202, 0x80798179,
|
||||
0xd7610002, 0x0000f203,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f204, 0x80798179,
|
||||
0xd7610002, 0x0000f205,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f206, 0x80798179,
|
||||
0xd7610002, 0x0000f207,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f208, 0x80798179,
|
||||
0xd7610002, 0x0000f209,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20a, 0x80798179,
|
||||
0xd7610002, 0x0000f20b,
|
||||
0x80798179, 0xe0685000,
|
||||
0x701d0200, 0xbefe00c1,
|
||||
0x857d9973, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20002,
|
||||
0xbeff0080, 0xbfa00001,
|
||||
0xbeff00c1, 0xb8fb4306,
|
||||
0x8b7bc17b, 0xbfa10044,
|
||||
0xbfbd0000, 0x8b7aff6d,
|
||||
0x80000000, 0xbfa10040,
|
||||
0x847b867b, 0x847b827b,
|
||||
0xbef6007b, 0xb8f03b05,
|
||||
0x7e000280, 0x7e020280,
|
||||
0x7e040280, 0xbefd0080,
|
||||
0xd7610002, 0x0000fa71,
|
||||
0x807d817d, 0xd7610002,
|
||||
0x0000fa6c, 0x807d817d,
|
||||
0x917aff6d, 0x80000000,
|
||||
0xd7610002, 0x0000fa7a,
|
||||
0x807d817d, 0xd7610002,
|
||||
0x0000fa6e, 0x807d817d,
|
||||
0xd7610002, 0x0000fa6f,
|
||||
0x807d817d, 0xd7610002,
|
||||
0x0000fa78, 0x807d817d,
|
||||
0xb8faf803, 0xd7610002,
|
||||
0x0000fa7a, 0x807d817d,
|
||||
0xd7610002, 0x0000fa7b,
|
||||
0x807d817d, 0xb8f1f801,
|
||||
0xd7610002, 0x0000fa71,
|
||||
0x807d817d, 0xb8f1f814,
|
||||
0xd7610002, 0x0000fa71,
|
||||
0x807d817d, 0xb8f1f815,
|
||||
0xd7610002, 0x0000fa71,
|
||||
0x807d817d, 0xbefe00ff,
|
||||
0x0000ffff, 0xbeff0080,
|
||||
0xe0685000, 0x701d0200,
|
||||
0xbefe00c1, 0xb8f03b05,
|
||||
0x80708170, 0xbf0d9973,
|
||||
0xbfa20002, 0x84708970,
|
||||
0xbfa00001, 0x84708a70,
|
||||
0xb8fa1e06, 0x847a8a7a,
|
||||
0x80707a70, 0x8070ff70,
|
||||
0x00000200, 0x8070ff70,
|
||||
0x00000080, 0xbef600ff,
|
||||
0x01000000, 0xd71f0000,
|
||||
0x000100c1, 0xd7200000,
|
||||
0x000200c1, 0x16000084,
|
||||
0x857d9973, 0x8b7d817d,
|
||||
0xbf06817d, 0xbefd0080,
|
||||
0xbfa20012, 0xbe8300ff,
|
||||
0x00000080, 0xbf800000,
|
||||
0xbf800000, 0xbf800000,
|
||||
0xd8d80000, 0x01000000,
|
||||
0xbf890000, 0xe0685000,
|
||||
0x701d0100, 0x807d037d,
|
||||
0x80700370, 0xd5250000,
|
||||
0x0001ff00, 0x00000080,
|
||||
0xbf0a7b7d, 0xbfa2fff4,
|
||||
0xbfa00011, 0xbe8300ff,
|
||||
0x00000100, 0xbf800000,
|
||||
0xbf800000, 0xbf800000,
|
||||
0xd8d80000, 0x01000000,
|
||||
0xbf890000, 0xe0685000,
|
||||
0x701d0100, 0x807d037d,
|
||||
0x80700370, 0xd5250000,
|
||||
0x0001ff00, 0x00000100,
|
||||
0xbf0a7b7d, 0xbfa2fff4,
|
||||
0x80707a70, 0xbef600ff,
|
||||
0x01000000, 0xbef90080,
|
||||
0xbefd0080, 0xbf800000,
|
||||
0xbe804100, 0xbe824102,
|
||||
0xbe844104, 0xbe864106,
|
||||
0xbe884108, 0xbe8a410a,
|
||||
0xbe8c410c, 0xbe8e410e,
|
||||
0xd7610002, 0x0000f200,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f201, 0x80798179,
|
||||
0xd7610002, 0x0000f202,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f203, 0x80798179,
|
||||
0xd7610002, 0x0000f204,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f205, 0x80798179,
|
||||
0xd7610002, 0x0000f206,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f207, 0x80798179,
|
||||
0xd7610002, 0x0000f208,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f209, 0x80798179,
|
||||
0xd7610002, 0x0000f20a,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20b, 0x80798179,
|
||||
0xd7610002, 0x0000f20c,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20d, 0x80798179,
|
||||
0xd7610002, 0x0000f20e,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20f, 0x80798179,
|
||||
0xbf06a079, 0xbfa10006,
|
||||
0xe0685000, 0x701d0200,
|
||||
0x8070ff70, 0x00000080,
|
||||
0xbef90080, 0x7e040280,
|
||||
0x807d907d, 0xbf0aff7d,
|
||||
0x00000060, 0xbfa2ffbc,
|
||||
0xbe804100, 0xbe824102,
|
||||
0xbe844104, 0xbe864106,
|
||||
0xbe884108, 0xbe8a410a,
|
||||
0xd7610002, 0x0000f200,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f201, 0x80798179,
|
||||
0xd7610002, 0x0000f202,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f203, 0x80798179,
|
||||
0xd7610002, 0x0000f204,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f205, 0x80798179,
|
||||
0xd7610002, 0x0000f206,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f207, 0x80798179,
|
||||
0xd7610002, 0x0000f208,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f209, 0x80798179,
|
||||
0xd7610002, 0x0000f20a,
|
||||
0x80798179, 0xd7610002,
|
||||
0x0000f20b, 0x80798179,
|
||||
0xe0685000, 0x701d0200,
|
||||
0xbefe00c1, 0x857d9973,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbfa20004, 0xbef000ff,
|
||||
0x00000200, 0xbeff0080,
|
||||
0xbfa00003, 0xbef000ff,
|
||||
0x00000400, 0xbeff00c1,
|
||||
0xb8fb3b05, 0x807b817b,
|
||||
0x847b827b, 0x857d9973,
|
||||
0xbfa20002, 0xbeff0080,
|
||||
0xbfa00001, 0xbeff00c1,
|
||||
0xb8fb4306, 0x8b7bc17b,
|
||||
0xbfa10044, 0xbfbd0000,
|
||||
0x8b7aff6d, 0x80000000,
|
||||
0xbfa10040, 0x847b867b,
|
||||
0x847b827b, 0xbef6007b,
|
||||
0xb8f03b05, 0x80708170,
|
||||
0xbf0d9973, 0xbfa20002,
|
||||
0x84708970, 0xbfa00001,
|
||||
0x84708a70, 0xb8fa1e06,
|
||||
0x847a8a7a, 0x80707a70,
|
||||
0x8070ff70, 0x00000200,
|
||||
0x8070ff70, 0x00000080,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xd71f0000, 0x000100c1,
|
||||
0xd7200000, 0x000200c1,
|
||||
0x16000084, 0x857d9973,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbfa20017, 0xbef600ff,
|
||||
0xbefd0080, 0xbfa20012,
|
||||
0xbe8300ff, 0x00000080,
|
||||
0xbf800000, 0xbf800000,
|
||||
0xbf800000, 0xd8d80000,
|
||||
0x01000000, 0xbf890000,
|
||||
0xe0685000, 0x701d0100,
|
||||
0x807d037d, 0x80700370,
|
||||
0xd5250000, 0x0001ff00,
|
||||
0x00000080, 0xbf0a7b7d,
|
||||
0xbfa2fff4, 0xbfa00011,
|
||||
0xbe8300ff, 0x00000100,
|
||||
0xbf800000, 0xbf800000,
|
||||
0xbf800000, 0xd8d80000,
|
||||
0x01000000, 0xbf890000,
|
||||
0xe0685000, 0x701d0100,
|
||||
0x807d037d, 0x80700370,
|
||||
0xd5250000, 0x0001ff00,
|
||||
0x00000100, 0xbf0a7b7d,
|
||||
0xbfa2fff4, 0xbefe00c1,
|
||||
0x857d9973, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20004,
|
||||
0xbef000ff, 0x00000200,
|
||||
0xbeff0080, 0xbfa00003,
|
||||
0xbef000ff, 0x00000400,
|
||||
0xbeff00c1, 0xb8fb3b05,
|
||||
0x807b817b, 0x847b827b,
|
||||
0x857d9973, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20017,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbefd0084, 0xbf0a7b7d,
|
||||
0xbfa10037, 0x7e008700,
|
||||
0x7e028701, 0x7e048702,
|
||||
0x7e068703, 0xe0685000,
|
||||
0x701d0000, 0xe0685080,
|
||||
0x701d0100, 0xe0685100,
|
||||
0x701d0200, 0xe0685180,
|
||||
0x701d0300, 0x807d847d,
|
||||
0x8070ff70, 0x00000200,
|
||||
0xbf0a7b7d, 0xbfa2ffef,
|
||||
0xbfa00025, 0xbef600ff,
|
||||
0x01000000, 0xbefd0084,
|
||||
0xbf0a7b7d, 0xbfa10037,
|
||||
0xbf0a7b7d, 0xbfa10011,
|
||||
0x7e008700, 0x7e028701,
|
||||
0x7e048702, 0x7e068703,
|
||||
0xe0685000, 0x701d0000,
|
||||
0xe0685080, 0x701d0100,
|
||||
0xe0685100, 0x701d0200,
|
||||
0xe0685180, 0x701d0300,
|
||||
0xe0685100, 0x701d0100,
|
||||
0xe0685200, 0x701d0200,
|
||||
0xe0685300, 0x701d0300,
|
||||
0x807d847d, 0x8070ff70,
|
||||
0x00000200, 0xbf0a7b7d,
|
||||
0xbfa2ffef, 0xbfa00025,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbefd0084, 0xbf0a7b7d,
|
||||
0xbfa10011, 0x7e008700,
|
||||
0x7e028701, 0x7e048702,
|
||||
0x7e068703, 0xe0685000,
|
||||
0x701d0000, 0xe0685100,
|
||||
0x701d0100, 0xe0685200,
|
||||
0x701d0200, 0xe0685300,
|
||||
0x701d0300, 0x807d847d,
|
||||
0x8070ff70, 0x00000400,
|
||||
0xbf0a7b7d, 0xbfa2ffef,
|
||||
0xb8fb1e06, 0x8b7bc17b,
|
||||
0xbfa1000c, 0x847b837b,
|
||||
0x807b7d7b, 0xbefe00c1,
|
||||
0xbeff0080, 0x7e008700,
|
||||
0xe0685000, 0x701d0000,
|
||||
0x807d817d, 0x8070ff70,
|
||||
0x00000080, 0xbf0a7b7d,
|
||||
0xbfa2fff8, 0xbfa00146,
|
||||
0xbef4007e, 0x8b75ff7f,
|
||||
0x0000ffff, 0x8c75ff75,
|
||||
0x00040000, 0xbef60080,
|
||||
0xbef700ff, 0x10807fac,
|
||||
0xb8f202dc, 0x84729972,
|
||||
0x8b6eff7f, 0x04000000,
|
||||
0xbfa1003a, 0xbefe00c1,
|
||||
0x857d9972, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20002,
|
||||
0xbeff0080, 0xbfa00001,
|
||||
0xbeff00c1, 0xb8ef4306,
|
||||
0x8b6fc16f, 0xbfa1002f,
|
||||
0x846f866f, 0x846f826f,
|
||||
0xbef6006f, 0xb8f83b05,
|
||||
0x80788178, 0xbf0d9972,
|
||||
0xbfa20002, 0x84788978,
|
||||
0xbfa00001, 0x84788a78,
|
||||
0xb8ee1e06, 0x846e8a6e,
|
||||
0x80786e78, 0x8078ff78,
|
||||
0x00000200, 0x8078ff78,
|
||||
0x00000080, 0xbef600ff,
|
||||
0x01000000, 0x857d9972,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbefd0080, 0xbfa2000c,
|
||||
0xe0500000, 0x781d0000,
|
||||
0xbf8903f7, 0xdac00000,
|
||||
0x00000000, 0x807dff7d,
|
||||
0x00000080, 0x8078ff78,
|
||||
0x00000080, 0xbf0a6f7d,
|
||||
0xbfa2fff5, 0xbfa0000b,
|
||||
0xe0500000, 0x781d0000,
|
||||
0xbf8903f7, 0xdac00000,
|
||||
0x00000000, 0x807dff7d,
|
||||
0x00000100, 0x8078ff78,
|
||||
0x00000100, 0xbf0a6f7d,
|
||||
0xbfa2fff5, 0xbef80080,
|
||||
0x00000400, 0xbf0a7b7d,
|
||||
0xbfa2ffef, 0xb8fb1e06,
|
||||
0x8b7bc17b, 0xbfa1000c,
|
||||
0x847b837b, 0x807b7d7b,
|
||||
0xbefe00c1, 0xbeff0080,
|
||||
0x7e008700, 0xe0685000,
|
||||
0x701d0000, 0x807d817d,
|
||||
0x8070ff70, 0x00000080,
|
||||
0xbf0a7b7d, 0xbfa2fff8,
|
||||
0xbfa00146, 0xbef4007e,
|
||||
0x8b75ff7f, 0x0000ffff,
|
||||
0x8c75ff75, 0x00040000,
|
||||
0xbef60080, 0xbef700ff,
|
||||
0x10807fac, 0xb8f202dc,
|
||||
0x84729972, 0x8b6eff7f,
|
||||
0x04000000, 0xbfa1003a,
|
||||
0xbefe00c1, 0x857d9972,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbfa20002, 0xbeff0080,
|
||||
0xbfa00001, 0xbeff00c1,
|
||||
0xb8ef3b05, 0x806f816f,
|
||||
0x846f826f, 0x857d9972,
|
||||
0x8b7d817d, 0xbf06817d,
|
||||
0xbfa20024, 0xbef600ff,
|
||||
0x01000000, 0xbeee0078,
|
||||
0x8078ff78, 0x00000200,
|
||||
0xbefd0084, 0xbf0a6f7d,
|
||||
0xbfa10050, 0xe0505000,
|
||||
0x781d0000, 0xe0505080,
|
||||
0x781d0100, 0xe0505100,
|
||||
0x781d0200, 0xe0505180,
|
||||
0x781d0300, 0xbf8903f7,
|
||||
0x7e008500, 0x7e028501,
|
||||
0x7e048502, 0x7e068503,
|
||||
0x807d847d, 0x8078ff78,
|
||||
0x00000200, 0xbf0a6f7d,
|
||||
0xbfa2ffee, 0xe0505000,
|
||||
0x6e1d0000, 0xe0505080,
|
||||
0x6e1d0100, 0xe0505100,
|
||||
0x6e1d0200, 0xe0505180,
|
||||
0x6e1d0300, 0xbf8903f7,
|
||||
0xbfa00034, 0xbef600ff,
|
||||
0x01000000, 0xbeee0078,
|
||||
0x8078ff78, 0x00000400,
|
||||
0xbefd0084, 0xbf0a6f7d,
|
||||
0xbfa10012, 0xe0505000,
|
||||
0x781d0000, 0xe0505100,
|
||||
0x781d0100, 0xe0505200,
|
||||
0x781d0200, 0xe0505300,
|
||||
0x781d0300, 0xbf8903f7,
|
||||
0x7e008500, 0x7e028501,
|
||||
0x7e048502, 0x7e068503,
|
||||
0x807d847d, 0x8078ff78,
|
||||
0x00000400, 0xbf0a6f7d,
|
||||
0xbfa2ffee, 0xb8ef1e06,
|
||||
0x8b6fc16f, 0xbfa1000e,
|
||||
0x846f836f, 0x806f7d6f,
|
||||
0xbefe00c1, 0xbeff0080,
|
||||
0xe0505000, 0x781d0000,
|
||||
0xbf8903f7, 0x7e008500,
|
||||
0x807d817d, 0x8078ff78,
|
||||
0x00000080, 0xbf0a6f7d,
|
||||
0xbfa2fff7, 0xbeff00c1,
|
||||
0xe0505000, 0x6e1d0000,
|
||||
0xe0505100, 0x6e1d0100,
|
||||
0xe0505200, 0x6e1d0200,
|
||||
0xe0505300, 0x6e1d0300,
|
||||
0xbf8903f7, 0xb8f83b05,
|
||||
0x80788178, 0xbf0d9972,
|
||||
0xbfa20002, 0x84788978,
|
||||
0xbfa00001, 0x84788a78,
|
||||
0xb8ee1e06, 0x846e8a6e,
|
||||
0x80786e78, 0x8078ff78,
|
||||
0x00000200, 0x80f8ff78,
|
||||
0x00000050, 0xbef600ff,
|
||||
0x01000000, 0xbefd00ff,
|
||||
0x0000006c, 0x80f89078,
|
||||
0xf428403a, 0xf0000000,
|
||||
0xbf89fc07, 0x80fd847d,
|
||||
0xbf800000, 0xbe804300,
|
||||
0xbe824302, 0x80f8a078,
|
||||
0xf42c403a, 0xf0000000,
|
||||
0xbf89fc07, 0x80fd887d,
|
||||
0xbf800000, 0xbe804300,
|
||||
0xbe824302, 0xbe844304,
|
||||
0xbe864306, 0x80f8c078,
|
||||
0xf430403a, 0xf0000000,
|
||||
0xbf89fc07, 0x80fd907d,
|
||||
0xbf800000, 0xbe804300,
|
||||
0xbe824302, 0xbe844304,
|
||||
0xbe864306, 0xbe884308,
|
||||
0xbe8a430a, 0xbe8c430c,
|
||||
0xbe8e430e, 0xbf06807d,
|
||||
0xbfa1fff0, 0xb980f801,
|
||||
0x00000000, 0xbfbd0000,
|
||||
0xb8ef4306, 0x8b6fc16f,
|
||||
0xbfa1002f, 0x846f866f,
|
||||
0x846f826f, 0xbef6006f,
|
||||
0xb8f83b05, 0x80788178,
|
||||
0xbf0d9972, 0xbfa20002,
|
||||
0x84788978, 0xbfa00001,
|
||||
0x84788a78, 0xb8ee1e06,
|
||||
0x846e8a6e, 0x80786e78,
|
||||
0x8078ff78, 0x00000200,
|
||||
0x8078ff78, 0x00000080,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xf4205bfa, 0xf0000000,
|
||||
0x80788478, 0xf4205b3a,
|
||||
0x857d9972, 0x8b7d817d,
|
||||
0xbf06817d, 0xbefd0080,
|
||||
0xbfa2000c, 0xe0500000,
|
||||
0x781d0000, 0xbf8903f7,
|
||||
0xdac00000, 0x00000000,
|
||||
0x807dff7d, 0x00000080,
|
||||
0x8078ff78, 0x00000080,
|
||||
0xbf0a6f7d, 0xbfa2fff5,
|
||||
0xbfa0000b, 0xe0500000,
|
||||
0x781d0000, 0xbf8903f7,
|
||||
0xdac00000, 0x00000000,
|
||||
0x807dff7d, 0x00000100,
|
||||
0x8078ff78, 0x00000100,
|
||||
0xbf0a6f7d, 0xbfa2fff5,
|
||||
0xbef80080, 0xbefe00c1,
|
||||
0x857d9972, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20002,
|
||||
0xbeff0080, 0xbfa00001,
|
||||
0xbeff00c1, 0xb8ef3b05,
|
||||
0x806f816f, 0x846f826f,
|
||||
0x857d9972, 0x8b7d817d,
|
||||
0xbf06817d, 0xbfa20024,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbeee0078, 0x8078ff78,
|
||||
0x00000200, 0xbefd0084,
|
||||
0xbf0a6f7d, 0xbfa10050,
|
||||
0xe0505000, 0x781d0000,
|
||||
0xe0505080, 0x781d0100,
|
||||
0xe0505100, 0x781d0200,
|
||||
0xe0505180, 0x781d0300,
|
||||
0xbf8903f7, 0x7e008500,
|
||||
0x7e028501, 0x7e048502,
|
||||
0x7e068503, 0x807d847d,
|
||||
0x8078ff78, 0x00000200,
|
||||
0xbf0a6f7d, 0xbfa2ffee,
|
||||
0xe0505000, 0x6e1d0000,
|
||||
0xe0505080, 0x6e1d0100,
|
||||
0xe0505100, 0x6e1d0200,
|
||||
0xe0505180, 0x6e1d0300,
|
||||
0xbf8903f7, 0xbfa00034,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbeee0078, 0x8078ff78,
|
||||
0x00000400, 0xbefd0084,
|
||||
0xbf0a6f7d, 0xbfa10012,
|
||||
0xe0505000, 0x781d0000,
|
||||
0xe0505100, 0x781d0100,
|
||||
0xe0505200, 0x781d0200,
|
||||
0xe0505300, 0x781d0300,
|
||||
0xbf8903f7, 0x7e008500,
|
||||
0x7e028501, 0x7e048502,
|
||||
0x7e068503, 0x807d847d,
|
||||
0x8078ff78, 0x00000400,
|
||||
0xbf0a6f7d, 0xbfa2ffee,
|
||||
0xb8ef1e06, 0x8b6fc16f,
|
||||
0xbfa1000e, 0x846f836f,
|
||||
0x806f7d6f, 0xbefe00c1,
|
||||
0xbeff0080, 0xe0505000,
|
||||
0x781d0000, 0xbf8903f7,
|
||||
0x7e008500, 0x807d817d,
|
||||
0x8078ff78, 0x00000080,
|
||||
0xbf0a6f7d, 0xbfa2fff7,
|
||||
0xbeff00c1, 0xe0505000,
|
||||
0x6e1d0000, 0xe0505100,
|
||||
0x6e1d0100, 0xe0505200,
|
||||
0x6e1d0200, 0xe0505300,
|
||||
0x6e1d0300, 0xbf8903f7,
|
||||
0xb8f83b05, 0x80788178,
|
||||
0xbf0d9972, 0xbfa20002,
|
||||
0x84788978, 0xbfa00001,
|
||||
0x84788a78, 0xb8ee1e06,
|
||||
0x846e8a6e, 0x80786e78,
|
||||
0x8078ff78, 0x00000200,
|
||||
0x80f8ff78, 0x00000050,
|
||||
0xbef600ff, 0x01000000,
|
||||
0xbefd00ff, 0x0000006c,
|
||||
0x80f89078, 0xf428403a,
|
||||
0xf0000000, 0xbf89fc07,
|
||||
0x80fd847d, 0xbf800000,
|
||||
0xbe804300, 0xbe824302,
|
||||
0x80f8a078, 0xf42c403a,
|
||||
0xf0000000, 0xbf89fc07,
|
||||
0x80fd887d, 0xbf800000,
|
||||
0xbe804300, 0xbe824302,
|
||||
0xbe844304, 0xbe864306,
|
||||
0x80f8c078, 0xf430403a,
|
||||
0xf0000000, 0xbf89fc07,
|
||||
0x80fd907d, 0xbf800000,
|
||||
0xbe804300, 0xbe824302,
|
||||
0xbe844304, 0xbe864306,
|
||||
0xbe884308, 0xbe8a430a,
|
||||
0xbe8c430c, 0xbe8e430e,
|
||||
0xbf06807d, 0xbfa1fff0,
|
||||
0xb980f801, 0x00000000,
|
||||
0xbfbd0000, 0xb8f83b05,
|
||||
0x80788178, 0xbf0d9972,
|
||||
0xbfa20002, 0x84788978,
|
||||
0xbfa00001, 0x84788a78,
|
||||
0xb8ee1e06, 0x846e8a6e,
|
||||
0x80786e78, 0x8078ff78,
|
||||
0x00000200, 0xbef600ff,
|
||||
0x01000000, 0xf4205bfa,
|
||||
0xf0000000, 0x80788478,
|
||||
0xf4205b7a, 0xf0000000,
|
||||
0x80788478, 0xf4205c3a,
|
||||
0xf4205b3a, 0xf0000000,
|
||||
0x80788478, 0xf4205b7a,
|
||||
0xf0000000, 0x80788478,
|
||||
0xf4205c7a, 0xf0000000,
|
||||
0x80788478, 0xf4205eba,
|
||||
0xf4205c3a, 0xf0000000,
|
||||
0x80788478, 0xf4205c7a,
|
||||
0xf0000000, 0x80788478,
|
||||
0xf4205efa, 0xf0000000,
|
||||
0x80788478, 0xf4205e7a,
|
||||
0xf4205eba, 0xf0000000,
|
||||
0x80788478, 0xf4205efa,
|
||||
0xf0000000, 0x80788478,
|
||||
0xf4205cfa, 0xf0000000,
|
||||
0x80788478, 0xf4205bba,
|
||||
0xf4205e7a, 0xf0000000,
|
||||
0x80788478, 0xf4205cfa,
|
||||
0xf0000000, 0x80788478,
|
||||
0xbf89fc07, 0xb96ef814,
|
||||
0xf4205bba, 0xf0000000,
|
||||
0x80788478, 0xbf89fc07,
|
||||
0xb96ef815, 0xbefd006f,
|
||||
0xbefe0070, 0xbeff0071,
|
||||
0x8b6f7bff, 0x000003ff,
|
||||
0xb96f4803, 0x8b6f7bff,
|
||||
0xfffff800, 0x856f8b6f,
|
||||
0xb96fa2c3, 0xb973f801,
|
||||
0xb8ee3b05, 0x806e816e,
|
||||
0xbf0d9972, 0xbfa20002,
|
||||
0x846e896e, 0xbfa00001,
|
||||
0x846e8a6e, 0xb8ef1e06,
|
||||
0x846f8a6f, 0x806e6f6e,
|
||||
0x806eff6e, 0x00000200,
|
||||
0x806e746e, 0x826f8075,
|
||||
0x8b6fff6f, 0x0000ffff,
|
||||
0xf4085c37, 0xf8000050,
|
||||
0xf4085d37, 0xf8000060,
|
||||
0xf4005e77, 0xf8000074,
|
||||
0xbf89fc07, 0x8b6dff6d,
|
||||
0x0000ffff, 0x8bfe7e7e,
|
||||
0x8bea6a6a, 0xb8eef802,
|
||||
0xbf0d866e, 0xbfa20002,
|
||||
0xb97af802, 0xbe80486c,
|
||||
0xb97af802, 0xbe804a6c,
|
||||
0xbfb00000, 0xbf9f0000,
|
||||
0xb96ef814, 0xf4205bba,
|
||||
0xf0000000, 0x80788478,
|
||||
0xbf89fc07, 0xb96ef815,
|
||||
0xbefd006f, 0xbefe0070,
|
||||
0xbeff0071, 0x8b6f7bff,
|
||||
0x000003ff, 0xb96f4803,
|
||||
0x8b6f7bff, 0xfffff800,
|
||||
0x856f8b6f, 0xb96fa2c3,
|
||||
0xb973f801, 0xb8ee3b05,
|
||||
0x806e816e, 0xbf0d9972,
|
||||
0xbfa20002, 0x846e896e,
|
||||
0xbfa00001, 0x846e8a6e,
|
||||
0xb8ef1e06, 0x846f8a6f,
|
||||
0x806e6f6e, 0x806eff6e,
|
||||
0x00000200, 0x806e746e,
|
||||
0x826f8075, 0x8b6fff6f,
|
||||
0x0000ffff, 0xf4085c37,
|
||||
0xf8000050, 0xf4085d37,
|
||||
0xf8000060, 0xf4005e77,
|
||||
0xf8000074, 0xbf89fc07,
|
||||
0x8b6dff6d, 0x0000ffff,
|
||||
0x8bfe7e7e, 0x8bea6a6a,
|
||||
0xb8eef802, 0xbf0d866e,
|
||||
0xbfa20002, 0xb97af802,
|
||||
0xbe80486c, 0xb97af802,
|
||||
0xbe804a6c, 0xbfb00000,
|
||||
0xbf9f0000, 0xbf9f0000,
|
||||
0xbf9f0000, 0xbf9f0000,
|
||||
0xbf9f0000, 0x00000000,
|
||||
};
|
||||
|
@ -186,6 +186,12 @@ L_SKIP_RESTORE:
|
||||
s_getreg_b32 s_save_trapsts, hwreg(HW_REG_TRAPSTS)
|
||||
|
||||
#if SW_SA_TRAP
|
||||
// If ttmp1[30] is set then issue s_barrier to unblock dependent waves.
|
||||
s_bitcmp1_b32 s_save_pc_hi, 30
|
||||
s_cbranch_scc0 L_TRAP_NO_BARRIER
|
||||
s_barrier
|
||||
|
||||
L_TRAP_NO_BARRIER:
|
||||
// If ttmp1[31] is set then trap may occur early.
|
||||
// Spin wait until SAVECTX exception is raised.
|
||||
s_bitcmp1_b32 s_save_pc_hi, 31
|
||||
|
@ -973,12 +973,10 @@ out_unlock_prange:
|
||||
out_unlock_svms:
|
||||
mutex_unlock(&p->svms.lock);
|
||||
out_unref_process:
|
||||
pr_debug("CPU fault svms 0x%p address 0x%lx done\n", &p->svms, addr);
|
||||
kfd_unref_process(p);
|
||||
out_mmput:
|
||||
mmput(mm);
|
||||
|
||||
pr_debug("CPU fault svms 0x%p address 0x%lx done\n", &p->svms, addr);
|
||||
|
||||
return r ? VM_FAULT_SIGBUS : 0;
|
||||
}
|
||||
|
||||
|
@ -1549,6 +1549,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
|
||||
adev->dm.dc->debug.visual_confirm = amdgpu_dc_visual_confirm;
|
||||
|
||||
/* TODO: Remove after DP2 receiver gets proper support of Cable ID feature */
|
||||
adev->dm.dc->debug.ignore_cable_id = true;
|
||||
|
||||
r = dm_dmub_hw_init(adev);
|
||||
if (r) {
|
||||
DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
|
||||
|
@ -157,6 +157,7 @@ void dcn32_init_clocks(struct clk_mgr *clk_mgr_base)
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
unsigned int num_levels;
|
||||
struct clk_limit_num_entries *num_entries_per_clk = &clk_mgr_base->bw_params->clk_table.num_entries_per_clk;
|
||||
unsigned int i;
|
||||
|
||||
memset(&(clk_mgr_base->clks), 0, sizeof(struct dc_clocks));
|
||||
clk_mgr_base->clks.p_state_change_support = true;
|
||||
@ -205,18 +206,17 @@ void dcn32_init_clocks(struct clk_mgr *clk_mgr_base)
|
||||
clk_mgr->dpm_present = true;
|
||||
|
||||
if (clk_mgr_base->ctx->dc->debug.min_disp_clk_khz) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < num_levels; i++)
|
||||
if (clk_mgr_base->bw_params->clk_table.entries[i].dispclk_mhz
|
||||
< khz_to_mhz_ceil(clk_mgr_base->ctx->dc->debug.min_disp_clk_khz))
|
||||
clk_mgr_base->bw_params->clk_table.entries[i].dispclk_mhz
|
||||
= khz_to_mhz_ceil(clk_mgr_base->ctx->dc->debug.min_disp_clk_khz);
|
||||
}
|
||||
for (i = 0; i < num_levels; i++)
|
||||
if (clk_mgr_base->bw_params->clk_table.entries[i].dispclk_mhz > 1950)
|
||||
clk_mgr_base->bw_params->clk_table.entries[i].dispclk_mhz = 1950;
|
||||
|
||||
if (clk_mgr_base->ctx->dc->debug.min_dpp_clk_khz) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < num_levels; i++)
|
||||
if (clk_mgr_base->bw_params->clk_table.entries[i].dppclk_mhz
|
||||
< khz_to_mhz_ceil(clk_mgr_base->ctx->dc->debug.min_dpp_clk_khz))
|
||||
@ -669,6 +669,9 @@ static void dcn32_get_memclk_states_from_smu(struct clk_mgr *clk_mgr_base)
|
||||
&clk_mgr_base->bw_params->clk_table.entries[0].memclk_mhz,
|
||||
&num_entries_per_clk->num_memclk_levels);
|
||||
|
||||
/* memclk must have at least one level */
|
||||
num_entries_per_clk->num_memclk_levels = num_entries_per_clk->num_memclk_levels ? num_entries_per_clk->num_memclk_levels : 1;
|
||||
|
||||
dcn32_init_single_clock(clk_mgr, PPCLK_FCLK,
|
||||
&clk_mgr_base->bw_params->clk_table.entries[0].fclk_mhz,
|
||||
&num_entries_per_clk->num_fclk_levels);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user