diff options
author | Mike Pagano <mpagano@gentoo.org> | 2020-09-03 07:48:16 -0400 |
---|---|---|
committer | Mike Pagano <mpagano@gentoo.org> | 2020-09-03 07:48:16 -0400 |
commit | d74b195b5da2b0ed808dfa000ab302de53abfcbc (patch) | |
tree | 5a7a243a114525c429b8caf5593f2bbbce4ce4ff | |
parent | Linux patch 5.8.5 (diff) | |
download | linux-patches-5.8-8.tar.gz linux-patches-5.8-8.tar.bz2 linux-patches-5.8-8.zip |
Linux patch 5.7.65.8-8
Signed-off-by: Mike Pagano <mpagano@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1005_linux-5.7.6.patch | 20870 |
2 files changed, 20874 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 4ed3bb45..ba2f3898 100644 --- a/0000_README +++ b/0000_README @@ -63,6 +63,10 @@ Patch: 1004_linux-5.8.5.patch From: http://www.kernel.org Desc: Linux 5.8.5 +Patch: 1005_linux-5.8.6.patch +From: http://www.kernel.org +Desc: Linux 5.8.6 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1005_linux-5.7.6.patch b/1005_linux-5.7.6.patch new file mode 100644 index 00000000..9939e08b --- /dev/null +++ b/1005_linux-5.7.6.patch @@ -0,0 +1,20870 @@ +diff --git a/Makefile b/Makefile +index c48d489f82bc..f928cd1dfdc1 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 7 +-SUBLEVEL = 5 ++SUBLEVEL = 6 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts b/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts +index 5d7cbd9164d4..669980c690f9 100644 +--- a/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts ++++ b/arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts +@@ -112,13 +112,13 @@ + &kcs2 { + // BMC KCS channel 2 + status = "okay"; +- kcs_addr = <0xca8>; ++ aspeed,lpc-io-reg = <0xca8>; + }; + + &kcs3 { + // BMC KCS channel 3 + status = "okay"; +- kcs_addr = <0xca2>; ++ aspeed,lpc-io-reg = <0xca2>; + }; + + &mac0 { +diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi +index f12ec04d3cbc..bc92d3db7b78 100644 +--- a/arch/arm/boot/dts/aspeed-g5.dtsi ++++ b/arch/arm/boot/dts/aspeed-g5.dtsi +@@ -426,22 +426,22 @@ + #size-cells = <1>; + ranges = <0x0 0x0 0x80>; + +- kcs1: kcs1@0 { +- compatible = "aspeed,ast2500-kcs-bmc"; ++ kcs1: kcs@24 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x24 0x1>, <0x30 0x1>, <0x3c 0x1>; + interrupts = <8>; +- kcs_chan = <1>; + status = "disabled"; + }; +- kcs2: kcs2@0 { +- compatible = "aspeed,ast2500-kcs-bmc"; ++ kcs2: kcs@28 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x28 0x1>, <0x34 0x1>, <0x40 0x1>; + interrupts = <8>; +- kcs_chan = <2>; + status = "disabled"; + }; +- kcs3: kcs3@0 { +- compatible = "aspeed,ast2500-kcs-bmc"; ++ kcs3: kcs@2c { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x2c 0x1>, <0x38 0x1>, <0x44 0x1>; + interrupts = <8>; +- kcs_chan = <3>; + status = "disabled"; + }; + }; +@@ -455,10 +455,10 @@ + #size-cells = <1>; + ranges = <0x0 0x80 0x1e0>; + +- kcs4: kcs4@0 { +- compatible = "aspeed,ast2500-kcs-bmc"; ++ kcs4: kcs@94 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x94 0x1>, <0x98 0x1>, <0x9c 0x1>; + interrupts = <8>; +- kcs_chan = <4>; + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi +index 0a29b3b57a9d..a2d2ac720a51 100644 +--- a/arch/arm/boot/dts/aspeed-g6.dtsi ++++ b/arch/arm/boot/dts/aspeed-g6.dtsi +@@ -65,6 +65,7 @@ + <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>; + clocks = <&syscon ASPEED_CLK_HPLL>; + arm,cpu-registers-not-fw-configured; ++ always-on; + }; + + ahb { +@@ -368,6 +369,7 @@ + <&gic GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&syscon ASPEED_CLK_APB1>; + clock-names = "PCLK"; ++ status = "disabled"; + }; + + uart1: serial@1e783000 { +@@ -433,22 +435,23 @@ + #size-cells = <1>; + ranges = <0x0 0x0 0x80>; + +- kcs1: kcs1@0 { +- compatible = "aspeed,ast2600-kcs-bmc"; ++ kcs1: kcs@24 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x24 0x1>, <0x30 0x1>, <0x3c 0x1>; + interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>; + kcs_chan = <1>; + status = "disabled"; + }; +- kcs2: kcs2@0 { +- compatible = "aspeed,ast2600-kcs-bmc"; ++ kcs2: kcs@28 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x28 0x1>, <0x34 0x1>, <0x40 0x1>; + interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; +- kcs_chan = <2>; + status = "disabled"; + }; +- kcs3: kcs3@0 { +- compatible = "aspeed,ast2600-kcs-bmc"; ++ kcs3: kcs@2c { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x2c 0x1>, <0x38 0x1>, <0x44 0x1>; + interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; +- kcs_chan = <3>; + status = "disabled"; + }; + }; +@@ -462,10 +465,10 @@ + #size-cells = <1>; + ranges = <0x0 0x80 0x1e0>; + +- kcs4: kcs4@0 { +- compatible = "aspeed,ast2600-kcs-bmc"; ++ kcs4: kcs@94 { ++ compatible = "aspeed,ast2500-kcs-bmc-v2"; ++ reg = <0x94 0x1>, <0x98 0x1>, <0x9c 0x1>; + interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>; +- kcs_chan = <4>; + status = "disabled"; + }; + +diff --git a/arch/arm/boot/dts/bcm2835-common.dtsi b/arch/arm/boot/dts/bcm2835-common.dtsi +index 2b1d9d4c0cde..4119271c979d 100644 +--- a/arch/arm/boot/dts/bcm2835-common.dtsi ++++ b/arch/arm/boot/dts/bcm2835-common.dtsi +@@ -130,7 +130,6 @@ + compatible = "brcm,bcm2835-v3d"; + reg = <0x7ec00000 0x1000>; + interrupts = <1 10>; +- power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>; + }; + + vc4: gpu { +diff --git a/arch/arm/boot/dts/bcm2835-rpi-common.dtsi b/arch/arm/boot/dts/bcm2835-rpi-common.dtsi +new file mode 100644 +index 000000000000..8a55b6cded59 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2835-rpi-common.dtsi +@@ -0,0 +1,12 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * This include file covers the common peripherals and configuration between ++ * bcm2835, bcm2836 and bcm2837 implementations that interact with RPi's ++ * firmware interface. ++ */ ++ ++#include <dt-bindings/power/raspberrypi-power.h> ++ ++&v3d { ++ power-domains = <&power RPI_POWER_DOMAIN_V3D>; ++}; +diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi +index 53bf4579cc22..0549686134ea 100644 +--- a/arch/arm/boot/dts/bcm2835.dtsi ++++ b/arch/arm/boot/dts/bcm2835.dtsi +@@ -1,6 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 + #include "bcm283x.dtsi" + #include "bcm2835-common.dtsi" ++#include "bcm2835-rpi-common.dtsi" + + / { + compatible = "brcm,bcm2835"; +diff --git a/arch/arm/boot/dts/bcm2836.dtsi b/arch/arm/boot/dts/bcm2836.dtsi +index 82d6c4662ae4..b390006aef79 100644 +--- a/arch/arm/boot/dts/bcm2836.dtsi ++++ b/arch/arm/boot/dts/bcm2836.dtsi +@@ -1,6 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 + #include "bcm283x.dtsi" + #include "bcm2835-common.dtsi" ++#include "bcm2835-rpi-common.dtsi" + + / { + compatible = "brcm,bcm2836"; +diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi +index 9e95fee78e19..0199ec98cd61 100644 +--- a/arch/arm/boot/dts/bcm2837.dtsi ++++ b/arch/arm/boot/dts/bcm2837.dtsi +@@ -1,5 +1,6 @@ + #include "bcm283x.dtsi" + #include "bcm2835-common.dtsi" ++#include "bcm2835-rpi-common.dtsi" + + / { + compatible = "brcm,bcm2837"; +diff --git a/arch/arm/boot/dts/r8a7743.dtsi b/arch/arm/boot/dts/r8a7743.dtsi +index e8b340bb99bc..fff123753b85 100644 +--- a/arch/arm/boot/dts/r8a7743.dtsi ++++ b/arch/arm/boot/dts/r8a7743.dtsi +@@ -338,7 +338,7 @@ + #thermal-sensor-cells = <0>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -348,7 +348,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -357,7 +357,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -367,7 +367,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -376,7 +376,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -386,7 +386,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7743", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7744.dtsi b/arch/arm/boot/dts/r8a7744.dtsi +index def840b8b2d3..5050ac19041d 100644 +--- a/arch/arm/boot/dts/r8a7744.dtsi ++++ b/arch/arm/boot/dts/r8a7744.dtsi +@@ -338,7 +338,7 @@ + #thermal-sensor-cells = <0>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -348,7 +348,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -357,7 +357,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -367,7 +367,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -376,7 +376,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -386,7 +386,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7744", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7745.dtsi b/arch/arm/boot/dts/r8a7745.dtsi +index 7ab58d8bb740..b0d1fc24e97e 100644 +--- a/arch/arm/boot/dts/r8a7745.dtsi ++++ b/arch/arm/boot/dts/r8a7745.dtsi +@@ -302,7 +302,7 @@ + resets = <&cpg 407>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -312,7 +312,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -321,7 +321,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -331,7 +331,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -340,7 +340,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -350,7 +350,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7745", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi +index e5ef9fd4284a..166d5566229d 100644 +--- a/arch/arm/boot/dts/r8a7790.dtsi ++++ b/arch/arm/boot/dts/r8a7790.dtsi +@@ -427,7 +427,7 @@ + #thermal-sensor-cells = <0>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -437,7 +437,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -446,7 +446,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -456,7 +456,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -465,7 +465,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -475,7 +475,7 @@ + status = "disabled"; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a7790", + "renesas,ipmmu-vmsa"; + reg = <0 0xffc80000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi +index 6e5bd86731cd..09e47cc17765 100644 +--- a/arch/arm/boot/dts/r8a7791.dtsi ++++ b/arch/arm/boot/dts/r8a7791.dtsi +@@ -350,7 +350,7 @@ + #thermal-sensor-cells = <0>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -360,7 +360,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -369,7 +369,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -379,7 +379,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -388,7 +388,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -398,7 +398,7 @@ + status = "disabled"; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xffc80000 0 0x1000>; +@@ -407,7 +407,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7791", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7793.dtsi b/arch/arm/boot/dts/r8a7793.dtsi +index dadbda16161b..1b62a7e06b42 100644 +--- a/arch/arm/boot/dts/r8a7793.dtsi ++++ b/arch/arm/boot/dts/r8a7793.dtsi +@@ -336,7 +336,7 @@ + #thermal-sensor-cells = <0>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -346,7 +346,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -355,7 +355,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -365,7 +365,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -374,7 +374,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -384,7 +384,7 @@ + status = "disabled"; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xffc80000 0 0x1000>; +@@ -393,7 +393,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7793", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/r8a7794.dtsi b/arch/arm/boot/dts/r8a7794.dtsi +index 2c9e7a1ebfec..8d7f8798628a 100644 +--- a/arch/arm/boot/dts/r8a7794.dtsi ++++ b/arch/arm/boot/dts/r8a7794.dtsi +@@ -290,7 +290,7 @@ + resets = <&cpg 407>; + }; + +- ipmmu_sy0: mmu@e6280000 { ++ ipmmu_sy0: iommu@e6280000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6280000 0 0x1000>; +@@ -300,7 +300,7 @@ + status = "disabled"; + }; + +- ipmmu_sy1: mmu@e6290000 { ++ ipmmu_sy1: iommu@e6290000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6290000 0 0x1000>; +@@ -309,7 +309,7 @@ + status = "disabled"; + }; + +- ipmmu_ds: mmu@e6740000 { ++ ipmmu_ds: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xe6740000 0 0x1000>; +@@ -319,7 +319,7 @@ + status = "disabled"; + }; + +- ipmmu_mp: mmu@ec680000 { ++ ipmmu_mp: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xec680000 0 0x1000>; +@@ -328,7 +328,7 @@ + status = "disabled"; + }; + +- ipmmu_mx: mmu@fe951000 { ++ ipmmu_mx: iommu@fe951000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xfe951000 0 0x1000>; +@@ -338,7 +338,7 @@ + status = "disabled"; + }; + +- ipmmu_gp: mmu@e62a0000 { ++ ipmmu_gp: iommu@e62a0000 { + compatible = "renesas,ipmmu-r8a7794", + "renesas,ipmmu-vmsa"; + reg = <0 0xe62a0000 0 0x1000>; +diff --git a/arch/arm/boot/dts/stm32mp157a-avenger96.dts b/arch/arm/boot/dts/stm32mp157a-avenger96.dts +index 425175f7d83c..081037b510bc 100644 +--- a/arch/arm/boot/dts/stm32mp157a-avenger96.dts ++++ b/arch/arm/boot/dts/stm32mp157a-avenger96.dts +@@ -92,6 +92,9 @@ + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,dwmac-mdio"; ++ reset-gpios = <&gpioz 2 GPIO_ACTIVE_LOW>; ++ reset-delay-us = <1000>; ++ + phy0: ethernet-phy@7 { + reg = <7>; + }; +diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +index d277d043031b..4c6704e4c57e 100644 +--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts ++++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts +@@ -31,7 +31,7 @@ + + pwr_led { + label = "bananapi-m2-zero:red:pwr"; +- gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ ++ gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */ + default-state = "on"; + }; + }; +diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi +index 5c183483ec3b..8010cdcdb37a 100644 +--- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi ++++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi +@@ -31,7 +31,7 @@ + #interrupt-cells = <1>; + ranges; + +- nor_flash: flash@0,00000000 { ++ nor_flash: flash@0 { + compatible = "arm,vexpress-flash", "cfi-flash"; + reg = <0 0x00000000 0x04000000>, + <4 0x00000000 0x04000000>; +@@ -41,13 +41,13 @@ + }; + }; + +- psram@1,00000000 { ++ psram@100000000 { + compatible = "arm,vexpress-psram", "mtd-ram"; + reg = <1 0x00000000 0x02000000>; + bank-width = <4>; + }; + +- ethernet@2,02000000 { ++ ethernet@202000000 { + compatible = "smsc,lan9118", "smsc,lan9115"; + reg = <2 0x02000000 0x10000>; + interrupts = <15>; +@@ -59,14 +59,14 @@ + vddvario-supply = <&v2m_fixed_3v3>; + }; + +- usb@2,03000000 { ++ usb@203000000 { + compatible = "nxp,usb-isp1761"; + reg = <2 0x03000000 0x20000>; + interrupts = <16>; + port1-otg; + }; + +- iofpga@3,00000000 { ++ iofpga@300000000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c +index 3461d12bbfc0..a5d3708fedf6 100644 +--- a/arch/arm/mach-davinci/board-dm644x-evm.c ++++ b/arch/arm/mach-davinci/board-dm644x-evm.c +@@ -655,19 +655,6 @@ static struct i2c_board_info __initdata i2c_info[] = { + }, + }; + +-/* Fixed regulator support */ +-static struct regulator_consumer_supply fixed_supplies_3_3v[] = { +- /* Baseboard 3.3V: 5V -> TPS54310PWP -> 3.3V */ +- REGULATOR_SUPPLY("AVDD", "1-001b"), +- REGULATOR_SUPPLY("DRVDD", "1-001b"), +-}; +- +-static struct regulator_consumer_supply fixed_supplies_1_8v[] = { +- /* Baseboard 1.8V: 5V -> TPS54310PWP -> 1.8V */ +- REGULATOR_SUPPLY("IOVDD", "1-001b"), +- REGULATOR_SUPPLY("DVDD", "1-001b"), +-}; +- + #define DM644X_I2C_SDA_PIN GPIO_TO_PIN(2, 12) + #define DM644X_I2C_SCL_PIN GPIO_TO_PIN(2, 11) + +@@ -700,6 +687,19 @@ static void __init evm_init_i2c(void) + } + #endif + ++/* Fixed regulator support */ ++static struct regulator_consumer_supply fixed_supplies_3_3v[] = { ++ /* Baseboard 3.3V: 5V -> TPS54310PWP -> 3.3V */ ++ REGULATOR_SUPPLY("AVDD", "1-001b"), ++ REGULATOR_SUPPLY("DRVDD", "1-001b"), ++}; ++ ++static struct regulator_consumer_supply fixed_supplies_1_8v[] = { ++ /* Baseboard 1.8V: 5V -> TPS54310PWP -> 1.8V */ ++ REGULATOR_SUPPLY("IOVDD", "1-001b"), ++ REGULATOR_SUPPLY("DVDD", "1-001b"), ++}; ++ + #define VENC_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) + + /* venc standard timings */ +diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig +index 982eabc36163..2406cab73835 100644 +--- a/arch/arm/mach-integrator/Kconfig ++++ b/arch/arm/mach-integrator/Kconfig +@@ -4,6 +4,8 @@ menuconfig ARCH_INTEGRATOR + depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 + select ARM_AMBA + select COMMON_CLK_VERSATILE ++ select CMA ++ select DMA_CMA + select HAVE_TCM + select ICST + select MFD_SYSCON +@@ -35,14 +37,13 @@ config INTEGRATOR_IMPD1 + select ARM_VIC + select GPIO_PL061 + select GPIOLIB ++ select REGULATOR ++ select REGULATOR_FIXED_VOLTAGE + help + The IM-PD1 is an add-on logic module for the Integrator which + allows ARM(R) Ltd PrimeCells to be developed and evaluated. + The IM-PD1 can be found on the Integrator/PP2 platform. + +- To compile this driver as a module, choose M here: the +- module will be called impd1. +- + config INTEGRATOR_CM7TDMI + bool "Integrator/CM7TDMI core module" + depends on ARCH_INTEGRATOR_AP +diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms +index 55d70cfe0f9e..3c7e310fd8bf 100644 +--- a/arch/arm64/Kconfig.platforms ++++ b/arch/arm64/Kconfig.platforms +@@ -248,7 +248,7 @@ config ARCH_TEGRA + This enables support for the NVIDIA Tegra SoC family. + + config ARCH_SPRD +- tristate "Spreadtrum SoC platform" ++ bool "Spreadtrum SoC platform" + help + Support for Spreadtrum ARM based SoCs + +diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi +index aace3d32a3df..8e6281c685fa 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi +@@ -1735,18 +1735,18 @@ + }; + + sram: sram@fffc0000 { +- compatible = "amlogic,meson-axg-sram", "mmio-sram"; ++ compatible = "mmio-sram"; + reg = <0x0 0xfffc0000 0x0 0x20000>; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x0 0xfffc0000 0x20000>; + +- cpu_scp_lpri: scp-shmem@13000 { ++ cpu_scp_lpri: scp-sram@13000 { + compatible = "amlogic,meson-axg-scp-shmem"; + reg = <0x13000 0x400>; + }; + +- cpu_scp_hpri: scp-shmem@13400 { ++ cpu_scp_hpri: scp-sram@13400 { + compatible = "amlogic,meson-axg-scp-shmem"; + reg = <0x13400 0x400>; + }; +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts +index 06c5430eb92d..fdaacfd96b97 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts +@@ -14,7 +14,7 @@ + #include <dt-bindings/sound/meson-g12a-tohdmitx.h> + + / { +- compatible = "ugoos,am6", "amlogic,g12b"; ++ compatible = "ugoos,am6", "amlogic,s922x", "amlogic,g12b"; + model = "Ugoos AM6"; + + aliases { +diff --git a/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi +index 248b018c83d5..b1da36fdeac6 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi +@@ -96,14 +96,14 @@ + leds { + compatible = "gpio-leds"; + +- green { ++ led-green { + color = <LED_COLOR_ID_GREEN>; + function = LED_FUNCTION_DISK_ACTIVITY; + gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "disk-activity"; + }; + +- blue { ++ led-blue { + color = <LED_COLOR_ID_BLUE>; + function = LED_FUNCTION_STATUS; + gpios = <&gpio GPIODV_28 GPIO_ACTIVE_HIGH>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +index 03f79fe045b7..e2bb68ec8502 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi +@@ -398,20 +398,20 @@ + }; + + sram: sram@c8000000 { +- compatible = "amlogic,meson-gx-sram", "amlogic,meson-gxbb-sram", "mmio-sram"; ++ compatible = "mmio-sram"; + reg = <0x0 0xc8000000 0x0 0x14000>; + + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0x0 0xc8000000 0x14000>; + +- cpu_scp_lpri: scp-shmem@0 { +- compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem"; ++ cpu_scp_lpri: scp-sram@0 { ++ compatible = "amlogic,meson-gxbb-scp-shmem"; + reg = <0x13000 0x400>; + }; + +- cpu_scp_hpri: scp-shmem@200 { +- compatible = "amlogic,meson-gx-scp-shmem", "amlogic,meson-gxbb-scp-shmem"; ++ cpu_scp_hpri: scp-sram@200 { ++ compatible = "amlogic,meson-gxbb-scp-shmem"; + reg = <0x13400 0x400>; + }; + }; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +index 6c9cc45fb417..e8394a8269ee 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +@@ -11,7 +11,7 @@ + #include <dt-bindings/input/input.h> + #include <dt-bindings/leds/common.h> + / { +- compatible = "videostrong,kii-pro", "amlogic,p201", "amlogic,s905", "amlogic,meson-gxbb"; ++ compatible = "videostrong,kii-pro", "amlogic,meson-gxbb"; + model = "Videostrong KII Pro"; + + leds { +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts +index d6ca684e0e61..7be3e354093b 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts +@@ -29,7 +29,7 @@ + leds { + compatible = "gpio-leds"; + +- stat { ++ led-stat { + label = "nanopi-k2:blue:stat"; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts +index 65ec7dea828c..67d901ed2fa3 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts +@@ -31,7 +31,7 @@ + + leds { + compatible = "gpio-leds"; +- blue { ++ led-blue { + label = "a95x:system-status"; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts +index b46ef985bb44..70fcfb7b0683 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts +@@ -49,7 +49,7 @@ + + leds { + compatible = "gpio-leds"; +- blue { ++ led-blue { + label = "c2:blue:alive"; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi +index 45cb83625951..222ee8069cfa 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi +@@ -20,7 +20,7 @@ + leds { + compatible = "gpio-leds"; + +- blue { ++ led-blue { + label = "vega-s95:blue:on"; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts +index 1d32d1f6d032..2ab8a3d10079 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts +@@ -14,13 +14,13 @@ + model = "WeTek Play 2"; + + leds { +- wifi { ++ led-wifi { + label = "wetek-play:wifi-status"; + gpios = <&gpio GPIODV_26 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + +- ethernet { ++ led-ethernet { + label = "wetek-play:ethernet-status"; + gpios = <&gpio GPIODV_27 GPIO_ACTIVE_HIGH>; + default-state = "off"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi +index dee51cf95223..d6133af09d64 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi +@@ -25,7 +25,7 @@ + leds { + compatible = "gpio-leds"; + +- system { ++ led-system { + label = "wetek-play:system-status"; + gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>; + default-state = "on"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts +index e8348b2728db..a4a71c13891b 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts +@@ -54,14 +54,14 @@ + leds { + compatible = "gpio-leds"; + +- system { ++ led-system { + label = "librecomputer:system-status"; + gpios = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>; + default-state = "on"; + panic-indicator; + }; + +- blue { ++ led-blue { + label = "librecomputer:blue"; + gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "heartbeat"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts +index 420a88e9a195..c89c9f846fb1 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts +@@ -36,13 +36,13 @@ + leds { + compatible = "gpio-leds"; + +- blue { ++ led-blue { + label = "rbox-pro:blue:on"; + gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + +- red { ++ led-red { + label = "rbox-pro:red:standby"; + gpios = <&gpio GPIODV_28 GPIO_ACTIVE_HIGH>; + default-state = "off"; +diff --git a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi +index 094ecf2222bb..1ef1e3672b96 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi +@@ -39,13 +39,13 @@ + leds { + compatible = "gpio-leds"; + +- white { ++ led-white { + label = "vim3:white:sys"; + gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + }; + +- red { ++ led-red { + label = "vim3:red"; + gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; + }; +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +index dfb2438851c0..5ab139a34c01 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +@@ -104,7 +104,7 @@ + leds { + compatible = "gpio-leds"; + +- bluetooth { ++ led-bluetooth { + label = "sei610:blue:bt"; + gpios = <&gpio GPIOC_7 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; + default-state = "off"; +diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi +index 15fe81738e94..dfb23dfc0b0f 100644 +--- a/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi ++++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi +@@ -8,7 +8,7 @@ + gic: interrupt-controller@2c001000 { + compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; + #interrupt-cells = <3>; +- #address-cells = <2>; ++ #address-cells = <1>; + interrupt-controller; + reg = <0x0 0x2c001000 0 0x1000>, + <0x0 0x2c002000 0 0x2000>, +diff --git a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi +index f2c75c756039..906f51935b36 100644 +--- a/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi ++++ b/arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi +@@ -8,9 +8,9 @@ + gic: interrupt-controller@2f000000 { + compatible = "arm,gic-v3"; + #interrupt-cells = <3>; +- #address-cells = <2>; +- #size-cells = <2>; +- ranges; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges = <0x0 0x0 0x2f000000 0x100000>; + interrupt-controller; + reg = <0x0 0x2f000000 0x0 0x10000>, + <0x0 0x2f100000 0x0 0x200000>, +@@ -22,7 +22,7 @@ + its: its@2f020000 { + compatible = "arm,gic-v3-its"; + msi-controller; +- reg = <0x0 0x2f020000 0x0 0x20000>; ++ reg = <0x20000 0x20000>; + }; + }; + }; +diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi +index 12f039fa3dad..e2da63f78298 100644 +--- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi ++++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi +@@ -107,51 +107,51 @@ + + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 63>; +- interrupt-map = <0 0 0 &gic 0 0 GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 1 &gic 0 0 GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 2 &gic 0 0 GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 3 &gic 0 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 4 &gic 0 0 GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 5 &gic 0 0 GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 6 &gic 0 0 GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 7 &gic 0 0 GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 8 &gic 0 0 GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 9 &gic 0 0 GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 10 &gic 0 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 11 &gic 0 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 12 &gic 0 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 13 &gic 0 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 14 &gic 0 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 15 &gic 0 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 16 &gic 0 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 17 &gic 0 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 18 &gic 0 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 19 &gic 0 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 20 &gic 0 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 21 &gic 0 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 22 &gic 0 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 23 &gic 0 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 24 &gic 0 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 25 &gic 0 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 26 &gic 0 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 27 &gic 0 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 28 &gic 0 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 29 &gic 0 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 30 &gic 0 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 31 &gic 0 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 32 &gic 0 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 33 &gic 0 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 34 &gic 0 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 35 &gic 0 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 36 &gic 0 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 37 &gic 0 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 38 &gic 0 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 39 &gic 0 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 40 &gic 0 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 41 &gic 0 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 42 &gic 0 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>; +- +- ethernet@2,02000000 { ++ interrupt-map = <0 0 0 &gic 0 GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 1 &gic 0 GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 2 &gic 0 GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 3 &gic 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 4 &gic 0 GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 5 &gic 0 GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 6 &gic 0 GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 7 &gic 0 GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 8 &gic 0 GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 9 &gic 0 GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 10 &gic 0 GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 11 &gic 0 GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 12 &gic 0 GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 13 &gic 0 GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 14 &gic 0 GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 15 &gic 0 GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 16 &gic 0 GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 17 &gic 0 GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 18 &gic 0 GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 19 &gic 0 GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 20 &gic 0 GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 21 &gic 0 GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 22 &gic 0 GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 23 &gic 0 GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 24 &gic 0 GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 25 &gic 0 GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 26 &gic 0 GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 27 &gic 0 GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 28 &gic 0 GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 29 &gic 0 GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 30 &gic 0 GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 31 &gic 0 GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 32 &gic 0 GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 33 &gic 0 GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 34 &gic 0 GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 35 &gic 0 GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 36 &gic 0 GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 37 &gic 0 GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 38 &gic 0 GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 39 &gic 0 GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 40 &gic 0 GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 41 &gic 0 GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 42 &gic 0 GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>; ++ ++ ethernet@202000000 { + compatible = "smsc,lan91c111"; + reg = <2 0x02000000 0x10000>; + interrupts = <15>; +@@ -178,7 +178,7 @@ + clock-output-names = "v2m:refclk32khz"; + }; + +- iofpga@3,00000000 { ++ iofpga@300000000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi +index f5889281545f..59b6ac0b828a 100644 +--- a/arch/arm64/boot/dts/arm/juno-base.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-base.dtsi +@@ -74,35 +74,35 @@ + <0x0 0x2c02f000 0 0x2000>, + <0x0 0x2c04f000 0 0x2000>, + <0x0 0x2c06f000 0 0x2000>; +- #address-cells = <2>; ++ #address-cells = <1>; + #interrupt-cells = <3>; +- #size-cells = <2>; ++ #size-cells = <1>; + interrupt-controller; + interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_HIGH)>; +- ranges = <0 0 0 0x2c1c0000 0 0x40000>; ++ ranges = <0 0 0x2c1c0000 0x40000>; + + v2m_0: v2m@0 { + compatible = "arm,gic-v2m-frame"; + msi-controller; +- reg = <0 0 0 0x10000>; ++ reg = <0 0x10000>; + }; + + v2m@10000 { + compatible = "arm,gic-v2m-frame"; + msi-controller; +- reg = <0 0x10000 0 0x10000>; ++ reg = <0x10000 0x10000>; + }; + + v2m@20000 { + compatible = "arm,gic-v2m-frame"; + msi-controller; +- reg = <0 0x20000 0 0x10000>; ++ reg = <0x20000 0x10000>; + }; + + v2m@30000 { + compatible = "arm,gic-v2m-frame"; + msi-controller; +- reg = <0 0x30000 0 0x10000>; ++ reg = <0x30000 0x10000>; + }; + }; + +@@ -546,10 +546,10 @@ + <0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; +- interrupt-map = <0 0 0 1 &gic 0 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 0 2 &gic 0 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 0 3 &gic 0 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 0 4 &gic 0 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-map = <0 0 0 1 &gic 0 GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 0 2 &gic 0 GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 0 3 &gic 0 GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 0 4 &gic 0 GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; + msi-parent = <&v2m_0>; + status = "disabled"; + iommu-map-mask = <0x0>; /* RC has no means to output PCI RID */ +@@ -813,19 +813,19 @@ + + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 15>; +- interrupt-map = <0 0 0 &gic 0 0 GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 1 &gic 0 0 GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 2 &gic 0 0 GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 3 &gic 0 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 4 &gic 0 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 5 &gic 0 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 6 &gic 0 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 7 &gic 0 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 8 &gic 0 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 9 &gic 0 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 10 &gic 0 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 11 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, +- <0 0 12 &gic 0 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-map = <0 0 0 &gic 0 GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 1 &gic 0 GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 2 &gic 0 GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 3 &gic 0 GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 4 &gic 0 GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 5 &gic 0 GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 6 &gic 0 GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 7 &gic 0 GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 8 &gic 0 GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 9 &gic 0 GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 10 &gic 0 GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 11 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, ++ <0 0 12 &gic 0 GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>; + }; + + site2: tlx@60000000 { +@@ -835,6 +835,6 @@ + ranges = <0 0 0x60000000 0x10000000>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0>; +- interrupt-map = <0 0 &gic 0 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-map = <0 0 &gic 0 GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; + }; + }; +diff --git a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi +index e3983ded3c3c..d5cefddde08c 100644 +--- a/arch/arm64/boot/dts/arm/juno-motherboard.dtsi ++++ b/arch/arm64/boot/dts/arm/juno-motherboard.dtsi +@@ -103,7 +103,7 @@ + }; + }; + +- flash@0,00000000 { ++ flash@0 { + /* 2 * 32MiB NOR Flash memory mounted on CS0 */ + compatible = "arm,vexpress-flash", "cfi-flash"; + reg = <0 0x00000000 0x04000000>; +@@ -120,7 +120,7 @@ + }; + }; + +- ethernet@2,00000000 { ++ ethernet@200000000 { + compatible = "smsc,lan9118", "smsc,lan9115"; + reg = <2 0x00000000 0x10000>; + interrupts = <3>; +@@ -133,7 +133,7 @@ + vddvario-supply = <&mb_fixed_3v3>; + }; + +- iofpga@3,00000000 { ++ iofpga@300000000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi +index 60703b5763c6..350cbf17e8b4 100644 +--- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi ++++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi +@@ -9,7 +9,7 @@ + motherboard { + arm,v2m-memory-map = "rs2"; + +- iofpga@3,00000000 { ++ iofpga@300000000 { + virtio-p9@140000 { + compatible = "virtio,mmio"; + reg = <0x140000 0x200>; +diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi +index e333c8d2d0e4..d1bfa62ca073 100644 +--- a/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi ++++ b/arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi +@@ -17,14 +17,14 @@ + #interrupt-cells = <1>; + ranges; + +- flash@0,00000000 { ++ flash@0 { + compatible = "arm,vexpress-flash", "cfi-flash"; + reg = <0 0x00000000 0x04000000>, + <4 0x00000000 0x04000000>; + bank-width = <4>; + }; + +- ethernet@2,02000000 { ++ ethernet@202000000 { + compatible = "smsc,lan91c111"; + reg = <2 0x02000000 0x10000>; + interrupts = <15>; +@@ -51,7 +51,7 @@ + clock-output-names = "v2m:refclk32khz"; + }; + +- iofpga@3,00000000 { ++ iofpga@300000000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +diff --git a/arch/arm64/boot/dts/marvell/armada-3720-db.dts b/arch/arm64/boot/dts/marvell/armada-3720-db.dts +index f2cc00594d64..3e5789f37206 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-db.dts ++++ b/arch/arm64/boot/dts/marvell/armada-3720-db.dts +@@ -128,6 +128,9 @@ + + /* CON15(V2.0)/CON17(V1.4) : PCIe / CON15(V2.0)/CON12(V1.4) :mini-PCIe */ + &pcie0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>; ++ reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi +index 42e992f9c8a5..c92ad664cb0e 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi ++++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi +@@ -47,6 +47,7 @@ + phys = <&comphy1 0>; + pinctrl-names = "default"; + pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>; ++ reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; + }; + + /* J6 */ +diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +index bb42d1e6a4e9..1452c821f8c0 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts ++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +@@ -95,7 +95,7 @@ + }; + + sfp: sfp { +- compatible = "sff,sfp+"; ++ compatible = "sff,sfp"; + i2c-bus = <&i2c0>; + los-gpio = <&moxtet_sfp 0 GPIO_ACTIVE_HIGH>; + tx-fault-gpio = <&moxtet_sfp 1 GPIO_ACTIVE_HIGH>; +@@ -128,10 +128,6 @@ + }; + }; + +-&pcie_reset_pins { +- function = "gpio"; +-}; +- + &pcie0 { + pinctrl-names = "default"; + pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>; +@@ -179,6 +175,8 @@ + marvell,pad-type = "sd"; + vqmmc-supply = <&vsdio_reg>; + mmc-pwrseq = <&sdhci1_pwrseq>; ++ /* forbid SDR104 for FCC purposes */ ++ sdhci-caps-mask = <0x2 0x0>; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi +index 000c135e39b7..7909c146eabf 100644 +--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi ++++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi +@@ -317,7 +317,7 @@ + + pcie_reset_pins: pcie-reset-pins { + groups = "pcie1"; +- function = "pcie"; ++ function = "gpio"; + }; + + pcie_clkreq_pins: pcie-clkreq-pins { +diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi +index d819e44d94a8..6ad1053afd27 100644 +--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi +@@ -242,21 +242,21 @@ + cpu_on = <0x84000003>; + }; + +- clk26m: oscillator@0 { ++ clk26m: oscillator0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <26000000>; + clock-output-names = "clk26m"; + }; + +- clk32k: oscillator@1 { ++ clk32k: oscillator1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32000>; + clock-output-names = "clk32k"; + }; + +- cpum_ck: oscillator@2 { ++ cpum_ck: oscillator2 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <0>; +@@ -272,19 +272,19 @@ + sustainable-power = <1500>; /* milliwatts */ + + trips { +- threshold: trip-point@0 { ++ threshold: trip-point0 { + temperature = <68000>; + hysteresis = <2000>; + type = "passive"; + }; + +- target: trip-point@1 { ++ target: trip-point1 { + temperature = <85000>; + hysteresis = <2000>; + type = "passive"; + }; + +- cpu_crit: cpu_crit@0 { ++ cpu_crit: cpu_crit0 { + temperature = <115000>; + hysteresis = <2000>; + type = "critical"; +@@ -292,13 +292,13 @@ + }; + + cooling-maps { +- map@0 { ++ map0 { + trip = <&target>; + cooling-device = <&cpu0 0 0>, + <&cpu1 0 0>; + contribution = <3072>; + }; +- map@1 { ++ map1 { + trip = <&target>; + cooling-device = <&cpu2 0 0>, + <&cpu3 0 0>; +@@ -312,7 +312,7 @@ + #address-cells = <2>; + #size-cells = <2>; + ranges; +- vpu_dma_reserved: vpu_dma_mem_region { ++ vpu_dma_reserved: vpu_dma_mem_region@b7000000 { + compatible = "shared-dma-pool"; + reg = <0 0xb7000000 0 0x500000>; + alignment = <0x1000>; +@@ -365,7 +365,7 @@ + reg = <0 0x10005000 0 0x1000>; + }; + +- pio: pinctrl@10005000 { ++ pio: pinctrl@1000b000 { + compatible = "mediatek,mt8173-pinctrl"; + reg = <0 0x1000b000 0 0x1000>; + mediatek,pctl-regmap = <&syscfg_pctl_a>; +@@ -572,7 +572,7 @@ + status = "disabled"; + }; + +- gic: interrupt-controller@10220000 { ++ gic: interrupt-controller@10221000 { + compatible = "arm,gic-400"; + #interrupt-cells = <3>; + interrupt-parent = <&gic>; +diff --git a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +index 623f7d7d216b..8e3136dfdd62 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +@@ -33,7 +33,7 @@ + + phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>; + phy-handle = <&phy>; +- phy-mode = "rgmii"; ++ phy-mode = "rgmii-id"; + + mdio { + #address-cells = <1>; +diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi +index f4ede86e32b4..3c928360f4ed 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi +@@ -1387,7 +1387,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x30100000 0x0 0x30100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */ ++ 0xc3000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */ + 0x82000000 0x0 0x40000000 0x12 0x30000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ + }; + +@@ -1432,7 +1432,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x32100000 0x0 0x32100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */ ++ 0xc3000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */ + 0x82000000 0x0 0x40000000 0x12 0x70000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ + }; + +@@ -1477,7 +1477,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x34100000 0x0 0x34100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */ ++ 0xc3000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */ + 0x82000000 0x0 0x40000000 0x12 0xb0000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */ + }; + +@@ -1522,7 +1522,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x36100000 0x0 0x36100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ ++ 0xc3000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ + 0x82000000 0x0 0x40000000 0x17 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ + }; + +@@ -1567,7 +1567,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x38100000 0x0 0x38100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ ++ 0xc3000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ + 0x82000000 0x0 0x40000000 0x1b 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ + }; + +@@ -1616,7 +1616,7 @@ + + bus-range = <0x0 0xff>; + ranges = <0x81000000 0x0 0x3a100000 0x0 0x3a100000 0x0 0x00100000 /* downstream I/O (1MB) */ +- 0xc2000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ ++ 0xc3000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */ + 0x82000000 0x0 0x40000000 0x1f 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */ + }; + +diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +index c4abbccf2bed..eaa1eb70b455 100644 +--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi ++++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi +@@ -117,16 +117,6 @@ + regulator-max-microvolt = <3700000>; + }; + +- vreg_s8a_l3a_input: vreg-s8a-l3a-input { +- compatible = "regulator-fixed"; +- regulator-name = "vreg_s8a_l3a_input"; +- regulator-always-on; +- regulator-boot-on; +- +- regulator-min-microvolt = <0>; +- regulator-max-microvolt = <0>; +- }; +- + wlan_en: wlan-en-1-8v { + pinctrl-names = "default"; + pinctrl-0 = <&wlan_en_gpios>; +@@ -705,14 +695,14 @@ + vdd_s11-supply = <&vph_pwr>; + vdd_s12-supply = <&vph_pwr>; + vdd_l2_l26_l28-supply = <&vreg_s3a_1p3>; +- vdd_l3_l11-supply = <&vreg_s8a_l3a_input>; ++ vdd_l3_l11-supply = <&vreg_s3a_1p3>; + vdd_l4_l27_l31-supply = <&vreg_s3a_1p3>; + vdd_l5_l7-supply = <&vreg_s5a_2p15>; + vdd_l6_l12_l32-supply = <&vreg_s5a_2p15>; + vdd_l8_l16_l30-supply = <&vph_pwr>; + vdd_l14_l15-supply = <&vreg_s5a_2p15>; + vdd_l25-supply = <&vreg_s3a_1p3>; +- vdd_lvs1_2-supply = <&vreg_s4a_1p8>; ++ vdd_lvs1_lvs2-supply = <&vreg_s4a_1p8>; + + vreg_s3a_1p3: s3 { + regulator-name = "vreg_s3a_1p3"; +diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi +index a88a15f2352b..5548d7b5096c 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -261,7 +261,7 @@ + thermal-sensors = <&tsens 4>; + + trips { +- cpu2_3_alert0: trip-point@0 { ++ cpu2_3_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "passive"; +@@ -291,7 +291,7 @@ + thermal-sensors = <&tsens 2>; + + trips { +- gpu_alert0: trip-point@0 { ++ gpu_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "passive"; +@@ -311,7 +311,7 @@ + thermal-sensors = <&tsens 1>; + + trips { +- cam_alert0: trip-point@0 { ++ cam_alert0: trip-point0 { + temperature = <75000>; + hysteresis = <2000>; + type = "hot"; +@@ -326,7 +326,7 @@ + thermal-sensors = <&tsens 0>; + + trips { +- modem_alert0: trip-point@0 { ++ modem_alert0: trip-point0 { + temperature = <85000>; + hysteresis = <2000>; + type = "hot"; +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index 98634d5c4440..d22c364b520a 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -989,16 +989,16 @@ + "csi_clk_mux", + "vfe0", + "vfe1"; +- interrupts = <GIC_SPI 78 0>, +- <GIC_SPI 79 0>, +- <GIC_SPI 80 0>, +- <GIC_SPI 296 0>, +- <GIC_SPI 297 0>, +- <GIC_SPI 298 0>, +- <GIC_SPI 299 0>, +- <GIC_SPI 309 0>, +- <GIC_SPI 314 0>, +- <GIC_SPI 315 0>; ++ interrupts = <GIC_SPI 78 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 80 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 296 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 297 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 298 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 299 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 309 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 314 IRQ_TYPE_EDGE_RISING>, ++ <GIC_SPI 315 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "csiphy0", + "csiphy1", + "csiphy2", +diff --git a/arch/arm64/boot/dts/qcom/pm8150.dtsi b/arch/arm64/boot/dts/qcom/pm8150.dtsi +index b6e304748a57..c0b197458665 100644 +--- a/arch/arm64/boot/dts/qcom/pm8150.dtsi ++++ b/arch/arm64/boot/dts/qcom/pm8150.dtsi +@@ -73,18 +73,8 @@ + reg = <0xc000>; + gpio-controller; + #gpio-cells = <2>; +- interrupts = <0x0 0xc0 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc1 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc2 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc3 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc4 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc5 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc6 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc7 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc8 0x0 IRQ_TYPE_NONE>, +- <0x0 0xc9 0x0 IRQ_TYPE_NONE>, +- <0x0 0xca 0x0 IRQ_TYPE_NONE>, +- <0x0 0xcb 0x0 IRQ_TYPE_NONE>; ++ interrupt-controller; ++ #interrupt-cells = <2>; + }; + }; + +diff --git a/arch/arm64/boot/dts/qcom/pm8150b.dtsi b/arch/arm64/boot/dts/qcom/pm8150b.dtsi +index 322379d5c31f..40b5d75a4a1d 100644 +--- a/arch/arm64/boot/dts/qcom/pm8150b.dtsi ++++ b/arch/arm64/boot/dts/qcom/pm8150b.dtsi +@@ -62,18 +62,8 @@ + reg = <0xc000>; + gpio-controller; + #gpio-cells = <2>; +- interrupts = <0x2 0xc0 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc1 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc2 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc3 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc4 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc5 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc6 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc7 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc8 0x0 IRQ_TYPE_NONE>, +- <0x2 0xc9 0x0 IRQ_TYPE_NONE>, +- <0x2 0xca 0x0 IRQ_TYPE_NONE>, +- <0x2 0xcb 0x0 IRQ_TYPE_NONE>; ++ interrupt-controller; ++ #interrupt-cells = <2>; + }; + }; + +diff --git a/arch/arm64/boot/dts/qcom/pm8150l.dtsi b/arch/arm64/boot/dts/qcom/pm8150l.dtsi +index eb0e9a090e42..cf05e0685d10 100644 +--- a/arch/arm64/boot/dts/qcom/pm8150l.dtsi ++++ b/arch/arm64/boot/dts/qcom/pm8150l.dtsi +@@ -56,18 +56,8 @@ + reg = <0xc000>; + gpio-controller; + #gpio-cells = <2>; +- interrupts = <0x4 0xc0 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc1 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc2 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc3 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc4 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc5 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc6 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc7 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc8 0x0 IRQ_TYPE_NONE>, +- <0x4 0xc9 0x0 IRQ_TYPE_NONE>, +- <0x4 0xca 0x0 IRQ_TYPE_NONE>, +- <0x4 0xcb 0x0 IRQ_TYPE_NONE>; ++ interrupt-controller; ++ #interrupt-cells = <2>; + }; + }; + +diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi b/arch/arm64/boot/dts/qcom/sc7180.dtsi +index 998f101ad623..eea92b314fc6 100644 +--- a/arch/arm64/boot/dts/qcom/sc7180.dtsi ++++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi +@@ -1657,8 +1657,7 @@ + pdc: interrupt-controller@b220000 { + compatible = "qcom,sc7180-pdc", "qcom,pdc"; + reg = <0 0x0b220000 0 0x30000>; +- qcom,pdc-ranges = <0 480 15>, <17 497 98>, +- <119 634 4>, <124 639 1>; ++ qcom,pdc-ranges = <0 480 94>, <94 609 31>, <125 63 1>; + #interrupt-cells = <2>; + interrupt-parent = <&intc>; + interrupt-controller; +diff --git a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +index 51a670ad15b2..4b9860a2c8eb 100644 +--- a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts ++++ b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +@@ -577,3 +577,14 @@ + }; + }; + }; ++ ++&wifi { ++ status = "okay"; ++ ++ vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>; ++ vdd-1.8-xo-supply = <&vreg_l7a_1p8>; ++ vdd-1.3-rfa-supply = <&vreg_l17a_1p3>; ++ vdd-3.3-ch0-supply = <&vreg_l25a_3p3>; ++ ++ qcom,snoc-host-cap-8bit-quirk; ++}; +diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi +index 891d83b2afea..2a7eaefd221d 100644 +--- a/arch/arm64/boot/dts/qcom/sm8250.dtsi ++++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi +@@ -314,8 +314,8 @@ + }; + + pdc: interrupt-controller@b220000 { +- compatible = "qcom,sm8250-pdc"; +- reg = <0x0b220000 0x30000>, <0x17c000f0 0x60>; ++ compatible = "qcom,sm8250-pdc", "qcom,pdc"; ++ reg = <0 0x0b220000 0 0x30000>, <0 0x17c000f0 0 0x60>; + qcom,pdc-ranges = <0 480 94>, <94 609 31>, + <125 63 1>, <126 716 12>; + #interrupt-cells = <2>; +diff --git a/arch/arm64/boot/dts/realtek/rtd1293-ds418j.dts b/arch/arm64/boot/dts/realtek/rtd1293-ds418j.dts +index b2dd583146b4..b2e44c6c2d22 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1293-ds418j.dts ++++ b/arch/arm64/boot/dts/realtek/rtd1293-ds418j.dts +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) + /* +- * Copyright (c) 2017 Andreas Färber ++ * Copyright (c) 2017-2019 Andreas Färber + */ + + /dts-v1/; +@@ -11,9 +11,9 @@ + compatible = "synology,ds418j", "realtek,rtd1293"; + model = "Synology DiskStation DS418j"; + +- memory@0 { ++ memory@1f000 { + device_type = "memory"; +- reg = <0x0 0x40000000>; ++ reg = <0x1f000 0x3ffe1000>; /* boot ROM to 1 GiB */ + }; + + aliases { +diff --git a/arch/arm64/boot/dts/realtek/rtd1293.dtsi b/arch/arm64/boot/dts/realtek/rtd1293.dtsi +index bd4e22723f7b..2d92b56ac94d 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1293.dtsi ++++ b/arch/arm64/boot/dts/realtek/rtd1293.dtsi +@@ -36,16 +36,20 @@ + timer { + compatible = "arm,armv8-timer"; + interrupts = <GIC_PPI 13 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 14 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 11 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 10 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>; ++ (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>; + }; + }; + + &arm_pmu { + interrupt-affinity = <&cpu0>, <&cpu1>; + }; ++ ++&gic { ++ interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>; ++}; +diff --git a/arch/arm64/boot/dts/realtek/rtd1295-mele-v9.dts b/arch/arm64/boot/dts/realtek/rtd1295-mele-v9.dts +index bd584e99fff9..cf4a57c012a8 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1295-mele-v9.dts ++++ b/arch/arm64/boot/dts/realtek/rtd1295-mele-v9.dts +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2017 Andreas Färber ++ * Copyright (c) 2017-2019 Andreas Färber + * + * SPDX-License-Identifier: (GPL-2.0+ OR MIT) + */ +@@ -12,9 +12,9 @@ + compatible = "mele,v9", "realtek,rtd1295"; + model = "MeLE V9"; + +- memory@0 { ++ memory@1f000 { + device_type = "memory"; +- reg = <0x0 0x80000000>; ++ reg = <0x1f000 0x7ffe1000>; /* boot ROM to 2 GiB */ + }; + + aliases { +diff --git a/arch/arm64/boot/dts/realtek/rtd1295-probox2-ava.dts b/arch/arm64/boot/dts/realtek/rtd1295-probox2-ava.dts +index 8e2b0e75298a..14161c3f304d 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1295-probox2-ava.dts ++++ b/arch/arm64/boot/dts/realtek/rtd1295-probox2-ava.dts +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2017 Andreas Färber ++ * Copyright (c) 2017-2019 Andreas Färber + * + * SPDX-License-Identifier: (GPL-2.0+ OR MIT) + */ +@@ -12,9 +12,9 @@ + compatible = "probox2,ava", "realtek,rtd1295"; + model = "PROBOX2 AVA"; + +- memory@0 { ++ memory@1f000 { + device_type = "memory"; +- reg = <0x0 0x80000000>; ++ reg = <0x1f000 0x7ffe1000>; /* boot ROM to 2 GiB */ + }; + + aliases { +diff --git a/arch/arm64/boot/dts/realtek/rtd1295-zidoo-x9s.dts b/arch/arm64/boot/dts/realtek/rtd1295-zidoo-x9s.dts +index e98e508b9514..4beb37bb9522 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1295-zidoo-x9s.dts ++++ b/arch/arm64/boot/dts/realtek/rtd1295-zidoo-x9s.dts +@@ -11,9 +11,9 @@ + compatible = "zidoo,x9s", "realtek,rtd1295"; + model = "Zidoo X9S"; + +- memory@0 { ++ memory@1f000 { + device_type = "memory"; +- reg = <0x0 0x80000000>; ++ reg = <0x1f000 0x7ffe1000>; /* boot ROM to 2 GiB */ + }; + + aliases { +diff --git a/arch/arm64/boot/dts/realtek/rtd1295.dtsi b/arch/arm64/boot/dts/realtek/rtd1295.dtsi +index 93f0e1d97721..1402abe80ea1 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1295.dtsi ++++ b/arch/arm64/boot/dts/realtek/rtd1295.dtsi +@@ -2,7 +2,7 @@ + /* + * Realtek RTD1295 SoC + * +- * Copyright (c) 2016-2017 Andreas Färber ++ * Copyright (c) 2016-2019 Andreas Färber + */ + + #include "rtd129x.dtsi" +@@ -47,27 +47,16 @@ + }; + }; + +- reserved-memory { +- #address-cells = <1>; +- #size-cells = <1>; +- ranges; +- +- tee@10100000 { +- reg = <0x10100000 0xf00000>; +- no-map; +- }; +- }; +- + timer { + compatible = "arm,armv8-timer"; + interrupts = <GIC_PPI 13 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 14 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 11 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 10 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>; ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + }; + +diff --git a/arch/arm64/boot/dts/realtek/rtd1296-ds418.dts b/arch/arm64/boot/dts/realtek/rtd1296-ds418.dts +index 5a051a52bf88..cc706d13da8b 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1296-ds418.dts ++++ b/arch/arm64/boot/dts/realtek/rtd1296-ds418.dts +@@ -11,9 +11,9 @@ + compatible = "synology,ds418", "realtek,rtd1296"; + model = "Synology DiskStation DS418"; + +- memory@0 { ++ memory@1f000 { + device_type = "memory"; +- reg = <0x0 0x80000000>; ++ reg = <0x1f000 0x7ffe1000>; /* boot ROM to 2 GiB */ + }; + + aliases { +diff --git a/arch/arm64/boot/dts/realtek/rtd1296.dtsi b/arch/arm64/boot/dts/realtek/rtd1296.dtsi +index 0f9e59cac086..fb864a139c97 100644 +--- a/arch/arm64/boot/dts/realtek/rtd1296.dtsi ++++ b/arch/arm64/boot/dts/realtek/rtd1296.dtsi +@@ -50,13 +50,13 @@ + timer { + compatible = "arm,armv8-timer"; + interrupts = <GIC_PPI 13 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 14 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 11 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>, ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 10 +- (GIC_CPU_MASK_RAW(0xf) | IRQ_TYPE_LEVEL_LOW)>; ++ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + }; + +diff --git a/arch/arm64/boot/dts/realtek/rtd129x.dtsi b/arch/arm64/boot/dts/realtek/rtd129x.dtsi +index 4433114476f5..b63d0c03597a 100644 +--- a/arch/arm64/boot/dts/realtek/rtd129x.dtsi ++++ b/arch/arm64/boot/dts/realtek/rtd129x.dtsi +@@ -2,14 +2,12 @@ + /* + * Realtek RTD1293/RTD1295/RTD1296 SoC + * +- * Copyright (c) 2016-2017 Andreas Färber ++ * Copyright (c) 2016-2019 Andreas Färber + */ + +-/memreserve/ 0x0000000000000000 0x0000000000030000; +-/memreserve/ 0x000000000001f000 0x0000000000001000; +-/memreserve/ 0x0000000000030000 0x00000000000d0000; ++/memreserve/ 0x0000000000000000 0x000000000001f000; ++/memreserve/ 0x000000000001f000 0x00000000000e1000; + /memreserve/ 0x0000000001b00000 0x00000000004be000; +-/memreserve/ 0x0000000001ffe000 0x0000000000004000; + + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/reset/realtek,rtd1295.h> +@@ -19,6 +17,25 @@ + #address-cells = <1>; + #size-cells = <1>; + ++ reserved-memory { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ rpc_comm: rpc@1f000 { ++ reg = <0x1f000 0x1000>; ++ }; ++ ++ rpc_ringbuf: rpc@1ffe000 { ++ reg = <0x1ffe000 0x4000>; ++ }; ++ ++ tee: tee@10100000 { ++ reg = <0x10100000 0xf00000>; ++ no-map; ++ }; ++ }; ++ + arm_pmu: arm-pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>; +@@ -35,8 +52,9 @@ + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; +- /* Exclude up to 2 GiB of RAM */ +- ranges = <0x80000000 0x80000000 0x80000000>; ++ ranges = <0x00000000 0x00000000 0x0001f000>, /* boot ROM */ ++ /* Exclude up to 2 GiB of RAM */ ++ <0x80000000 0x80000000 0x80000000>; + + reset1: reset-controller@98000000 { + compatible = "snps,dw-low-reset"; +diff --git a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi +index 79023433a740..a603d947970e 100644 +--- a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi +@@ -1000,7 +1000,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -1008,7 +1008,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -1016,7 +1016,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -1024,7 +1024,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -1033,7 +1033,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -1041,7 +1041,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 5>; +@@ -1049,7 +1049,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv1: mmu@fd950000 { ++ ipmmu_pv1: iommu@fd950000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xfd950000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -1057,7 +1057,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 8>; +@@ -1065,7 +1065,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a774a1"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 9>; +diff --git a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi +index 3137f735974b..1e51855c7cd3 100644 +--- a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi +@@ -874,7 +874,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -882,7 +882,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -890,7 +890,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -898,7 +898,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -907,7 +907,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -915,7 +915,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -923,7 +923,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -931,7 +931,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -939,7 +939,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a774b1"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +diff --git a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi +index 22785cbddff5..5c72a7efbb03 100644 +--- a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi +@@ -847,7 +847,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -855,7 +855,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -863,7 +863,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -871,7 +871,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -880,7 +880,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -888,7 +888,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -896,7 +896,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -904,7 +904,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -912,7 +912,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a774c0"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77950.dtsi b/arch/arm64/boot/dts/renesas/r8a77950.dtsi +index 3975eecd50c4..d716c4386ae9 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77950.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77950.dtsi +@@ -77,7 +77,7 @@ + /delete-node/ dma-controller@e6460000; + /delete-node/ dma-controller@e6470000; + +- ipmmu_mp1: mmu@ec680000 { ++ ipmmu_mp1: iommu@ec680000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xec680000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 5>; +@@ -85,7 +85,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_sy: mmu@e7730000 { ++ ipmmu_sy: iommu@e7730000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xe7730000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 8>; +@@ -93,11 +93,11 @@ + #iommu-cells = <1>; + }; + +- /delete-node/ mmu@fd950000; +- /delete-node/ mmu@fd960000; +- /delete-node/ mmu@fd970000; +- /delete-node/ mmu@febe0000; +- /delete-node/ mmu@fe980000; ++ /delete-node/ iommu@fd950000; ++ /delete-node/ iommu@fd960000; ++ /delete-node/ iommu@fd970000; ++ /delete-node/ iommu@febe0000; ++ /delete-node/ iommu@fe980000; + + xhci1: usb@ee040000 { + compatible = "renesas,xhci-r8a7795", "renesas,rcar-gen3-xhci"; +diff --git a/arch/arm64/boot/dts/renesas/r8a77951.dtsi b/arch/arm64/boot/dts/renesas/r8a77951.dtsi +index 52229546454c..61d67d9714ab 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77951.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77951.dtsi +@@ -1073,7 +1073,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -1081,7 +1081,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -1089,7 +1089,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -1097,7 +1097,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ir: mmu@ff8b0000 { ++ ipmmu_ir: iommu@ff8b0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xff8b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 3>; +@@ -1105,7 +1105,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -1114,7 +1114,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp0: mmu@ec670000 { ++ ipmmu_mp0: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -1122,7 +1122,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -1130,7 +1130,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv1: mmu@fd950000 { ++ ipmmu_pv1: iommu@fd950000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfd950000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 7>; +@@ -1138,7 +1138,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv2: mmu@fd960000 { ++ ipmmu_pv2: iommu@fd960000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfd960000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 8>; +@@ -1146,7 +1146,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv3: mmu@fd970000 { ++ ipmmu_pv3: iommu@fd970000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfd970000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 9>; +@@ -1154,7 +1154,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 10>; +@@ -1162,7 +1162,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -1170,7 +1170,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc1: mmu@fe6f0000 { ++ ipmmu_vc1: iommu@fe6f0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfe6f0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 13>; +@@ -1178,7 +1178,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -1186,7 +1186,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi1: mmu@febe0000 { ++ ipmmu_vi1: iommu@febe0000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfebe0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 15>; +@@ -1194,7 +1194,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +@@ -1202,7 +1202,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp1: mmu@fe980000 { ++ ipmmu_vp1: iommu@fe980000 { + compatible = "renesas,ipmmu-r8a7795"; + reg = <0 0xfe980000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 17>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77960.dtsi b/arch/arm64/boot/dts/renesas/r8a77960.dtsi +index 31282367d3ac..33bf62acffbb 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77960.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77960.dtsi +@@ -997,7 +997,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -1005,7 +1005,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -1013,7 +1013,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -1021,7 +1021,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ir: mmu@ff8b0000 { ++ ipmmu_ir: iommu@ff8b0000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xff8b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 3>; +@@ -1029,7 +1029,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -1038,7 +1038,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -1046,7 +1046,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 5>; +@@ -1054,7 +1054,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv1: mmu@fd950000 { ++ ipmmu_pv1: iommu@fd950000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xfd950000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -1062,7 +1062,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 7>; +@@ -1070,7 +1070,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 8>; +@@ -1078,7 +1078,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a7796"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 9>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77965.dtsi b/arch/arm64/boot/dts/renesas/r8a77965.dtsi +index d82dd4e67b62..6f7ab39fd282 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77965.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77965.dtsi +@@ -867,7 +867,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -875,7 +875,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -883,7 +883,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -891,7 +891,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -900,7 +900,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -908,7 +908,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -916,7 +916,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 10>; +@@ -924,7 +924,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -932,7 +932,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -940,7 +940,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a77965"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77970.dtsi b/arch/arm64/boot/dts/renesas/r8a77970.dtsi +index a009c0ebc8b4..bd95ecb1b40d 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77970.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77970.dtsi +@@ -985,7 +985,7 @@ + <&ipmmu_ds1 22>, <&ipmmu_ds1 23>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a77970"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -993,7 +993,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ir: mmu@ff8b0000 { ++ ipmmu_ir: iommu@ff8b0000 { + compatible = "renesas,ipmmu-r8a77970"; + reg = <0 0xff8b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 3>; +@@ -1001,7 +1001,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a77970"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -1010,7 +1010,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a77970"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 7>; +@@ -1018,7 +1018,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a77970"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 9>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77980.dtsi b/arch/arm64/boot/dts/renesas/r8a77980.dtsi +index d672b320bc14..387e6d99f2f3 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77980.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77980.dtsi +@@ -1266,7 +1266,7 @@ + status = "disabled"; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -1274,7 +1274,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ir: mmu@ff8b0000 { ++ ipmmu_ir: iommu@ff8b0000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xff8b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 3>; +@@ -1282,7 +1282,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -1291,7 +1291,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 10>; +@@ -1299,7 +1299,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe990000 { ++ ipmmu_vc0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -1307,7 +1307,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -1315,7 +1315,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vip0: mmu@e7b00000 { ++ ipmmu_vip0: iommu@e7b00000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xe7b00000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -1323,7 +1323,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vip1: mmu@e7960000 { ++ ipmmu_vip1: iommu@e7960000 { + compatible = "renesas,ipmmu-r8a77980"; + reg = <0 0xe7960000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 11>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77990.dtsi b/arch/arm64/boot/dts/renesas/r8a77990.dtsi +index 1543f18e834f..cd11f24744d4 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77990.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77990.dtsi +@@ -817,7 +817,7 @@ + <&ipmmu_ds1 30>, <&ipmmu_ds1 31>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -825,7 +825,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -833,7 +833,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -841,7 +841,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -850,7 +850,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -858,7 +858,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -866,7 +866,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 10>; +@@ -874,7 +874,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -882,7 +882,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -890,7 +890,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a77990"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +diff --git a/arch/arm64/boot/dts/renesas/r8a77995.dtsi b/arch/arm64/boot/dts/renesas/r8a77995.dtsi +index e8d2290fe79d..e5617ec0f49c 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77995.dtsi ++++ b/arch/arm64/boot/dts/renesas/r8a77995.dtsi +@@ -507,7 +507,7 @@ + <&ipmmu_ds1 22>, <&ipmmu_ds1 23>; + }; + +- ipmmu_ds0: mmu@e6740000 { ++ ipmmu_ds0: iommu@e6740000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xe6740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 0>; +@@ -515,7 +515,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_ds1: mmu@e7740000 { ++ ipmmu_ds1: iommu@e7740000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xe7740000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 1>; +@@ -523,7 +523,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_hc: mmu@e6570000 { ++ ipmmu_hc: iommu@e6570000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xe6570000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 2>; +@@ -531,7 +531,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mm: mmu@e67b0000 { ++ ipmmu_mm: iommu@e67b0000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xe67b0000 0 0x1000>; + interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, +@@ -540,7 +540,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_mp: mmu@ec670000 { ++ ipmmu_mp: iommu@ec670000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xec670000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; +@@ -548,7 +548,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_pv0: mmu@fd800000 { ++ ipmmu_pv0: iommu@fd800000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xfd800000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 6>; +@@ -556,7 +556,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_rt: mmu@ffc80000 { ++ ipmmu_rt: iommu@ffc80000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xffc80000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 10>; +@@ -564,7 +564,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vc0: mmu@fe6b0000 { ++ ipmmu_vc0: iommu@fe6b0000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xfe6b0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 12>; +@@ -572,7 +572,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vi0: mmu@febd0000 { ++ ipmmu_vi0: iommu@febd0000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xfebd0000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 14>; +@@ -580,7 +580,7 @@ + #iommu-cells = <1>; + }; + +- ipmmu_vp0: mmu@fe990000 { ++ ipmmu_vp0: iommu@fe990000 { + compatible = "renesas,ipmmu-r8a77995"; + reg = <0 0xfe990000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 16>; +diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c +index 8618faa82e6d..86a5cf9bc19a 100644 +--- a/arch/arm64/kernel/ftrace.c ++++ b/arch/arm64/kernel/ftrace.c +@@ -69,7 +69,8 @@ static struct plt_entry *get_ftrace_plt(struct module *mod, unsigned long addr) + + if (addr == FTRACE_ADDR) + return &plt[FTRACE_PLT_IDX]; +- if (addr == FTRACE_REGS_ADDR && IS_ENABLED(CONFIG_FTRACE_WITH_REGS)) ++ if (addr == FTRACE_REGS_ADDR && ++ IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_REGS)) + return &plt[FTRACE_REGS_PLT_IDX]; + #endif + return NULL; +diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c +index 0b727edf4104..af234a1e08b7 100644 +--- a/arch/arm64/kernel/hw_breakpoint.c ++++ b/arch/arm64/kernel/hw_breakpoint.c +@@ -730,6 +730,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val, + return 0; + } + ++static int watchpoint_report(struct perf_event *wp, unsigned long addr, ++ struct pt_regs *regs) ++{ ++ int step = is_default_overflow_handler(wp); ++ struct arch_hw_breakpoint *info = counter_arch_bp(wp); ++ ++ info->trigger = addr; ++ ++ /* ++ * If we triggered a user watchpoint from a uaccess routine, then ++ * handle the stepping ourselves since userspace really can't help ++ * us with this. ++ */ ++ if (!user_mode(regs) && info->ctrl.privilege == AARCH64_BREAKPOINT_EL0) ++ step = 1; ++ else ++ perf_bp_event(wp, regs); ++ ++ return step; ++} ++ + static int watchpoint_handler(unsigned long addr, unsigned int esr, + struct pt_regs *regs) + { +@@ -739,7 +760,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, + u64 val; + struct perf_event *wp, **slots; + struct debug_info *debug_info; +- struct arch_hw_breakpoint *info; + struct arch_hw_breakpoint_ctrl ctrl; + + slots = this_cpu_ptr(wp_on_reg); +@@ -777,25 +797,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, + if (dist != 0) + continue; + +- info = counter_arch_bp(wp); +- info->trigger = addr; +- perf_bp_event(wp, regs); +- +- /* Do we need to handle the stepping? */ +- if (is_default_overflow_handler(wp)) +- step = 1; ++ step = watchpoint_report(wp, addr, regs); + } +- if (min_dist > 0 && min_dist != -1) { +- /* No exact match found. */ +- wp = slots[closest_match]; +- info = counter_arch_bp(wp); +- info->trigger = addr; +- perf_bp_event(wp, regs); + +- /* Do we need to handle the stepping? */ +- if (is_default_overflow_handler(wp)) +- step = 1; +- } ++ /* No exact match found? */ ++ if (min_dist > 0 && min_dist != -1) ++ step = watchpoint_report(slots[closest_match], addr, regs); ++ + rcu_read_unlock(); + + if (!step) +diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c +index e42727e3568e..3f9010167468 100644 +--- a/arch/arm64/mm/init.c ++++ b/arch/arm64/mm/init.c +@@ -458,11 +458,6 @@ void __init arm64_memblock_init(void) + high_memory = __va(memblock_end_of_DRAM() - 1) + 1; + + dma_contiguous_reserve(arm64_dma32_phys_limit); +- +-#ifdef CONFIG_ARM64_4K_PAGES +- hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT); +-#endif +- + } + + void __init bootmem_init(void) +@@ -478,6 +473,16 @@ void __init bootmem_init(void) + min_low_pfn = min; + + arm64_numa_init(); ++ ++ /* ++ * must be done after arm64_numa_init() which calls numa_init() to ++ * initialize node_online_map that gets used in hugetlb_cma_reserve() ++ * while allocating required CMA size across online nodes. ++ */ ++#ifdef CONFIG_ARM64_4K_PAGES ++ hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT); ++#endif ++ + /* + * Sparsemem tries to allocate bootmem in memory_present(), so must be + * done after the fixed reservations. +diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c +index 62b0eb6cf69a..84eab0f5e00a 100644 +--- a/arch/m68k/coldfire/pci.c ++++ b/arch/m68k/coldfire/pci.c +@@ -216,8 +216,10 @@ static int __init mcf_pci_init(void) + + /* Keep a virtual mapping to IO/config space active */ + iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE); +- if (iospace == 0) ++ if (iospace == 0) { ++ pci_free_host_bridge(bridge); + return -ENODEV; ++ } + pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n", + (u32) iospace); + +diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S +index e4a78571f883..c6481cfc5220 100644 +--- a/arch/openrisc/kernel/entry.S ++++ b/arch/openrisc/kernel/entry.S +@@ -1166,13 +1166,13 @@ ENTRY(__sys_clone) + l.movhi r29,hi(sys_clone) + l.ori r29,r29,lo(sys_clone) + l.j _fork_save_extra_regs_and_call +- l.addi r7,r1,0 ++ l.nop + + ENTRY(__sys_fork) + l.movhi r29,hi(sys_fork) + l.ori r29,r29,lo(sys_fork) + l.j _fork_save_extra_regs_and_call +- l.addi r3,r1,0 ++ l.nop + + ENTRY(sys_rt_sigreturn) + l.jal _sys_rt_sigreturn +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 62aca9efbbbe..310957b988e3 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -773,6 +773,7 @@ config THREAD_SHIFT + range 13 15 + default "15" if PPC_256K_PAGES + default "14" if PPC64 ++ default "14" if KASAN + default "13" + help + Used to define the stack size. The default is almost always what you +diff --git a/arch/powerpc/configs/adder875_defconfig b/arch/powerpc/configs/adder875_defconfig +index f55e23cb176c..5326bc739279 100644 +--- a/arch/powerpc/configs/adder875_defconfig ++++ b/arch/powerpc/configs/adder875_defconfig +@@ -10,7 +10,6 @@ CONFIG_EXPERT=y + # CONFIG_BLK_DEV_BSG is not set + CONFIG_PARTITION_ADVANCED=y + CONFIG_PPC_ADDER875=y +-CONFIG_8xx_COPYBACK=y + CONFIG_GEN_RTC=y + CONFIG_HZ_1000=y + # CONFIG_SECCOMP is not set +diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig +index 0e2e5e81a359..f5c3e72da719 100644 +--- a/arch/powerpc/configs/ep88xc_defconfig ++++ b/arch/powerpc/configs/ep88xc_defconfig +@@ -12,7 +12,6 @@ CONFIG_EXPERT=y + # CONFIG_BLK_DEV_BSG is not set + CONFIG_PARTITION_ADVANCED=y + CONFIG_PPC_EP88XC=y +-CONFIG_8xx_COPYBACK=y + CONFIG_GEN_RTC=y + CONFIG_HZ_100=y + # CONFIG_SECCOMP is not set +diff --git a/arch/powerpc/configs/mpc866_ads_defconfig b/arch/powerpc/configs/mpc866_ads_defconfig +index 5320735395e7..5c56d36cdfc5 100644 +--- a/arch/powerpc/configs/mpc866_ads_defconfig ++++ b/arch/powerpc/configs/mpc866_ads_defconfig +@@ -12,7 +12,6 @@ CONFIG_EXPERT=y + # CONFIG_BLK_DEV_BSG is not set + CONFIG_PARTITION_ADVANCED=y + CONFIG_MPC86XADS=y +-CONFIG_8xx_COPYBACK=y + CONFIG_GEN_RTC=y + CONFIG_HZ_1000=y + CONFIG_MATH_EMULATION=y +diff --git a/arch/powerpc/configs/mpc885_ads_defconfig b/arch/powerpc/configs/mpc885_ads_defconfig +index 82a008c04eae..949ff9ccda5e 100644 +--- a/arch/powerpc/configs/mpc885_ads_defconfig ++++ b/arch/powerpc/configs/mpc885_ads_defconfig +@@ -11,7 +11,6 @@ CONFIG_EXPERT=y + # CONFIG_VM_EVENT_COUNTERS is not set + # CONFIG_BLK_DEV_BSG is not set + CONFIG_PARTITION_ADVANCED=y +-CONFIG_8xx_COPYBACK=y + CONFIG_GEN_RTC=y + CONFIG_HZ_100=y + # CONFIG_SECCOMP is not set +diff --git a/arch/powerpc/configs/tqm8xx_defconfig b/arch/powerpc/configs/tqm8xx_defconfig +index eda8bfb2d0a3..77857d513022 100644 +--- a/arch/powerpc/configs/tqm8xx_defconfig ++++ b/arch/powerpc/configs/tqm8xx_defconfig +@@ -15,7 +15,6 @@ CONFIG_MODULE_SRCVERSION_ALL=y + # CONFIG_BLK_DEV_BSG is not set + CONFIG_PARTITION_ADVANCED=y + CONFIG_TQM8XX=y +-CONFIG_8xx_COPYBACK=y + # CONFIG_8xx_CPU15 is not set + CONFIG_GEN_RTC=y + CONFIG_HZ_100=y +diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h +index 3bcef989a35d..101d60f16d46 100644 +--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h ++++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h +@@ -16,7 +16,9 @@ + #ifdef CONFIG_PPC_KUAP + BEGIN_MMU_FTR_SECTION_NESTED(67) + ld \gpr, STACK_REGS_KUAP(r1) ++ isync + mtspr SPRN_AMR, \gpr ++ /* No isync required, see kuap_restore_amr() */ + END_MMU_FTR_SECTION_NESTED_IFSET(MMU_FTR_RADIX_KUAP, 67) + #endif + .endm +@@ -62,8 +64,15 @@ + + static inline void kuap_restore_amr(struct pt_regs *regs) + { +- if (mmu_has_feature(MMU_FTR_RADIX_KUAP)) ++ if (mmu_has_feature(MMU_FTR_RADIX_KUAP)) { ++ isync(); + mtspr(SPRN_AMR, regs->kuap); ++ /* ++ * No isync required here because we are about to RFI back to ++ * previous context before any user accesses would be made, ++ * which is a CSI. ++ */ ++ } + } + + static inline void kuap_check_amr(void) +diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h +index 368b136517e0..2838b98bc6df 100644 +--- a/arch/powerpc/include/asm/book3s/64/pgtable.h ++++ b/arch/powerpc/include/asm/book3s/64/pgtable.h +@@ -998,10 +998,25 @@ extern struct page *pgd_page(pgd_t pgd); + #define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS) + #define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS) + +-#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1)) +-#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1)) +-#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1)) +-#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1)) ++static inline unsigned long pgd_index(unsigned long address) ++{ ++ return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1); ++} ++ ++static inline unsigned long pud_index(unsigned long address) ++{ ++ return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1); ++} ++ ++static inline unsigned long pmd_index(unsigned long address) ++{ ++ return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); ++} ++ ++static inline unsigned long pte_index(unsigned long address) ++{ ++ return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); ++} + + /* + * Find an entry in a page-table-directory. We combine the address region +diff --git a/arch/powerpc/include/asm/nohash/32/mmu-8xx.h b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h +index 76af5b0cb16e..26b7cee34dfe 100644 +--- a/arch/powerpc/include/asm/nohash/32/mmu-8xx.h ++++ b/arch/powerpc/include/asm/nohash/32/mmu-8xx.h +@@ -19,7 +19,6 @@ + #define MI_RSV4I 0x08000000 /* Reserve 4 TLB entries */ + #define MI_PPCS 0x02000000 /* Use MI_RPN prob/priv state */ + #define MI_IDXMASK 0x00001f00 /* TLB index to be loaded */ +-#define MI_RESETVAL 0x00000000 /* Value of register at reset */ + + /* These are the Ks and Kp from the PowerPC books. For proper operation, + * Ks = 0, Kp = 1. +@@ -95,7 +94,6 @@ + #define MD_TWAM 0x04000000 /* Use 4K page hardware assist */ + #define MD_PPCS 0x02000000 /* Use MI_RPN prob/priv state */ + #define MD_IDXMASK 0x00001f00 /* TLB index to be loaded */ +-#define MD_RESETVAL 0x04000000 /* Value of register at reset */ + + #define SPRN_M_CASID 793 /* Address space ID (context) to match */ + #define MC_ASIDMASK 0x0000000f /* Bits used for ASID value */ +diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h +index eedcbfb9a6ff..c220cb9eccad 100644 +--- a/arch/powerpc/include/asm/processor.h ++++ b/arch/powerpc/include/asm/processor.h +@@ -301,7 +301,6 @@ struct thread_struct { + #else + #define INIT_THREAD { \ + .ksp = INIT_SP, \ +- .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \ + .addr_limit = KERNEL_DS, \ + .fpexc_mode = 0, \ + .fscr = FSCR_TAR | FSCR_EBB \ +diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S +index ebeebab74b56..d9ddce40bed8 100644 +--- a/arch/powerpc/kernel/exceptions-64s.S ++++ b/arch/powerpc/kernel/exceptions-64s.S +@@ -270,7 +270,7 @@ BEGIN_FTR_SECTION + END_FTR_SECTION_IFSET(CPU_FTR_CFAR) + .endif + +- ld r10,PACA_EXGEN+EX_CTR(r13) ++ ld r10,IAREA+EX_CTR(r13) + mtctr r10 + BEGIN_FTR_SECTION + ld r10,IAREA+EX_PPR(r13) +@@ -298,7 +298,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) + + .if IKVM_SKIP + 89: mtocrf 0x80,r9 +- ld r10,PACA_EXGEN+EX_CTR(r13) ++ ld r10,IAREA+EX_CTR(r13) + mtctr r10 + ld r9,IAREA+EX_R9(r13) + ld r10,IAREA+EX_R10(r13) +@@ -1117,11 +1117,30 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) + li r10,MSR_RI + mtmsrd r10,1 + ++ /* ++ * Set IRQS_ALL_DISABLED and save PACAIRQHAPPENED (see ++ * system_reset_common) ++ */ ++ li r10,IRQS_ALL_DISABLED ++ stb r10,PACAIRQSOFTMASK(r13) ++ lbz r10,PACAIRQHAPPENED(r13) ++ std r10,RESULT(r1) ++ ori r10,r10,PACA_IRQ_HARD_DIS ++ stb r10,PACAIRQHAPPENED(r13) ++ + addi r3,r1,STACK_FRAME_OVERHEAD + bl machine_check_early + std r3,RESULT(r1) /* Save result */ + ld r12,_MSR(r1) + ++ /* ++ * Restore soft mask settings. ++ */ ++ ld r10,RESULT(r1) ++ stb r10,PACAIRQHAPPENED(r13) ++ ld r10,SOFTE(r1) ++ stb r10,PACAIRQSOFTMASK(r13) ++ + #ifdef CONFIG_PPC_P7_NAP + /* + * Check if thread was in power saving mode. We come here when any +@@ -1225,17 +1244,19 @@ EXC_COMMON_BEGIN(machine_check_idle_common) + bl machine_check_queue_event + + /* +- * We have not used any non-volatile GPRs here, and as a rule +- * most exception code including machine check does not. +- * Therefore PACA_NAPSTATELOST does not need to be set. Idle +- * wakeup will restore volatile registers. ++ * GPR-loss wakeups are relatively straightforward, because the ++ * idle sleep code has saved all non-volatile registers on its ++ * own stack, and r1 in PACAR1. + * +- * Load the original SRR1 into r3 for pnv_powersave_wakeup_mce. ++ * For no-loss wakeups the r1 and lr registers used by the ++ * early machine check handler have to be restored first. r2 is ++ * the kernel TOC, so no need to restore it. + * + * Then decrement MCE nesting after finishing with the stack. + */ + ld r3,_MSR(r1) + ld r4,_LINK(r1) ++ ld r1,GPR1(r1) + + lhz r11,PACA_IN_MCE(r13) + subi r11,r11,1 +@@ -1244,7 +1265,7 @@ EXC_COMMON_BEGIN(machine_check_idle_common) + mtlr r4 + rlwinm r10,r3,47-31,30,31 + cmpwi cr1,r10,2 +- bltlr cr1 /* no state loss, return to idle caller */ ++ bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */ + b idle_return_gpr_loss + #endif + +diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S +index ddfbd02140d9..0e05a9a47a4b 100644 +--- a/arch/powerpc/kernel/head_64.S ++++ b/arch/powerpc/kernel/head_64.S +@@ -947,15 +947,8 @@ start_here_multiplatform: + std r0,0(r4) + #endif + +- /* The following gets the stack set up with the regs */ +- /* pointing to the real addr of the kernel stack. This is */ +- /* all done to support the C function call below which sets */ +- /* up the htab. This is done because we have relocated the */ +- /* kernel but are still running in real mode. */ +- +- LOAD_REG_ADDR(r3,init_thread_union) +- + /* set up a stack pointer */ ++ LOAD_REG_ADDR(r3,init_thread_union) + LOAD_REG_IMMEDIATE(r1,THREAD_SIZE) + add r1,r3,r1 + li r0,0 +diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S +index 073a651787df..905205c79a25 100644 +--- a/arch/powerpc/kernel/head_8xx.S ++++ b/arch/powerpc/kernel/head_8xx.S +@@ -779,10 +779,7 @@ start_here: + initial_mmu: + li r8, 0 + mtspr SPRN_MI_CTR, r8 /* remove PINNED ITLB entries */ +- lis r10, MD_RESETVAL@h +-#ifndef CONFIG_8xx_COPYBACK +- oris r10, r10, MD_WTDEF@h +-#endif ++ lis r10, MD_TWAM@h + mtspr SPRN_MD_CTR, r10 /* remove PINNED DTLB entries */ + + tlbia /* Invalidate all TLB entries */ +@@ -857,17 +854,7 @@ initial_mmu: + mtspr SPRN_DC_CST, r8 + lis r8, IDC_ENABLE@h + mtspr SPRN_IC_CST, r8 +-#ifdef CONFIG_8xx_COPYBACK +- mtspr SPRN_DC_CST, r8 +-#else +- /* For a debug option, I left this here to easily enable +- * the write through cache mode +- */ +- lis r8, DC_SFWT@h + mtspr SPRN_DC_CST, r8 +- lis r8, IDC_ENABLE@h +- mtspr SPRN_DC_CST, r8 +-#endif + /* Disable debug mode entry on breakpoints */ + mfspr r8, SPRN_DER + #ifdef CONFIG_PERF_EVENTS +diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c +index 9c21288f8645..774476be591b 100644 +--- a/arch/powerpc/kernel/process.c ++++ b/arch/powerpc/kernel/process.c +@@ -1241,29 +1241,31 @@ struct task_struct *__switch_to(struct task_struct *prev, + static void show_instructions(struct pt_regs *regs) + { + int i; ++ unsigned long nip = regs->nip; + unsigned long pc = regs->nip - (NR_INSN_TO_PRINT * 3 / 4 * sizeof(int)); + + printk("Instruction dump:"); + ++ /* ++ * If we were executing with the MMU off for instructions, adjust pc ++ * rather than printing XXXXXXXX. ++ */ ++ if (!IS_ENABLED(CONFIG_BOOKE) && !(regs->msr & MSR_IR)) { ++ pc = (unsigned long)phys_to_virt(pc); ++ nip = (unsigned long)phys_to_virt(regs->nip); ++ } ++ + for (i = 0; i < NR_INSN_TO_PRINT; i++) { + int instr; + + if (!(i % 8)) + pr_cont("\n"); + +-#if !defined(CONFIG_BOOKE) +- /* If executing with the IMMU off, adjust pc rather +- * than print XXXXXXXX. +- */ +- if (!(regs->msr & MSR_IR)) +- pc = (unsigned long)phys_to_virt(pc); +-#endif +- + if (!__kernel_text_address(pc) || + probe_kernel_address((const void *)pc, instr)) { + pr_cont("XXXXXXXX "); + } else { +- if (regs->nip == pc) ++ if (nip == pc) + pr_cont("<%08x> ", instr); + else + pr_cont("%08x ", instr); +diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c +index 078fe3d76feb..56da5eb2b923 100644 +--- a/arch/powerpc/kexec/core.c ++++ b/arch/powerpc/kexec/core.c +@@ -115,11 +115,12 @@ void machine_kexec(struct kimage *image) + + void __init reserve_crashkernel(void) + { +- unsigned long long crash_size, crash_base; ++ unsigned long long crash_size, crash_base, total_mem_sz; + int ret; + ++ total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size(); + /* use common parsing */ +- ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(), ++ ret = parse_crashkernel(boot_command_line, total_mem_sz, + &crash_size, &crash_base); + if (ret == 0 && crash_size > 0) { + crashk_res.start = crash_base; +@@ -178,6 +179,7 @@ void __init reserve_crashkernel(void) + /* Crash kernel trumps memory limit */ + if (memory_limit && memory_limit <= crashk_res.end) { + memory_limit = crashk_res.end + 1; ++ total_mem_sz = memory_limit; + printk("Adjusted memory limit for crashkernel, now 0x%llx\n", + memory_limit); + } +@@ -186,7 +188,7 @@ void __init reserve_crashkernel(void) + "for crashkernel (System RAM: %ldMB)\n", + (unsigned long)(crash_size >> 20), + (unsigned long)(crashk_res.start >> 20), +- (unsigned long)(memblock_phys_mem_size() >> 20)); ++ (unsigned long)(total_mem_sz >> 20)); + + if (!memblock_is_region_memory(crashk_res.start, crash_size) || + memblock_reserve(crashk_res.start, crash_size)) { +diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c +index aa12cd4078b3..bc6c1aa3d0e9 100644 +--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c ++++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c +@@ -353,7 +353,13 @@ static struct kmem_cache *kvm_pmd_cache; + + static pte_t *kvmppc_pte_alloc(void) + { +- return kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL); ++ pte_t *pte; ++ ++ pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL); ++ /* pmd_populate() will only reference _pa(pte). */ ++ kmemleak_ignore(pte); ++ ++ return pte; + } + + static void kvmppc_pte_free(pte_t *ptep) +@@ -363,7 +369,13 @@ static void kvmppc_pte_free(pte_t *ptep) + + static pmd_t *kvmppc_pmd_alloc(void) + { +- return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL); ++ pmd_t *pmd; ++ ++ pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL); ++ /* pud_populate() will only reference _pa(pmd). */ ++ kmemleak_ignore(pmd); ++ ++ return pmd; + } + + static void kvmppc_pmd_free(pmd_t *pmdp) +diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c +index 50555ad1db93..1a529df0ab44 100644 +--- a/arch/powerpc/kvm/book3s_64_vio.c ++++ b/arch/powerpc/kvm/book3s_64_vio.c +@@ -73,6 +73,7 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm, + struct kvmppc_spapr_tce_iommu_table *stit, *tmp; + struct iommu_table_group *table_group = NULL; + ++ rcu_read_lock(); + list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) { + + table_group = iommu_group_get_iommudata(grp); +@@ -87,7 +88,9 @@ extern void kvm_spapr_tce_release_iommu_group(struct kvm *kvm, + kref_put(&stit->kref, kvm_spapr_tce_liobn_put); + } + } ++ cond_resched_rcu(); + } ++ rcu_read_unlock(); + } + + extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, +@@ -105,12 +108,14 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, + if (!f.file) + return -EBADF; + ++ rcu_read_lock(); + list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) { + if (stt == f.file->private_data) { + found = true; + break; + } + } ++ rcu_read_unlock(); + + fdput(f); + +@@ -143,6 +148,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, + if (!tbl) + return -EINVAL; + ++ rcu_read_lock(); + list_for_each_entry_rcu(stit, &stt->iommu_tables, next) { + if (tbl != stit->tbl) + continue; +@@ -150,14 +156,17 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm *kvm, int tablefd, + if (!kref_get_unless_zero(&stit->kref)) { + /* stit is being destroyed */ + iommu_tce_table_put(tbl); ++ rcu_read_unlock(); + return -ENOTTY; + } + /* + * The table is already known to this KVM, we just increased + * its KVM reference counter and can return. + */ ++ rcu_read_unlock(); + return 0; + } ++ rcu_read_unlock(); + + stit = kzalloc(sizeof(*stit), GFP_KERNEL); + if (!stit) { +@@ -365,18 +374,19 @@ static long kvmppc_tce_validate(struct kvmppc_spapr_tce_table *stt, + if (kvmppc_tce_to_ua(stt->kvm, tce, &ua)) + return H_TOO_HARD; + ++ rcu_read_lock(); + list_for_each_entry_rcu(stit, &stt->iommu_tables, next) { + unsigned long hpa = 0; + struct mm_iommu_table_group_mem_t *mem; + long shift = stit->tbl->it_page_shift; + + mem = mm_iommu_lookup(stt->kvm->mm, ua, 1ULL << shift); +- if (!mem) +- return H_TOO_HARD; +- +- if (mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) ++ if (!mem || mm_iommu_ua_to_hpa(mem, ua, shift, &hpa)) { ++ rcu_read_unlock(); + return H_TOO_HARD; ++ } + } ++ rcu_read_unlock(); + + return H_SUCCESS; + } +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index 93493f0cbfe8..ee581cde4878 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -1099,9 +1099,14 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu) + ret = kvmppc_h_svm_init_done(vcpu->kvm); + break; + case H_SVM_INIT_ABORT: +- ret = H_UNSUPPORTED; +- if (kvmppc_get_srr1(vcpu) & MSR_S) +- ret = kvmppc_h_svm_init_abort(vcpu->kvm); ++ /* ++ * Even if that call is made by the Ultravisor, the SSR1 value ++ * is the guest context one, with the secure bit clear as it has ++ * not yet been secured. So we can't check it here. ++ * Instead the kvm->arch.secure_guest flag is checked inside ++ * kvmppc_h_svm_init_abort(). ++ */ ++ ret = kvmppc_h_svm_init_abort(vcpu->kvm); + break; + + default: +diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c +index 39ba53ca5bb5..a9b2cbc74797 100644 +--- a/arch/powerpc/mm/book3s32/mmu.c ++++ b/arch/powerpc/mm/book3s32/mmu.c +@@ -187,6 +187,7 @@ void mmu_mark_initmem_nx(void) + int i; + unsigned long base = (unsigned long)_stext - PAGE_OFFSET; + unsigned long top = (unsigned long)_etext - PAGE_OFFSET; ++ unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET; + unsigned long size; + + if (IS_ENABLED(CONFIG_PPC_BOOK3S_601)) +@@ -201,9 +202,10 @@ void mmu_mark_initmem_nx(void) + size = block_size(base, top); + size = max(size, 128UL << 10); + if ((top - base) > size) { +- if (strict_kernel_rwx_enabled()) +- pr_warn("Kernel _etext not properly aligned\n"); + size <<= 1; ++ if (strict_kernel_rwx_enabled() && base + size > border) ++ pr_warn("Some RW data is getting mapped X. " ++ "Adjust CONFIG_DATA_SHIFT to avoid that.\n"); + } + setibat(i++, PAGE_OFFSET + base, base, size, PAGE_KERNEL_TEXT); + base += size; +diff --git a/arch/powerpc/mm/book3s64/radix_tlb.c b/arch/powerpc/mm/book3s64/radix_tlb.c +index 758ade2c2b6e..b5cc9b23cf02 100644 +--- a/arch/powerpc/mm/book3s64/radix_tlb.c ++++ b/arch/powerpc/mm/book3s64/radix_tlb.c +@@ -884,9 +884,7 @@ is_local: + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) { + hstart = (start + PMD_SIZE - 1) & PMD_MASK; + hend = end & PMD_MASK; +- if (hstart == hend) +- hflush = false; +- else ++ if (hstart < hend) + hflush = true; + } + +diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c +index 59e49c0e8154..b7c287adfd59 100644 +--- a/arch/powerpc/mm/kasan/kasan_init_32.c ++++ b/arch/powerpc/mm/kasan/kasan_init_32.c +@@ -76,15 +76,14 @@ static int __init kasan_init_region(void *start, size_t size) + return ret; + + block = memblock_alloc(k_end - k_start, PAGE_SIZE); ++ if (!block) ++ return -ENOMEM; + + for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) { + pmd_t *pmd = pmd_ptr_k(k_cur); + void *va = block + k_cur - k_start; + pte_t pte = pfn_pte(PHYS_PFN(__pa(va)), PAGE_KERNEL); + +- if (!va) +- return -ENOMEM; +- + __set_pte_at(&init_mm, k_cur, pte_offset_kernel(pmd, k_cur), pte, 0); + } + flush_tlb_kernel_range(k_start, k_end); +diff --git a/arch/powerpc/mm/ptdump/shared.c b/arch/powerpc/mm/ptdump/shared.c +index f7ed2f187cb0..784f8df17f73 100644 +--- a/arch/powerpc/mm/ptdump/shared.c ++++ b/arch/powerpc/mm/ptdump/shared.c +@@ -30,6 +30,11 @@ static const struct flag_info flag_array[] = { + .val = _PAGE_PRESENT, + .set = "present", + .clear = " ", ++ }, { ++ .mask = _PAGE_COHERENT, ++ .val = _PAGE_COHERENT, ++ .set = "coherent", ++ .clear = " ", + }, { + .mask = _PAGE_GUARDED, + .val = _PAGE_GUARDED, +diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c +index 573e0b309c0c..48e8f4b17b91 100644 +--- a/arch/powerpc/perf/hv-24x7.c ++++ b/arch/powerpc/perf/hv-24x7.c +@@ -1400,16 +1400,6 @@ static void h_24x7_event_read(struct perf_event *event) + h24x7hw = &get_cpu_var(hv_24x7_hw); + h24x7hw->events[i] = event; + put_cpu_var(h24x7hw); +- /* +- * Clear the event count so we can compute the _change_ +- * in the 24x7 raw counter value at the end of the txn. +- * +- * Note that we could alternatively read the 24x7 value +- * now and save its value in event->hw.prev_count. But +- * that would require issuing a hcall, which would then +- * defeat the purpose of using the txn interface. +- */ +- local64_set(&event->count, 0); + } + + put_cpu_var(hv_24x7_reqb); +diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c +index e6e2adcc7b64..c13d64c3b019 100644 +--- a/arch/powerpc/platforms/4xx/pci.c ++++ b/arch/powerpc/platforms/4xx/pci.c +@@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port) + if (mbase == NULL) { + printk(KERN_ERR "%pOF: Can't map internal config space !", + port->node); +- goto done; ++ return; + } + + while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA) +@@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port) + } + if (attempt) + port->link = 1; +-done: + iounmap(mbase); +- + } + + static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = { +diff --git a/arch/powerpc/platforms/8xx/Kconfig b/arch/powerpc/platforms/8xx/Kconfig +index e0fe670f06f6..b37de62d7e7f 100644 +--- a/arch/powerpc/platforms/8xx/Kconfig ++++ b/arch/powerpc/platforms/8xx/Kconfig +@@ -98,15 +98,6 @@ menu "MPC8xx CPM Options" + # 8xx specific questions. + comment "Generic MPC8xx Options" + +-config 8xx_COPYBACK +- bool "Copy-Back Data Cache (else Writethrough)" +- help +- Saying Y here will cause the cache on an MPC8xx processor to be used +- in Copy-Back mode. If you say N here, it is used in Writethrough +- mode. +- +- If in doubt, say Y here. +- + config 8xx_GPIO + bool "GPIO API Support" + select GPIOLIB +diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c +index 2b3dfd0b6cdd..d95954ad4c0a 100644 +--- a/arch/powerpc/platforms/powernv/opal.c ++++ b/arch/powerpc/platforms/powernv/opal.c +@@ -811,6 +811,10 @@ static int opal_add_one_export(struct kobject *parent, const char *export_name, + goto out; + + attr = kzalloc(sizeof(*attr), GFP_KERNEL); ++ if (!attr) { ++ rc = -ENOMEM; ++ goto out; ++ } + name = kstrdup(export_name, GFP_KERNEL); + if (!name) { + rc = -ENOMEM; +diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c +index 423be34f0f5f..f42fe4e86ce5 100644 +--- a/arch/powerpc/platforms/ps3/mm.c ++++ b/arch/powerpc/platforms/ps3/mm.c +@@ -200,13 +200,14 @@ void ps3_mm_vas_destroy(void) + { + int result; + +- DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id); +- + if (map.vas_id) { + result = lv1_select_virtual_address_space(0); +- BUG_ON(result); +- result = lv1_destruct_virtual_address_space(map.vas_id); +- BUG_ON(result); ++ result += lv1_destruct_virtual_address_space(map.vas_id); ++ ++ if (result) { ++ lv1_panic(0); ++ } ++ + map.vas_id = 0; + } + } +@@ -304,19 +305,20 @@ static void ps3_mm_region_destroy(struct mem_region *r) + int result; + + if (!r->destroy) { +- pr_info("%s:%d: Not destroying high region: %llxh %llxh\n", +- __func__, __LINE__, r->base, r->size); + return; + } + +- DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base); +- + if (r->base) { + result = lv1_release_memory(r->base); +- BUG_ON(result); ++ ++ if (result) { ++ lv1_panic(0); ++ } ++ + r->size = r->base = r->offset = 0; + map.total = map.rm.size; + } ++ + ps3_mm_set_repository_highmem(NULL); + } + +diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c +index 1d1da639b8b7..16ba5c542e55 100644 +--- a/arch/powerpc/platforms/pseries/ras.c ++++ b/arch/powerpc/platforms/pseries/ras.c +@@ -395,10 +395,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id) + /* + * Some versions of FWNMI place the buffer inside the 4kB page starting at + * 0x7000. Other versions place it inside the rtas buffer. We check both. ++ * Minimum size of the buffer is 16 bytes. + */ + #define VALID_FWNMI_BUFFER(A) \ +- ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \ +- (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16)))) ++ ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \ ++ (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16)))) + + static inline struct rtas_error_log *fwnmi_get_errlog(void) + { +diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig +index 2167bce993ff..ae01be202204 100644 +--- a/arch/s390/Kconfig ++++ b/arch/s390/Kconfig +@@ -462,6 +462,7 @@ config NUMA + + config NODES_SHIFT + int ++ depends on NEED_MULTIPLE_NODES + default "1" + + config SCHED_SMT +diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h +index f073292e9fdb..d9d5de0f67ff 100644 +--- a/arch/s390/include/asm/syscall.h ++++ b/arch/s390/include/asm/syscall.h +@@ -33,7 +33,17 @@ static inline void syscall_rollback(struct task_struct *task, + static inline long syscall_get_error(struct task_struct *task, + struct pt_regs *regs) + { +- return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0; ++ unsigned long error = regs->gprs[2]; ++#ifdef CONFIG_COMPAT ++ if (test_tsk_thread_flag(task, TIF_31BIT)) { ++ /* ++ * Sign-extend the value so (int)-EFOO becomes (long)-EFOO ++ * and will match correctly in comparisons. ++ */ ++ error = (long)(int)error; ++ } ++#endif ++ return IS_ERR_VALUE(error) ? error : 0; + } + + static inline long syscall_get_return_value(struct task_struct *task, +diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h +index 39c9ead489e5..b42228906eaf 100644 +--- a/arch/sh/include/asm/io.h ++++ b/arch/sh/include/asm/io.h +@@ -328,7 +328,7 @@ __ioremap_mode(phys_addr_t offset, unsigned long size, pgprot_t prot) + #else + #define __ioremap(offset, size, prot) ((void __iomem *)(offset)) + #define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset)) +-#define iounmap(addr) do { } while (0) ++static inline void iounmap(void __iomem *addr) {} + #endif /* CONFIG_MMU */ + + static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size) +diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c +index a8c2f2615fc6..ecc9e8786d57 100644 +--- a/arch/sparc/mm/srmmu.c ++++ b/arch/sparc/mm/srmmu.c +@@ -383,7 +383,6 @@ pgtable_t pte_alloc_one(struct mm_struct *mm) + return NULL; + page = pfn_to_page(__nocache_pa(pte) >> PAGE_SHIFT); + if (!pgtable_pte_page_ctor(page)) { +- __free_page(page); + return NULL; + } + return page; +diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile +index a290821e355c..2a249f619467 100644 +--- a/arch/um/drivers/Makefile ++++ b/arch/um/drivers/Makefile +@@ -18,9 +18,9 @@ ubd-objs := ubd_kern.o ubd_user.o + port-objs := port_kern.o port_user.o + harddog-objs := harddog_kern.o harddog_user.o + +-LDFLAGS_pcap.o := -r $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a) ++LDFLAGS_pcap.o = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a) + +-LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) ++LDFLAGS_vde.o = $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) + + targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o + +diff --git a/arch/unicore32/lib/Makefile b/arch/unicore32/lib/Makefile +index 098981a01841..5af06645b8f0 100644 +--- a/arch/unicore32/lib/Makefile ++++ b/arch/unicore32/lib/Makefile +@@ -10,12 +10,12 @@ lib-y += strncpy_from_user.o strnlen_user.o + lib-y += clear_user.o copy_page.o + lib-y += copy_from_user.o copy_to_user.o + +-GNU_LIBC_A := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a) ++GNU_LIBC_A = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a) + GNU_LIBC_A_OBJS := memchr.o memcpy.o memmove.o memset.o + GNU_LIBC_A_OBJS += strchr.o strrchr.o + GNU_LIBC_A_OBJS += rawmemchr.o # needed by strrchr.o + +-GNU_LIBGCC_A := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a) ++GNU_LIBGCC_A = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a) + GNU_LIBGCC_A_OBJS := _ashldi3.o _ashrdi3.o _lshrdi3.o + GNU_LIBGCC_A_OBJS += _divsi3.o _modsi3.o _ucmpdi2.o _umodsi3.o _udivsi3.o + +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index e53dda210cd7..21d2f1de1057 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -2093,7 +2093,7 @@ void __init init_apic_mappings(void) + unsigned int new_apicid; + + if (apic_validate_deadline_timer()) +- pr_debug("TSC deadline timer available\n"); ++ pr_info("TSC deadline timer available\n"); + + if (x2apic_mode) { + boot_cpu_physical_apicid = read_apic_id(); +diff --git a/arch/x86/kernel/cpu/mce/dev-mcelog.c b/arch/x86/kernel/cpu/mce/dev-mcelog.c +index d089567a9ce8..bcb379b2fd42 100644 +--- a/arch/x86/kernel/cpu/mce/dev-mcelog.c ++++ b/arch/x86/kernel/cpu/mce/dev-mcelog.c +@@ -343,7 +343,7 @@ static __init int dev_mcelog_init_device(void) + if (!mcelog) + return -ENOMEM; + +- strncpy(mcelog->signature, MCE_LOG_SIGNATURE, sizeof(mcelog->signature)); ++ memcpy(mcelog->signature, MCE_LOG_SIGNATURE, sizeof(mcelog->signature)); + mcelog->len = mce_log_len; + mcelog->recordlen = sizeof(struct mce); + +diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c +index 87ef69a72c52..7bb4c3cbf4dc 100644 +--- a/arch/x86/kernel/idt.c ++++ b/arch/x86/kernel/idt.c +@@ -318,7 +318,11 @@ void __init idt_setup_apic_and_irq_gates(void) + + #ifdef CONFIG_X86_LOCAL_APIC + for_each_clear_bit_from(i, system_vectors, NR_VECTORS) { +- set_bit(i, system_vectors); ++ /* ++ * Don't set the non assigned system vectors in the ++ * system_vectors bitmap. Otherwise they show up in ++ * /proc/interrupts. ++ */ + entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR); + set_intr_gate(i, entry); + } +diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c +index 4d7022a740ab..a12adbe1559d 100644 +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -753,16 +753,11 @@ asm( + NOKPROBE_SYMBOL(kretprobe_trampoline); + STACK_FRAME_NON_STANDARD(kretprobe_trampoline); + +-static struct kprobe kretprobe_kprobe = { +- .addr = (void *)kretprobe_trampoline, +-}; +- + /* + * Called from kretprobe_trampoline + */ + __used __visible void *trampoline_handler(struct pt_regs *regs) + { +- struct kprobe_ctlblk *kcb; + struct kretprobe_instance *ri = NULL; + struct hlist_head *head, empty_rp; + struct hlist_node *tmp; +@@ -772,16 +767,12 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) + void *frame_pointer; + bool skipped = false; + +- preempt_disable(); +- + /* + * Set a dummy kprobe for avoiding kretprobe recursion. + * Since kretprobe never run in kprobe handler, kprobe must not + * be running at this point. + */ +- kcb = get_kprobe_ctlblk(); +- __this_cpu_write(current_kprobe, &kretprobe_kprobe); +- kcb->kprobe_status = KPROBE_HIT_ACTIVE; ++ kprobe_busy_begin(); + + INIT_HLIST_HEAD(&empty_rp); + kretprobe_hash_lock(current, &head, &flags); +@@ -857,7 +848,7 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) + __this_cpu_write(current_kprobe, &ri->rp->kp); + ri->ret_addr = correct_ret_addr; + ri->rp->handler(ri, regs); +- __this_cpu_write(current_kprobe, &kretprobe_kprobe); ++ __this_cpu_write(current_kprobe, &kprobe_busy); + } + + recycle_rp_inst(ri, &empty_rp); +@@ -873,8 +864,7 @@ __used __visible void *trampoline_handler(struct pt_regs *regs) + + kretprobe_hash_unlock(current, &flags); + +- __this_cpu_write(current_kprobe, NULL); +- preempt_enable(); ++ kprobe_busy_end(); + + hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) { + hlist_del(&ri->hlist); +diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile +index fb4ee5444379..9733d1cc791d 100644 +--- a/arch/x86/purgatory/Makefile ++++ b/arch/x86/purgatory/Makefile +@@ -17,7 +17,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS + LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib + targets += purgatory.ro + ++# Sanitizer, etc. runtimes are unavailable and cannot be linked here. ++GCOV_PROFILE := n + KASAN_SANITIZE := n ++UBSAN_SANITIZE := n + KCOV_INSTRUMENT := n + + # These are adjustments to the compiler flags used for objects that +@@ -25,7 +28,7 @@ KCOV_INSTRUMENT := n + + PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel + PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss +-PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) ++PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING + + # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That + # in turn leaves some undefined symbols like __fentry__ in purgatory and not +diff --git a/crypto/algboss.c b/crypto/algboss.c +index 535f1f87e6c1..5ebccbd6b74e 100644 +--- a/crypto/algboss.c ++++ b/crypto/algboss.c +@@ -178,8 +178,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval) + if (IS_ERR(thread)) + goto err_put_larval; + +- wait_for_completion_interruptible(&larval->completion); +- + return NOTIFY_STOP; + + err_put_larval: +diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c +index e2c8ab408bed..4c3bdffe0c3a 100644 +--- a/crypto/algif_skcipher.c ++++ b/crypto/algif_skcipher.c +@@ -74,14 +74,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, + return PTR_ERR(areq); + + /* convert iovecs of output buffers into RX SGL */ +- err = af_alg_get_rsgl(sk, msg, flags, areq, -1, &len); ++ err = af_alg_get_rsgl(sk, msg, flags, areq, ctx->used, &len); + if (err) + goto free; + +- /* Process only as much RX buffers for which we have TX data */ +- if (len > ctx->used) +- len = ctx->used; +- + /* + * If more buffers are to be expected to be processed, process only + * full block size buffers. +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index beca5f91bb4c..e74c8fe2a5fd 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -42,7 +42,6 @@ + #include <linux/workqueue.h> + #include <linux/scatterlist.h> + #include <linux/io.h> +-#include <linux/async.h> + #include <linux/log2.h> + #include <linux/slab.h> + #include <linux/glob.h> +@@ -5778,7 +5777,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) + /* perform each probe asynchronously */ + for (i = 0; i < host->n_ports; i++) { + struct ata_port *ap = host->ports[i]; +- async_schedule(async_port_probe, ap); ++ ap->cookie = async_schedule(async_port_probe, ap); + } + + return 0; +@@ -5920,11 +5919,11 @@ void ata_host_detach(struct ata_host *host) + { + int i; + +- /* Ensure ata_port probe has completed */ +- async_synchronize_full(); +- +- for (i = 0; i < host->n_ports; i++) ++ for (i = 0; i < host->n_ports; i++) { ++ /* Ensure ata_port probe has completed */ ++ async_synchronize_cookie(host->ports[i]->cookie + 1); + ata_port_detach(host->ports[i]); ++ } + + /* the host is dead now, dissociate ACPI */ + ata_acpi_dissociate(host); +diff --git a/drivers/base/platform.c b/drivers/base/platform.c +index b27d0f6c18c9..f5d485166fd3 100644 +--- a/drivers/base/platform.c ++++ b/drivers/base/platform.c +@@ -851,6 +851,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv, + /* temporary section violation during probe() */ + drv->probe = probe; + retval = code = __platform_driver_register(drv, module); ++ if (retval) ++ return retval; + + /* + * Fixup that section violation, being paranoid about code scanning +diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c +index c5c6487a19d5..7b55811c2a81 100644 +--- a/drivers/block/ps3disk.c ++++ b/drivers/block/ps3disk.c +@@ -454,7 +454,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev) + queue->queuedata = dev; + + blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9); +- blk_queue_segment_boundary(queue, -1UL); + blk_queue_dma_alignment(queue, dev->blk_size-1); + blk_queue_logical_block_size(queue, dev->blk_size); + +diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c +index 97e06cc586e4..8be3d0fb0614 100644 +--- a/drivers/bus/mhi/core/main.c ++++ b/drivers/bus/mhi/core/main.c +@@ -513,7 +513,10 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, + mhi_cntrl->unmap_single(mhi_cntrl, buf_info); + + result.buf_addr = buf_info->cb_buf; +- result.bytes_xferd = xfer_len; ++ ++ /* truncate to buf len if xfer_len is larger */ ++ result.bytes_xferd = ++ min_t(u16, xfer_len, buf_info->len); + mhi_del_ring_element(mhi_cntrl, buf_ring); + mhi_del_ring_element(mhi_cntrl, tre_ring); + local_rp = tre_ring->rp; +@@ -597,7 +600,9 @@ static int parse_rsc_event(struct mhi_controller *mhi_cntrl, + + result.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ? + -EOVERFLOW : 0; +- result.bytes_xferd = xfer_len; ++ ++ /* truncate to buf len if xfer_len is larger */ ++ result.bytes_xferd = min_t(u16, xfer_len, buf_info->len); + result.buf_addr = buf_info->cb_buf; + result.dir = mhi_chan->dir; + +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index c48d8f086382..9afd220cd824 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -33,6 +33,7 @@ + #include <linux/workqueue.h> + #include <linux/uuid.h> + #include <linux/nospec.h> ++#include <linux/vmalloc.h> + + #define IPMI_DRIVER_VERSION "39.2" + +@@ -1153,7 +1154,7 @@ static void free_user_work(struct work_struct *work) + remove_work); + + cleanup_srcu_struct(&user->release_barrier); +- kfree(user); ++ vfree(user); + } + + int ipmi_create_user(unsigned int if_num, +@@ -1185,7 +1186,7 @@ int ipmi_create_user(unsigned int if_num, + if (rv) + return rv; + +- new_user = kmalloc(sizeof(*new_user), GFP_KERNEL); ++ new_user = vzalloc(sizeof(*new_user)); + if (!new_user) + return -ENOMEM; + +@@ -1232,7 +1233,7 @@ int ipmi_create_user(unsigned int if_num, + + out_kfree: + srcu_read_unlock(&ipmi_interfaces_srcu, index); +- kfree(new_user); ++ vfree(new_user); + return rv; + } + EXPORT_SYMBOL(ipmi_create_user); +diff --git a/drivers/char/mem.c b/drivers/char/mem.c +index 43dd0891ca1e..31cae88a730b 100644 +--- a/drivers/char/mem.c ++++ b/drivers/char/mem.c +@@ -31,11 +31,15 @@ + #include <linux/uio.h> + #include <linux/uaccess.h> + #include <linux/security.h> ++#include <linux/pseudo_fs.h> ++#include <uapi/linux/magic.h> ++#include <linux/mount.h> + + #ifdef CONFIG_IA64 + # include <linux/efi.h> + #endif + ++#define DEVMEM_MINOR 1 + #define DEVPORT_MINOR 4 + + static inline unsigned long size_inside_page(unsigned long start, +@@ -805,12 +809,64 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig) + return ret; + } + ++static struct inode *devmem_inode; ++ ++#ifdef CONFIG_IO_STRICT_DEVMEM ++void revoke_devmem(struct resource *res) ++{ ++ struct inode *inode = READ_ONCE(devmem_inode); ++ ++ /* ++ * Check that the initialization has completed. Losing the race ++ * is ok because it means drivers are claiming resources before ++ * the fs_initcall level of init and prevent /dev/mem from ++ * establishing mappings. ++ */ ++ if (!inode) ++ return; ++ ++ /* ++ * The expectation is that the driver has successfully marked ++ * the resource busy by this point, so devmem_is_allowed() ++ * should start returning false, however for performance this ++ * does not iterate the entire resource range. ++ */ ++ if (devmem_is_allowed(PHYS_PFN(res->start)) && ++ devmem_is_allowed(PHYS_PFN(res->end))) { ++ /* ++ * *cringe* iomem=relaxed says "go ahead, what's the ++ * worst that can happen?" ++ */ ++ return; ++ } ++ ++ unmap_mapping_range(inode->i_mapping, res->start, resource_size(res), 1); ++} ++#endif ++ + static int open_port(struct inode *inode, struct file *filp) + { ++ int rc; ++ + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + +- return security_locked_down(LOCKDOWN_DEV_MEM); ++ rc = security_locked_down(LOCKDOWN_DEV_MEM); ++ if (rc) ++ return rc; ++ ++ if (iminor(inode) != DEVMEM_MINOR) ++ return 0; ++ ++ /* ++ * Use a unified address space to have a single point to manage ++ * revocations when drivers want to take over a /dev/mem mapped ++ * range. ++ */ ++ inode->i_mapping = devmem_inode->i_mapping; ++ filp->f_mapping = inode->i_mapping; ++ ++ return 0; + } + + #define zero_lseek null_lseek +@@ -885,7 +941,7 @@ static const struct memdev { + fmode_t fmode; + } devlist[] = { + #ifdef CONFIG_DEVMEM +- [1] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET }, ++ [DEVMEM_MINOR] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET }, + #endif + #ifdef CONFIG_DEVKMEM + [2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET }, +@@ -939,6 +995,45 @@ static char *mem_devnode(struct device *dev, umode_t *mode) + + static struct class *mem_class; + ++static int devmem_fs_init_fs_context(struct fs_context *fc) ++{ ++ return init_pseudo(fc, DEVMEM_MAGIC) ? 0 : -ENOMEM; ++} ++ ++static struct file_system_type devmem_fs_type = { ++ .name = "devmem", ++ .owner = THIS_MODULE, ++ .init_fs_context = devmem_fs_init_fs_context, ++ .kill_sb = kill_anon_super, ++}; ++ ++static int devmem_init_inode(void) ++{ ++ static struct vfsmount *devmem_vfs_mount; ++ static int devmem_fs_cnt; ++ struct inode *inode; ++ int rc; ++ ++ rc = simple_pin_fs(&devmem_fs_type, &devmem_vfs_mount, &devmem_fs_cnt); ++ if (rc < 0) { ++ pr_err("Cannot mount /dev/mem pseudo filesystem: %d\n", rc); ++ return rc; ++ } ++ ++ inode = alloc_anon_inode(devmem_vfs_mount->mnt_sb); ++ if (IS_ERR(inode)) { ++ rc = PTR_ERR(inode); ++ pr_err("Cannot allocate inode for /dev/mem: %d\n", rc); ++ simple_release_fs(&devmem_vfs_mount, &devmem_fs_cnt); ++ return rc; ++ } ++ ++ /* publish /dev/mem initialized */ ++ WRITE_ONCE(devmem_inode, inode); ++ ++ return 0; ++} ++ + static int __init chr_dev_init(void) + { + int minor; +@@ -960,6 +1055,8 @@ static int __init chr_dev_init(void) + */ + if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) + continue; ++ if ((minor == DEVMEM_MINOR) && devmem_init_inode() != 0) ++ continue; + + device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), + NULL, devlist[minor].name); +diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile +index f4169cc2fd31..60e811d3f226 100644 +--- a/drivers/clk/Makefile ++++ b/drivers/clk/Makefile +@@ -105,7 +105,7 @@ obj-$(CONFIG_CLK_SIFIVE) += sifive/ + obj-$(CONFIG_ARCH_SIRF) += sirf/ + obj-$(CONFIG_ARCH_SOCFPGA) += socfpga/ + obj-$(CONFIG_PLAT_SPEAR) += spear/ +-obj-$(CONFIG_ARCH_SPRD) += sprd/ ++obj-y += sprd/ + obj-$(CONFIG_ARCH_STI) += st/ + obj-$(CONFIG_ARCH_STRATIX10) += socfpga/ + obj-$(CONFIG_ARCH_SUNXI) += sunxi/ +diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c +index ded13ccf768e..7c845c293af0 100644 +--- a/drivers/clk/bcm/clk-bcm2835.c ++++ b/drivers/clk/bcm/clk-bcm2835.c +@@ -1448,13 +1448,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, + return &clock->hw; + } + +-static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, ++static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman, + const struct bcm2835_gate_data *data) + { +- return clk_register_gate(cprman->dev, data->name, data->parent, +- CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, +- cprman->regs + data->ctl_reg, +- CM_GATE_BIT, 0, &cprman->regs_lock); ++ return clk_hw_register_gate(cprman->dev, data->name, data->parent, ++ CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, ++ cprman->regs + data->ctl_reg, ++ CM_GATE_BIT, 0, &cprman->regs_lock); + } + + typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, +diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c +index 392d01705b97..99afc949925f 100644 +--- a/drivers/clk/clk-ast2600.c ++++ b/drivers/clk/clk-ast2600.c +@@ -642,14 +642,22 @@ static const u32 ast2600_a0_axi_ahb_div_table[] = { + 2, 2, 3, 5, + }; + +-static const u32 ast2600_a1_axi_ahb_div_table[] = { +- 4, 6, 2, 4, ++static const u32 ast2600_a1_axi_ahb_div0_tbl[] = { ++ 3, 2, 3, 4, ++}; ++ ++static const u32 ast2600_a1_axi_ahb_div1_tbl[] = { ++ 3, 4, 6, 8, ++}; ++ ++static const u32 ast2600_a1_axi_ahb200_tbl[] = { ++ 3, 4, 3, 4, 2, 2, 2, 2, + }; + + static void __init aspeed_g6_cc(struct regmap *map) + { + struct clk_hw *hw; +- u32 val, div, chip_id, axi_div, ahb_div; ++ u32 val, div, divbits, chip_id, axi_div, ahb_div; + + clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000); + +@@ -679,11 +687,22 @@ static void __init aspeed_g6_cc(struct regmap *map) + else + axi_div = 2; + ++ divbits = (val >> 11) & 0x3; + regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id); +- if (chip_id & BIT(16)) +- ahb_div = ast2600_a1_axi_ahb_div_table[(val >> 11) & 0x3]; +- else ++ if (chip_id & BIT(16)) { ++ if (!divbits) { ++ ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3]; ++ if (val & BIT(16)) ++ ahb_div *= 2; ++ } else { ++ if (val & BIT(16)) ++ ahb_div = ast2600_a1_axi_ahb_div1_tbl[divbits]; ++ else ++ ahb_div = ast2600_a1_axi_ahb_div0_tbl[divbits]; ++ } ++ } else { + ahb_div = ast2600_a0_axi_ahb_div_table[(val >> 11) & 0x3]; ++ } + + hw = clk_hw_register_fixed_factor(NULL, "ahb", "hpll", 0, 1, axi_div * ahb_div); + aspeed_g6_clk_data->hws[ASPEED_CLK_AHB] = hw; +diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c +index 34a70c4b4899..11f6b868cf2b 100644 +--- a/drivers/clk/meson/meson8b.c ++++ b/drivers/clk/meson/meson8b.c +@@ -1077,7 +1077,7 @@ static struct clk_regmap meson8b_vid_pll_in_sel = { + * Meson8m2: vid2_pll + */ + .parent_hws = (const struct clk_hw *[]) { +- &meson8b_hdmi_pll_dco.hw ++ &meson8b_hdmi_pll_lvds_out.hw + }, + .num_parents = 1, + .flags = CLK_SET_RATE_PARENT, +@@ -1213,7 +1213,7 @@ static struct clk_regmap meson8b_vclk_in_en = { + + static struct clk_regmap meson8b_vclk_div1_gate = { + .data = &(struct clk_regmap_gate_data){ +- .offset = HHI_VID_CLK_DIV, ++ .offset = HHI_VID_CLK_CNTL, + .bit_idx = 0, + }, + .hw.init = &(struct clk_init_data){ +@@ -1243,7 +1243,7 @@ static struct clk_fixed_factor meson8b_vclk_div2_div = { + + static struct clk_regmap meson8b_vclk_div2_div_gate = { + .data = &(struct clk_regmap_gate_data){ +- .offset = HHI_VID_CLK_DIV, ++ .offset = HHI_VID_CLK_CNTL, + .bit_idx = 1, + }, + .hw.init = &(struct clk_init_data){ +@@ -1273,7 +1273,7 @@ static struct clk_fixed_factor meson8b_vclk_div4_div = { + + static struct clk_regmap meson8b_vclk_div4_div_gate = { + .data = &(struct clk_regmap_gate_data){ +- .offset = HHI_VID_CLK_DIV, ++ .offset = HHI_VID_CLK_CNTL, + .bit_idx = 2, + }, + .hw.init = &(struct clk_init_data){ +@@ -1303,7 +1303,7 @@ static struct clk_fixed_factor meson8b_vclk_div6_div = { + + static struct clk_regmap meson8b_vclk_div6_div_gate = { + .data = &(struct clk_regmap_gate_data){ +- .offset = HHI_VID_CLK_DIV, ++ .offset = HHI_VID_CLK_CNTL, + .bit_idx = 3, + }, + .hw.init = &(struct clk_init_data){ +@@ -1333,7 +1333,7 @@ static struct clk_fixed_factor meson8b_vclk_div12_div = { + + static struct clk_regmap meson8b_vclk_div12_div_gate = { + .data = &(struct clk_regmap_gate_data){ +- .offset = HHI_VID_CLK_DIV, ++ .offset = HHI_VID_CLK_CNTL, + .bit_idx = 4, + }, + .hw.init = &(struct clk_init_data){ +@@ -1918,6 +1918,13 @@ static struct clk_regmap meson8b_mali = { + }, + }; + ++static const struct reg_sequence meson8m2_gp_pll_init_regs[] = { ++ { .reg = HHI_GP_PLL_CNTL2, .def = 0x59c88000 }, ++ { .reg = HHI_GP_PLL_CNTL3, .def = 0xca463823 }, ++ { .reg = HHI_GP_PLL_CNTL4, .def = 0x0286a027 }, ++ { .reg = HHI_GP_PLL_CNTL5, .def = 0x00003000 }, ++}; ++ + static const struct pll_params_table meson8m2_gp_pll_params_table[] = { + PLL_PARAMS(182, 3), + { /* sentinel */ }, +@@ -1951,6 +1958,8 @@ static struct clk_regmap meson8m2_gp_pll_dco = { + .width = 1, + }, + .table = meson8m2_gp_pll_params_table, ++ .init_regs = meson8m2_gp_pll_init_regs, ++ .init_count = ARRAY_SIZE(meson8m2_gp_pll_init_regs), + }, + .hw.init = &(struct clk_init_data){ + .name = "gp_pll_dco", +@@ -3506,54 +3515,87 @@ static struct clk_regmap *const meson8b_clk_regmaps[] = { + static const struct meson8b_clk_reset_line { + u32 reg; + u8 bit_idx; ++ bool active_low; + } meson8b_clk_reset_bits[] = { + [CLKC_RESET_L2_CACHE_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 30 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 30, ++ .active_low = false, + }, + [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 29 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 29, ++ .active_low = false, + }, + [CLKC_RESET_SCU_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 28 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 28, ++ .active_low = false, + }, + [CLKC_RESET_CPU3_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 27 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 27, ++ .active_low = false, + }, + [CLKC_RESET_CPU2_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 26 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 26, ++ .active_low = false, + }, + [CLKC_RESET_CPU1_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 25 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 25, ++ .active_low = false, + }, + [CLKC_RESET_CPU0_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 24 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 24, ++ .active_low = false, + }, + [CLKC_RESET_A5_GLOBAL_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 18 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 18, ++ .active_low = false, + }, + [CLKC_RESET_A5_AXI_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 17 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 17, ++ .active_low = false, + }, + [CLKC_RESET_A5_ABP_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL0, .bit_idx = 16 ++ .reg = HHI_SYS_CPU_CLK_CNTL0, ++ .bit_idx = 16, ++ .active_low = false, + }, + [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = { +- .reg = HHI_SYS_CPU_CLK_CNTL1, .bit_idx = 30 ++ .reg = HHI_SYS_CPU_CLK_CNTL1, ++ .bit_idx = 30, ++ .active_low = false, + }, + [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = { +- .reg = HHI_VID_CLK_CNTL, .bit_idx = 15 ++ .reg = HHI_VID_CLK_CNTL, ++ .bit_idx = 15, ++ .active_low = false, + }, + [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = { +- .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 7 ++ .reg = HHI_VID_DIVIDER_CNTL, ++ .bit_idx = 7, ++ .active_low = false, + }, + [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = { +- .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 3 ++ .reg = HHI_VID_DIVIDER_CNTL, ++ .bit_idx = 3, ++ .active_low = false, + }, + [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = { +- .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 1 ++ .reg = HHI_VID_DIVIDER_CNTL, ++ .bit_idx = 1, ++ .active_low = true, + }, + [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = { +- .reg = HHI_VID_DIVIDER_CNTL, .bit_idx = 0 ++ .reg = HHI_VID_DIVIDER_CNTL, ++ .bit_idx = 0, ++ .active_low = true, + }, + }; + +@@ -3562,22 +3604,22 @@ static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev, + { + struct meson8b_clk_reset *meson8b_clk_reset = + container_of(rcdev, struct meson8b_clk_reset, reset); +- unsigned long flags; + const struct meson8b_clk_reset_line *reset; ++ unsigned int value = 0; ++ unsigned long flags; + + if (id >= ARRAY_SIZE(meson8b_clk_reset_bits)) + return -EINVAL; + + reset = &meson8b_clk_reset_bits[id]; + ++ if (assert != reset->active_low) ++ value = BIT(reset->bit_idx); ++ + spin_lock_irqsave(&meson_clk_lock, flags); + +- if (assert) +- regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, +- BIT(reset->bit_idx), BIT(reset->bit_idx)); +- else +- regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, +- BIT(reset->bit_idx), 0); ++ regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, ++ BIT(reset->bit_idx), value); + + spin_unlock_irqrestore(&meson_clk_lock, flags); + +diff --git a/drivers/clk/meson/meson8b.h b/drivers/clk/meson/meson8b.h +index c889fbeec30f..c91fb07fcb65 100644 +--- a/drivers/clk/meson/meson8b.h ++++ b/drivers/clk/meson/meson8b.h +@@ -20,6 +20,10 @@ + * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf + */ + #define HHI_GP_PLL_CNTL 0x40 /* 0x10 offset in data sheet */ ++#define HHI_GP_PLL_CNTL2 0x44 /* 0x11 offset in data sheet */ ++#define HHI_GP_PLL_CNTL3 0x48 /* 0x12 offset in data sheet */ ++#define HHI_GP_PLL_CNTL4 0x4C /* 0x13 offset in data sheet */ ++#define HHI_GP_PLL_CNTL5 0x50 /* 0x14 offset in data sheet */ + #define HHI_VIID_CLK_DIV 0x128 /* 0x4a offset in data sheet */ + #define HHI_VIID_CLK_CNTL 0x12c /* 0x4b offset in data sheet */ + #define HHI_GCLK_MPEG0 0x140 /* 0x50 offset in data sheet */ +diff --git a/drivers/clk/qcom/gcc-msm8916.c b/drivers/clk/qcom/gcc-msm8916.c +index 4e329a7baf2b..17e4a5a2a9fd 100644 +--- a/drivers/clk/qcom/gcc-msm8916.c ++++ b/drivers/clk/qcom/gcc-msm8916.c +@@ -260,7 +260,7 @@ static struct clk_pll gpll0 = { + .l_reg = 0x21004, + .m_reg = 0x21008, + .n_reg = 0x2100c, +- .config_reg = 0x21014, ++ .config_reg = 0x21010, + .mode_reg = 0x21000, + .status_reg = 0x2101c, + .status_bit = 17, +@@ -287,7 +287,7 @@ static struct clk_pll gpll1 = { + .l_reg = 0x20004, + .m_reg = 0x20008, + .n_reg = 0x2000c, +- .config_reg = 0x20014, ++ .config_reg = 0x20010, + .mode_reg = 0x20000, + .status_reg = 0x2001c, + .status_bit = 17, +@@ -314,7 +314,7 @@ static struct clk_pll gpll2 = { + .l_reg = 0x4a004, + .m_reg = 0x4a008, + .n_reg = 0x4a00c, +- .config_reg = 0x4a014, ++ .config_reg = 0x4a010, + .mode_reg = 0x4a000, + .status_reg = 0x4a01c, + .status_bit = 17, +@@ -341,7 +341,7 @@ static struct clk_pll bimc_pll = { + .l_reg = 0x23004, + .m_reg = 0x23008, + .n_reg = 0x2300c, +- .config_reg = 0x23014, ++ .config_reg = 0x23010, + .mode_reg = 0x23000, + .status_reg = 0x2301c, + .status_bit = 17, +diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c +index a2663fbbd7a5..d6a53c99b114 100644 +--- a/drivers/clk/renesas/renesas-cpg-mssr.c ++++ b/drivers/clk/renesas/renesas-cpg-mssr.c +@@ -812,7 +812,8 @@ static int cpg_mssr_suspend_noirq(struct device *dev) + /* Save module registers with bits under our control */ + for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) { + if (priv->smstpcr_saved[reg].mask) +- priv->smstpcr_saved[reg].val = ++ priv->smstpcr_saved[reg].val = priv->stbyctrl ? ++ readb(priv->base + STBCR(reg)) : + readl(priv->base + SMSTPCR(reg)); + } + +@@ -872,8 +873,9 @@ static int cpg_mssr_resume_noirq(struct device *dev) + } + + if (!i) +- dev_warn(dev, "Failed to enable SMSTP %p[0x%x]\n", +- priv->base + SMSTPCR(reg), oldval & mask); ++ dev_warn(dev, "Failed to enable %s%u[0x%x]\n", ++ priv->stbyctrl ? "STB" : "SMSTP", reg, ++ oldval & mask); + } + + return 0; +diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c +index c9e5a1fb6653..edb2363c735a 100644 +--- a/drivers/clk/samsung/clk-exynos5420.c ++++ b/drivers/clk/samsung/clk-exynos5420.c +@@ -540,7 +540,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = { + + static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = { + GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam", +- GATE_BUS_TOP, 24, 0, 0), ++ GATE_BUS_TOP, 24, CLK_IS_CRITICAL, 0), + GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler", + GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0), + }; +@@ -943,25 +943,25 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { + GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg", + GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0), + GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0", +- GATE_BUS_TOP, 5, 0, 0), ++ GATE_BUS_TOP, 5, CLK_IS_CRITICAL, 0), + GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl", + GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0), + GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl", + GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0), + GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp", +- GATE_BUS_TOP, 8, 0, 0), ++ GATE_BUS_TOP, 8, CLK_IS_CRITICAL, 0), + GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio", + GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), + GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", + GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), + GATE(0, "aclk266_isp", "mout_user_aclk266_isp", +- GATE_BUS_TOP, 13, 0, 0), ++ GATE_BUS_TOP, 13, CLK_IS_CRITICAL, 0), + GATE(0, "aclk166", "mout_user_aclk166", + GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0), + GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333", + GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0), + GATE(0, "aclk400_isp", "mout_user_aclk400_isp", +- GATE_BUS_TOP, 16, 0, 0), ++ GATE_BUS_TOP, 16, CLK_IS_CRITICAL, 0), + GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", + GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0), + GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", +@@ -1161,8 +1161,10 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { + GATE_IP_GSCL1, 3, 0, 0), + GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333", + GATE_IP_GSCL1, 4, 0, 0), +- GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0), +- GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0), ++ GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, ++ CLK_IS_CRITICAL, 0), ++ GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, ++ CLK_IS_CRITICAL, 0), + GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333", + GATE_IP_GSCL1, 16, 0, 0), + GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl", +diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c +index 4b1aa9382ad2..6f29ecd0442e 100644 +--- a/drivers/clk/samsung/clk-exynos5433.c ++++ b/drivers/clk/samsung/clk-exynos5433.c +@@ -1706,7 +1706,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = { + GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric", + ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), + GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric", +- ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), ++ ENABLE_SCLK_PERIC, 6, ++ CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0), + GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC, + 5, CLK_SET_RATE_PARENT, 0), + GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC, +diff --git a/drivers/clk/sprd/pll.c b/drivers/clk/sprd/pll.c +index 15791484388f..13a322b2535a 100644 +--- a/drivers/clk/sprd/pll.c ++++ b/drivers/clk/sprd/pll.c +@@ -106,7 +106,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll, + + cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL); + if (!cfg) +- return -ENOMEM; ++ return parent_rate; + + for (i = 0; i < regs_num; i++) + cfg[i] = sprd_pll_read(pll, i); +diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c +index 4413b6e04a8e..55873d4b7603 100644 +--- a/drivers/clk/st/clk-flexgen.c ++++ b/drivers/clk/st/clk-flexgen.c +@@ -375,6 +375,7 @@ static void __init st_of_flexgen_setup(struct device_node *np) + break; + } + ++ flex_flags &= ~CLK_IS_CRITICAL; + of_clk_detect_critical(np, i, &flex_flags); + + /* +diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c +index 27201fd26e44..e1aa1fbac48a 100644 +--- a/drivers/clk/sunxi/clk-sunxi.c ++++ b/drivers/clk/sunxi/clk-sunxi.c +@@ -90,7 +90,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req) + * Round down the frequency to the closest multiple of either + * 6 or 16 + */ +- u32 round_freq_6 = round_down(freq_mhz, 6); ++ u32 round_freq_6 = rounddown(freq_mhz, 6); + u32 round_freq_16 = round_down(freq_mhz, 16); + + if (round_freq_6 > round_freq_16) +diff --git a/drivers/clk/ti/composite.c b/drivers/clk/ti/composite.c +index 6a89936ba03a..eaa43575cfa5 100644 +--- a/drivers/clk/ti/composite.c ++++ b/drivers/clk/ti/composite.c +@@ -196,6 +196,7 @@ cleanup: + if (!cclk->comp_clks[i]) + continue; + list_del(&cclk->comp_clks[i]->link); ++ kfree(cclk->comp_clks[i]->parent_names); + kfree(cclk->comp_clks[i]); + } + +diff --git a/drivers/clk/zynqmp/clkc.c b/drivers/clk/zynqmp/clkc.c +index 10e89f23880b..b66c3a62233a 100644 +--- a/drivers/clk/zynqmp/clkc.c ++++ b/drivers/clk/zynqmp/clkc.c +@@ -558,7 +558,7 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, + { + int j; + u32 num_nodes, clk_dev_id; +- char *clk_out = NULL; ++ char *clk_out[MAX_NODES]; + struct clock_topology *nodes; + struct clk_hw *hw = NULL; + +@@ -572,16 +572,16 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, + * Intermediate clock names are postfixed with type of clock. + */ + if (j != (num_nodes - 1)) { +- clk_out = kasprintf(GFP_KERNEL, "%s%s", clk_name, ++ clk_out[j] = kasprintf(GFP_KERNEL, "%s%s", clk_name, + clk_type_postfix[nodes[j].type]); + } else { +- clk_out = kasprintf(GFP_KERNEL, "%s", clk_name); ++ clk_out[j] = kasprintf(GFP_KERNEL, "%s", clk_name); + } + + if (!clk_topology[nodes[j].type]) + continue; + +- hw = (*clk_topology[nodes[j].type])(clk_out, clk_dev_id, ++ hw = (*clk_topology[nodes[j].type])(clk_out[j], clk_dev_id, + parent_names, + num_parents, + &nodes[j]); +@@ -590,9 +590,12 @@ static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, + __func__, clk_dev_id, clk_name, + PTR_ERR(hw)); + +- parent_names[0] = clk_out; ++ parent_names[0] = clk_out[j]; + } +- kfree(clk_out); ++ ++ for (j = 0; j < num_nodes; j++) ++ kfree(clk_out[j]); ++ + return hw; + } + +diff --git a/drivers/clk/zynqmp/divider.c b/drivers/clk/zynqmp/divider.c +index 4be2cc76aa2e..9bc4f9409aea 100644 +--- a/drivers/clk/zynqmp/divider.c ++++ b/drivers/clk/zynqmp/divider.c +@@ -111,23 +111,30 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw, + + static void zynqmp_get_divider2_val(struct clk_hw *hw, + unsigned long rate, +- unsigned long parent_rate, + struct zynqmp_clk_divider *divider, + int *bestdiv) + { + int div1; + int div2; + long error = LONG_MAX; +- struct clk_hw *parent_hw = clk_hw_get_parent(hw); +- struct zynqmp_clk_divider *pdivider = to_zynqmp_clk_divider(parent_hw); ++ unsigned long div1_prate; ++ struct clk_hw *div1_parent_hw; ++ struct clk_hw *div2_parent_hw = clk_hw_get_parent(hw); ++ struct zynqmp_clk_divider *pdivider = ++ to_zynqmp_clk_divider(div2_parent_hw); + + if (!pdivider) + return; + ++ div1_parent_hw = clk_hw_get_parent(div2_parent_hw); ++ if (!div1_parent_hw) ++ return; ++ ++ div1_prate = clk_hw_get_rate(div1_parent_hw); + *bestdiv = 1; + for (div1 = 1; div1 <= pdivider->max_div;) { + for (div2 = 1; div2 <= divider->max_div;) { +- long new_error = ((parent_rate / div1) / div2) - rate; ++ long new_error = ((div1_prate / div1) / div2) - rate; + + if (abs(new_error) < abs(error)) { + *bestdiv = div2; +@@ -192,7 +199,7 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw, + */ + if (div_type == TYPE_DIV2 && + (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { +- zynqmp_get_divider2_val(hw, rate, *prate, divider, &bestdiv); ++ zynqmp_get_divider2_val(hw, rate, divider, &bestdiv); + } + + if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && divider->is_frac) +diff --git a/drivers/crypto/hisilicon/sgl.c b/drivers/crypto/hisilicon/sgl.c +index 0e8c7e324fb4..725a739800b0 100644 +--- a/drivers/crypto/hisilicon/sgl.c ++++ b/drivers/crypto/hisilicon/sgl.c +@@ -66,7 +66,8 @@ struct hisi_acc_sgl_pool *hisi_acc_create_sgl_pool(struct device *dev, + + sgl_size = sizeof(struct acc_hw_sge) * sge_nr + + sizeof(struct hisi_acc_hw_sgl); +- block_size = PAGE_SIZE * (1 << (MAX_ORDER - 1)); ++ block_size = 1 << (PAGE_SHIFT + MAX_ORDER <= 32 ? ++ PAGE_SHIFT + MAX_ORDER - 1 : 31); + sgl_num_per_block = block_size / sgl_size; + block_num = count / sgl_num_per_block; + remain_sgl = count % sgl_num_per_block; +diff --git a/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c b/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c +index 06202bcffb33..a370c99ecf4c 100644 +--- a/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c ++++ b/drivers/crypto/marvell/octeontx/otx_cptvf_algs.c +@@ -118,6 +118,9 @@ static void otx_cpt_aead_callback(int status, void *arg1, void *arg2) + struct otx_cpt_req_info *cpt_req; + struct pci_dev *pdev; + ++ if (!cpt_info) ++ goto complete; ++ + cpt_req = cpt_info->req; + if (!status) { + /* +@@ -129,10 +132,10 @@ static void otx_cpt_aead_callback(int status, void *arg1, void *arg2) + !cpt_req->is_enc) + status = validate_hmac_cipher_null(cpt_req); + } +- if (cpt_info) { +- pdev = cpt_info->pdev; +- do_request_cleanup(pdev, cpt_info); +- } ++ pdev = cpt_info->pdev; ++ do_request_cleanup(pdev, cpt_info); ++ ++complete: + if (areq) + areq->complete(areq, status); + } +diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c +index e4072cd38585..a82a3596dca3 100644 +--- a/drivers/crypto/omap-sham.c ++++ b/drivers/crypto/omap-sham.c +@@ -169,8 +169,6 @@ struct omap_sham_hmac_ctx { + }; + + struct omap_sham_ctx { +- struct omap_sham_dev *dd; +- + unsigned long flags; + + /* fallback stuff */ +@@ -751,8 +749,15 @@ static int omap_sham_align_sgs(struct scatterlist *sg, + int offset = rctx->offset; + int bufcnt = rctx->bufcnt; + +- if (!sg || !sg->length || !nbytes) ++ if (!sg || !sg->length || !nbytes) { ++ if (bufcnt) { ++ sg_init_table(rctx->sgl, 1); ++ sg_set_buf(rctx->sgl, rctx->dd->xmit_buf, bufcnt); ++ rctx->sg = rctx->sgl; ++ } ++ + return 0; ++ } + + new_len = nbytes; + +@@ -896,7 +901,7 @@ static int omap_sham_prepare_request(struct ahash_request *req, bool update) + if (hash_later < 0) + hash_later = 0; + +- if (hash_later) { ++ if (hash_later && hash_later <= rctx->buflen) { + scatterwalk_map_and_copy(rctx->buffer, + req->src, + req->nbytes - hash_later, +@@ -926,27 +931,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd) + return 0; + } + ++struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx) ++{ ++ struct omap_sham_dev *dd; ++ ++ if (ctx->dd) ++ return ctx->dd; ++ ++ spin_lock_bh(&sham.lock); ++ dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list); ++ list_move_tail(&dd->list, &sham.dev_list); ++ ctx->dd = dd; ++ spin_unlock_bh(&sham.lock); ++ ++ return dd; ++} ++ + static int omap_sham_init(struct ahash_request *req) + { + struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); + struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm); + struct omap_sham_reqctx *ctx = ahash_request_ctx(req); +- struct omap_sham_dev *dd = NULL, *tmp; ++ struct omap_sham_dev *dd; + int bs = 0; + +- spin_lock_bh(&sham.lock); +- if (!tctx->dd) { +- list_for_each_entry(tmp, &sham.dev_list, list) { +- dd = tmp; +- break; +- } +- tctx->dd = dd; +- } else { +- dd = tctx->dd; +- } +- spin_unlock_bh(&sham.lock); ++ ctx->dd = NULL; + +- ctx->dd = dd; ++ dd = omap_sham_find_dev(ctx); ++ if (!dd) ++ return -ENODEV; + + ctx->flags = 0; + +@@ -1216,8 +1229,7 @@ err1: + static int omap_sham_enqueue(struct ahash_request *req, unsigned int op) + { + struct omap_sham_reqctx *ctx = ahash_request_ctx(req); +- struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm); +- struct omap_sham_dev *dd = tctx->dd; ++ struct omap_sham_dev *dd = ctx->dd; + + ctx->op = op; + +@@ -1227,7 +1239,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op) + static int omap_sham_update(struct ahash_request *req) + { + struct omap_sham_reqctx *ctx = ahash_request_ctx(req); +- struct omap_sham_dev *dd = ctx->dd; ++ struct omap_sham_dev *dd = omap_sham_find_dev(ctx); + + if (!req->nbytes) + return 0; +@@ -1331,21 +1343,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key, + struct omap_sham_hmac_ctx *bctx = tctx->base; + int bs = crypto_shash_blocksize(bctx->shash); + int ds = crypto_shash_digestsize(bctx->shash); +- struct omap_sham_dev *dd = NULL, *tmp; + int err, i; + +- spin_lock_bh(&sham.lock); +- if (!tctx->dd) { +- list_for_each_entry(tmp, &sham.dev_list, list) { +- dd = tmp; +- break; +- } +- tctx->dd = dd; +- } else { +- dd = tctx->dd; +- } +- spin_unlock_bh(&sham.lock); +- + err = crypto_shash_setkey(tctx->fallback, key, keylen); + if (err) + return err; +@@ -1363,7 +1362,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key, + + memset(bctx->ipad + keylen, 0, bs - keylen); + +- if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) { ++ if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) { + memcpy(bctx->opad, bctx->ipad, bs); + + for (i = 0; i < bs; i++) { +@@ -2167,6 +2166,7 @@ static int omap_sham_probe(struct platform_device *pdev) + } + + dd->flags |= dd->pdata->flags; ++ sham.flags |= dd->pdata->flags; + + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY); +@@ -2194,6 +2194,9 @@ static int omap_sham_probe(struct platform_device *pdev) + spin_unlock(&sham.lock); + + for (i = 0; i < dd->pdata->algs_info_size; i++) { ++ if (dd->pdata->algs_info[i].registered) ++ break; ++ + for (j = 0; j < dd->pdata->algs_info[i].size; j++) { + struct ahash_alg *alg; + +@@ -2245,9 +2248,11 @@ static int omap_sham_remove(struct platform_device *pdev) + list_del(&dd->list); + spin_unlock(&sham.lock); + for (i = dd->pdata->algs_info_size - 1; i >= 0; i--) +- for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) ++ for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) { + crypto_unregister_ahash( + &dd->pdata->algs_info[i].algs_list[j]); ++ dd->pdata->algs_info[i].registered--; ++ } + tasklet_kill(&dd->done_task); + pm_runtime_disable(&pdev->dev); + +diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c +index ad02dc6747a4..0317b614b680 100644 +--- a/drivers/extcon/extcon-adc-jack.c ++++ b/drivers/extcon/extcon-adc-jack.c +@@ -124,7 +124,7 @@ static int adc_jack_probe(struct platform_device *pdev) + for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++); + data->num_conditions = i; + +- data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel); ++ data->chan = devm_iio_channel_get(&pdev->dev, pdata->consumer_channel); + if (IS_ERR(data->chan)) + return PTR_ERR(data->chan); + +@@ -164,7 +164,6 @@ static int adc_jack_remove(struct platform_device *pdev) + + free_irq(data->irq, data); + cancel_work_sync(&data->handler.work); +- iio_channel_release(data->chan); + + return 0; + } +diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c +index b3da2e193ad2..176ddd151375 100644 +--- a/drivers/firmware/imx/imx-scu.c ++++ b/drivers/firmware/imx/imx-scu.c +@@ -314,6 +314,7 @@ static int imx_scu_probe(struct platform_device *pdev) + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to request mbox chan %s ret %d\n", + chan_name, ret); ++ kfree(chan_name); + return ret; + } + +diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c +index 059bb0fbae9e..4701487573f7 100644 +--- a/drivers/firmware/qcom_scm.c ++++ b/drivers/firmware/qcom_scm.c +@@ -6,7 +6,6 @@ + #include <linux/init.h> + #include <linux/cpumask.h> + #include <linux/export.h> +-#include <linux/dma-direct.h> + #include <linux/dma-mapping.h> + #include <linux/module.h> + #include <linux/types.h> +@@ -806,8 +805,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, + struct qcom_scm_mem_map_info *mem_to_map; + phys_addr_t mem_to_map_phys; + phys_addr_t dest_phys; +- phys_addr_t ptr_phys; +- dma_addr_t ptr_dma; ++ dma_addr_t ptr_phys; + size_t mem_to_map_sz; + size_t dest_sz; + size_t src_sz; +@@ -824,10 +822,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, + ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) + + ALIGN(dest_sz, SZ_64); + +- ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL); ++ ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); + if (!ptr) + return -ENOMEM; +- ptr_phys = dma_to_phys(__scm->dev, ptr_dma); + + /* Fill source vmid detail */ + src = ptr; +@@ -855,7 +852,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, + + ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, + ptr_phys, src_sz, dest_phys, dest_sz); +- dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma); ++ dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys); + if (ret) { + dev_err(__scm->dev, + "Assign memory protection call failed %d\n", ret); +diff --git a/drivers/fpga/dfl-afu-dma-region.c b/drivers/fpga/dfl-afu-dma-region.c +index 62f924489db5..5942343a5d6e 100644 +--- a/drivers/fpga/dfl-afu-dma-region.c ++++ b/drivers/fpga/dfl-afu-dma-region.c +@@ -61,10 +61,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata, + region->pages); + if (pinned < 0) { + ret = pinned; +- goto put_pages; ++ goto free_pages; + } else if (pinned != npages) { + ret = -EFAULT; +- goto free_pages; ++ goto put_pages; + } + + dev_dbg(dev, "%d pages pinned\n", pinned); +diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c +index 92e127e74813..ed6061b5cca1 100644 +--- a/drivers/gpio/gpio-dwapb.c ++++ b/drivers/gpio/gpio-dwapb.c +@@ -49,7 +49,9 @@ + #define GPIO_EXT_PORTC 0x58 + #define GPIO_EXT_PORTD 0x5c + ++#define DWAPB_DRIVER_NAME "gpio-dwapb" + #define DWAPB_MAX_PORTS 4 ++ + #define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */ + #define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */ + #define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */ +@@ -398,7 +400,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, + return; + + err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2, +- "gpio-dwapb", handle_level_irq, ++ DWAPB_DRIVER_NAME, handle_level_irq, + IRQ_NOREQUEST, 0, + IRQ_GC_INIT_NESTED_LOCK); + if (err) { +@@ -455,7 +457,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, + */ + err = devm_request_irq(gpio->dev, pp->irq[0], + dwapb_irq_handler_mfd, +- IRQF_SHARED, "gpio-dwapb-mfd", gpio); ++ IRQF_SHARED, DWAPB_DRIVER_NAME, gpio); + if (err) { + dev_err(gpio->dev, "error requesting IRQ\n"); + irq_domain_remove(gpio->domain); +@@ -533,26 +535,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio, + dwapb_configure_irqs(gpio, port, pp); + + err = gpiochip_add_data(&port->gc, port); +- if (err) ++ if (err) { + dev_err(gpio->dev, "failed to register gpiochip for port%d\n", + port->idx); +- else +- port->is_registered = true; ++ return err; ++ } + + /* Add GPIO-signaled ACPI event support */ +- if (pp->has_irq) +- acpi_gpiochip_request_interrupts(&port->gc); ++ acpi_gpiochip_request_interrupts(&port->gc); + +- return err; ++ port->is_registered = true; ++ ++ return 0; + } + + static void dwapb_gpio_unregister(struct dwapb_gpio *gpio) + { + unsigned int m; + +- for (m = 0; m < gpio->nr_ports; ++m) +- if (gpio->ports[m].is_registered) +- gpiochip_remove(&gpio->ports[m].gc); ++ for (m = 0; m < gpio->nr_ports; ++m) { ++ struct dwapb_gpio_port *port = &gpio->ports[m]; ++ ++ if (!port->is_registered) ++ continue; ++ ++ acpi_gpiochip_free_interrupts(&port->gc); ++ gpiochip_remove(&port->gc); ++ } + } + + static struct dwapb_platform_data * +@@ -836,7 +845,7 @@ static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops, dwapb_gpio_suspend, + + static struct platform_driver dwapb_gpio_driver = { + .driver = { +- .name = "gpio-dwapb", ++ .name = DWAPB_DRIVER_NAME, + .pm = &dwapb_gpio_pm_ops, + .of_match_table = of_match_ptr(dwapb_of_match), + .acpi_match_table = ACPI_PTR(dwapb_acpi_match), +@@ -850,3 +859,4 @@ module_platform_driver(dwapb_gpio_driver); + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Jamie Iles"); + MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver"); ++MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME); +diff --git a/drivers/gpio/gpio-mlxbf2.c b/drivers/gpio/gpio-mlxbf2.c +index da570e63589d..cc0dd8593a4b 100644 +--- a/drivers/gpio/gpio-mlxbf2.c ++++ b/drivers/gpio/gpio-mlxbf2.c +@@ -110,8 +110,8 @@ static int mlxbf2_gpio_get_lock_res(struct platform_device *pdev) + } + + yu_arm_gpio_lock_param.io = devm_ioremap(dev, res->start, size); +- if (IS_ERR(yu_arm_gpio_lock_param.io)) +- ret = PTR_ERR(yu_arm_gpio_lock_param.io); ++ if (!yu_arm_gpio_lock_param.io) ++ ret = -ENOMEM; + + exit: + mutex_unlock(yu_arm_gpio_lock_param.lock); +diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c +index 4269ea9a817e..01011a780688 100644 +--- a/drivers/gpio/gpio-pca953x.c ++++ b/drivers/gpio/gpio-pca953x.c +@@ -307,8 +307,22 @@ static const struct regmap_config pca953x_i2c_regmap = { + .volatile_reg = pca953x_volatile_register, + + .cache_type = REGCACHE_RBTREE, +- /* REVISIT: should be 0x7f but some 24 bit chips use REG_ADDR_AI */ +- .max_register = 0xff, ++ .max_register = 0x7f, ++}; ++ ++static const struct regmap_config pca953x_ai_i2c_regmap = { ++ .reg_bits = 8, ++ .val_bits = 8, ++ ++ .read_flag_mask = REG_ADDR_AI, ++ .write_flag_mask = REG_ADDR_AI, ++ ++ .readable_reg = pca953x_readable_register, ++ .writeable_reg = pca953x_writeable_register, ++ .volatile_reg = pca953x_volatile_register, ++ ++ .cache_type = REGCACHE_RBTREE, ++ .max_register = 0x7f, + }; + + static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off, +@@ -319,18 +333,6 @@ static u8 pca953x_recalc_addr(struct pca953x_chip *chip, int reg, int off, + int pinctrl = (reg & PCAL_PINCTRL_MASK) << 1; + u8 regaddr = pinctrl | addr | (off / BANK_SZ); + +- /* Single byte read doesn't need AI bit set. */ +- if (!addrinc) +- return regaddr; +- +- /* Chips with 24 and more GPIOs always support Auto Increment */ +- if (write && NBANK(chip) > 2) +- regaddr |= REG_ADDR_AI; +- +- /* PCA9575 needs address-increment on multi-byte writes */ +- if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) +- regaddr |= REG_ADDR_AI; +- + return regaddr; + } + +@@ -863,6 +865,7 @@ static int pca953x_probe(struct i2c_client *client, + int ret; + u32 invert = 0; + struct regulator *reg; ++ const struct regmap_config *regmap_config; + + chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); + if (chip == NULL) +@@ -925,7 +928,17 @@ static int pca953x_probe(struct i2c_client *client, + + i2c_set_clientdata(client, chip); + +- chip->regmap = devm_regmap_init_i2c(client, &pca953x_i2c_regmap); ++ pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); ++ ++ if (NBANK(chip) > 2 || PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { ++ dev_info(&client->dev, "using AI\n"); ++ regmap_config = &pca953x_ai_i2c_regmap; ++ } else { ++ dev_info(&client->dev, "using no AI\n"); ++ regmap_config = &pca953x_i2c_regmap; ++ } ++ ++ chip->regmap = devm_regmap_init_i2c(client, regmap_config); + if (IS_ERR(chip->regmap)) { + ret = PTR_ERR(chip->regmap); + goto err_exit; +@@ -956,7 +969,6 @@ static int pca953x_probe(struct i2c_client *client, + /* initialize cached registers from their original values. + * we can't share this chip with another i2c master. + */ +- pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); + + if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) { + chip->regs = &pca953x_regs; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index c24cad3c64ed..f7cfb8180b71 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -40,6 +40,7 @@ + #include <drm/drm_file.h> + #include <drm/drm_drv.h> + #include <drm/drm_device.h> ++#include <drm/drm_ioctl.h> + #include <kgd_kfd_interface.h> + #include <linux/swap.h> + +@@ -1053,7 +1054,7 @@ static inline int kfd_devcgroup_check_permission(struct kfd_dev *kfd) + #if defined(CONFIG_CGROUP_DEVICE) || defined(CONFIG_CGROUP_BPF) + struct drm_device *ddev = kfd->ddev; + +- return devcgroup_check_permission(DEVCG_DEV_CHAR, ddev->driver->major, ++ return devcgroup_check_permission(DEVCG_DEV_CHAR, DRM_MAJOR, + ddev->render->index, + DEVCG_ACC_WRITE | DEVCG_ACC_READ); + #else +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index 7fc15b82fe48..f9f02e08054b 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -1334,7 +1334,7 @@ static int dm_late_init(void *handle) + unsigned int linear_lut[16]; + int i; + struct dmcu *dmcu = adev->dm.dc->res_pool->dmcu; +- bool ret = false; ++ bool ret; + + for (i = 0; i < 16; i++) + linear_lut[i] = 0xFFFF * i / 15; +@@ -1350,13 +1350,10 @@ static int dm_late_init(void *handle) + */ + params.min_abm_backlight = 0x28F; + +- /* todo will enable for navi10 */ +- if (adev->asic_type <= CHIP_RAVEN) { +- ret = dmcu_load_iram(dmcu, params); ++ ret = dmcu_load_iram(dmcu, params); + +- if (!ret) +- return -EINVAL; +- } ++ if (!ret) ++ return -EINVAL; + + return detect_mst_link_for_all_connectors(adev->ddev); + } +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 47431ca6986d..4acaf4be8a81 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1011,9 +1011,17 @@ static void program_timing_sync( + } + } + +- /* set first pipe with plane as master */ ++ /* set first unblanked pipe as master */ + for (j = 0; j < group_size; j++) { +- if (pipe_set[j]->plane_state) { ++ bool is_blanked; ++ ++ if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked) ++ is_blanked = ++ pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp); ++ else ++ is_blanked = ++ pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg); ++ if (!is_blanked) { + if (j == 0) + break; + +@@ -1034,9 +1042,17 @@ static void program_timing_sync( + status->timing_sync_info.master = false; + + } +- /* remove any other pipes with plane as they have already been synced */ ++ /* remove any other unblanked pipes as they have already been synced */ + for (j = j + 1; j < group_size; j++) { +- if (pipe_set[j]->plane_state) { ++ bool is_blanked; ++ ++ if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked) ++ is_blanked = ++ pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp); ++ else ++ is_blanked = ++ pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg); ++ if (!is_blanked) { + group_size--; + pipe_set[j] = pipe_set[group_size]; + j--; +@@ -2517,6 +2533,12 @@ void dc_commit_updates_for_stream(struct dc *dc, + + copy_stream_update_to_stream(dc, context, stream, stream_update); + ++ if (!dc->res_pool->funcs->validate_bandwidth(dc, context, false)) { ++ DC_ERROR("Mode validation failed for stream update!\n"); ++ dc_release_state(context); ++ return; ++ } ++ + commit_planes_for_stream( + dc, + srf_updates, +diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +index cac09d500fda..e89694eb90b4 100644 +--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c ++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +@@ -843,7 +843,7 @@ static bool build_regamma(struct pwl_float_data_ex *rgb_regamma, + pow_buffer_ptr = -1; // reset back to no optimize + ret = true; + release: +- kfree(coeff); ++ kvfree(coeff); + return ret; + } + +diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c +index 868e2d5f6e62..7c3e903230ca 100644 +--- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c ++++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c +@@ -239,7 +239,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr) + + switch (dev_id) { + case 0x67BA: +- case 0x66B1: ++ case 0x67B1: + smu_data->power_tune_defaults = &defaults_hawaii_pro; + break; + case 0x67B8: +diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c +index 7a9f20a2fd30..e7ba0b6f46d8 100644 +--- a/drivers/gpu/drm/ast/ast_mode.c ++++ b/drivers/gpu/drm/ast/ast_mode.c +@@ -226,6 +226,7 @@ static void ast_set_vbios_color_reg(struct ast_private *ast, + case 3: + case 4: + color_index = TrueCModeIndex; ++ break; + default: + return; + } +@@ -801,6 +802,9 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc, + return -EINVAL; + } + ++ if (!state->enable) ++ return 0; /* no mode checks if CRTC is being disabled */ ++ + ast_state = to_ast_crtc_state(state); + + format = ast_state->format; +diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c +index 644f0ad10671..ac9fd96c4c66 100644 +--- a/drivers/gpu/drm/drm_connector.c ++++ b/drivers/gpu/drm/drm_connector.c +@@ -27,6 +27,7 @@ + #include <drm/drm_print.h> + #include <drm/drm_drv.h> + #include <drm/drm_file.h> ++#include <drm/drm_sysfs.h> + + #include <linux/uaccess.h> + +@@ -523,6 +524,10 @@ int drm_connector_register(struct drm_connector *connector) + drm_mode_object_register(connector->dev, &connector->base); + + connector->registration_state = DRM_CONNECTOR_REGISTERED; ++ ++ /* Let userspace know we have a new connector */ ++ drm_sysfs_hotplug_event(connector->dev); ++ + goto unlock; + + err_debugfs: +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 9d89ebf3a749..abb1f358ec6d 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -27,6 +27,7 @@ + #include <linux/kernel.h> + #include <linux/sched.h> + #include <linux/seq_file.h> ++#include <linux/iopoll.h> + + #if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS) + #include <linux/stacktrace.h> +@@ -4448,6 +4449,17 @@ fail: + return ret; + } + ++static int do_get_act_status(struct drm_dp_aux *aux) ++{ ++ int ret; ++ u8 status; ++ ++ ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); ++ if (ret < 0) ++ return ret; ++ ++ return status; ++} + + /** + * drm_dp_check_act_status() - Check ACT handled status. +@@ -4457,33 +4469,29 @@ fail: + */ + int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr) + { +- u8 status; +- int ret; +- int count = 0; +- +- do { +- ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); +- +- if (ret < 0) { +- DRM_DEBUG_KMS("failed to read payload table status %d\n", ret); +- goto fail; +- } +- +- if (status & DP_PAYLOAD_ACT_HANDLED) +- break; +- count++; +- udelay(100); +- +- } while (count < 30); +- +- if (!(status & DP_PAYLOAD_ACT_HANDLED)) { +- DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count); +- ret = -EINVAL; +- goto fail; ++ /* ++ * There doesn't seem to be any recommended retry count or timeout in ++ * the MST specification. Since some hubs have been observed to take ++ * over 1 second to update their payload allocations under certain ++ * conditions, we use a rather large timeout value. ++ */ ++ const int timeout_ms = 3000; ++ int ret, status; ++ ++ ret = readx_poll_timeout(do_get_act_status, mgr->aux, status, ++ status & DP_PAYLOAD_ACT_HANDLED || status < 0, ++ 200, timeout_ms * USEC_PER_MSEC); ++ if (ret < 0 && status >= 0) { ++ DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n", ++ timeout_ms, status); ++ return -EINVAL; ++ } else if (status < 0) { ++ DRM_DEBUG_KMS("Failed to read payload table status: %d\n", ++ status); ++ return status; + } ++ + return 0; +-fail: +- return ret; + } + EXPORT_SYMBOL(drm_dp_check_act_status); + +diff --git a/drivers/gpu/drm/drm_encoder_slave.c b/drivers/gpu/drm/drm_encoder_slave.c +index cf804389f5ec..d50a7884e69e 100644 +--- a/drivers/gpu/drm/drm_encoder_slave.c ++++ b/drivers/gpu/drm/drm_encoder_slave.c +@@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev, + + err = encoder_drv->encoder_init(client, dev, encoder); + if (err) +- goto fail_unregister; ++ goto fail_module_put; + + if (info->platform_data) + encoder->slave_funcs->set_config(&encoder->base, +@@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev, + + return 0; + ++fail_module_put: ++ module_put(module); + fail_unregister: + i2c_unregister_device(client); +- module_put(module); + fail: + return err; + } +diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c +index 939f0032aab1..f0336c804639 100644 +--- a/drivers/gpu/drm/drm_sysfs.c ++++ b/drivers/gpu/drm/drm_sysfs.c +@@ -291,9 +291,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector) + return PTR_ERR(connector->kdev); + } + +- /* Let userspace know we have a new connector */ +- drm_sysfs_hotplug_event(dev); +- + if (connector->ddc) + return sysfs_create_link(&connector->kdev->kobj, + &connector->ddc->dev.kobj, "ddc"); +diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c +index 52db7852827b..647412da733e 100644 +--- a/drivers/gpu/drm/i915/display/intel_ddi.c ++++ b/drivers/gpu/drm/i915/display/intel_ddi.c +@@ -2866,7 +2866,7 @@ icl_program_mg_dp_mode(struct intel_digital_port *intel_dig_port, + ln1 = intel_de_read(dev_priv, MG_DP_MODE(1, tc_port)); + } + +- ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X1_MODE); ++ ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE); + ln1 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE); + + /* DPPATC */ +diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c +index a2fafd4499f2..5e228d202e4d 100644 +--- a/drivers/gpu/drm/i915/display/intel_dp.c ++++ b/drivers/gpu/drm/i915/display/intel_dp.c +@@ -1343,8 +1343,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp, + bool is_tc_port = intel_phy_is_tc(i915, phy); + i915_reg_t ch_ctl, ch_data[5]; + u32 aux_clock_divider; +- enum intel_display_power_domain aux_domain = +- intel_aux_power_domain(intel_dig_port); ++ enum intel_display_power_domain aux_domain; + intel_wakeref_t aux_wakeref; + intel_wakeref_t pps_wakeref; + int i, ret, recv_bytes; +@@ -1359,6 +1358,8 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp, + if (is_tc_port) + intel_tc_port_lock(intel_dig_port); + ++ aux_domain = intel_aux_power_domain(intel_dig_port); ++ + aux_wakeref = intel_display_power_get(i915, aux_domain); + pps_wakeref = pps_lock(intel_dp); + +diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +index 5d5d7eef3f43..7aff3514d97a 100644 +--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c ++++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +@@ -39,7 +39,6 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj) + unsigned long last_pfn = 0; /* suppress gcc warning */ + unsigned int max_segment = i915_sg_segment_size(); + unsigned int sg_page_sizes; +- struct pagevec pvec; + gfp_t noreclaim; + int ret; + +@@ -192,13 +191,17 @@ err_sg: + sg_mark_end(sg); + err_pages: + mapping_clear_unevictable(mapping); +- pagevec_init(&pvec); +- for_each_sgt_page(page, sgt_iter, st) { +- if (!pagevec_add(&pvec, page)) ++ if (sg != st->sgl) { ++ struct pagevec pvec; ++ ++ pagevec_init(&pvec); ++ for_each_sgt_page(page, sgt_iter, st) { ++ if (!pagevec_add(&pvec, page)) ++ check_release_pagevec(&pvec); ++ } ++ if (pagevec_count(&pvec)) + check_release_pagevec(&pvec); + } +- if (pagevec_count(&pvec)) +- check_release_pagevec(&pvec); + sg_free_table(st); + kfree(st); + +diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c +index 883a9b7fe88d..55b9165e7533 100644 +--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c ++++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c +@@ -639,7 +639,7 @@ static int engine_setup_common(struct intel_engine_cs *engine) + struct measure_breadcrumb { + struct i915_request rq; + struct intel_ring ring; +- u32 cs[1024]; ++ u32 cs[2048]; + }; + + static int measure_breadcrumb_dw(struct intel_context *ce) +@@ -661,6 +661,8 @@ static int measure_breadcrumb_dw(struct intel_context *ce) + + frame->ring.vaddr = frame->cs; + frame->ring.size = sizeof(frame->cs); ++ frame->ring.wrap = ++ BITS_PER_TYPE(frame->ring.size) - ilog2(frame->ring.size); + frame->ring.effective_size = frame->ring.size; + intel_ring_update_space(&frame->ring); + frame->rq.ring = &frame->ring; +diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c +index 2dfaddb8811e..ba82193b4e31 100644 +--- a/drivers/gpu/drm/i915/gt/intel_lrc.c ++++ b/drivers/gpu/drm/i915/gt/intel_lrc.c +@@ -972,6 +972,13 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine) + list_move(&rq->sched.link, pl); + set_bit(I915_FENCE_FLAG_PQUEUE, &rq->fence.flags); + ++ /* Check in case we rollback so far we wrap [size/2] */ ++ if (intel_ring_direction(rq->ring, ++ intel_ring_wrap(rq->ring, ++ rq->tail), ++ rq->ring->tail) > 0) ++ rq->context->lrc.desc |= CTX_DESC_FORCE_RESTORE; ++ + active = rq; + } else { + struct intel_engine_cs *owner = rq->context->engine; +@@ -1383,8 +1390,9 @@ static u64 execlists_update_context(struct i915_request *rq) + * HW has a tendency to ignore us rewinding the TAIL to the end of + * an earlier request. + */ ++ GEM_BUG_ON(ce->lrc_reg_state[CTX_RING_TAIL] != rq->ring->tail); ++ prev = rq->ring->tail; + tail = intel_ring_set_tail(rq->ring, rq->tail); +- prev = ce->lrc_reg_state[CTX_RING_TAIL]; + if (unlikely(intel_ring_direction(rq->ring, tail, prev) <= 0)) + desc |= CTX_DESC_FORCE_RESTORE; + ce->lrc_reg_state[CTX_RING_TAIL] = tail; +@@ -4213,6 +4221,14 @@ static int gen12_emit_flush_render(struct i915_request *request, + return 0; + } + ++static void assert_request_valid(struct i915_request *rq) ++{ ++ struct intel_ring *ring __maybe_unused = rq->ring; ++ ++ /* Can we unwind this request without appearing to go forwards? */ ++ GEM_BUG_ON(intel_ring_direction(ring, rq->wa_tail, rq->head) <= 0); ++} ++ + /* + * Reserve space for 2 NOOPs at the end of each request to be + * used as a workaround for not being allowed to do lite +@@ -4225,6 +4241,9 @@ static u32 *gen8_emit_wa_tail(struct i915_request *request, u32 *cs) + *cs++ = MI_NOOP; + request->wa_tail = intel_ring_offset(request, cs); + ++ /* Check that entire request is less than half the ring */ ++ assert_request_valid(request); ++ + return cs; + } + +diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c +index 8cda1b7e17ba..bdb324167ef3 100644 +--- a/drivers/gpu/drm/i915/gt/intel_ring.c ++++ b/drivers/gpu/drm/i915/gt/intel_ring.c +@@ -315,3 +315,7 @@ int intel_ring_cacheline_align(struct i915_request *rq) + GEM_BUG_ON(rq->ring->emit & (CACHELINE_BYTES - 1)); + return 0; + } ++ ++#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) ++#include "selftest_ring.c" ++#endif +diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c +index 5176ad1a3976..bb100872cd07 100644 +--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c ++++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c +@@ -178,6 +178,12 @@ wa_write_or(struct i915_wa_list *wal, i915_reg_t reg, u32 set) + wa_write_masked_or(wal, reg, set, set); + } + ++static void ++wa_write_clr(struct i915_wa_list *wal, i915_reg_t reg, u32 clr) ++{ ++ wa_write_masked_or(wal, reg, clr, 0); ++} ++ + static void + wa_masked_en(struct i915_wa_list *wal, i915_reg_t reg, u32 val) + { +@@ -697,6 +703,227 @@ int intel_engine_emit_ctx_wa(struct i915_request *rq) + return 0; + } + ++static void ++gen4_gt_workarounds_init(struct drm_i915_private *i915, ++ struct i915_wa_list *wal) ++{ ++ /* WaDisable_RenderCache_OperationalFlush:gen4,ilk */ ++ wa_masked_dis(wal, CACHE_MODE_0, RC_OP_FLUSH_ENABLE); ++} ++ ++static void ++g4x_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ gen4_gt_workarounds_init(i915, wal); ++ ++ /* WaDisableRenderCachePipelinedFlush:g4x,ilk */ ++ wa_masked_en(wal, CACHE_MODE_0, CM0_PIPELINED_RENDER_FLUSH_DISABLE); ++} ++ ++static void ++ilk_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ g4x_gt_workarounds_init(i915, wal); ++ ++ wa_masked_en(wal, _3D_CHICKEN2, _3D_CHICKEN2_WM_READ_PIPELINED); ++} ++ ++static void ++snb_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ /* WaDisableHiZPlanesWhenMSAAEnabled:snb */ ++ wa_masked_en(wal, ++ _3D_CHICKEN, ++ _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB); ++ ++ /* WaDisable_RenderCache_OperationalFlush:snb */ ++ wa_masked_dis(wal, CACHE_MODE_0, RC_OP_FLUSH_ENABLE); ++ ++ /* ++ * BSpec recommends 8x4 when MSAA is used, ++ * however in practice 16x4 seems fastest. ++ * ++ * Note that PS/WM thread counts depend on the WIZ hashing ++ * disable bit, which we don't touch here, but it's good ++ * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). ++ */ ++ wa_add(wal, ++ GEN6_GT_MODE, 0, ++ _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4), ++ GEN6_WIZ_HASHING_16x4); ++ ++ wa_masked_dis(wal, CACHE_MODE_0, CM0_STC_EVICT_DISABLE_LRA_SNB); ++ ++ wa_masked_en(wal, ++ _3D_CHICKEN3, ++ /* WaStripsFansDisableFastClipPerformanceFix:snb */ ++ _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL | ++ /* ++ * Bspec says: ++ * "This bit must be set if 3DSTATE_CLIP clip mode is set ++ * to normal and 3DSTATE_SF number of SF output attributes ++ * is more than 16." ++ */ ++ _3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH); ++} ++ ++static void ++ivb_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ /* WaDisableEarlyCull:ivb */ ++ wa_masked_en(wal, _3D_CHICKEN3, _3D_CHICKEN_SF_DISABLE_OBJEND_CULL); ++ ++ /* WaDisablePSDDualDispatchEnable:ivb */ ++ if (IS_IVB_GT1(i915)) ++ wa_masked_en(wal, ++ GEN7_HALF_SLICE_CHICKEN1, ++ GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE); ++ ++ /* WaDisable_RenderCache_OperationalFlush:ivb */ ++ wa_masked_dis(wal, CACHE_MODE_0_GEN7, RC_OP_FLUSH_ENABLE); ++ ++ /* Apply the WaDisableRHWOOptimizationForRenderHang:ivb workaround. */ ++ wa_masked_dis(wal, ++ GEN7_COMMON_SLICE_CHICKEN1, ++ GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); ++ ++ /* WaApplyL3ControlAndL3ChickenMode:ivb */ ++ wa_write(wal, GEN7_L3CNTLREG1, GEN7_WA_FOR_GEN7_L3_CONTROL); ++ wa_write(wal, GEN7_L3_CHICKEN_MODE_REGISTER, GEN7_WA_L3_CHICKEN_MODE); ++ ++ /* WaForceL3Serialization:ivb */ ++ wa_write_clr(wal, GEN7_L3SQCREG4, L3SQ_URB_READ_CAM_MATCH_DISABLE); ++ ++ /* ++ * WaVSThreadDispatchOverride:ivb,vlv ++ * ++ * This actually overrides the dispatch ++ * mode for all thread types. ++ */ ++ wa_write_masked_or(wal, GEN7_FF_THREAD_MODE, ++ GEN7_FF_SCHED_MASK, ++ GEN7_FF_TS_SCHED_HW | ++ GEN7_FF_VS_SCHED_HW | ++ GEN7_FF_DS_SCHED_HW); ++ ++ if (0) { /* causes HiZ corruption on ivb:gt1 */ ++ /* enable HiZ Raw Stall Optimization */ ++ wa_masked_dis(wal, CACHE_MODE_0_GEN7, HIZ_RAW_STALL_OPT_DISABLE); ++ } ++ ++ /* WaDisable4x2SubspanOptimization:ivb */ ++ wa_masked_en(wal, CACHE_MODE_1, PIXEL_SUBSPAN_COLLECT_OPT_DISABLE); ++ ++ /* ++ * BSpec recommends 8x4 when MSAA is used, ++ * however in practice 16x4 seems fastest. ++ * ++ * Note that PS/WM thread counts depend on the WIZ hashing ++ * disable bit, which we don't touch here, but it's good ++ * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). ++ */ ++ wa_add(wal, GEN7_GT_MODE, 0, ++ _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4), ++ GEN6_WIZ_HASHING_16x4); ++} ++ ++static void ++vlv_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ /* WaDisableEarlyCull:vlv */ ++ wa_masked_en(wal, _3D_CHICKEN3, _3D_CHICKEN_SF_DISABLE_OBJEND_CULL); ++ ++ /* WaPsdDispatchEnable:vlv */ ++ /* WaDisablePSDDualDispatchEnable:vlv */ ++ wa_masked_en(wal, ++ GEN7_HALF_SLICE_CHICKEN1, ++ GEN7_MAX_PS_THREAD_DEP | ++ GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE); ++ ++ /* WaDisable_RenderCache_OperationalFlush:vlv */ ++ wa_masked_dis(wal, CACHE_MODE_0_GEN7, RC_OP_FLUSH_ENABLE); ++ ++ /* WaForceL3Serialization:vlv */ ++ wa_write_clr(wal, GEN7_L3SQCREG4, L3SQ_URB_READ_CAM_MATCH_DISABLE); ++ ++ /* ++ * WaVSThreadDispatchOverride:ivb,vlv ++ * ++ * This actually overrides the dispatch ++ * mode for all thread types. ++ */ ++ wa_write_masked_or(wal, ++ GEN7_FF_THREAD_MODE, ++ GEN7_FF_SCHED_MASK, ++ GEN7_FF_TS_SCHED_HW | ++ GEN7_FF_VS_SCHED_HW | ++ GEN7_FF_DS_SCHED_HW); ++ ++ /* ++ * BSpec says this must be set, even though ++ * WaDisable4x2SubspanOptimization isn't listed for VLV. ++ */ ++ wa_masked_en(wal, CACHE_MODE_1, PIXEL_SUBSPAN_COLLECT_OPT_DISABLE); ++ ++ /* ++ * BSpec recommends 8x4 when MSAA is used, ++ * however in practice 16x4 seems fastest. ++ * ++ * Note that PS/WM thread counts depend on the WIZ hashing ++ * disable bit, which we don't touch here, but it's good ++ * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). ++ */ ++ wa_add(wal, GEN7_GT_MODE, 0, ++ _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4), ++ GEN6_WIZ_HASHING_16x4); ++ ++ /* ++ * WaIncreaseL3CreditsForVLVB0:vlv ++ * This is the hardware default actually. ++ */ ++ wa_write(wal, GEN7_L3SQCREG1, VLV_B0_WA_L3SQCREG1_VALUE); ++} ++ ++static void ++hsw_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) ++{ ++ /* L3 caching of data atomics doesn't work -- disable it. */ ++ wa_write(wal, HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE); ++ ++ wa_add(wal, ++ HSW_ROW_CHICKEN3, 0, ++ _MASKED_BIT_ENABLE(HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE), ++ 0 /* XXX does this reg exist? */); ++ ++ /* WaVSRefCountFullforceMissDisable:hsw */ ++ wa_write_clr(wal, GEN7_FF_THREAD_MODE, GEN7_FF_VS_REF_CNT_FFME); ++ ++ wa_masked_dis(wal, ++ CACHE_MODE_0_GEN7, ++ /* WaDisable_RenderCache_OperationalFlush:hsw */ ++ RC_OP_FLUSH_ENABLE | ++ /* enable HiZ Raw Stall Optimization */ ++ HIZ_RAW_STALL_OPT_DISABLE); ++ ++ /* WaDisable4x2SubspanOptimization:hsw */ ++ wa_masked_en(wal, CACHE_MODE_1, PIXEL_SUBSPAN_COLLECT_OPT_DISABLE); ++ ++ /* ++ * BSpec recommends 8x4 when MSAA is used, ++ * however in practice 16x4 seems fastest. ++ * ++ * Note that PS/WM thread counts depend on the WIZ hashing ++ * disable bit, which we don't touch here, but it's good ++ * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). ++ */ ++ wa_add(wal, GEN7_GT_MODE, 0, ++ _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4), ++ GEN6_WIZ_HASHING_16x4); ++ ++ /* WaSampleCChickenBitEnable:hsw */ ++ wa_masked_en(wal, HALF_SLICE_CHICKEN3, HSW_SAMPLE_C_PERFORMANCE); ++} ++ + static void + gen9_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal) + { +@@ -974,6 +1201,20 @@ gt_init_workarounds(struct drm_i915_private *i915, struct i915_wa_list *wal) + bxt_gt_workarounds_init(i915, wal); + else if (IS_SKYLAKE(i915)) + skl_gt_workarounds_init(i915, wal); ++ else if (IS_HASWELL(i915)) ++ hsw_gt_workarounds_init(i915, wal); ++ else if (IS_VALLEYVIEW(i915)) ++ vlv_gt_workarounds_init(i915, wal); ++ else if (IS_IVYBRIDGE(i915)) ++ ivb_gt_workarounds_init(i915, wal); ++ else if (IS_GEN(i915, 6)) ++ snb_gt_workarounds_init(i915, wal); ++ else if (IS_GEN(i915, 5)) ++ ilk_gt_workarounds_init(i915, wal); ++ else if (IS_G4X(i915)) ++ g4x_gt_workarounds_init(i915, wal); ++ else if (IS_GEN(i915, 4)) ++ gen4_gt_workarounds_init(i915, wal); + else if (INTEL_GEN(i915) <= 8) + return; + else +@@ -1379,12 +1620,6 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal) + GEN7_FF_THREAD_MODE, + GEN12_FF_TESSELATION_DOP_GATE_DISABLE); + +- /* +- * Wa_1409085225:tgl +- * Wa_14010229206:tgl +- */ +- wa_masked_en(wal, GEN9_ROW_CHICKEN4, GEN12_DISABLE_TDL_PUSH); +- + /* Wa_1408615072:tgl */ + wa_write_or(wal, UNSLICE_UNIT_LEVEL_CLKGATE2, + VSUNIT_CLKGATE_DIS_TGL); +@@ -1402,6 +1637,12 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal) + wa_masked_en(wal, + GEN9_CS_DEBUG_MODE1, + FF_DOP_CLOCK_GATE_DISABLE); ++ ++ /* ++ * Wa_1409085225:tgl ++ * Wa_14010229206:tgl ++ */ ++ wa_masked_en(wal, GEN9_ROW_CHICKEN4, GEN12_DISABLE_TDL_PUSH); + } + + if (IS_GEN(i915, 11)) { +diff --git a/drivers/gpu/drm/i915/gt/selftest_mocs.c b/drivers/gpu/drm/i915/gt/selftest_mocs.c +index 8831ffee2061..63f87d8608c3 100644 +--- a/drivers/gpu/drm/i915/gt/selftest_mocs.c ++++ b/drivers/gpu/drm/i915/gt/selftest_mocs.c +@@ -18,6 +18,20 @@ struct live_mocs { + void *vaddr; + }; + ++static struct intel_context *mocs_context_create(struct intel_engine_cs *engine) ++{ ++ struct intel_context *ce; ++ ++ ce = intel_context_create(engine); ++ if (IS_ERR(ce)) ++ return ce; ++ ++ /* We build large requests to read the registers from the ring */ ++ ce->ring = __intel_context_ring_size(SZ_16K); ++ ++ return ce; ++} ++ + static int request_add_sync(struct i915_request *rq, int err) + { + i915_request_get(rq); +@@ -301,7 +315,7 @@ static int live_mocs_clean(void *arg) + for_each_engine(engine, gt, id) { + struct intel_context *ce; + +- ce = intel_context_create(engine); ++ ce = mocs_context_create(engine); + if (IS_ERR(ce)) { + err = PTR_ERR(ce); + break; +@@ -395,7 +409,7 @@ static int live_mocs_reset(void *arg) + for_each_engine(engine, gt, id) { + struct intel_context *ce; + +- ce = intel_context_create(engine); ++ ce = mocs_context_create(engine); + if (IS_ERR(ce)) { + err = PTR_ERR(ce); + break; +diff --git a/drivers/gpu/drm/i915/gt/selftest_ring.c b/drivers/gpu/drm/i915/gt/selftest_ring.c +new file mode 100644 +index 000000000000..2a8c534dc125 +--- /dev/null ++++ b/drivers/gpu/drm/i915/gt/selftest_ring.c +@@ -0,0 +1,110 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Copyright © 2020 Intel Corporation ++ */ ++ ++static struct intel_ring *mock_ring(unsigned long sz) ++{ ++ struct intel_ring *ring; ++ ++ ring = kzalloc(sizeof(*ring) + sz, GFP_KERNEL); ++ if (!ring) ++ return NULL; ++ ++ kref_init(&ring->ref); ++ ring->size = sz; ++ ring->wrap = BITS_PER_TYPE(ring->size) - ilog2(sz); ++ ring->effective_size = sz; ++ ring->vaddr = (void *)(ring + 1); ++ atomic_set(&ring->pin_count, 1); ++ ++ intel_ring_update_space(ring); ++ ++ return ring; ++} ++ ++static void mock_ring_free(struct intel_ring *ring) ++{ ++ kfree(ring); ++} ++ ++static int check_ring_direction(struct intel_ring *ring, ++ u32 next, u32 prev, ++ int expected) ++{ ++ int result; ++ ++ result = intel_ring_direction(ring, next, prev); ++ if (result < 0) ++ result = -1; ++ else if (result > 0) ++ result = 1; ++ ++ if (result != expected) { ++ pr_err("intel_ring_direction(%u, %u):%d != %d\n", ++ next, prev, result, expected); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int check_ring_step(struct intel_ring *ring, u32 x, u32 step) ++{ ++ u32 prev = x, next = intel_ring_wrap(ring, x + step); ++ int err = 0; ++ ++ err |= check_ring_direction(ring, next, next, 0); ++ err |= check_ring_direction(ring, prev, prev, 0); ++ err |= check_ring_direction(ring, next, prev, 1); ++ err |= check_ring_direction(ring, prev, next, -1); ++ ++ return err; ++} ++ ++static int check_ring_offset(struct intel_ring *ring, u32 x, u32 step) ++{ ++ int err = 0; ++ ++ err |= check_ring_step(ring, x, step); ++ err |= check_ring_step(ring, intel_ring_wrap(ring, x + 1), step); ++ err |= check_ring_step(ring, intel_ring_wrap(ring, x - 1), step); ++ ++ return err; ++} ++ ++static int igt_ring_direction(void *dummy) ++{ ++ struct intel_ring *ring; ++ unsigned int half = 2048; ++ int step, err = 0; ++ ++ ring = mock_ring(2 * half); ++ if (!ring) ++ return -ENOMEM; ++ ++ GEM_BUG_ON(ring->size != 2 * half); ++ ++ /* Precision of wrap detection is limited to ring->size / 2 */ ++ for (step = 1; step < half; step <<= 1) { ++ err |= check_ring_offset(ring, 0, step); ++ err |= check_ring_offset(ring, half, step); ++ } ++ err |= check_ring_step(ring, 0, half - 64); ++ ++ /* And check unwrapped handling for good measure */ ++ err |= check_ring_offset(ring, 0, 2 * half + 64); ++ err |= check_ring_offset(ring, 3 * half, 1); ++ ++ mock_ring_free(ring); ++ return err; ++} ++ ++int intel_ring_mock_selftests(void) ++{ ++ static const struct i915_subtest tests[] = { ++ SUBTEST(igt_ring_direction), ++ }; ++ ++ return i915_subtests(tests, NULL); ++} +diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c +index 189b573d02be..372354d33f55 100644 +--- a/drivers/gpu/drm/i915/i915_cmd_parser.c ++++ b/drivers/gpu/drm/i915/i915_cmd_parser.c +@@ -572,6 +572,9 @@ struct drm_i915_reg_descriptor { + #define REG32(_reg, ...) \ + { .addr = (_reg), __VA_ARGS__ } + ++#define REG32_IDX(_reg, idx) \ ++ { .addr = _reg(idx) } ++ + /* + * Convenience macro for adding 64-bit registers. + * +@@ -669,6 +672,7 @@ static const struct drm_i915_reg_descriptor gen9_blt_regs[] = { + REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE), + REG32(BCS_SWCTRL), + REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE), ++ REG32_IDX(RING_CTX_TIMESTAMP, BLT_RING_BASE), + REG64_IDX(BCS_GPR, 0), + REG64_IDX(BCS_GPR, 1), + REG64_IDX(BCS_GPR, 2), +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index 8a2b83807ffc..bd042725a678 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -3092,6 +3092,7 @@ static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv) + + val = I915_READ(GEN11_DE_HPD_IMR); + val &= ~hotplug_irqs; ++ val |= ~enabled_irqs & hotplug_irqs; + I915_WRITE(GEN11_DE_HPD_IMR, val); + POSTING_READ(GEN11_DE_HPD_IMR); + +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +index 6e12000c4b6b..a41be9357d15 100644 +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -7819,7 +7819,7 @@ enum { + + /* GEN7 chicken */ + #define GEN7_COMMON_SLICE_CHICKEN1 _MMIO(0x7010) +- #define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1 << 10) | (1 << 26)) ++ #define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC (1 << 10) + #define GEN9_RHWO_OPTIMIZATION_DISABLE (1 << 14) + + #define COMMON_SLICE_CHICKEN2 _MMIO(0x7014) +diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c +index a52986a9e7a6..20c1683fda24 100644 +--- a/drivers/gpu/drm/i915/intel_pm.c ++++ b/drivers/gpu/drm/i915/intel_pm.c +@@ -6593,16 +6593,6 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv) + I915_WRITE(ILK_DISPLAY_CHICKEN2, + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_ELPIN_409_SELECT); +- I915_WRITE(_3D_CHICKEN2, +- _3D_CHICKEN2_WM_READ_PIPELINED << 16 | +- _3D_CHICKEN2_WM_READ_PIPELINED); +- +- /* WaDisableRenderCachePipelinedFlush:ilk */ +- I915_WRITE(CACHE_MODE_0, +- _MASKED_BIT_ENABLE(CM0_PIPELINED_RENDER_FLUSH_DISABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:ilk */ +- I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); + + g4x_disable_trickle_feed(dev_priv); + +@@ -6665,27 +6655,6 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv) + I915_READ(ILK_DISPLAY_CHICKEN2) | + ILK_ELPIN_409_SELECT); + +- /* WaDisableHiZPlanesWhenMSAAEnabled:snb */ +- I915_WRITE(_3D_CHICKEN, +- _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB)); +- +- /* WaDisable_RenderCache_OperationalFlush:snb */ +- I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); +- +- /* +- * BSpec recoomends 8x4 when MSAA is used, +- * however in practice 16x4 seems fastest. +- * +- * Note that PS/WM thread counts depend on the WIZ hashing +- * disable bit, which we don't touch here, but it's good +- * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). +- */ +- I915_WRITE(GEN6_GT_MODE, +- _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4)); +- +- I915_WRITE(CACHE_MODE_0, +- _MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB)); +- + I915_WRITE(GEN6_UCGCTL1, + I915_READ(GEN6_UCGCTL1) | + GEN6_BLBUNIT_CLOCK_GATE_DISABLE | +@@ -6708,18 +6677,6 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv) + GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | + GEN6_RCCUNIT_CLOCK_GATE_DISABLE); + +- /* WaStripsFansDisableFastClipPerformanceFix:snb */ +- I915_WRITE(_3D_CHICKEN3, +- _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL)); +- +- /* +- * Bspec says: +- * "This bit must be set if 3DSTATE_CLIP clip mode is set to normal and +- * 3DSTATE_SF number of SF output attributes is more than 16." +- */ +- I915_WRITE(_3D_CHICKEN3, +- _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH)); +- + /* + * According to the spec the following bits should be + * set in order to enable memory self-refresh and fbc: +@@ -6749,24 +6706,6 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv) + gen6_check_mch_setup(dev_priv); + } + +-static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv) +-{ +- u32 reg = I915_READ(GEN7_FF_THREAD_MODE); +- +- /* +- * WaVSThreadDispatchOverride:ivb,vlv +- * +- * This actually overrides the dispatch +- * mode for all thread types. +- */ +- reg &= ~GEN7_FF_SCHED_MASK; +- reg |= GEN7_FF_TS_SCHED_HW; +- reg |= GEN7_FF_VS_SCHED_HW; +- reg |= GEN7_FF_DS_SCHED_HW; +- +- I915_WRITE(GEN7_FF_THREAD_MODE, reg); +-} +- + static void lpt_init_clock_gating(struct drm_i915_private *dev_priv) + { + /* +@@ -6992,45 +6931,10 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv) + + static void hsw_init_clock_gating(struct drm_i915_private *dev_priv) + { +- /* L3 caching of data atomics doesn't work -- disable it. */ +- I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE); +- I915_WRITE(HSW_ROW_CHICKEN3, +- _MASKED_BIT_ENABLE(HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE)); +- + /* This is required by WaCatErrorRejectionIssue:hsw */ + I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, +- I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | +- GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); +- +- /* WaVSRefCountFullforceMissDisable:hsw */ +- I915_WRITE(GEN7_FF_THREAD_MODE, +- I915_READ(GEN7_FF_THREAD_MODE) & ~GEN7_FF_VS_REF_CNT_FFME); +- +- /* WaDisable_RenderCache_OperationalFlush:hsw */ +- I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); +- +- /* enable HiZ Raw Stall Optimization */ +- I915_WRITE(CACHE_MODE_0_GEN7, +- _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE)); +- +- /* WaDisable4x2SubspanOptimization:hsw */ +- I915_WRITE(CACHE_MODE_1, +- _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); +- +- /* +- * BSpec recommends 8x4 when MSAA is used, +- * however in practice 16x4 seems fastest. +- * +- * Note that PS/WM thread counts depend on the WIZ hashing +- * disable bit, which we don't touch here, but it's good +- * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). +- */ +- I915_WRITE(GEN7_GT_MODE, +- _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4)); +- +- /* WaSampleCChickenBitEnable:hsw */ +- I915_WRITE(HALF_SLICE_CHICKEN3, +- _MASKED_BIT_ENABLE(HSW_SAMPLE_C_PERFORMANCE)); ++ I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | ++ GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); + + /* WaSwitchSolVfFArbitrationPriority:hsw */ + I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); +@@ -7044,32 +6948,11 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) + + I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE); + +- /* WaDisableEarlyCull:ivb */ +- I915_WRITE(_3D_CHICKEN3, +- _MASKED_BIT_ENABLE(_3D_CHICKEN_SF_DISABLE_OBJEND_CULL)); +- + /* WaDisableBackToBackFlipFix:ivb */ + I915_WRITE(IVB_CHICKEN3, + CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | + CHICKEN3_DGMG_DONE_FIX_DISABLE); + +- /* WaDisablePSDDualDispatchEnable:ivb */ +- if (IS_IVB_GT1(dev_priv)) +- I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, +- _MASKED_BIT_ENABLE(GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:ivb */ +- I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); +- +- /* Apply the WaDisableRHWOOptimizationForRenderHang:ivb workaround. */ +- I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, +- GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); +- +- /* WaApplyL3ControlAndL3ChickenMode:ivb */ +- I915_WRITE(GEN7_L3CNTLREG1, +- GEN7_WA_FOR_GEN7_L3_CONTROL); +- I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, +- GEN7_WA_L3_CHICKEN_MODE); + if (IS_IVB_GT1(dev_priv)) + I915_WRITE(GEN7_ROW_CHICKEN2, + _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); +@@ -7081,10 +6964,6 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) + _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); + } + +- /* WaForceL3Serialization:ivb */ +- I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & +- ~L3SQ_URB_READ_CAM_MATCH_DISABLE); +- + /* + * According to the spec, bit 13 (RCZUNIT) must be set on IVB. + * This implements the WaDisableRCZUnitClockGating:ivb workaround. +@@ -7099,29 +6978,6 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) + + g4x_disable_trickle_feed(dev_priv); + +- gen7_setup_fixed_func_scheduler(dev_priv); +- +- if (0) { /* causes HiZ corruption on ivb:gt1 */ +- /* enable HiZ Raw Stall Optimization */ +- I915_WRITE(CACHE_MODE_0_GEN7, +- _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE)); +- } +- +- /* WaDisable4x2SubspanOptimization:ivb */ +- I915_WRITE(CACHE_MODE_1, +- _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); +- +- /* +- * BSpec recommends 8x4 when MSAA is used, +- * however in practice 16x4 seems fastest. +- * +- * Note that PS/WM thread counts depend on the WIZ hashing +- * disable bit, which we don't touch here, but it's good +- * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). +- */ +- I915_WRITE(GEN7_GT_MODE, +- _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4)); +- + snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); + snpcr &= ~GEN6_MBC_SNPCR_MASK; + snpcr |= GEN6_MBC_SNPCR_MED; +@@ -7135,28 +6991,11 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) + + static void vlv_init_clock_gating(struct drm_i915_private *dev_priv) + { +- /* WaDisableEarlyCull:vlv */ +- I915_WRITE(_3D_CHICKEN3, +- _MASKED_BIT_ENABLE(_3D_CHICKEN_SF_DISABLE_OBJEND_CULL)); +- + /* WaDisableBackToBackFlipFix:vlv */ + I915_WRITE(IVB_CHICKEN3, + CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | + CHICKEN3_DGMG_DONE_FIX_DISABLE); + +- /* WaPsdDispatchEnable:vlv */ +- /* WaDisablePSDDualDispatchEnable:vlv */ +- I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, +- _MASKED_BIT_ENABLE(GEN7_MAX_PS_THREAD_DEP | +- GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:vlv */ +- I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); +- +- /* WaForceL3Serialization:vlv */ +- I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & +- ~L3SQ_URB_READ_CAM_MATCH_DISABLE); +- + /* WaDisableDopClockGating:vlv */ + I915_WRITE(GEN7_ROW_CHICKEN2, + _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); +@@ -7166,8 +7005,6 @@ static void vlv_init_clock_gating(struct drm_i915_private *dev_priv) + I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | + GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); + +- gen7_setup_fixed_func_scheduler(dev_priv); +- + /* + * According to the spec, bit 13 (RCZUNIT) must be set on IVB. + * This implements the WaDisableRCZUnitClockGating:vlv workaround. +@@ -7181,30 +7018,6 @@ static void vlv_init_clock_gating(struct drm_i915_private *dev_priv) + I915_WRITE(GEN7_UCGCTL4, + I915_READ(GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE); + +- /* +- * BSpec says this must be set, even though +- * WaDisable4x2SubspanOptimization isn't listed for VLV. +- */ +- I915_WRITE(CACHE_MODE_1, +- _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); +- +- /* +- * BSpec recommends 8x4 when MSAA is used, +- * however in practice 16x4 seems fastest. +- * +- * Note that PS/WM thread counts depend on the WIZ hashing +- * disable bit, which we don't touch here, but it's good +- * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). +- */ +- I915_WRITE(GEN7_GT_MODE, +- _MASKED_FIELD(GEN6_WIZ_HASHING_MASK, GEN6_WIZ_HASHING_16x4)); +- +- /* +- * WaIncreaseL3CreditsForVLVB0:vlv +- * This is the hardware default actually. +- */ +- I915_WRITE(GEN7_L3SQCREG1, VLV_B0_WA_L3SQCREG1_VALUE); +- + /* + * WaDisableVLVClockGating_VBIIssue:vlv + * Disable clock gating on th GCFG unit to prevent a delay +@@ -7257,13 +7070,6 @@ static void g4x_init_clock_gating(struct drm_i915_private *dev_priv) + dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE; + I915_WRITE(DSPCLK_GATE_D, dspclk_gate); + +- /* WaDisableRenderCachePipelinedFlush */ +- I915_WRITE(CACHE_MODE_0, +- _MASKED_BIT_ENABLE(CM0_PIPELINED_RENDER_FLUSH_DISABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:g4x */ +- I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); +- + g4x_disable_trickle_feed(dev_priv); + } + +@@ -7279,11 +7085,6 @@ static void i965gm_init_clock_gating(struct drm_i915_private *dev_priv) + intel_uncore_write(uncore, + MI_ARB_STATE, + _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:gen4 */ +- intel_uncore_write(uncore, +- CACHE_MODE_0, +- _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); + } + + static void i965g_init_clock_gating(struct drm_i915_private *dev_priv) +@@ -7296,9 +7097,6 @@ static void i965g_init_clock_gating(struct drm_i915_private *dev_priv) + I915_WRITE(RENCLK_GATE_D2, 0); + I915_WRITE(MI_ARB_STATE, + _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE)); +- +- /* WaDisable_RenderCache_OperationalFlush:gen4 */ +- I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE)); + } + + static void gen3_init_clock_gating(struct drm_i915_private *dev_priv) +diff --git a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h +index 5b39bab4da1d..86baed226b53 100644 +--- a/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h ++++ b/drivers/gpu/drm/i915/selftests/i915_mock_selftests.h +@@ -20,6 +20,7 @@ selftest(fence, i915_sw_fence_mock_selftests) + selftest(scatterlist, scatterlist_mock_selftests) + selftest(syncmap, i915_syncmap_mock_selftests) + selftest(uncore, intel_uncore_mock_selftests) ++selftest(ring, intel_ring_mock_selftests) + selftest(engine, intel_engine_cs_mock_selftests) + selftest(timelines, intel_timeline_mock_selftests) + selftest(requests, i915_request_mock_selftests) +diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +index 724024a2243a..662d02289533 100644 +--- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +@@ -1404,6 +1404,10 @@ static unsigned long a5xx_gpu_busy(struct msm_gpu *gpu) + { + u64 busy_cycles, busy_time; + ++ /* Only read the gpu busy if the hardware is already active */ ++ if (pm_runtime_get_if_in_use(&gpu->pdev->dev) == 0) ++ return 0; ++ + busy_cycles = gpu_read64(gpu, REG_A5XX_RBBM_PERFCTR_RBBM_0_LO, + REG_A5XX_RBBM_PERFCTR_RBBM_0_HI); + +@@ -1412,6 +1416,8 @@ static unsigned long a5xx_gpu_busy(struct msm_gpu *gpu) + + gpu->devfreq.busy_cycles = busy_cycles; + ++ pm_runtime_put(&gpu->pdev->dev); ++ + if (WARN_ON(busy_time > ~0LU)) + return ~0LU; + +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +index c4e71abbdd53..34607a98cc7c 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +@@ -108,6 +108,13 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) + struct msm_gpu *gpu = &adreno_gpu->base; + int ret; + ++ /* ++ * This can get called from devfreq while the hardware is idle. Don't ++ * bring up the power if it isn't already active ++ */ ++ if (pm_runtime_get_if_in_use(gmu->dev) == 0) ++ return; ++ + gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0); + + gmu_write(gmu, REG_A6XX_GMU_DCVS_PERF_SETTING, +@@ -134,6 +141,7 @@ static void __a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index) + * for now leave it at max so that the performance is nominal. + */ + icc_set_bw(gpu->icc_path, 0, MBps_to_icc(7216)); ++ pm_runtime_put(gmu->dev); + } + + void a6xx_gmu_set_freq(struct msm_gpu *gpu, unsigned long freq) +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +index 68af24150de5..2c09d2c21773 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +@@ -810,6 +810,11 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu *gpu) + struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); + u64 busy_cycles, busy_time; + ++ ++ /* Only read the gpu busy if the hardware is already active */ ++ if (pm_runtime_get_if_in_use(a6xx_gpu->gmu.dev) == 0) ++ return 0; ++ + busy_cycles = gmu_read64(&a6xx_gpu->gmu, + REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_L, + REG_A6XX_GMU_CX_GMU_POWER_COUNTER_XOCLK_0_H); +@@ -819,6 +824,8 @@ static unsigned long a6xx_gpu_busy(struct msm_gpu *gpu) + + gpu->devfreq.busy_cycles = busy_cycles; + ++ pm_runtime_put(a6xx_gpu->gmu.dev); ++ + if (WARN_ON(busy_time > ~0LU)) + return ~0LU; + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +index 47b989834af1..c23a2fa13fb9 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +@@ -943,7 +943,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) + + return 0; + fail: +- mdp5_destroy(pdev); ++ if (mdp5_kms) ++ mdp5_destroy(pdev); + return ret; + } + +diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c +index 732f65df5c4f..fea30e7aa9e8 100644 +--- a/drivers/gpu/drm/msm/msm_rd.c ++++ b/drivers/gpu/drm/msm/msm_rd.c +@@ -29,8 +29,6 @@ + * or shader programs (if not emitted inline in cmdstream). + */ + +-#ifdef CONFIG_DEBUG_FS +- + #include <linux/circ_buf.h> + #include <linux/debugfs.h> + #include <linux/kfifo.h> +@@ -47,6 +45,8 @@ bool rd_full = false; + MODULE_PARM_DESC(rd_full, "If true, $debugfs/.../rd will snapshot all buffer contents"); + module_param_named(rd_full, rd_full, bool, 0600); + ++#ifdef CONFIG_DEBUG_FS ++ + enum rd_sect_type { + RD_NONE, + RD_TEST, /* ascii text */ +diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c +index 6be9df1820c5..2625ed84fc44 100644 +--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c +@@ -482,15 +482,16 @@ nv50_dac_create(struct drm_connector *connector, struct dcb_output *dcbe) + * audio component binding for ELD notification + */ + static void +-nv50_audio_component_eld_notify(struct drm_audio_component *acomp, int port) ++nv50_audio_component_eld_notify(struct drm_audio_component *acomp, int port, ++ int dev_id) + { + if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) + acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, +- port, -1); ++ port, dev_id); + } + + static int +-nv50_audio_component_get_eld(struct device *kdev, int port, int pipe, ++nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id, + bool *enabled, unsigned char *buf, int max_bytes) + { + struct drm_device *drm_dev = dev_get_drvdata(kdev); +@@ -506,7 +507,8 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int pipe, + nv_encoder = nouveau_encoder(encoder); + nv_connector = nouveau_encoder_connector_get(nv_encoder); + nv_crtc = nouveau_crtc(encoder->crtc); +- if (!nv_connector || !nv_crtc || nv_crtc->index != port) ++ if (!nv_connector || !nv_crtc || nv_encoder->or != port || ++ nv_crtc->index != dev_id) + continue; + *enabled = drm_detect_monitor_audio(nv_connector->edid); + if (*enabled) { +@@ -600,7 +602,8 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc) + + nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); + +- nv50_audio_component_eld_notify(drm->audio.component, nv_crtc->index); ++ nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, ++ nv_crtc->index); + } + + static void +@@ -634,7 +637,8 @@ nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode) + nvif_mthd(&disp->disp->object, 0, &args, + sizeof(args.base) + drm_eld_size(args.data)); + +- nv50_audio_component_eld_notify(drm->audio.component, nv_crtc->index); ++ nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, ++ nv_crtc->index); + } + + /****************************************************************************** +diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c +index 9b16a08eb4d9..bf6d41fb0c9f 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c ++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigm200.c +@@ -27,10 +27,10 @@ void + gm200_hdmi_scdc(struct nvkm_ior *ior, int head, u8 scdc) + { + struct nvkm_device *device = ior->disp->engine.subdev.device; +- const u32 hoff = head * 0x800; ++ const u32 soff = nv50_ior_base(ior); + const u32 ctrl = scdc & 0x3; + +- nvkm_mask(device, 0x61c5bc + hoff, 0x00000003, ctrl); ++ nvkm_mask(device, 0x61c5bc + soff, 0x00000003, ctrl); + + ior->tmds.high_speed = !!(scdc & 0x2); + } +diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c +index 4209b24a46d7..bf6b65257852 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c ++++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c +@@ -341,7 +341,7 @@ gk20a_gr_load(struct gf100_gr *gr, int ver, const struct gf100_gr_fwif *fwif) + + static const struct gf100_gr_fwif + gk20a_gr_fwif[] = { +- { -1, gk20a_gr_load, &gk20a_gr }, ++ { 0, gk20a_gr_load, &gk20a_gr }, + {} + }; + +diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c +index 70b20ee4741a..41ef6a9ca8cc 100644 +--- a/drivers/gpu/drm/qxl/qxl_kms.c ++++ b/drivers/gpu/drm/qxl/qxl_kms.c +@@ -218,7 +218,7 @@ int qxl_device_init(struct qxl_device *qdev, + &(qdev->ram_header->cursor_ring_hdr), + sizeof(struct qxl_command), + QXL_CURSOR_RING_SIZE, +- qdev->io_base + QXL_IO_NOTIFY_CMD, ++ qdev->io_base + QXL_IO_NOTIFY_CURSOR, + false, + &qdev->cursor_event); + +diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi.h b/drivers/gpu/drm/sun4i/sun4i_hdmi.h +index 7ad3f06c127e..00ca35f07ba5 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_hdmi.h ++++ b/drivers/gpu/drm/sun4i/sun4i_hdmi.h +@@ -148,7 +148,7 @@ + #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3 + + #define SUN4I_HDMI_DDC_CLK_REG 0x528 +-#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0x7) << 3) ++#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3) + #define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7) + + #define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540 +diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c +index 2ff780114106..12430b9d4e93 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c ++++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c +@@ -33,7 +33,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate, + unsigned long best_rate = 0; + u8 best_m = 0, best_n = 0, _m, _n; + +- for (_m = 0; _m < 8; _m++) { ++ for (_m = 0; _m < 16; _m++) { + for (_n = 0; _n < 8; _n++) { + unsigned long tmp_rate; + +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 1c71a1aa76b2..f03f1cc913ce 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -1157,6 +1157,9 @@ + #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882 + #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883 + ++#define USB_VENDOR_ID_TRUST 0x145f ++#define USB_DEVICE_ID_TRUST_PANORA_TABLET 0x0212 ++ + #define USB_VENDOR_ID_TURBOX 0x062a + #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 + #define USB_DEVICE_ID_ASUS_MD_5110 0x5110 +diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c +index e4cb543de0cd..ca8b5c261c7c 100644 +--- a/drivers/hid/hid-quirks.c ++++ b/drivers/hid/hid-quirks.c +@@ -168,6 +168,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET }, + { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_TRUST, USB_DEVICE_ID_TRUST_PANORA_TABLET), HID_QUIRK_MULTI_INPUT | HID_QUIRK_HIDINPUT_FORCE }, + { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET }, + { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT }, +diff --git a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c +index aa2dbed30fc3..6cf59fd26ad7 100644 +--- a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c ++++ b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c +@@ -480,6 +480,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data, + sizeof(ldr_xfer_query_resp)); + if (rv < 0) { + client_data->flag_retry = true; ++ *fw_info = (struct shim_fw_info){}; + return rv; + } + +@@ -489,6 +490,7 @@ static int ish_query_loader_prop(struct ishtp_cl_data *client_data, + "data size %d is not equal to size of loader_xfer_query_response %zu\n", + rv, sizeof(struct loader_xfer_query_response)); + client_data->flag_retry = true; ++ *fw_info = (struct shim_fw_info){}; + return -EMSGSIZE; + } + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c +index a90d757f7043..a6d6c7a3abcb 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x.c +@@ -1527,6 +1527,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) + return 0; + + err_arch_supported: ++ etmdrvdata[drvdata->cpu] = NULL; + if (--etm4_count == 0) { + etm4_cpu_pm_unregister(); + +diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c +index 43418a2126ff..471f34e40c74 100644 +--- a/drivers/hwtracing/coresight/coresight-platform.c ++++ b/drivers/hwtracing/coresight/coresight-platform.c +@@ -87,6 +87,7 @@ static void of_coresight_get_ports_legacy(const struct device_node *node, + int *nr_inport, int *nr_outport) + { + struct device_node *ep = NULL; ++ struct of_endpoint endpoint; + int in = 0, out = 0; + + do { +@@ -94,10 +95,16 @@ static void of_coresight_get_ports_legacy(const struct device_node *node, + if (!ep) + break; + +- if (of_coresight_legacy_ep_is_input(ep)) +- in++; +- else +- out++; ++ if (of_graph_parse_endpoint(ep, &endpoint)) ++ continue; ++ ++ if (of_coresight_legacy_ep_is_input(ep)) { ++ in = (endpoint.port + 1 > in) ? ++ endpoint.port + 1 : in; ++ } else { ++ out = (endpoint.port + 1) > out ? ++ endpoint.port + 1 : out; ++ } + + } while (ep); + +@@ -137,9 +144,16 @@ of_coresight_count_ports(struct device_node *port_parent) + { + int i = 0; + struct device_node *ep = NULL; ++ struct of_endpoint endpoint; ++ ++ while ((ep = of_graph_get_next_endpoint(port_parent, ep))) { ++ /* Defer error handling to parsing */ ++ if (of_graph_parse_endpoint(ep, &endpoint)) ++ continue; ++ if (endpoint.port + 1 > i) ++ i = endpoint.port + 1; ++ } + +- while ((ep = of_graph_get_next_endpoint(port_parent, ep))) +- i++; + return i; + } + +@@ -191,14 +205,12 @@ static int of_coresight_get_cpu(struct device *dev) + * Parses the local port, remote device name and the remote port. + * + * Returns : +- * 1 - If the parsing is successful and a connection record +- * was created for an output connection. + * 0 - If the parsing completed without any fatal errors. + * -Errno - Fatal error, abort the scanning. + */ + static int of_coresight_parse_endpoint(struct device *dev, + struct device_node *ep, +- struct coresight_connection *conn) ++ struct coresight_platform_data *pdata) + { + int ret = 0; + struct of_endpoint endpoint, rendpoint; +@@ -206,6 +218,7 @@ static int of_coresight_parse_endpoint(struct device *dev, + struct device_node *rep = NULL; + struct device *rdev = NULL; + struct fwnode_handle *rdev_fwnode; ++ struct coresight_connection *conn; + + do { + /* Parse the local port details */ +@@ -232,6 +245,13 @@ static int of_coresight_parse_endpoint(struct device *dev, + break; + } + ++ conn = &pdata->conns[endpoint.port]; ++ if (conn->child_fwnode) { ++ dev_warn(dev, "Duplicate output port %d\n", ++ endpoint.port); ++ ret = -EINVAL; ++ break; ++ } + conn->outport = endpoint.port; + /* + * Hold the refcount to the target device. This could be +@@ -244,7 +264,6 @@ static int of_coresight_parse_endpoint(struct device *dev, + conn->child_fwnode = fwnode_handle_get(rdev_fwnode); + conn->child_port = rendpoint.port; + /* Connection record updated */ +- ret = 1; + } while (0); + + of_node_put(rparent); +@@ -258,7 +277,6 @@ static int of_get_coresight_platform_data(struct device *dev, + struct coresight_platform_data *pdata) + { + int ret = 0; +- struct coresight_connection *conn; + struct device_node *ep = NULL; + const struct device_node *parent = NULL; + bool legacy_binding = false; +@@ -287,8 +305,6 @@ static int of_get_coresight_platform_data(struct device *dev, + dev_warn_once(dev, "Uses obsolete Coresight DT bindings\n"); + } + +- conn = pdata->conns; +- + /* Iterate through each output port to discover topology */ + while ((ep = of_graph_get_next_endpoint(parent, ep))) { + /* +@@ -300,15 +316,9 @@ static int of_get_coresight_platform_data(struct device *dev, + if (legacy_binding && of_coresight_legacy_ep_is_input(ep)) + continue; + +- ret = of_coresight_parse_endpoint(dev, ep, conn); +- switch (ret) { +- case 1: +- conn++; /* Fall through */ +- case 0: +- break; +- default: ++ ret = of_coresight_parse_endpoint(dev, ep, pdata); ++ if (ret) + return ret; +- } + } + + return 0; +@@ -647,6 +657,16 @@ static int acpi_coresight_parse_link(struct acpi_device *adev, + * coresight_remove_match(). + */ + conn->child_fwnode = fwnode_handle_get(&r_adev->fwnode); ++ } else if (dir == ACPI_CORESIGHT_LINK_SLAVE) { ++ /* ++ * We are only interested in the port number ++ * for the input ports at this component. ++ * Store the port number in child_port. ++ */ ++ conn->child_port = fields[0].integer.value; ++ } else { ++ /* Invalid direction */ ++ return -EINVAL; + } + + return dir; +@@ -692,10 +712,20 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev, + return dir; + + if (dir == ACPI_CORESIGHT_LINK_MASTER) { +- pdata->nr_outport++; ++ if (ptr->outport > pdata->nr_outport) ++ pdata->nr_outport = ptr->outport; + ptr++; + } else { +- pdata->nr_inport++; ++ WARN_ON(pdata->nr_inport == ptr->child_port); ++ /* ++ * We do not track input port connections for a device. ++ * However we need the highest port number described, ++ * which can be recorded now and reuse this connection ++ * record for an output connection. Hence, do not move ++ * the ptr for input connections ++ */ ++ if (ptr->child_port > pdata->nr_inport) ++ pdata->nr_inport = ptr->child_port; + } + } + +@@ -704,8 +734,13 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev, + return rc; + + /* Copy the connection information to the final location */ +- for (i = 0; i < pdata->nr_outport; i++) +- pdata->conns[i] = conns[i]; ++ for (i = 0; conns + i < ptr; i++) { ++ int port = conns[i].outport; ++ ++ /* Duplicate output port */ ++ WARN_ON(pdata->conns[port].child_fwnode); ++ pdata->conns[port] = conns[i]; ++ } + + devm_kfree(&adev->dev, conns); + return 0; +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c +index d0cc3985b72a..36cce2bfb744 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c +@@ -596,13 +596,6 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata) + goto out; + } + +- /* There is no point in reading a TMC in HW FIFO mode */ +- mode = readl_relaxed(drvdata->base + TMC_MODE); +- if (mode != TMC_MODE_CIRCULAR_BUFFER) { +- ret = -EINVAL; +- goto out; +- } +- + /* Don't interfere if operated from Perf */ + if (drvdata->mode == CS_MODE_PERF) { + ret = -EINVAL; +@@ -616,8 +609,15 @@ int tmc_read_prepare_etb(struct tmc_drvdata *drvdata) + } + + /* Disable the TMC if need be */ +- if (drvdata->mode == CS_MODE_SYSFS) ++ if (drvdata->mode == CS_MODE_SYSFS) { ++ /* There is no point in reading a TMC in HW FIFO mode */ ++ mode = readl_relaxed(drvdata->base + TMC_MODE); ++ if (mode != TMC_MODE_CIRCULAR_BUFFER) { ++ ret = -EINVAL; ++ goto out; ++ } + __tmc_etb_disable_hw(drvdata); ++ } + + drvdata->reading = true; + out: +diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c +index c71553c09f8e..8f5e62f02444 100644 +--- a/drivers/hwtracing/coresight/coresight.c ++++ b/drivers/hwtracing/coresight/coresight.c +@@ -1053,6 +1053,9 @@ static int coresight_orphan_match(struct device *dev, void *data) + for (i = 0; i < i_csdev->pdata->nr_outport; i++) { + conn = &i_csdev->pdata->conns[i]; + ++ /* Skip the port if FW doesn't describe it */ ++ if (!conn->child_fwnode) ++ continue; + /* We have found at least one orphan connection */ + if (conn->child_dev == NULL) { + /* Does it match this newly added device? */ +@@ -1091,6 +1094,8 @@ static void coresight_fixup_device_conns(struct coresight_device *csdev) + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_connection *conn = &csdev->pdata->conns[i]; + ++ if (!conn->child_fwnode) ++ continue; + conn->child_dev = + coresight_find_csdev_by_fwnode(conn->child_fwnode); + if (!conn->child_dev) +@@ -1118,7 +1123,7 @@ static int coresight_remove_match(struct device *dev, void *data) + for (i = 0; i < iterator->pdata->nr_outport; i++) { + conn = &iterator->pdata->conns[i]; + +- if (conn->child_dev == NULL) ++ if (conn->child_dev == NULL || conn->child_fwnode == NULL) + continue; + + if (csdev->dev.fwnode == conn->child_fwnode) { +diff --git a/drivers/i2c/busses/i2c-icy.c b/drivers/i2c/busses/i2c-icy.c +index 271470f4d8a9..66c9923fc766 100644 +--- a/drivers/i2c/busses/i2c-icy.c ++++ b/drivers/i2c/busses/i2c-icy.c +@@ -43,6 +43,7 @@ + #include <linux/i2c.h> + #include <linux/i2c-algo-pcf.h> + ++#include <asm/amigahw.h> + #include <asm/amigaints.h> + #include <linux/zorro.h> + +diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c +index 30ded6422e7b..69740a4ff1db 100644 +--- a/drivers/i2c/busses/i2c-piix4.c ++++ b/drivers/i2c/busses/i2c-piix4.c +@@ -977,7 +977,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id) + } + + if (dev->vendor == PCI_VENDOR_ID_AMD && +- dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) { ++ (dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS || ++ dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) { + retval = piix4_setup_sb800(dev, id, 1); + } + +diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c +index 466e4f681d7a..f537a37ac1d5 100644 +--- a/drivers/i2c/busses/i2c-pxa.c ++++ b/drivers/i2c/busses/i2c-pxa.c +@@ -311,11 +311,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why) + dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n", + readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)), + readl(_ISR(i2c))); +- dev_dbg(dev, "log: "); ++ dev_err(dev, "log:"); + for (i = 0; i < i2c->irqlogidx; i++) +- pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); +- +- pr_debug("\n"); ++ pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]); ++ pr_cont("\n"); + } + + #else /* ifdef DEBUG */ +@@ -747,11 +746,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c) + { + u32 icr; + +- /* +- * Clear the STOP and ACK flags +- */ ++ /* Clear the START, STOP, ACK, TB and MA flags */ + icr = readl(_ICR(i2c)); +- icr &= ~(ICR_STOP | ICR_ACKNAK); ++ icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA); + writel(icr, _ICR(i2c)); + } + +diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c +index b129693af0fd..94da3b1ca3a2 100644 +--- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c ++++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c +@@ -134,7 +134,7 @@ static ssize_t iio_dmaengine_buffer_get_length_align(struct device *dev, + struct dmaengine_buffer *dmaengine_buffer = + iio_buffer_to_dmaengine_buffer(indio_dev->buffer); + +- return sprintf(buf, "%u\n", dmaengine_buffer->align); ++ return sprintf(buf, "%zu\n", dmaengine_buffer->align); + } + + static IIO_DEVICE_ATTR(length_align_bytes, 0444, +diff --git a/drivers/iio/light/gp2ap002.c b/drivers/iio/light/gp2ap002.c +index b7ef16b28280..7a2679bdc987 100644 +--- a/drivers/iio/light/gp2ap002.c ++++ b/drivers/iio/light/gp2ap002.c +@@ -158,6 +158,9 @@ static irqreturn_t gp2ap002_prox_irq(int irq, void *d) + int val; + int ret; + ++ if (!gp2ap002->enabled) ++ goto err_retrig; ++ + ret = regmap_read(gp2ap002->map, GP2AP002_PROX, &val); + if (ret) { + dev_err(gp2ap002->dev, "error reading proximity\n"); +@@ -247,6 +250,8 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, + struct gp2ap002 *gp2ap002 = iio_priv(indio_dev); + int ret; + ++ pm_runtime_get_sync(gp2ap002->dev); ++ + switch (mask) { + case IIO_CHAN_INFO_RAW: + switch (chan->type) { +@@ -255,13 +260,21 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, + if (ret < 0) + return ret; + *val = ret; +- return IIO_VAL_INT; ++ ret = IIO_VAL_INT; ++ goto out; + default: +- return -EINVAL; ++ ret = -EINVAL; ++ goto out; + } + default: +- return -EINVAL; ++ ret = -EINVAL; + } ++ ++out: ++ pm_runtime_mark_last_busy(gp2ap002->dev); ++ pm_runtime_put_autosuspend(gp2ap002->dev); ++ ++ return ret; + } + + static int gp2ap002_init(struct gp2ap002 *gp2ap002) +diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c +index 29c209cc1108..973264a088f9 100644 +--- a/drivers/iio/pressure/bmp280-core.c ++++ b/drivers/iio/pressure/bmp280-core.c +@@ -271,6 +271,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data, + + (s32)2097152) * calib->H2 + 8192) >> 14); + var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4; + ++ var = clamp_val(var, 0, 419430400); ++ + return var >> 12; + }; + +@@ -713,7 +715,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas) + unsigned int ctrl; + + if (data->use_eoc) +- init_completion(&data->done); ++ reinit_completion(&data->done); + + ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); + if (ret) +@@ -969,6 +971,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev, + "trying to enforce it\n"); + irq_trig = IRQF_TRIGGER_RISING; + } ++ ++ init_completion(&data->done); ++ + ret = devm_request_threaded_irq(dev, + irq, + bmp085_eoc_irq, +diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c +index 17f14e0eafe4..1c2bf18cda9f 100644 +--- a/drivers/infiniband/core/cm.c ++++ b/drivers/infiniband/core/cm.c +@@ -1076,7 +1076,9 @@ retest: + case IB_CM_REP_SENT: + case IB_CM_MRA_REP_RCVD: + ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); +- /* Fall through */ ++ cm_send_rej_locked(cm_id_priv, IB_CM_REJ_CONSUMER_DEFINED, NULL, ++ 0, NULL, 0); ++ goto retest; + case IB_CM_MRA_REQ_SENT: + case IB_CM_REP_RCVD: + case IB_CM_MRA_REP_SENT: +diff --git a/drivers/infiniband/core/cma_configfs.c b/drivers/infiniband/core/cma_configfs.c +index c672a4978bfd..3c1e2ca564fe 100644 +--- a/drivers/infiniband/core/cma_configfs.c ++++ b/drivers/infiniband/core/cma_configfs.c +@@ -322,8 +322,21 @@ fail: + return ERR_PTR(err); + } + ++static void drop_cma_dev(struct config_group *cgroup, struct config_item *item) ++{ ++ struct config_group *group = ++ container_of(item, struct config_group, cg_item); ++ struct cma_dev_group *cma_dev_group = ++ container_of(group, struct cma_dev_group, device_group); ++ ++ configfs_remove_default_groups(&cma_dev_group->ports_group); ++ configfs_remove_default_groups(&cma_dev_group->device_group); ++ config_item_put(item); ++} ++ + static struct configfs_group_operations cma_subsys_group_ops = { + .make_group = make_cma_dev, ++ .drop_item = drop_cma_dev, + }; + + static const struct config_item_type cma_subsys_type = { +diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c +index 087682e6969e..defe9cd4c5ee 100644 +--- a/drivers/infiniband/core/sysfs.c ++++ b/drivers/infiniband/core/sysfs.c +@@ -1058,8 +1058,7 @@ static int add_port(struct ib_core_device *coredev, int port_num) + coredev->ports_kobj, + "%d", port_num); + if (ret) { +- kfree(p); +- return ret; ++ goto err_put; + } + + p->gid_attr_group = kzalloc(sizeof(*p->gid_attr_group), GFP_KERNEL); +@@ -1072,8 +1071,7 @@ static int add_port(struct ib_core_device *coredev, int port_num) + ret = kobject_init_and_add(&p->gid_attr_group->kobj, &gid_attr_type, + &p->kobj, "gid_attrs"); + if (ret) { +- kfree(p->gid_attr_group); +- goto err_put; ++ goto err_put_gid_attrs; + } + + if (device->ops.process_mad && is_full_dev) { +@@ -1404,8 +1402,10 @@ int ib_port_register_module_stat(struct ib_device *device, u8 port_num, + + ret = kobject_init_and_add(kobj, ktype, &port->kobj, "%s", + name); +- if (ret) ++ if (ret) { ++ kobject_put(kobj); + return ret; ++ } + } + + return 0; +diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c +index 060b4ebbd2ba..d6e9cc94dd90 100644 +--- a/drivers/infiniband/core/uverbs_cmd.c ++++ b/drivers/infiniband/core/uverbs_cmd.c +@@ -2959,6 +2959,7 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) + wq_init_attr.event_handler = ib_uverbs_wq_event_handler; + wq_init_attr.create_flags = cmd.create_flags; + INIT_LIST_HEAD(&obj->uevent.event_list); ++ obj->uevent.uobject.user_handle = cmd.user_handle; + + wq = pd->device->ops.create_wq(pd, &wq_init_attr, &attrs->driver_udata); + if (IS_ERR(wq)) { +@@ -2976,8 +2977,6 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs) + atomic_set(&wq->usecnt, 0); + atomic_inc(&pd->usecnt); + atomic_inc(&cq->usecnt); +- wq->uobject = obj; +- obj->uevent.uobject.object = wq; + + memset(&resp, 0, sizeof(resp)); + resp.wq_handle = obj->uevent.uobject.id; +diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c +index 599340c1f0b8..541dbcf22d0e 100644 +--- a/drivers/infiniband/hw/cxgb4/device.c ++++ b/drivers/infiniband/hw/cxgb4/device.c +@@ -953,6 +953,7 @@ void c4iw_dealloc(struct uld_ctx *ctx) + static void c4iw_remove(struct uld_ctx *ctx) + { + pr_debug("c4iw_dev %p\n", ctx->dev); ++ debugfs_remove_recursive(ctx->dev->debugfs_root); + c4iw_unregister_device(ctx->dev); + c4iw_dealloc(ctx); + } +diff --git a/drivers/infiniband/hw/efa/efa_com_cmd.c b/drivers/infiniband/hw/efa/efa_com_cmd.c +index eea5574a62e8..69f842c92ff6 100644 +--- a/drivers/infiniband/hw/efa/efa_com_cmd.c ++++ b/drivers/infiniband/hw/efa/efa_com_cmd.c +@@ -388,7 +388,7 @@ static int efa_com_get_feature_ex(struct efa_com_dev *edev, + + if (control_buff_size) + EFA_SET(&get_cmd.aq_common_descriptor.flags, +- EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT, 1); ++ EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA, 1); + + efa_com_set_dma_addr(control_buf_dma_addr, + &get_cmd.control_buffer.address.mem_addr_high, +@@ -540,7 +540,7 @@ static int efa_com_set_feature_ex(struct efa_com_dev *edev, + if (control_buff_size) { + set_cmd->aq_common_descriptor.flags = 0; + EFA_SET(&set_cmd->aq_common_descriptor.flags, +- EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA_INDIRECT, 1); ++ EFA_ADMIN_AQ_COMMON_DESC_CTRL_DATA, 1); + efa_com_set_dma_addr(control_buf_dma_addr, + &set_cmd->control_buffer.address.mem_addr_high, + &set_cmd->control_buffer.address.mem_addr_low); +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index c3316672b70e..f9fa80ae5560 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -1349,34 +1349,26 @@ static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev) + static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev) + { + struct hns_roce_pf_timer_res_a *req_a; +- struct hns_roce_cmq_desc desc[2]; +- int ret, i; ++ struct hns_roce_cmq_desc desc; ++ int ret; + +- for (i = 0; i < 2; i++) { +- hns_roce_cmq_setup_basic_desc(&desc[i], +- HNS_ROCE_OPC_QUERY_PF_TIMER_RES, +- true); ++ hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES, ++ true); + +- if (i == 0) +- desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); +- else +- desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); +- } +- +- ret = hns_roce_cmq_send(hr_dev, desc, 2); ++ ret = hns_roce_cmq_send(hr_dev, &desc, 1); + if (ret) + return ret; + +- req_a = (struct hns_roce_pf_timer_res_a *)desc[0].data; ++ req_a = (struct hns_roce_pf_timer_res_a *)desc.data; + + hr_dev->caps.qpc_timer_bt_num = +- roce_get_field(req_a->qpc_timer_bt_idx_num, +- PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M, +- PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S); ++ roce_get_field(req_a->qpc_timer_bt_idx_num, ++ PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M, ++ PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S); + hr_dev->caps.cqc_timer_bt_num = +- roce_get_field(req_a->cqc_timer_bt_idx_num, +- PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M, +- PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S); ++ roce_get_field(req_a->cqc_timer_bt_idx_num, ++ PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M, ++ PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S); + + return 0; + } +@@ -4639,7 +4631,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, + qp_attr->path_mig_state = IB_MIG_ARMED; + qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE; + if (hr_qp->ibqp.qp_type == IB_QPT_UD) +- qp_attr->qkey = V2_QKEY_VAL; ++ qp_attr->qkey = le32_to_cpu(context.qkey_xrcd); + + qp_attr->rq_psn = roce_get_field(context.byte_108_rx_reqepsn, + V2_QPC_BYTE_108_RX_REQ_EPSN_M, +diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c +index 46e1ab771f10..ed10e2f32aab 100644 +--- a/drivers/infiniband/hw/mlx5/devx.c ++++ b/drivers/infiniband/hw/mlx5/devx.c +@@ -494,6 +494,10 @@ static u64 devx_get_obj_id(const void *in) + obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, + MLX5_GET(rst2init_qp_in, in, qpn)); + break; ++ case MLX5_CMD_OP_INIT2INIT_QP: ++ obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, ++ MLX5_GET(init2init_qp_in, in, qpn)); ++ break; + case MLX5_CMD_OP_INIT2RTR_QP: + obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_QP, + MLX5_GET(init2rtr_qp_in, in, qpn)); +@@ -819,6 +823,7 @@ static bool devx_is_obj_modify_cmd(const void *in) + case MLX5_CMD_OP_SET_L2_TABLE_ENTRY: + case MLX5_CMD_OP_RST2INIT_QP: + case MLX5_CMD_OP_INIT2RTR_QP: ++ case MLX5_CMD_OP_INIT2INIT_QP: + case MLX5_CMD_OP_RTR2RTS_QP: + case MLX5_CMD_OP_RTS2RTS_QP: + case MLX5_CMD_OP_SQERR2RTS_QP: +diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c +index b1a8a9175040..6d1ff13d2283 100644 +--- a/drivers/infiniband/hw/mlx5/srq.c ++++ b/drivers/infiniband/hw/mlx5/srq.c +@@ -310,12 +310,18 @@ int mlx5_ib_create_srq(struct ib_srq *ib_srq, + srq->msrq.event = mlx5_ib_srq_event; + srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn; + +- if (udata) +- if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof(__u32))) { ++ if (udata) { ++ struct mlx5_ib_create_srq_resp resp = { ++ .srqn = srq->msrq.srqn, ++ }; ++ ++ if (ib_copy_to_udata(udata, &resp, min(udata->outlen, ++ sizeof(resp)))) { + mlx5_ib_dbg(dev, "copy to user failed\n"); + err = -EFAULT; + goto err_core; + } ++ } + + init_attr->attr.max_wr = srq->msrq.max - 1; + +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index 98552749d71c..fcf982c60db6 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -610,6 +610,11 @@ static int srpt_refresh_port(struct srpt_port *sport) + dev_name(&sport->sdev->device->dev), sport->port, + PTR_ERR(sport->mad_agent)); + sport->mad_agent = NULL; ++ memset(&port_modify, 0, sizeof(port_modify)); ++ port_modify.clr_port_cap_mask = IB_PORT_DEVICE_MGMT_SUP; ++ ib_modify_port(sport->sdev->device, sport->port, 0, ++ &port_modify); ++ + } + } + +@@ -633,9 +638,8 @@ static void srpt_unregister_mad_agent(struct srpt_device *sdev) + for (i = 1; i <= sdev->device->phys_port_cnt; i++) { + sport = &sdev->port[i - 1]; + WARN_ON(sport->port != i); +- if (ib_modify_port(sdev->device, i, 0, &port_modify) < 0) +- pr_err("disabling MAD processing failed.\n"); + if (sport->mad_agent) { ++ ib_modify_port(sdev->device, i, 0, &port_modify); + ib_unregister_mad_agent(sport->mad_agent); + sport->mad_agent = NULL; + } +diff --git a/drivers/input/serio/i8042-ppcio.h b/drivers/input/serio/i8042-ppcio.h +deleted file mode 100644 +index 391f94d9e47d..000000000000 +--- a/drivers/input/serio/i8042-ppcio.h ++++ /dev/null +@@ -1,57 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0-only */ +-#ifndef _I8042_PPCIO_H +-#define _I8042_PPCIO_H +- +- +-#if defined(CONFIG_WALNUT) +- +-#define I8042_KBD_IRQ 25 +-#define I8042_AUX_IRQ 26 +- +-#define I8042_KBD_PHYS_DESC "walnutps2/serio0" +-#define I8042_AUX_PHYS_DESC "walnutps2/serio1" +-#define I8042_MUX_PHYS_DESC "walnutps2/serio%d" +- +-extern void *kb_cs; +-extern void *kb_data; +- +-#define I8042_COMMAND_REG (*(int *)kb_cs) +-#define I8042_DATA_REG (*(int *)kb_data) +- +-static inline int i8042_read_data(void) +-{ +- return readb(kb_data); +-} +- +-static inline int i8042_read_status(void) +-{ +- return readb(kb_cs); +-} +- +-static inline void i8042_write_data(int val) +-{ +- writeb(val, kb_data); +-} +- +-static inline void i8042_write_command(int val) +-{ +- writeb(val, kb_cs); +-} +- +-static inline int i8042_platform_init(void) +-{ +- i8042_reset = I8042_RESET_ALWAYS; +- return 0; +-} +- +-static inline void i8042_platform_exit(void) +-{ +-} +- +-#else +- +-#include "i8042-io.h" +- +-#endif +- +-#endif /* _I8042_PPCIO_H */ +diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h +index 38dc27ad3c18..eb376700dfff 100644 +--- a/drivers/input/serio/i8042.h ++++ b/drivers/input/serio/i8042.h +@@ -17,8 +17,6 @@ + #include "i8042-ip22io.h" + #elif defined(CONFIG_SNI_RM) + #include "i8042-snirm.h" +-#elif defined(CONFIG_PPC) +-#include "i8042-ppcio.h" + #elif defined(CONFIG_SPARC) + #include "i8042-sparcio.h" + #elif defined(CONFIG_X86) || defined(CONFIG_IA64) +diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c +index d2587724c52a..9b8450794a8a 100644 +--- a/drivers/input/touchscreen/edt-ft5x06.c ++++ b/drivers/input/touchscreen/edt-ft5x06.c +@@ -938,19 +938,25 @@ static void edt_ft5x06_ts_get_defaults(struct device *dev, + + error = device_property_read_u32(dev, "offset", &val); + if (!error) { +- edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val); ++ if (reg_addr->reg_offset != NO_REGISTER) ++ edt_ft5x06_register_write(tsdata, ++ reg_addr->reg_offset, val); + tsdata->offset = val; + } + + error = device_property_read_u32(dev, "offset-x", &val); + if (!error) { +- edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_x, val); ++ if (reg_addr->reg_offset_x != NO_REGISTER) ++ edt_ft5x06_register_write(tsdata, ++ reg_addr->reg_offset_x, val); + tsdata->offset_x = val; + } + + error = device_property_read_u32(dev, "offset-y", &val); + if (!error) { +- edt_ft5x06_register_write(tsdata, reg_addr->reg_offset_y, val); ++ if (reg_addr->reg_offset_y != NO_REGISTER) ++ edt_ft5x06_register_write(tsdata, ++ reg_addr->reg_offset_y, val); + tsdata->offset_y = val; + } + } +diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c +index 82508730feb7..af21d24a09e8 100644 +--- a/drivers/iommu/arm-smmu-v3.c ++++ b/drivers/iommu/arm-smmu-v3.c +@@ -171,6 +171,8 @@ + #define ARM_SMMU_PRIQ_IRQ_CFG1 0xd8 + #define ARM_SMMU_PRIQ_IRQ_CFG2 0xdc + ++#define ARM_SMMU_REG_SZ 0xe00 ++ + /* Common MSI config fields */ + #define MSI_CFG0_ADDR_MASK GENMASK_ULL(51, 2) + #define MSI_CFG2_SH GENMASK(5, 4) +@@ -628,6 +630,7 @@ struct arm_smmu_strtab_cfg { + struct arm_smmu_device { + struct device *dev; + void __iomem *base; ++ void __iomem *page1; + + #define ARM_SMMU_FEAT_2_LVL_STRTAB (1 << 0) + #define ARM_SMMU_FEAT_2_LVL_CDTAB (1 << 1) +@@ -733,9 +736,8 @@ static struct arm_smmu_option_prop arm_smmu_options[] = { + static inline void __iomem *arm_smmu_page1_fixup(unsigned long offset, + struct arm_smmu_device *smmu) + { +- if ((offset > SZ_64K) && +- (smmu->options & ARM_SMMU_OPT_PAGE0_REGS_ONLY)) +- offset -= SZ_64K; ++ if (offset > SZ_64K) ++ return smmu->page1 + offset - SZ_64K; + + return smmu->base + offset; + } +@@ -4021,6 +4023,18 @@ err_reset_pci_ops: __maybe_unused; + return err; + } + ++static void __iomem *arm_smmu_ioremap(struct device *dev, resource_size_t start, ++ resource_size_t size) ++{ ++ struct resource res = { ++ .flags = IORESOURCE_MEM, ++ .start = start, ++ .end = start + size - 1, ++ }; ++ ++ return devm_ioremap_resource(dev, &res); ++} ++ + static int arm_smmu_device_probe(struct platform_device *pdev) + { + int irq, ret; +@@ -4056,10 +4070,23 @@ static int arm_smmu_device_probe(struct platform_device *pdev) + } + ioaddr = res->start; + +- smmu->base = devm_ioremap_resource(dev, res); ++ /* ++ * Don't map the IMPLEMENTATION DEFINED regions, since they may contain ++ * the PMCG registers which are reserved by the PMU driver. ++ */ ++ smmu->base = arm_smmu_ioremap(dev, ioaddr, ARM_SMMU_REG_SZ); + if (IS_ERR(smmu->base)) + return PTR_ERR(smmu->base); + ++ if (arm_smmu_resource_size(smmu) > SZ_64K) { ++ smmu->page1 = arm_smmu_ioremap(dev, ioaddr + SZ_64K, ++ ARM_SMMU_REG_SZ); ++ if (IS_ERR(smmu->page1)) ++ return PTR_ERR(smmu->page1); ++ } else { ++ smmu->page1 = smmu->base; ++ } ++ + /* Interrupt lines */ + + irq = platform_get_irq_byname_optional(pdev, "combined"); +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index 11ed871dd255..fde7aba49b74 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -2518,9 +2518,6 @@ struct dmar_domain *find_domain(struct device *dev) + if (unlikely(attach_deferred(dev) || iommu_dummy(dev))) + return NULL; + +- if (dev_is_pci(dev)) +- dev = &pci_real_dma_dev(to_pci_dev(dev))->dev; +- + /* No lock here, assumes no domain exit in normal case */ + info = dev->archdata.iommu; + if (likely(info)) +diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c +index 7906624a731c..478308fb82cc 100644 +--- a/drivers/mailbox/imx-mailbox.c ++++ b/drivers/mailbox/imx-mailbox.c +@@ -66,6 +66,8 @@ struct imx_mu_priv { + struct clk *clk; + int irq; + ++ u32 xcr; ++ + bool side_b; + }; + +@@ -374,7 +376,7 @@ static struct mbox_chan *imx_mu_scu_xlate(struct mbox_controller *mbox, + break; + default: + dev_err(mbox->dev, "Invalid chan type: %d\n", type); +- return NULL; ++ return ERR_PTR(-EINVAL); + } + + if (chan >= mbox->num_chans) { +@@ -558,12 +560,45 @@ static const struct of_device_id imx_mu_dt_ids[] = { + }; + MODULE_DEVICE_TABLE(of, imx_mu_dt_ids); + ++static int imx_mu_suspend_noirq(struct device *dev) ++{ ++ struct imx_mu_priv *priv = dev_get_drvdata(dev); ++ ++ priv->xcr = imx_mu_read(priv, priv->dcfg->xCR); ++ ++ return 0; ++} ++ ++static int imx_mu_resume_noirq(struct device *dev) ++{ ++ struct imx_mu_priv *priv = dev_get_drvdata(dev); ++ ++ /* ++ * ONLY restore MU when context lost, the TIE could ++ * be set during noirq resume as there is MU data ++ * communication going on, and restore the saved ++ * value will overwrite the TIE and cause MU data ++ * send failed, may lead to system freeze. This issue ++ * is observed by testing freeze mode suspend. ++ */ ++ if (!imx_mu_read(priv, priv->dcfg->xCR)) ++ imx_mu_write(priv, priv->xcr, priv->dcfg->xCR); ++ ++ return 0; ++} ++ ++static const struct dev_pm_ops imx_mu_pm_ops = { ++ SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_mu_suspend_noirq, ++ imx_mu_resume_noirq) ++}; ++ + static struct platform_driver imx_mu_driver = { + .probe = imx_mu_probe, + .remove = imx_mu_remove, + .driver = { + .name = "imx_mu", + .of_match_table = imx_mu_dt_ids, ++ .pm = &imx_mu_pm_ops, + }, + }; + module_platform_driver(imx_mu_driver); +diff --git a/drivers/mailbox/zynqmp-ipi-mailbox.c b/drivers/mailbox/zynqmp-ipi-mailbox.c +index 86887c9a349a..f9cc674ba9b7 100644 +--- a/drivers/mailbox/zynqmp-ipi-mailbox.c ++++ b/drivers/mailbox/zynqmp-ipi-mailbox.c +@@ -504,10 +504,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, + mchan->req_buf_size = resource_size(&res); + mchan->req_buf = devm_ioremap(mdev, res.start, + mchan->req_buf_size); +- if (IS_ERR(mchan->req_buf)) { ++ if (!mchan->req_buf) { + dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); +- ret = PTR_ERR(mchan->req_buf); +- return ret; ++ return -ENOMEM; + } + } else if (ret != -ENODEV) { + dev_err(mdev, "Unmatched resource %s, %d.\n", name, ret); +@@ -520,10 +519,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, + mchan->resp_buf_size = resource_size(&res); + mchan->resp_buf = devm_ioremap(mdev, res.start, + mchan->resp_buf_size); +- if (IS_ERR(mchan->resp_buf)) { ++ if (!mchan->resp_buf) { + dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); +- ret = PTR_ERR(mchan->resp_buf); +- return ret; ++ return -ENOMEM; + } + } else if (ret != -ENODEV) { + dev_err(mdev, "Unmatched resource %s.\n", name); +@@ -543,10 +541,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, + mchan->req_buf_size = resource_size(&res); + mchan->req_buf = devm_ioremap(mdev, res.start, + mchan->req_buf_size); +- if (IS_ERR(mchan->req_buf)) { ++ if (!mchan->req_buf) { + dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); +- ret = PTR_ERR(mchan->req_buf); +- return ret; ++ return -ENOMEM; + } + } else if (ret != -ENODEV) { + dev_err(mdev, "Unmatched resource %s.\n", name); +@@ -559,10 +556,9 @@ static int zynqmp_ipi_mbox_probe(struct zynqmp_ipi_mbox *ipi_mbox, + mchan->resp_buf_size = resource_size(&res); + mchan->resp_buf = devm_ioremap(mdev, res.start, + mchan->resp_buf_size); +- if (IS_ERR(mchan->resp_buf)) { ++ if (!mchan->resp_buf) { + dev_err(mdev, "Unable to map IPI buffer I/O memory\n"); +- ret = PTR_ERR(mchan->resp_buf); +- return ret; ++ return -ENOMEM; + } + } else if (ret != -ENODEV) { + dev_err(mdev, "Unmatched resource %s.\n", name); +diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c +index 72856e5f23a3..fd1f288fd801 100644 +--- a/drivers/md/bcache/btree.c ++++ b/drivers/md/bcache/btree.c +@@ -1389,7 +1389,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, + if (__set_blocks(n1, n1->keys + n2->keys, + block_bytes(b->c)) > + btree_blocks(new_nodes[i])) +- goto out_nocoalesce; ++ goto out_unlock_nocoalesce; + + keys = n2->keys; + /* Take the key of the node we're getting rid of */ +@@ -1418,7 +1418,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, + + if (__bch_keylist_realloc(&keylist, + bkey_u64s(&new_nodes[i]->key))) +- goto out_nocoalesce; ++ goto out_unlock_nocoalesce; + + bch_btree_node_write(new_nodes[i], &cl); + bch_keylist_add(&keylist, &new_nodes[i]->key); +@@ -1464,6 +1464,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op, + /* Invalidated our iterator */ + return -EINTR; + ++out_unlock_nocoalesce: ++ for (i = 0; i < nodes; i++) ++ mutex_unlock(&new_nodes[i]->write_lock); ++ + out_nocoalesce: + closure_sync(&cl); + +diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c +index 3e500098132f..e0c800cf87a9 100644 +--- a/drivers/md/dm-mpath.c ++++ b/drivers/md/dm-mpath.c +@@ -1918,7 +1918,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti, + int r; + + current_pgpath = READ_ONCE(m->current_pgpath); +- if (!current_pgpath) ++ if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags)) + current_pgpath = choose_pgpath(m, 0); + + if (current_pgpath) { +diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c +index 369de15c4e80..61b7d7b7e5a6 100644 +--- a/drivers/md/dm-zoned-metadata.c ++++ b/drivers/md/dm-zoned-metadata.c +@@ -1554,7 +1554,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd) + return dzone; + } + +- return ERR_PTR(-EBUSY); ++ return NULL; + } + + /* +@@ -1574,7 +1574,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) + return zone; + } + +- return ERR_PTR(-EBUSY); ++ return NULL; + } + + /* +diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c +index e7ace908a9b7..d50817320e8e 100644 +--- a/drivers/md/dm-zoned-reclaim.c ++++ b/drivers/md/dm-zoned-reclaim.c +@@ -349,8 +349,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc) + + /* Get a data zone */ + dzone = dmz_get_zone_for_reclaim(zmd); +- if (IS_ERR(dzone)) +- return PTR_ERR(dzone); ++ if (!dzone) ++ return -EBUSY; + + start = jiffies; + +diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c +index 5c2a23b953a4..eba2b9f040df 100644 +--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c ++++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c +@@ -1089,6 +1089,10 @@ static struct device *s5p_mfc_alloc_memdev(struct device *dev, + child->coherent_dma_mask = dev->coherent_dma_mask; + child->dma_mask = dev->dma_mask; + child->release = s5p_mfc_memdev_release; ++ child->dma_parms = devm_kzalloc(dev, sizeof(*child->dma_parms), ++ GFP_KERNEL); ++ if (!child->dma_parms) ++ goto err; + + /* + * The memdevs are not proper OF platform devices, so in order for them +@@ -1104,7 +1108,7 @@ static struct device *s5p_mfc_alloc_memdev(struct device *dev, + return child; + device_del(child); + } +- ++err: + put_device(child); + return NULL; + } +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 452edd06d67d..99fd377f9b81 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -1825,7 +1825,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, + sizeof(p_hevc_pps->row_height_minus1)); + + p_hevc_pps->flags &= +- ~V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED; ++ ~V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED; + } + + if (p_hevc_pps->flags & +diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c +index 857991cb3cbb..711979afd90a 100644 +--- a/drivers/mfd/stmfx.c ++++ b/drivers/mfd/stmfx.c +@@ -287,14 +287,21 @@ static int stmfx_irq_init(struct i2c_client *client) + + ret = regmap_write(stmfx->map, STMFX_REG_IRQ_OUT_PIN, irqoutpin); + if (ret) +- return ret; ++ goto irq_exit; + + ret = devm_request_threaded_irq(stmfx->dev, client->irq, + NULL, stmfx_irq_handler, + irqtrigger | IRQF_ONESHOT, + "stmfx", stmfx); + if (ret) +- stmfx_irq_exit(client); ++ goto irq_exit; ++ ++ stmfx->irq = client->irq; ++ ++ return 0; ++ ++irq_exit: ++ stmfx_irq_exit(client); + + return ret; + } +@@ -481,6 +488,8 @@ static int stmfx_suspend(struct device *dev) + if (ret) + return ret; + ++ disable_irq(stmfx->irq); ++ + if (stmfx->vdd) + return regulator_disable(stmfx->vdd); + +@@ -501,6 +510,13 @@ static int stmfx_resume(struct device *dev) + } + } + ++ /* Reset STMFX - supply has been stopped during suspend */ ++ ret = stmfx_chip_reset(stmfx); ++ if (ret) { ++ dev_err(stmfx->dev, "Failed to reset chip: %d\n", ret); ++ return ret; ++ } ++ + ret = regmap_raw_write(stmfx->map, STMFX_REG_SYS_CTRL, + &stmfx->bkp_sysctrl, sizeof(stmfx->bkp_sysctrl)); + if (ret) +@@ -517,6 +533,8 @@ static int stmfx_resume(struct device *dev) + if (ret) + return ret; + ++ enable_irq(stmfx->irq); ++ + return 0; + } + #endif +diff --git a/drivers/mfd/wcd934x.c b/drivers/mfd/wcd934x.c +index 90341f3c6810..da910302d51a 100644 +--- a/drivers/mfd/wcd934x.c ++++ b/drivers/mfd/wcd934x.c +@@ -280,7 +280,6 @@ static void wcd934x_slim_remove(struct slim_device *sdev) + + regulator_bulk_disable(WCD934X_MAX_SUPPLY, ddata->supplies); + mfd_remove_devices(&sdev->dev); +- kfree(ddata); + } + + static const struct slim_device_id wcd934x_slim_id[] = { +diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c +index 1e9fe7d92597..737dede4a95c 100644 +--- a/drivers/mfd/wm8994-core.c ++++ b/drivers/mfd/wm8994-core.c +@@ -690,3 +690,4 @@ module_i2c_driver(wm8994_i2c_driver); + MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); ++MODULE_SOFTDEP("pre: wm8994_regulator"); +diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c +index e3e085e33d46..7939c55daceb 100644 +--- a/drivers/misc/fastrpc.c ++++ b/drivers/misc/fastrpc.c +@@ -904,6 +904,7 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx, + struct fastrpc_channel_ctx *cctx; + struct fastrpc_user *fl = ctx->fl; + struct fastrpc_msg *msg = &ctx->msg; ++ int ret; + + cctx = fl->cctx; + msg->pid = fl->tgid; +@@ -919,7 +920,13 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx, + msg->size = roundup(ctx->msg_sz, PAGE_SIZE); + fastrpc_context_get(ctx); + +- return rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg)); ++ ret = rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg)); ++ ++ if (ret) ++ fastrpc_context_put(ctx); ++ ++ return ret; ++ + } + + static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel, +@@ -1613,8 +1620,10 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) + domains[domain_id]); + data->miscdev.fops = &fastrpc_fops; + err = misc_register(&data->miscdev); +- if (err) ++ if (err) { ++ kfree(data); + return err; ++ } + + kref_init(&data->refcount); + +diff --git a/drivers/misc/habanalabs/device.c b/drivers/misc/habanalabs/device.c +index aef4de36b7aa..6d9c298e02c7 100644 +--- a/drivers/misc/habanalabs/device.c ++++ b/drivers/misc/habanalabs/device.c +@@ -718,7 +718,7 @@ disable_device: + return rc; + } + +-static void device_kill_open_processes(struct hl_device *hdev) ++static int device_kill_open_processes(struct hl_device *hdev) + { + u16 pending_total, pending_cnt; + struct hl_fpriv *hpriv; +@@ -771,9 +771,7 @@ static void device_kill_open_processes(struct hl_device *hdev) + ssleep(1); + } + +- if (!list_empty(&hdev->fpriv_list)) +- dev_crit(hdev->dev, +- "Going to hard reset with open user contexts\n"); ++ return list_empty(&hdev->fpriv_list) ? 0 : -EBUSY; + } + + static void device_hard_reset_pending(struct work_struct *work) +@@ -894,7 +892,12 @@ again: + * process can't really exit until all its CSs are done, which + * is what we do in cs rollback + */ +- device_kill_open_processes(hdev); ++ rc = device_kill_open_processes(hdev); ++ if (rc) { ++ dev_crit(hdev->dev, ++ "Failed to kill all open processes, stopping hard reset\n"); ++ goto out_err; ++ } + + /* Flush the Event queue workers to make sure no other thread is + * reading or writing to registers during the reset +@@ -1375,7 +1378,9 @@ void hl_device_fini(struct hl_device *hdev) + * can't really exit until all its CSs are done, which is what we + * do in cs rollback + */ +- device_kill_open_processes(hdev); ++ rc = device_kill_open_processes(hdev); ++ if (rc) ++ dev_crit(hdev->dev, "Failed to kill all open processes\n"); + + hl_cb_pool_fini(hdev); + +diff --git a/drivers/misc/habanalabs/habanalabs.h b/drivers/misc/habanalabs/habanalabs.h +index 31ebcf9458fe..a6dd8e6ca594 100644 +--- a/drivers/misc/habanalabs/habanalabs.h ++++ b/drivers/misc/habanalabs/habanalabs.h +@@ -23,7 +23,7 @@ + + #define HL_MMAP_CB_MASK (0x8000000000000000ull >> PAGE_SHIFT) + +-#define HL_PENDING_RESET_PER_SEC 5 ++#define HL_PENDING_RESET_PER_SEC 30 + + #define HL_DEVICE_TIMEOUT_USEC 1000000 /* 1 s */ + +diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c +index 71bbaa56bdb5..e2766aad9e14 100644 +--- a/drivers/misc/xilinx_sdfec.c ++++ b/drivers/misc/xilinx_sdfec.c +@@ -602,10 +602,10 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, + const u32 depth) + { + u32 reg = 0; +- u32 res; +- u32 n, i; ++ int res, i, nr_pages; ++ u32 n; + u32 *addr = NULL; +- struct page *page[MAX_NUM_PAGES]; ++ struct page *pages[MAX_NUM_PAGES]; + + /* + * Writes that go beyond the length of +@@ -622,15 +622,22 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, + if ((len * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE) + n += 1; + +- res = get_user_pages_fast((unsigned long)src_ptr, n, 0, page); +- if (res < n) { +- for (i = 0; i < res; i++) +- put_page(page[i]); ++ if (WARN_ON_ONCE(n > INT_MAX)) ++ return -EINVAL; ++ ++ nr_pages = n; ++ ++ res = get_user_pages_fast((unsigned long)src_ptr, nr_pages, 0, pages); ++ if (res < nr_pages) { ++ if (res > 0) { ++ for (i = 0; i < res; i++) ++ put_page(pages[i]); ++ } + return -EINVAL; + } + +- for (i = 0; i < n; i++) { +- addr = kmap(page[i]); ++ for (i = 0; i < nr_pages; i++) { ++ addr = kmap(pages[i]); + do { + xsdfec_regwrite(xsdfec, + base_addr + ((offset + reg) * +@@ -639,7 +646,7 @@ static int xsdfec_table_write(struct xsdfec_dev *xsdfec, u32 offset, + reg++; + } while ((reg < len) && + ((reg * XSDFEC_REG_WIDTH_JUMP) % PAGE_SIZE)); +- put_page(page[i]); ++ put_page(pages[i]); + } + return reg; + } +diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c +index efd1a1d1f35e..5d3c691a1c66 100644 +--- a/drivers/net/bareudp.c ++++ b/drivers/net/bareudp.c +@@ -552,6 +552,8 @@ static int bareudp_validate(struct nlattr *tb[], struct nlattr *data[], + static int bareudp2info(struct nlattr *data[], struct bareudp_conf *conf, + struct netlink_ext_ack *extack) + { ++ memset(conf, 0, sizeof(*conf)); ++ + if (!data[IFLA_BAREUDP_PORT]) { + NL_SET_ERR_MSG(extack, "port not specified"); + return -EINVAL; +diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c +index cf6fa8fede33..521ebc072903 100644 +--- a/drivers/net/dsa/lantiq_gswip.c ++++ b/drivers/net/dsa/lantiq_gswip.c +@@ -1452,7 +1452,8 @@ static void gswip_phylink_validate(struct dsa_switch *ds, int port, + + unsupported: + bitmap_zero(supported, __ETHTOOL_LINK_MODE_MASK_NBITS); +- dev_err(ds->dev, "Unsupported interface: %d\n", state->interface); ++ dev_err(ds->dev, "Unsupported interface '%s' for port %d\n", ++ phy_modes(state->interface), port); + return; + } + +diff --git a/drivers/net/dsa/sja1105/sja1105_ptp.c b/drivers/net/dsa/sja1105/sja1105_ptp.c +index bc0e47c1dbb9..177134596458 100644 +--- a/drivers/net/dsa/sja1105/sja1105_ptp.c ++++ b/drivers/net/dsa/sja1105/sja1105_ptp.c +@@ -891,16 +891,16 @@ void sja1105_ptp_txtstamp_skb(struct dsa_switch *ds, int port, + + mutex_lock(&ptp_data->lock); + +- rc = sja1105_ptpclkval_read(priv, &ticks, NULL); ++ rc = sja1105_ptpegr_ts_poll(ds, port, &ts); + if (rc < 0) { +- dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc); ++ dev_err(ds->dev, "timed out polling for tstamp\n"); + kfree_skb(skb); + goto out; + } + +- rc = sja1105_ptpegr_ts_poll(ds, port, &ts); ++ rc = sja1105_ptpclkval_read(priv, &ticks, NULL); + if (rc < 0) { +- dev_err(ds->dev, "timed out polling for tstamp\n"); ++ dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc); + kfree_skb(skb); + goto out; + } +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 58e0d9a781e9..19c4a0a5727a 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -10014,7 +10014,7 @@ static void bnxt_timer(struct timer_list *t) + struct bnxt *bp = from_timer(bp, t, timer); + struct net_device *dev = bp->dev; + +- if (!netif_running(dev)) ++ if (!netif_running(dev) || !test_bit(BNXT_STATE_OPEN, &bp->state)) + return; + + if (atomic_read(&bp->intr_sem) != 0) +@@ -12097,19 +12097,9 @@ static int bnxt_resume(struct device *device) + goto resume_exit; + } + +- if (bnxt_hwrm_queue_qportcfg(bp)) { +- rc = -ENODEV; ++ rc = bnxt_hwrm_func_qcaps(bp); ++ if (rc) + goto resume_exit; +- } +- +- if (bp->hwrm_spec_code >= 0x10803) { +- if (bnxt_alloc_ctx_mem(bp)) { +- rc = -ENODEV; +- goto resume_exit; +- } +- } +- if (BNXT_NEW_RM(bp)) +- bnxt_hwrm_func_resc_qcaps(bp, false); + + if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) { + rc = -ENODEV; +@@ -12125,6 +12115,8 @@ static int bnxt_resume(struct device *device) + + resume_exit: + bnxt_ulp_start(bp, rc); ++ if (!rc) ++ bnxt_reenable_sriov(bp); + rtnl_unlock(); + return rc; + } +@@ -12168,6 +12160,9 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev, + bnxt_close(netdev); + + pci_disable_device(pdev); ++ bnxt_free_ctx_mem(bp); ++ kfree(bp->ctx); ++ bp->ctx = NULL; + rtnl_unlock(); + + /* Request a slot slot reset. */ +@@ -12201,12 +12196,16 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) + pci_set_master(pdev); + + err = bnxt_hwrm_func_reset(bp); +- if (!err && netif_running(netdev)) +- err = bnxt_open(netdev); +- +- if (!err) +- result = PCI_ERS_RESULT_RECOVERED; ++ if (!err) { ++ err = bnxt_hwrm_func_qcaps(bp); ++ if (!err && netif_running(netdev)) ++ err = bnxt_open(netdev); ++ } + bnxt_ulp_start(bp, err); ++ if (!err) { ++ bnxt_reenable_sriov(bp); ++ result = PCI_ERS_RESULT_RECOVERED; ++ } + } + + if (result != PCI_ERS_RESULT_RECOVERED) { +diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +index 9d868403d86c..cbaa1924afbe 100644 +--- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c ++++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +@@ -234,6 +234,11 @@ static void octeon_mgmt_rx_fill_ring(struct net_device *netdev) + + /* Put it in the ring. */ + p->rx_ring[p->rx_next_fill] = re.d64; ++ /* Make sure there is no reorder of filling the ring and ringing ++ * the bell ++ */ ++ wmb(); ++ + dma_sync_single_for_device(p->dev, p->rx_ring_handle, + ring_size_to_bytes(OCTEON_MGMT_RX_RING_SIZE), + DMA_BIDIRECTIONAL); +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index 197dc5b2c090..1b4d04e4474b 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -5184,6 +5184,9 @@ static int ibmvnic_remove(struct vio_dev *dev) + adapter->state = VNIC_REMOVING; + spin_unlock_irqrestore(&adapter->state_lock, flags); + ++ flush_work(&adapter->ibmvnic_reset); ++ flush_delayed_work(&adapter->ibmvnic_delayed_reset); ++ + rtnl_lock(); + unregister_netdevice(netdev); + +diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c +index df3d50e759de..5e388d4a97a1 100644 +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -6518,11 +6518,17 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev_priv(netdev); + struct e1000_hw *hw = &adapter->hw; +- u32 ctrl, ctrl_ext, rctl, status; +- /* Runtime suspend should only enable wakeup for link changes */ +- u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; ++ u32 ctrl, ctrl_ext, rctl, status, wufc; + int retval = 0; + ++ /* Runtime suspend should only enable wakeup for link changes */ ++ if (runtime) ++ wufc = E1000_WUFC_LNKC; ++ else if (device_may_wakeup(&pdev->dev)) ++ wufc = adapter->wol; ++ else ++ wufc = 0; ++ + status = er32(STATUS); + if (status & E1000_STATUS_LU) + wufc &= ~E1000_WUFC_LNKC; +@@ -6579,7 +6585,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) + if (adapter->hw.phy.type == e1000_phy_igp_3) { + e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); + } else if (hw->mac.type >= e1000_pch_lpt) { +- if (!(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC))) ++ if (wufc && !(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC))) + /* ULP does not support wake from unicast, multicast + * or broadcast. + */ +diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h +index bcd11b4b29df..2d4ce6fdba1a 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf.h ++++ b/drivers/net/ethernet/intel/iavf/iavf.h +@@ -87,6 +87,10 @@ struct iavf_vsi { + #define IAVF_HLUT_ARRAY_SIZE ((IAVF_VFQF_HLUT_MAX_INDEX + 1) * 4) + #define IAVF_MBPS_DIVISOR 125000 /* divisor to convert to Mbps */ + ++#define IAVF_VIRTCHNL_VF_RESOURCE_SIZE (sizeof(struct virtchnl_vf_resource) + \ ++ (IAVF_MAX_VF_VSI * \ ++ sizeof(struct virtchnl_vsi_resource))) ++ + /* MAX_MSIX_Q_VECTORS of these are allocated, + * but we only use one per queue-specific vector. + */ +@@ -306,6 +310,14 @@ struct iavf_adapter { + bool netdev_registered; + bool link_up; + enum virtchnl_link_speed link_speed; ++ /* This is only populated if the VIRTCHNL_VF_CAP_ADV_LINK_SPEED is set ++ * in vf_res->vf_cap_flags. Use ADV_LINK_SUPPORT macro to determine if ++ * this field is valid. This field should be used going forward and the ++ * enum virtchnl_link_speed above should be considered the legacy way of ++ * storing/communicating link speeds. ++ */ ++ u32 link_speed_mbps; ++ + enum virtchnl_ops current_op; + #define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \ + (_a)->vf_res->vf_cap_flags & \ +@@ -322,6 +334,8 @@ struct iavf_adapter { + VIRTCHNL_VF_OFFLOAD_RSS_PF))) + #define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_cap_flags & \ + VIRTCHNL_VF_OFFLOAD_VLAN) ++#define ADV_LINK_SUPPORT(_a) ((_a)->vf_res->vf_cap_flags & \ ++ VIRTCHNL_VF_CAP_ADV_LINK_SPEED) + struct virtchnl_vf_resource *vf_res; /* incl. all VSIs */ + struct virtchnl_vsi_resource *vsi_res; /* our LAN VSI */ + struct virtchnl_version_info pf_version; +diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c +index 2c39d46b6138..40a3fc7c5ea5 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c +@@ -278,7 +278,18 @@ static int iavf_get_link_ksettings(struct net_device *netdev, + ethtool_link_ksettings_zero_link_mode(cmd, supported); + cmd->base.autoneg = AUTONEG_DISABLE; + cmd->base.port = PORT_NONE; +- /* Set speed and duplex */ ++ cmd->base.duplex = DUPLEX_FULL; ++ ++ if (ADV_LINK_SUPPORT(adapter)) { ++ if (adapter->link_speed_mbps && ++ adapter->link_speed_mbps < U32_MAX) ++ cmd->base.speed = adapter->link_speed_mbps; ++ else ++ cmd->base.speed = SPEED_UNKNOWN; ++ ++ return 0; ++ } ++ + switch (adapter->link_speed) { + case IAVF_LINK_SPEED_40GB: + cmd->base.speed = SPEED_40000; +@@ -306,7 +317,6 @@ static int iavf_get_link_ksettings(struct net_device *netdev, + default: + break; + } +- cmd->base.duplex = DUPLEX_FULL; + + return 0; + } +diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c +index 2050649848ba..a21ae74bcd1b 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_main.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c +@@ -1756,17 +1756,17 @@ static int iavf_init_get_resources(struct iavf_adapter *adapter) + struct net_device *netdev = adapter->netdev; + struct pci_dev *pdev = adapter->pdev; + struct iavf_hw *hw = &adapter->hw; +- int err = 0, bufsz; ++ int err; + + WARN_ON(adapter->state != __IAVF_INIT_GET_RESOURCES); + /* aq msg sent, awaiting reply */ + if (!adapter->vf_res) { +- bufsz = sizeof(struct virtchnl_vf_resource) + +- (IAVF_MAX_VF_VSI * +- sizeof(struct virtchnl_vsi_resource)); +- adapter->vf_res = kzalloc(bufsz, GFP_KERNEL); +- if (!adapter->vf_res) ++ adapter->vf_res = kzalloc(IAVF_VIRTCHNL_VF_RESOURCE_SIZE, ++ GFP_KERNEL); ++ if (!adapter->vf_res) { ++ err = -ENOMEM; + goto err; ++ } + } + err = iavf_get_vf_config(adapter); + if (err == IAVF_ERR_ADMIN_QUEUE_NO_WORK) { +@@ -2036,7 +2036,7 @@ static void iavf_disable_vf(struct iavf_adapter *adapter) + iavf_reset_interrupt_capability(adapter); + iavf_free_queues(adapter); + iavf_free_q_vectors(adapter); +- kfree(adapter->vf_res); ++ memset(adapter->vf_res, 0, IAVF_VIRTCHNL_VF_RESOURCE_SIZE); + iavf_shutdown_adminq(&adapter->hw); + adapter->netdev->flags &= ~IFF_UP; + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); +@@ -2487,6 +2487,16 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter, + { + int speed = 0, ret = 0; + ++ if (ADV_LINK_SUPPORT(adapter)) { ++ if (adapter->link_speed_mbps < U32_MAX) { ++ speed = adapter->link_speed_mbps; ++ goto validate_bw; ++ } else { ++ dev_err(&adapter->pdev->dev, "Unknown link speed\n"); ++ return -EINVAL; ++ } ++ } ++ + switch (adapter->link_speed) { + case IAVF_LINK_SPEED_40GB: + speed = 40000; +@@ -2510,6 +2520,7 @@ static int iavf_validate_tx_bandwidth(struct iavf_adapter *adapter, + break; + } + ++validate_bw: + if (max_tx_rate > speed) { + dev_err(&adapter->pdev->dev, + "Invalid tx rate specified\n"); +diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +index d58374c2c33d..ca79bec4ebd9 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +@@ -139,7 +139,8 @@ int iavf_send_vf_config_msg(struct iavf_adapter *adapter) + VIRTCHNL_VF_OFFLOAD_ENCAP | + VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM | + VIRTCHNL_VF_OFFLOAD_REQ_QUEUES | +- VIRTCHNL_VF_OFFLOAD_ADQ; ++ VIRTCHNL_VF_OFFLOAD_ADQ | ++ VIRTCHNL_VF_CAP_ADV_LINK_SPEED; + + adapter->current_op = VIRTCHNL_OP_GET_VF_RESOURCES; + adapter->aq_required &= ~IAVF_FLAG_AQ_GET_CONFIG; +@@ -891,6 +892,8 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter) + iavf_send_pf_msg(adapter, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, NULL, 0); + } + ++#define IAVF_MAX_SPEED_STRLEN 13 ++ + /** + * iavf_print_link_message - print link up or down + * @adapter: adapter structure +@@ -900,37 +903,99 @@ void iavf_disable_vlan_stripping(struct iavf_adapter *adapter) + static void iavf_print_link_message(struct iavf_adapter *adapter) + { + struct net_device *netdev = adapter->netdev; +- char *speed = "Unknown "; ++ int link_speed_mbps; ++ char *speed; + + if (!adapter->link_up) { + netdev_info(netdev, "NIC Link is Down\n"); + return; + } + ++ speed = kcalloc(1, IAVF_MAX_SPEED_STRLEN, GFP_KERNEL); ++ if (!speed) ++ return; ++ ++ if (ADV_LINK_SUPPORT(adapter)) { ++ link_speed_mbps = adapter->link_speed_mbps; ++ goto print_link_msg; ++ } ++ + switch (adapter->link_speed) { + case IAVF_LINK_SPEED_40GB: +- speed = "40 G"; ++ link_speed_mbps = SPEED_40000; + break; + case IAVF_LINK_SPEED_25GB: +- speed = "25 G"; ++ link_speed_mbps = SPEED_25000; + break; + case IAVF_LINK_SPEED_20GB: +- speed = "20 G"; ++ link_speed_mbps = SPEED_20000; + break; + case IAVF_LINK_SPEED_10GB: +- speed = "10 G"; ++ link_speed_mbps = SPEED_10000; + break; + case IAVF_LINK_SPEED_1GB: +- speed = "1000 M"; ++ link_speed_mbps = SPEED_1000; + break; + case IAVF_LINK_SPEED_100MB: +- speed = "100 M"; ++ link_speed_mbps = SPEED_100; + break; + default: ++ link_speed_mbps = SPEED_UNKNOWN; + break; + } + +- netdev_info(netdev, "NIC Link is Up %sbps Full Duplex\n", speed); ++print_link_msg: ++ if (link_speed_mbps > SPEED_1000) { ++ if (link_speed_mbps == SPEED_2500) ++ snprintf(speed, IAVF_MAX_SPEED_STRLEN, "2.5 Gbps"); ++ else ++ /* convert to Gbps inline */ ++ snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%d %s", ++ link_speed_mbps / 1000, "Gbps"); ++ } else if (link_speed_mbps == SPEED_UNKNOWN) { ++ snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%s", "Unknown Mbps"); ++ } else { ++ snprintf(speed, IAVF_MAX_SPEED_STRLEN, "%u %s", ++ link_speed_mbps, "Mbps"); ++ } ++ ++ netdev_info(netdev, "NIC Link is Up Speed is %s Full Duplex\n", speed); ++ kfree(speed); ++} ++ ++/** ++ * iavf_get_vpe_link_status ++ * @adapter: adapter structure ++ * @vpe: virtchnl_pf_event structure ++ * ++ * Helper function for determining the link status ++ **/ ++static bool ++iavf_get_vpe_link_status(struct iavf_adapter *adapter, ++ struct virtchnl_pf_event *vpe) ++{ ++ if (ADV_LINK_SUPPORT(adapter)) ++ return vpe->event_data.link_event_adv.link_status; ++ else ++ return vpe->event_data.link_event.link_status; ++} ++ ++/** ++ * iavf_set_adapter_link_speed_from_vpe ++ * @adapter: adapter structure for which we are setting the link speed ++ * @vpe: virtchnl_pf_event structure that contains the link speed we are setting ++ * ++ * Helper function for setting iavf_adapter link speed ++ **/ ++static void ++iavf_set_adapter_link_speed_from_vpe(struct iavf_adapter *adapter, ++ struct virtchnl_pf_event *vpe) ++{ ++ if (ADV_LINK_SUPPORT(adapter)) ++ adapter->link_speed_mbps = ++ vpe->event_data.link_event_adv.link_speed; ++ else ++ adapter->link_speed = vpe->event_data.link_event.link_speed; + } + + /** +@@ -1160,12 +1225,11 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter, + if (v_opcode == VIRTCHNL_OP_EVENT) { + struct virtchnl_pf_event *vpe = + (struct virtchnl_pf_event *)msg; +- bool link_up = vpe->event_data.link_event.link_status; ++ bool link_up = iavf_get_vpe_link_status(adapter, vpe); + + switch (vpe->event) { + case VIRTCHNL_EVENT_LINK_CHANGE: +- adapter->link_speed = +- vpe->event_data.link_event.link_speed; ++ iavf_set_adapter_link_speed_from_vpe(adapter, vpe); + + /* we've already got the right link status, bail */ + if (adapter->link_up == link_up) +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index 2b5dad2ec650..b7b553602ea9 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -5983,8 +5983,8 @@ static int mvpp2_remove(struct platform_device *pdev) + { + struct mvpp2 *priv = platform_get_drvdata(pdev); + struct fwnode_handle *fwnode = pdev->dev.fwnode; ++ int i = 0, poolnum = MVPP2_BM_POOLS_NUM; + struct fwnode_handle *port_fwnode; +- int i = 0; + + mvpp2_dbgfs_cleanup(priv); + +@@ -5998,7 +5998,10 @@ static int mvpp2_remove(struct platform_device *pdev) + + destroy_workqueue(priv->stats_queue); + +- for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) { ++ if (priv->percpu_pools) ++ poolnum = mvpp2_get_nrxqs(priv) * 2; ++ ++ for (i = 0; i < poolnum; i++) { + struct mvpp2_bm_pool *bm_pool = &priv->bm_pools[i]; + + mvpp2_bm_pool_destroy(&pdev->dev, priv, bm_pool); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c +index 18719acb7e54..eff8bb64899d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c +@@ -181,7 +181,7 @@ static struct mlx5dr_qp *dr_create_rc_qp(struct mlx5_core_dev *mdev, + in, pas)); + + err = mlx5_core_create_qp(mdev, &dr_qp->mqp, in, inlen); +- kfree(in); ++ kvfree(in); + + if (err) { + mlx5_core_warn(mdev, " Can't create QP\n"); +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +index 6b39978acd07..3e4199246a18 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +@@ -990,8 +990,10 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu, + + lossy = !(pfc || pause_en); + thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu); ++ mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &thres_cells); + delay_cells = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay, + pfc, pause_en); ++ mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &delay_cells); + total_cells = thres_cells + delay_cells; + + taken_headroom_cells += total_cells; +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +index ca56e72cb4b7..e28ecb84b816 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +@@ -395,6 +395,19 @@ mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port, + return NULL; + } + ++static inline void ++mlxsw_sp_port_headroom_8x_adjust(const struct mlxsw_sp_port *mlxsw_sp_port, ++ u16 *p_size) ++{ ++ /* Ports with eight lanes use two headroom buffers between which the ++ * configured headroom size is split. Therefore, multiply the calculated ++ * headroom size by two. ++ */ ++ if (mlxsw_sp_port->mapping.width != 8) ++ return; ++ *p_size *= 2; ++} ++ + enum mlxsw_sp_flood_type { + MLXSW_SP_FLOOD_TYPE_UC, + MLXSW_SP_FLOOD_TYPE_BC, +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +index 968f0902e4fe..19bf0768ed78 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +@@ -312,6 +312,7 @@ static int mlxsw_sp_port_pb_init(struct mlxsw_sp_port *mlxsw_sp_port) + + if (i == MLXSW_SP_PB_UNUSED) + continue; ++ mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, &size); + mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl, i, size); + } + mlxsw_reg_pbmc_lossy_buffer_pack(pbmc_pl, +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +index 9fb2e9d93929..7c5032f9c8ff 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +@@ -776,6 +776,7 @@ mlxsw_sp_span_port_buffsize_update(struct mlxsw_sp_port *mlxsw_sp_port, u16 mtu) + speed = 0; + + buffsize = mlxsw_sp_span_buffsize_get(mlxsw_sp, speed, mtu); ++ mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, (u16 *) &buffsize); + mlxsw_reg_sbib_pack(sbib_pl, mlxsw_sp_port->local_port, buffsize); + return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sbib), sbib_pl); + } +diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c +index 6b461be1820b..75266580b586 100644 +--- a/drivers/net/geneve.c ++++ b/drivers/net/geneve.c +@@ -987,9 +987,10 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) + if (geneve->collect_md) { + info = skb_tunnel_info(skb); + if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) { +- err = -EINVAL; + netdev_dbg(dev, "no tunnel metadata\n"); +- goto tx_error; ++ dev_kfree_skb(skb); ++ dev->stats.tx_dropped++; ++ return NETDEV_TX_OK; + } + } else { + info = &geneve->info; +@@ -1006,7 +1007,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) + + if (likely(!err)) + return NETDEV_TX_OK; +-tx_error: ++ + dev_kfree_skb(skb); + + if (err == -ELOOP) +diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c +index 71cdef9fb56b..5ab53e9942f3 100644 +--- a/drivers/net/hamradio/yam.c ++++ b/drivers/net/hamradio/yam.c +@@ -1133,6 +1133,7 @@ static int __init yam_init_driver(void) + err = register_netdev(dev); + if (err) { + printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name); ++ free_netdev(dev); + goto error; + } + yam_devs[i] = dev; +diff --git a/drivers/net/ipa/ipa_endpoint.c b/drivers/net/ipa/ipa_endpoint.c +index a21534f1462f..1d823ac0f6d6 100644 +--- a/drivers/net/ipa/ipa_endpoint.c ++++ b/drivers/net/ipa/ipa_endpoint.c +@@ -669,10 +669,12 @@ static void ipa_endpoint_init_seq(struct ipa_endpoint *endpoint) + u32 seq_type = endpoint->seq_type; + u32 val = 0; + ++ /* Sequencer type is made up of four nibbles */ + val |= u32_encode_bits(seq_type & 0xf, HPS_SEQ_TYPE_FMASK); + val |= u32_encode_bits((seq_type >> 4) & 0xf, DPS_SEQ_TYPE_FMASK); +- /* HPS_REP_SEQ_TYPE is 0 */ +- /* DPS_REP_SEQ_TYPE is 0 */ ++ /* The second two apply to replicated packets */ ++ val |= u32_encode_bits((seq_type >> 8) & 0xf, HPS_REP_SEQ_TYPE_FMASK); ++ val |= u32_encode_bits((seq_type >> 12) & 0xf, DPS_REP_SEQ_TYPE_FMASK); + + iowrite32(val, endpoint->ipa->reg_virt + offset); + } +diff --git a/drivers/net/ipa/ipa_reg.h b/drivers/net/ipa/ipa_reg.h +index 3b8106aa277a..0a688d8c1d7c 100644 +--- a/drivers/net/ipa/ipa_reg.h ++++ b/drivers/net/ipa/ipa_reg.h +@@ -455,6 +455,8 @@ enum ipa_mode { + * second packet processing pass + no decipher + microcontroller + * @IPA_SEQ_DMA_DEC: DMA + cipher/decipher + * @IPA_SEQ_DMA_COMP_DECOMP: DMA + compression/decompression ++ * @IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP: ++ * packet processing + no decipher + no uCP + HPS REP DMA parser + * @IPA_SEQ_INVALID: invalid sequencer type + * + * The values defined here are broken into 4-bit nibbles that are written +diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c +index b55e3c0403ed..ddac79960ea7 100644 +--- a/drivers/net/phy/dp83867.c ++++ b/drivers/net/phy/dp83867.c +@@ -488,7 +488,7 @@ static int dp83867_verify_rgmii_cfg(struct phy_device *phydev) + return 0; + } + +-#ifdef CONFIG_OF_MDIO ++#if IS_ENABLED(CONFIG_OF_MDIO) + static int dp83867_of_init(struct phy_device *phydev) + { + struct dp83867_private *dp83867 = phydev->priv; +diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c +index 7fc8e10c5f33..a435f7352cfb 100644 +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -337,7 +337,7 @@ static int m88e1101_config_aneg(struct phy_device *phydev) + return marvell_config_aneg(phydev); + } + +-#ifdef CONFIG_OF_MDIO ++#if IS_ENABLED(CONFIG_OF_MDIO) + /* Set and/or override some configuration registers based on the + * marvell,reg-init property stored in the of_node for the phydev. + * +diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c +index 7a4eb3f2cb74..a1a4dee2a033 100644 +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -757,6 +757,7 @@ EXPORT_SYMBOL(mdiobus_scan); + + static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret) + { ++ preempt_disable(); + u64_stats_update_begin(&stats->syncp); + + u64_stats_inc(&stats->transfers); +@@ -771,6 +772,7 @@ static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret) + u64_stats_inc(&stats->writes); + out: + u64_stats_update_end(&stats->syncp); ++ preempt_enable(); + } + + /** +diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h +index 414e3b31bb1f..132f9bf49198 100644 +--- a/drivers/net/phy/mscc/mscc.h ++++ b/drivers/net/phy/mscc/mscc.h +@@ -375,7 +375,7 @@ struct vsc8531_private { + #endif + }; + +-#ifdef CONFIG_OF_MDIO ++#if IS_ENABLED(CONFIG_OF_MDIO) + struct vsc8531_edge_rate_table { + u32 vddmac; + u32 slowdown[8]; +diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c +index c8aa6d905d8e..485a4f8a6a9a 100644 +--- a/drivers/net/phy/mscc/mscc_main.c ++++ b/drivers/net/phy/mscc/mscc_main.c +@@ -98,7 +98,7 @@ static const struct vsc85xx_hw_stat vsc8584_hw_stats[] = { + }, + }; + +-#ifdef CONFIG_OF_MDIO ++#if IS_ENABLED(CONFIG_OF_MDIO) + static const struct vsc8531_edge_rate_table edge_table[] = { + {MSCC_VDDMAC_3300, { 0, 2, 4, 7, 10, 17, 29, 53} }, + {MSCC_VDDMAC_2500, { 0, 3, 6, 10, 14, 23, 37, 63} }, +@@ -382,7 +382,7 @@ out_unlock: + mutex_unlock(&phydev->lock); + } + +-#ifdef CONFIG_OF_MDIO ++#if IS_ENABLED(CONFIG_OF_MDIO) + static int vsc85xx_edge_rate_magic_get(struct phy_device *phydev) + { + u32 vdd, sd; +diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c +index 2581ab724c34..f8f75a504a58 100644 +--- a/drivers/ntb/core.c ++++ b/drivers/ntb/core.c +@@ -214,10 +214,8 @@ int ntb_default_port_number(struct ntb_dev *ntb) + case NTB_TOPO_B2B_DSD: + return NTB_PORT_SEC_DSD; + default: +- break; ++ return 0; + } +- +- return -EINVAL; + } + EXPORT_SYMBOL(ntb_default_port_number); + +@@ -240,10 +238,8 @@ int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx) + case NTB_TOPO_B2B_DSD: + return NTB_PORT_PRI_USD; + default: +- break; ++ return 0; + } +- +- return -EINVAL; + } + EXPORT_SYMBOL(ntb_default_peer_port_number); + +@@ -315,4 +311,3 @@ static void __exit ntb_driver_exit(void) + bus_unregister(&ntb_bus); + } + module_exit(ntb_driver_exit); +- +diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c +index 972f6d984f6d..528751803419 100644 +--- a/drivers/ntb/test/ntb_perf.c ++++ b/drivers/ntb/test/ntb_perf.c +@@ -159,6 +159,8 @@ struct perf_peer { + /* NTB connection setup service */ + struct work_struct service; + unsigned long sts; ++ ++ struct completion init_comp; + }; + #define to_peer_service(__work) \ + container_of(__work, struct perf_peer, service) +@@ -547,6 +549,7 @@ static int perf_setup_outbuf(struct perf_peer *peer) + + /* Initialization is finally done */ + set_bit(PERF_STS_DONE, &peer->sts); ++ complete_all(&peer->init_comp); + + return 0; + } +@@ -557,7 +560,7 @@ static void perf_free_inbuf(struct perf_peer *peer) + return; + + (void)ntb_mw_clear_trans(peer->perf->ntb, peer->pidx, peer->gidx); +- dma_free_coherent(&peer->perf->ntb->dev, peer->inbuf_size, ++ dma_free_coherent(&peer->perf->ntb->pdev->dev, peer->inbuf_size, + peer->inbuf, peer->inbuf_xlat); + peer->inbuf = NULL; + } +@@ -586,8 +589,9 @@ static int perf_setup_inbuf(struct perf_peer *peer) + + perf_free_inbuf(peer); + +- peer->inbuf = dma_alloc_coherent(&perf->ntb->dev, peer->inbuf_size, +- &peer->inbuf_xlat, GFP_KERNEL); ++ peer->inbuf = dma_alloc_coherent(&perf->ntb->pdev->dev, ++ peer->inbuf_size, &peer->inbuf_xlat, ++ GFP_KERNEL); + if (!peer->inbuf) { + dev_err(&perf->ntb->dev, "Failed to alloc inbuf of %pa\n", + &peer->inbuf_size); +@@ -637,6 +641,7 @@ static void perf_service_work(struct work_struct *work) + perf_setup_outbuf(peer); + + if (test_and_clear_bit(PERF_CMD_CLEAR, &peer->sts)) { ++ init_completion(&peer->init_comp); + clear_bit(PERF_STS_DONE, &peer->sts); + if (test_bit(0, &peer->perf->busy_flag) && + peer == peer->perf->test_peer) { +@@ -653,7 +658,7 @@ static int perf_init_service(struct perf_ctx *perf) + { + u64 mask; + +- if (ntb_peer_mw_count(perf->ntb) < perf->pcnt + 1) { ++ if (ntb_peer_mw_count(perf->ntb) < perf->pcnt) { + dev_err(&perf->ntb->dev, "Not enough memory windows\n"); + return -EINVAL; + } +@@ -1083,8 +1088,9 @@ static int perf_submit_test(struct perf_peer *peer) + struct perf_thread *pthr; + int tidx, ret; + +- if (!test_bit(PERF_STS_DONE, &peer->sts)) +- return -ENOLINK; ++ ret = wait_for_completion_interruptible(&peer->init_comp); ++ if (ret < 0) ++ return ret; + + if (test_and_set_bit_lock(0, &perf->busy_flag)) + return -EBUSY; +@@ -1455,10 +1461,21 @@ static int perf_init_peers(struct perf_ctx *perf) + peer->gidx = pidx; + } + INIT_WORK(&peer->service, perf_service_work); ++ init_completion(&peer->init_comp); + } + if (perf->gidx == -1) + perf->gidx = pidx; + ++ /* ++ * Hardware with only two ports may not have unique port ++ * numbers. In this case, the gidxs should all be zero. ++ */ ++ if (perf->pcnt == 1 && ntb_port_number(perf->ntb) == 0 && ++ ntb_peer_port_number(perf->ntb, 0) == 0) { ++ perf->gidx = 0; ++ perf->peers[0].gidx = 0; ++ } ++ + for (pidx = 0; pidx < perf->pcnt; pidx++) { + ret = perf_setup_peer_mw(&perf->peers[pidx]); + if (ret) +@@ -1554,4 +1571,3 @@ static void __exit perf_exit(void) + destroy_workqueue(perf_wq); + } + module_exit(perf_exit); +- +diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c +index 04dd46647db3..2164e8492772 100644 +--- a/drivers/ntb/test/ntb_pingpong.c ++++ b/drivers/ntb/test/ntb_pingpong.c +@@ -121,15 +121,14 @@ static int pp_find_next_peer(struct pp_ctx *pp) + link = ntb_link_is_up(pp->ntb, NULL, NULL); + + /* Find next available peer */ +- if (link & pp->nmask) { ++ if (link & pp->nmask) + pidx = __ffs64(link & pp->nmask); +- out_db = BIT_ULL(pidx + 1); +- } else if (link & pp->pmask) { ++ else if (link & pp->pmask) + pidx = __ffs64(link & pp->pmask); +- out_db = BIT_ULL(pidx); +- } else { ++ else + return -ENODEV; +- } ++ ++ out_db = BIT_ULL(ntb_peer_port_number(pp->ntb, pidx)); + + spin_lock(&pp->lock); + pp->out_pidx = pidx; +@@ -303,7 +302,7 @@ static void pp_init_flds(struct pp_ctx *pp) + break; + } + +- pp->in_db = BIT_ULL(pidx); ++ pp->in_db = BIT_ULL(lport); + pp->pmask = GENMASK_ULL(pidx, 0) >> 1; + pp->nmask = GENMASK_ULL(pcnt - 1, pidx); + +@@ -432,4 +431,3 @@ static void __exit pp_exit(void) + debugfs_remove_recursive(pp_dbgfs_topdir); + } + module_exit(pp_exit); +- +diff --git a/drivers/ntb/test/ntb_tool.c b/drivers/ntb/test/ntb_tool.c +index 69da758fe64c..b7bf3f863d79 100644 +--- a/drivers/ntb/test/ntb_tool.c ++++ b/drivers/ntb/test/ntb_tool.c +@@ -504,7 +504,7 @@ static ssize_t tool_peer_link_read(struct file *filep, char __user *ubuf, + buf[1] = '\n'; + buf[2] = '\0'; + +- return simple_read_from_buffer(ubuf, size, offp, buf, 3); ++ return simple_read_from_buffer(ubuf, size, offp, buf, 2); + } + + static TOOL_FOPS_RDWR(tool_peer_link_fops, +@@ -590,7 +590,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx, + inmw->size = min_t(resource_size_t, req_size, size); + inmw->size = round_up(inmw->size, addr_align); + inmw->size = round_up(inmw->size, size_align); +- inmw->mm_base = dma_alloc_coherent(&tc->ntb->dev, inmw->size, ++ inmw->mm_base = dma_alloc_coherent(&tc->ntb->pdev->dev, inmw->size, + &inmw->dma_base, GFP_KERNEL); + if (!inmw->mm_base) + return -ENOMEM; +@@ -612,7 +612,7 @@ static int tool_setup_mw(struct tool_ctx *tc, int pidx, int widx, + return 0; + + err_free_dma: +- dma_free_coherent(&tc->ntb->dev, inmw->size, inmw->mm_base, ++ dma_free_coherent(&tc->ntb->pdev->dev, inmw->size, inmw->mm_base, + inmw->dma_base); + inmw->mm_base = NULL; + inmw->dma_base = 0; +@@ -629,7 +629,7 @@ static void tool_free_mw(struct tool_ctx *tc, int pidx, int widx) + + if (inmw->mm_base != NULL) { + ntb_mw_clear_trans(tc->ntb, pidx, widx); +- dma_free_coherent(&tc->ntb->dev, inmw->size, ++ dma_free_coherent(&tc->ntb->pdev->dev, inmw->size, + inmw->mm_base, inmw->dma_base); + } + +@@ -1690,4 +1690,3 @@ static void __exit tool_exit(void) + debugfs_remove_recursive(tool_dbgfs_topdir); + } + module_exit(tool_exit); +- +diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c +index 5ef4a84c442a..564e3f220ac7 100644 +--- a/drivers/nvme/host/fc.c ++++ b/drivers/nvme/host/fc.c +@@ -2300,10 +2300,11 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue, + opstate = atomic_xchg(&op->state, FCPOP_STATE_COMPLETE); + __nvme_fc_fcpop_chk_teardowns(ctrl, op, opstate); + +- if (!(op->flags & FCOP_FLAGS_AEN)) ++ if (!(op->flags & FCOP_FLAGS_AEN)) { + nvme_fc_unmap_data(ctrl, op->rq, op); ++ nvme_cleanup_cmd(op->rq); ++ } + +- nvme_cleanup_cmd(op->rq); + nvme_fc_ctrl_put(ctrl); + + if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE && +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index 076bdd90c922..4ad629eb3bc6 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -2958,9 +2958,15 @@ static int nvme_suspend(struct device *dev) + * the PCI bus layer to put it into D3 in order to take the PCIe link + * down, so as to allow the platform to achieve its minimum low-power + * state (which may not be possible if the link is up). ++ * ++ * If a host memory buffer is enabled, shut down the device as the NVMe ++ * specification allows the device to access the host memory buffer in ++ * host DRAM from all power states, but hosts will fail access to DRAM ++ * during S3. + */ + if (pm_suspend_via_firmware() || !ctrl->npss || + !pcie_aspm_enabled(pdev) || ++ ndev->nr_host_mem_descs || + (ndev->ctrl.quirks & NVME_QUIRK_SIMPLE_SUSPEND)) + return nvme_disable_prepare_reset(ndev, true); + +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index 05c6ae4b0b97..a8300202a7fb 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -66,6 +66,30 @@ static LIST_HEAD(nvmem_lookup_list); + + static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); + ++static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset, ++ void *val, size_t bytes) ++{ ++ if (nvmem->reg_read) ++ return nvmem->reg_read(nvmem->priv, offset, val, bytes); ++ ++ return -EINVAL; ++} ++ ++static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset, ++ void *val, size_t bytes) ++{ ++ int ret; ++ ++ if (nvmem->reg_write) { ++ gpiod_set_value_cansleep(nvmem->wp_gpio, 0); ++ ret = nvmem->reg_write(nvmem->priv, offset, val, bytes); ++ gpiod_set_value_cansleep(nvmem->wp_gpio, 1); ++ return ret; ++ } ++ ++ return -EINVAL; ++} ++ + #ifdef CONFIG_NVMEM_SYSFS + static const char * const nvmem_type_str[] = { + [NVMEM_TYPE_UNKNOWN] = "Unknown", +@@ -122,7 +146,7 @@ static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj, + if (!nvmem->reg_read) + return -EPERM; + +- rc = nvmem->reg_read(nvmem->priv, pos, buf, count); ++ rc = nvmem_reg_read(nvmem, pos, buf, count); + + if (rc) + return rc; +@@ -159,7 +183,7 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj, + if (!nvmem->reg_write) + return -EPERM; + +- rc = nvmem->reg_write(nvmem->priv, pos, buf, count); ++ rc = nvmem_reg_write(nvmem, pos, buf, count); + + if (rc) + return rc; +@@ -311,30 +335,6 @@ static void nvmem_sysfs_remove_compat(struct nvmem_device *nvmem, + + #endif /* CONFIG_NVMEM_SYSFS */ + +-static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset, +- void *val, size_t bytes) +-{ +- if (nvmem->reg_read) +- return nvmem->reg_read(nvmem->priv, offset, val, bytes); +- +- return -EINVAL; +-} +- +-static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset, +- void *val, size_t bytes) +-{ +- int ret; +- +- if (nvmem->reg_write) { +- gpiod_set_value_cansleep(nvmem->wp_gpio, 0); +- ret = nvmem->reg_write(nvmem->priv, offset, val, bytes); +- gpiod_set_value_cansleep(nvmem->wp_gpio, 1); +- return ret; +- } +- +- return -EINVAL; +-} +- + static void nvmem_release(struct device *dev) + { + struct nvmem_device *nvmem = to_nvmem_device(dev); +diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c +index c72eef988041..a32e60b024b8 100644 +--- a/drivers/of/kobj.c ++++ b/drivers/of/kobj.c +@@ -134,8 +134,6 @@ int __of_attach_node_sysfs(struct device_node *np) + if (!name) + return -ENOMEM; + +- of_node_get(np); +- + rc = kobject_add(&np->kobj, parent, "%s", name); + kfree(name); + if (rc) +@@ -144,6 +142,7 @@ int __of_attach_node_sysfs(struct device_node *np) + for_each_property_of_node(np, pp) + __of_add_property_sysfs(np, pp); + ++ of_node_get(np); + return 0; + } + +diff --git a/drivers/of/property.c b/drivers/of/property.c +index b4916dcc9e72..6dc542af5a70 100644 +--- a/drivers/of/property.c ++++ b/drivers/of/property.c +@@ -1045,8 +1045,20 @@ static int of_link_to_phandle(struct device *dev, struct device_node *sup_np, + * Find the device node that contains the supplier phandle. It may be + * @sup_np or it may be an ancestor of @sup_np. + */ +- while (sup_np && !of_find_property(sup_np, "compatible", NULL)) ++ while (sup_np) { ++ ++ /* Don't allow linking to a disabled supplier */ ++ if (!of_device_is_available(sup_np)) { ++ of_node_put(sup_np); ++ sup_np = NULL; ++ } ++ ++ if (of_find_property(sup_np, "compatible", NULL)) ++ break; ++ + sup_np = of_get_next_parent(sup_np); ++ } ++ + if (!sup_np) { + dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np); + return -ENODEV; +@@ -1296,7 +1308,7 @@ static int of_link_to_suppliers(struct device *dev, + if (of_link_property(dev, con_np, p->name)) + ret = -ENODEV; + +- for_each_child_of_node(con_np, child) ++ for_each_available_child_of_node(con_np, child) + if (of_link_to_suppliers(dev, child) && !ret) + ret = -EAGAIN; + +diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c +index 3b0e58f2de58..6184ebc9392d 100644 +--- a/drivers/pci/controller/dwc/pci-dra7xx.c ++++ b/drivers/pci/controller/dwc/pci-dra7xx.c +@@ -840,7 +840,6 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) + struct phy **phy; + struct device_link **link; + void __iomem *base; +- struct resource *res; + struct dw_pcie *pci; + struct dra7xx_pcie *dra7xx; + struct device *dev = &pdev->dev; +@@ -877,10 +876,9 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) + return irq; + } + +- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ti_conf"); +- base = devm_ioremap(dev, res->start, resource_size(res)); +- if (!base) +- return -ENOMEM; ++ base = devm_platform_ioremap_resource_byname(pdev, "ti_conf"); ++ if (IS_ERR(base)) ++ return PTR_ERR(base); + + phy_count = of_property_count_strings(np, "phy-names"); + if (phy_count < 0) { +diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c +index 3715dceca1bf..ca59ba9e0ecd 100644 +--- a/drivers/pci/controller/dwc/pci-meson.c ++++ b/drivers/pci/controller/dwc/pci-meson.c +@@ -289,11 +289,11 @@ static void meson_pcie_init_dw(struct meson_pcie *mp) + meson_cfg_writel(mp, val, PCIE_CFG0); + + val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF); +- val &= ~LINK_CAPABLE_MASK; ++ val &= ~(LINK_CAPABLE_MASK | FAST_LINK_MODE); + meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF); + + val = meson_elb_readl(mp, PCIE_PORT_LINK_CTRL_OFF); +- val |= LINK_CAPABLE_X1 | FAST_LINK_MODE; ++ val |= LINK_CAPABLE_X1; + meson_elb_writel(mp, val, PCIE_PORT_LINK_CTRL_OFF); + + val = meson_elb_readl(mp, PCIE_GEN2_CTRL_OFF); +diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c +index 395feb8ca051..3c43311bb95c 100644 +--- a/drivers/pci/controller/dwc/pcie-designware-host.c ++++ b/drivers/pci/controller/dwc/pcie-designware-host.c +@@ -264,6 +264,8 @@ int dw_pcie_allocate_domains(struct pcie_port *pp) + return -ENOMEM; + } + ++ irq_domain_update_bus_token(pp->irq_domain, DOMAIN_BUS_NEXUS); ++ + pp->msi_domain = pci_msi_create_irq_domain(fwnode, + &dw_pcie_msi_domain_info, + pp->irq_domain); +diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c +index 2a20b649f40c..2ecc79c03ade 100644 +--- a/drivers/pci/controller/pci-aardvark.c ++++ b/drivers/pci/controller/pci-aardvark.c +@@ -9,6 +9,7 @@ + */ + + #include <linux/delay.h> ++#include <linux/gpio.h> + #include <linux/interrupt.h> + #include <linux/irq.h> + #include <linux/irqdomain.h> +@@ -18,6 +19,7 @@ + #include <linux/platform_device.h> + #include <linux/msi.h> + #include <linux/of_address.h> ++#include <linux/of_gpio.h> + #include <linux/of_pci.h> + + #include "../pci.h" +@@ -40,6 +42,7 @@ + #define PCIE_CORE_LINK_CTRL_STAT_REG 0xd0 + #define PCIE_CORE_LINK_L0S_ENTRY BIT(0) + #define PCIE_CORE_LINK_TRAINING BIT(5) ++#define PCIE_CORE_LINK_SPEED_SHIFT 16 + #define PCIE_CORE_LINK_WIDTH_SHIFT 20 + #define PCIE_CORE_ERR_CAPCTL_REG 0x118 + #define PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX BIT(5) +@@ -201,7 +204,9 @@ struct advk_pcie { + struct mutex msi_used_lock; + u16 msi_msg; + int root_bus_nr; ++ int link_gen; + struct pci_bridge_emul bridge; ++ struct gpio_desc *reset_gpio; + }; + + static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg) +@@ -225,20 +230,16 @@ static int advk_pcie_link_up(struct advk_pcie *pcie) + + static int advk_pcie_wait_for_link(struct advk_pcie *pcie) + { +- struct device *dev = &pcie->pdev->dev; + int retries; + + /* check if the link is up or not */ + for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) { +- if (advk_pcie_link_up(pcie)) { +- dev_info(dev, "link up\n"); ++ if (advk_pcie_link_up(pcie)) + return 0; +- } + + usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX); + } + +- dev_err(dev, "link never came up\n"); + return -ETIMEDOUT; + } + +@@ -253,10 +254,110 @@ static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie) + } + } + ++static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen) ++{ ++ int ret, neg_gen; ++ u32 reg; ++ ++ /* Setup link speed */ ++ reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); ++ reg &= ~PCIE_GEN_SEL_MSK; ++ if (gen == 3) ++ reg |= SPEED_GEN_3; ++ else if (gen == 2) ++ reg |= SPEED_GEN_2; ++ else ++ reg |= SPEED_GEN_1; ++ advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); ++ ++ /* ++ * Enable link training. This is not needed in every call to this ++ * function, just once suffices, but it does not break anything either. ++ */ ++ reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); ++ reg |= LINK_TRAINING_EN; ++ advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); ++ ++ /* ++ * Start link training immediately after enabling it. ++ * This solves problems for some buggy cards. ++ */ ++ reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); ++ reg |= PCIE_CORE_LINK_TRAINING; ++ advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); ++ ++ ret = advk_pcie_wait_for_link(pcie); ++ if (ret) ++ return ret; ++ ++ reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); ++ neg_gen = (reg >> PCIE_CORE_LINK_SPEED_SHIFT) & 0xf; ++ ++ return neg_gen; ++} ++ ++static void advk_pcie_train_link(struct advk_pcie *pcie) ++{ ++ struct device *dev = &pcie->pdev->dev; ++ int neg_gen = -1, gen; ++ ++ /* ++ * Try link training at link gen specified by device tree property ++ * 'max-link-speed'. If this fails, iteratively train at lower gen. ++ */ ++ for (gen = pcie->link_gen; gen > 0; --gen) { ++ neg_gen = advk_pcie_train_at_gen(pcie, gen); ++ if (neg_gen > 0) ++ break; ++ } ++ ++ if (neg_gen < 0) ++ goto err; ++ ++ /* ++ * After successful training if negotiated gen is lower than requested, ++ * train again on negotiated gen. This solves some stability issues for ++ * some buggy gen1 cards. ++ */ ++ if (neg_gen < gen) { ++ gen = neg_gen; ++ neg_gen = advk_pcie_train_at_gen(pcie, gen); ++ } ++ ++ if (neg_gen == gen) { ++ dev_info(dev, "link up at gen %i\n", gen); ++ return; ++ } ++ ++err: ++ dev_err(dev, "link never came up\n"); ++} ++ ++static void advk_pcie_issue_perst(struct advk_pcie *pcie) ++{ ++ u32 reg; ++ ++ if (!pcie->reset_gpio) ++ return; ++ ++ /* PERST does not work for some cards when link training is enabled */ ++ reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); ++ reg &= ~LINK_TRAINING_EN; ++ advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); ++ ++ /* 10ms delay is needed for some cards */ ++ dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n"); ++ gpiod_set_value_cansleep(pcie->reset_gpio, 1); ++ usleep_range(10000, 11000); ++ gpiod_set_value_cansleep(pcie->reset_gpio, 0); ++} ++ + static void advk_pcie_setup_hw(struct advk_pcie *pcie) + { + u32 reg; + ++ advk_pcie_issue_perst(pcie); ++ + /* Set to Direct mode */ + reg = advk_readl(pcie, CTRL_CONFIG_REG); + reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT); +@@ -288,23 +389,12 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) + PCIE_CORE_CTRL2_TD_ENABLE; + advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG); + +- /* Set GEN2 */ +- reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); +- reg &= ~PCIE_GEN_SEL_MSK; +- reg |= SPEED_GEN_2; +- advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); +- + /* Set lane X1 */ + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg &= ~LANE_CNT_MSK; + reg |= LANE_COUNT_1; + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); + +- /* Enable link training */ +- reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); +- reg |= LINK_TRAINING_EN; +- advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); +- + /* Enable MSI */ + reg = advk_readl(pcie, PCIE_CORE_CTRL2_REG); + reg |= PCIE_CORE_CTRL2_MSI_ENABLE; +@@ -340,22 +430,14 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) + + /* + * PERST# signal could have been asserted by pinctrl subsystem before +- * probe() callback has been called, making the endpoint going into ++ * probe() callback has been called or issued explicitly by reset gpio ++ * function advk_pcie_issue_perst(), making the endpoint going into + * fundamental reset. As required by PCI Express spec a delay for at + * least 100ms after such a reset before link training is needed. + */ + msleep(PCI_PM_D3COLD_WAIT); + +- /* Start link training */ +- reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); +- reg |= PCIE_CORE_LINK_TRAINING; +- advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); +- +- advk_pcie_wait_for_link(pcie); +- +- reg = PCIE_CORE_LINK_L0S_ENTRY | +- (1 << PCIE_CORE_LINK_WIDTH_SHIFT); +- advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); ++ advk_pcie_train_link(pcie); + + reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); + reg |= PCIE_CORE_CMD_MEM_ACCESS_EN | +@@ -989,6 +1071,28 @@ static int advk_pcie_probe(struct platform_device *pdev) + } + pcie->root_bus_nr = bus->start; + ++ pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node, ++ "reset-gpios", 0, ++ GPIOD_OUT_LOW, ++ "pcie1-reset"); ++ ret = PTR_ERR_OR_ZERO(pcie->reset_gpio); ++ if (ret) { ++ if (ret == -ENOENT) { ++ pcie->reset_gpio = NULL; ++ } else { ++ if (ret != -EPROBE_DEFER) ++ dev_err(dev, "Failed to get reset-gpio: %i\n", ++ ret); ++ return ret; ++ } ++ } ++ ++ ret = of_pci_get_max_link_speed(dev->of_node); ++ if (ret <= 0 || ret > 3) ++ pcie->link_gen = 3; ++ else ++ pcie->link_gen = ret; ++ + advk_pcie_setup_hw(pcie); + + advk_sw_pci_bridge_init(pcie); +diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c +index bd05221f5a22..ddcb4571a79b 100644 +--- a/drivers/pci/controller/pci-v3-semi.c ++++ b/drivers/pci/controller/pci-v3-semi.c +@@ -720,7 +720,7 @@ static int v3_pci_probe(struct platform_device *pdev) + int irq; + int ret; + +- host = pci_alloc_host_bridge(sizeof(*v3)); ++ host = devm_pci_alloc_host_bridge(dev, sizeof(*v3)); + if (!host) + return -ENOMEM; + +diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c +index 6d79d14527a6..2297910bf6e4 100644 +--- a/drivers/pci/controller/pcie-brcmstb.c ++++ b/drivers/pci/controller/pcie-brcmstb.c +@@ -54,11 +54,11 @@ + + #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO 0x400c + #define PCIE_MEM_WIN0_LO(win) \ +- PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO + ((win) * 4) ++ PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO + ((win) * 8) + + #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI 0x4010 + #define PCIE_MEM_WIN0_HI(win) \ +- PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI + ((win) * 4) ++ PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI + ((win) * 8) + + #define PCIE_MISC_RC_BAR1_CONFIG_LO 0x402c + #define PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK 0x1f +@@ -697,6 +697,7 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie) + + /* Reset the bridge */ + brcm_pcie_bridge_sw_init_set(pcie, 1); ++ brcm_pcie_perst_set(pcie, 1); + + usleep_range(100, 200); + +diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c +index 759c6542c5c8..1bae6a4abaae 100644 +--- a/drivers/pci/controller/pcie-rcar.c ++++ b/drivers/pci/controller/pcie-rcar.c +@@ -333,11 +333,12 @@ static struct pci_ops rcar_pcie_ops = { + }; + + static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie, +- struct resource *res) ++ struct resource_entry *window) + { + /* Setup PCIe address space mappings for each resource */ + resource_size_t size; + resource_size_t res_start; ++ struct resource *res = window->res; + u32 mask; + + rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win)); +@@ -351,9 +352,9 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie, + rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win)); + + if (res->flags & IORESOURCE_IO) +- res_start = pci_pio_to_address(res->start); ++ res_start = pci_pio_to_address(res->start) - window->offset; + else +- res_start = res->start; ++ res_start = res->start - window->offset; + + rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPAUR(win)); + rcar_pci_write_reg(pcie, lower_32_bits(res_start) & ~0x7F, +@@ -382,7 +383,7 @@ static int rcar_pcie_setup(struct list_head *resource, struct rcar_pcie *pci) + switch (resource_type(res)) { + case IORESOURCE_IO: + case IORESOURCE_MEM: +- rcar_pcie_setup_window(i, pci, res); ++ rcar_pcie_setup_window(i, pci, win); + i++; + break; + case IORESOURCE_BUS: +diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c +index dac91d60701d..e386d4eac407 100644 +--- a/drivers/pci/controller/vmd.c ++++ b/drivers/pci/controller/vmd.c +@@ -445,9 +445,11 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) + if (!membar2) + return -ENOMEM; + offset[0] = vmd->dev->resource[VMD_MEMBAR1].start - +- readq(membar2 + MB2_SHADOW_OFFSET); ++ (readq(membar2 + MB2_SHADOW_OFFSET) & ++ PCI_BASE_ADDRESS_MEM_MASK); + offset[1] = vmd->dev->resource[VMD_MEMBAR2].start - +- readq(membar2 + MB2_SHADOW_OFFSET + 8); ++ (readq(membar2 + MB2_SHADOW_OFFSET + 8) & ++ PCI_BASE_ADDRESS_MEM_MASK); + pci_iounmap(vmd->dev, membar2); + } + } +diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c +index 60330f3e3751..c89a9561439f 100644 +--- a/drivers/pci/endpoint/functions/pci-epf-test.c ++++ b/drivers/pci/endpoint/functions/pci-epf-test.c +@@ -187,6 +187,9 @@ static int pci_epf_test_init_dma_chan(struct pci_epf_test *epf_test) + */ + static void pci_epf_test_clean_dma_chan(struct pci_epf_test *epf_test) + { ++ if (!epf_test->dma_supported) ++ return; ++ + dma_release_channel(epf_test->dma_chan); + epf_test->dma_chan = NULL; + } +diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c +index 4f4f54bc732e..faa414655f33 100644 +--- a/drivers/pci/pci-bridge-emul.c ++++ b/drivers/pci/pci-bridge-emul.c +@@ -185,8 +185,8 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { + * RO, the rest is reserved + */ + .w1c = GENMASK(19, 16), +- .ro = GENMASK(20, 19), +- .rsvd = GENMASK(31, 21), ++ .ro = GENMASK(21, 20), ++ .rsvd = GENMASK(31, 22), + }, + + [PCI_EXP_LNKCAP / 4] = { +@@ -226,7 +226,7 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { + PCI_EXP_SLTSTA_CC | PCI_EXP_SLTSTA_DLLSC) << 16, + .ro = (PCI_EXP_SLTSTA_MRLSS | PCI_EXP_SLTSTA_PDS | + PCI_EXP_SLTSTA_EIS) << 16, +- .rsvd = GENMASK(15, 12) | (GENMASK(15, 9) << 16), ++ .rsvd = GENMASK(15, 13) | (GENMASK(15, 9) << 16), + }, + + [PCI_EXP_RTCTL / 4] = { +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 6d3234f75692..809f2584e338 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -4660,7 +4660,8 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) + * pcie_wait_for_link_delay - Wait until link is active or inactive + * @pdev: Bridge device + * @active: waiting for active or inactive? +- * @delay: Delay to wait after link has become active (in ms) ++ * @delay: Delay to wait after link has become active (in ms). Specify %0 ++ * for no delay. + * + * Use this to wait till link becomes active or inactive. + */ +@@ -4701,7 +4702,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active, + msleep(10); + timeout -= 10; + } +- if (active && ret) ++ if (active && ret && delay) + msleep(delay); + else if (ret != active) + pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n", +@@ -4822,17 +4823,28 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev) + if (!pcie_downstream_port(dev)) + return; + +- if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) { +- pci_dbg(dev, "waiting %d ms for downstream link\n", delay); +- msleep(delay); +- } else { +- pci_dbg(dev, "waiting %d ms for downstream link, after activation\n", +- delay); +- if (!pcie_wait_for_link_delay(dev, true, delay)) { ++ /* ++ * Per PCIe r5.0, sec 6.6.1, for downstream ports that support ++ * speeds > 5 GT/s, we must wait for link training to complete ++ * before the mandatory delay. ++ * ++ * We can only tell when link training completes via DLL Link ++ * Active, which is required for downstream ports that support ++ * speeds > 5 GT/s (sec 7.5.3.6). Unfortunately some common ++ * devices do not implement Link Active reporting even when it's ++ * required, so we'll check for that directly instead of checking ++ * the supported link speed. We assume devices without Link Active ++ * reporting can train in 100 ms regardless of speed. ++ */ ++ if (dev->link_active_reporting) { ++ pci_dbg(dev, "waiting for link to train\n"); ++ if (!pcie_wait_for_link_delay(dev, true, 0)) { + /* Did not train, no need to wait any further */ + return; + } + } ++ pci_dbg(child, "waiting %d ms to become accessible\n", delay); ++ msleep(delay); + + if (!pci_device_is_present(child)) { + pci_dbg(child, "waiting additional %d ms to become accessible\n", delay); +diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c +index 2378ed692534..b17e5ffd31b1 100644 +--- a/drivers/pci/pcie/aspm.c ++++ b/drivers/pci/pcie/aspm.c +@@ -628,16 +628,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) + + /* Setup initial capable state. Will be updated later */ + link->aspm_capable = link->aspm_support; +- /* +- * If the downstream component has pci bridge function, don't +- * do ASPM for now. +- */ +- list_for_each_entry(child, &linkbus->devices, bus_list) { +- if (pci_pcie_type(child) == PCI_EXP_TYPE_PCI_BRIDGE) { +- link->aspm_disable = ASPM_STATE_ALL; +- break; +- } +- } + + /* Get and check endpoint acceptable latencies */ + list_for_each_entry(child, &linkbus->devices, bus_list) { +diff --git a/drivers/pci/pcie/ptm.c b/drivers/pci/pcie/ptm.c +index 9361f3aa26ab..357a454cafa0 100644 +--- a/drivers/pci/pcie/ptm.c ++++ b/drivers/pci/pcie/ptm.c +@@ -39,10 +39,6 @@ void pci_ptm_init(struct pci_dev *dev) + if (!pci_is_pcie(dev)) + return; + +- pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM); +- if (!pos) +- return; +- + /* + * Enable PTM only on interior devices (root ports, switch ports, + * etc.) on the assumption that it causes no link traffic until an +@@ -52,6 +48,23 @@ void pci_ptm_init(struct pci_dev *dev) + pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END)) + return; + ++ /* ++ * Switch Downstream Ports are not permitted to have a PTM ++ * capability; their PTM behavior is controlled by the Upstream ++ * Port (PCIe r5.0, sec 7.9.16). ++ */ ++ ups = pci_upstream_bridge(dev); ++ if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM && ++ ups && ups->ptm_enabled) { ++ dev->ptm_granularity = ups->ptm_granularity; ++ dev->ptm_enabled = 1; ++ return; ++ } ++ ++ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_PTM); ++ if (!pos) ++ return; ++ + pci_read_config_dword(dev, pos + PCI_PTM_CAP, &cap); + local_clock = (cap & PCI_PTM_GRANULARITY_MASK) >> 8; + +@@ -61,7 +74,6 @@ void pci_ptm_init(struct pci_dev *dev) + * the spec recommendation (PCIe r3.1, sec 7.32.3), select the + * furthest upstream Time Source as the PTM Root. + */ +- ups = pci_upstream_bridge(dev); + if (ups && ups->ptm_enabled) { + ctrl = PCI_PTM_CTRL_ENABLE; + if (ups->ptm_granularity == 0) +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index c7e3a8267521..b59a4b0f5f16 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -909,9 +909,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge) + goto free; + + err = device_register(&bridge->dev); +- if (err) ++ if (err) { + put_device(&bridge->dev); +- ++ goto free; ++ } + bus->bridge = get_device(&bridge->dev); + device_enable_async_suspend(bus->bridge); + pci_set_bus_of_node(bus); +diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c +index d8ca40a97693..d21fa04fa44d 100644 +--- a/drivers/pci/setup-res.c ++++ b/drivers/pci/setup-res.c +@@ -439,10 +439,11 @@ int pci_resize_resource(struct pci_dev *dev, int resno, int size) + res->end = res->start + pci_rebar_size_to_bytes(size) - 1; + + /* Check if the new config works by trying to assign everything. */ +- ret = pci_reassign_bridge_resources(dev->bus->self, res->flags); +- if (ret) +- goto error_resize; +- ++ if (dev->bus->self) { ++ ret = pci_reassign_bridge_resources(dev->bus->self, res->flags); ++ if (ret) ++ goto error_resize; ++ } + return 0; + + error_resize: +diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c +index 1151e99b241c..479de4be99eb 100644 +--- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c ++++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c +@@ -35,7 +35,7 @@ + /* L3C has 8-counters */ + #define L3C_NR_COUNTERS 0x8 + +-#define L3C_PERF_CTRL_EN 0x20000 ++#define L3C_PERF_CTRL_EN 0x10000 + #define L3C_EVTYPE_NONE 0xff + + /* +diff --git a/drivers/phy/broadcom/phy-bcm-sr-usb.c b/drivers/phy/broadcom/phy-bcm-sr-usb.c +index fe6c58910e4c..7c7862b4f41f 100644 +--- a/drivers/phy/broadcom/phy-bcm-sr-usb.c ++++ b/drivers/phy/broadcom/phy-bcm-sr-usb.c +@@ -16,8 +16,6 @@ enum bcm_usb_phy_version { + }; + + enum bcm_usb_phy_reg { +- PLL_NDIV_FRAC, +- PLL_NDIV_INT, + PLL_CTRL, + PHY_CTRL, + PHY_PLL_CTRL, +@@ -31,18 +29,11 @@ static const u8 bcm_usb_combo_phy_ss[] = { + }; + + static const u8 bcm_usb_combo_phy_hs[] = { +- [PLL_NDIV_FRAC] = 0x04, +- [PLL_NDIV_INT] = 0x08, + [PLL_CTRL] = 0x0c, + [PHY_CTRL] = 0x10, + }; + +-#define HSPLL_NDIV_INT_VAL 0x13 +-#define HSPLL_NDIV_FRAC_VAL 0x1005 +- + static const u8 bcm_usb_hs_phy[] = { +- [PLL_NDIV_FRAC] = 0x0, +- [PLL_NDIV_INT] = 0x4, + [PLL_CTRL] = 0x8, + [PHY_CTRL] = 0xc, + }; +@@ -52,7 +43,6 @@ enum pll_ctrl_bits { + SSPLL_SUSPEND_EN, + PLL_SEQ_START, + PLL_LOCK, +- PLL_PDIV, + }; + + static const u8 u3pll_ctrl[] = { +@@ -66,29 +56,17 @@ static const u8 u3pll_ctrl[] = { + #define HSPLL_PDIV_VAL 0x1 + + static const u8 u2pll_ctrl[] = { +- [PLL_PDIV] = 1, + [PLL_RESETB] = 5, + [PLL_LOCK] = 6, + }; + + enum bcm_usb_phy_ctrl_bits { + CORERDY, +- AFE_LDO_PWRDWNB, +- AFE_PLL_PWRDWNB, +- AFE_BG_PWRDWNB, +- PHY_ISO, + PHY_RESETB, + PHY_PCTL, + }; + + #define PHY_PCTL_MASK 0xffff +-/* +- * 0x0806 of PCTL_VAL has below bits set +- * BIT-8 : refclk divider 1 +- * BIT-3:2: device mode; mode is not effect +- * BIT-1: soft reset active low +- */ +-#define HSPHY_PCTL_VAL 0x0806 + #define SSPHY_PCTL_VAL 0x0006 + + static const u8 u3phy_ctrl[] = { +@@ -98,10 +76,6 @@ static const u8 u3phy_ctrl[] = { + + static const u8 u2phy_ctrl[] = { + [CORERDY] = 0, +- [AFE_LDO_PWRDWNB] = 1, +- [AFE_PLL_PWRDWNB] = 2, +- [AFE_BG_PWRDWNB] = 3, +- [PHY_ISO] = 4, + [PHY_RESETB] = 5, + [PHY_PCTL] = 6, + }; +@@ -186,38 +160,13 @@ static int bcm_usb_hs_phy_init(struct bcm_usb_phy_cfg *phy_cfg) + int ret = 0; + void __iomem *regs = phy_cfg->regs; + const u8 *offset; +- u32 rd_data; + + offset = phy_cfg->offset; + +- writel(HSPLL_NDIV_INT_VAL, regs + offset[PLL_NDIV_INT]); +- writel(HSPLL_NDIV_FRAC_VAL, regs + offset[PLL_NDIV_FRAC]); +- +- rd_data = readl(regs + offset[PLL_CTRL]); +- rd_data &= ~(HSPLL_PDIV_MASK << u2pll_ctrl[PLL_PDIV]); +- rd_data |= (HSPLL_PDIV_VAL << u2pll_ctrl[PLL_PDIV]); +- writel(rd_data, regs + offset[PLL_CTRL]); +- +- /* Set Core Ready high */ +- bcm_usb_reg32_setbits(regs + offset[PHY_CTRL], +- BIT(u2phy_ctrl[CORERDY])); +- +- /* Maximum timeout for Core Ready done */ +- msleep(30); +- ++ bcm_usb_reg32_clrbits(regs + offset[PLL_CTRL], ++ BIT(u2pll_ctrl[PLL_RESETB])); + bcm_usb_reg32_setbits(regs + offset[PLL_CTRL], + BIT(u2pll_ctrl[PLL_RESETB])); +- bcm_usb_reg32_setbits(regs + offset[PHY_CTRL], +- BIT(u2phy_ctrl[PHY_RESETB])); +- +- +- rd_data = readl(regs + offset[PHY_CTRL]); +- rd_data &= ~(PHY_PCTL_MASK << u2phy_ctrl[PHY_PCTL]); +- rd_data |= (HSPHY_PCTL_VAL << u2phy_ctrl[PHY_PCTL]); +- writel(rd_data, regs + offset[PHY_CTRL]); +- +- /* Maximum timeout for PLL reset done */ +- msleep(30); + + ret = bcm_usb_pll_lock_check(regs + offset[PLL_CTRL], + BIT(u2pll_ctrl[PLL_LOCK])); +diff --git a/drivers/phy/cadence/phy-cadence-sierra.c b/drivers/phy/cadence/phy-cadence-sierra.c +index a5c08e5bd2bf..faed652b73f7 100644 +--- a/drivers/phy/cadence/phy-cadence-sierra.c ++++ b/drivers/phy/cadence/phy-cadence-sierra.c +@@ -685,10 +685,10 @@ static struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = { + static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { + {0xFE0A, SIERRA_DET_STANDEC_A_PREG}, + {0x000F, SIERRA_DET_STANDEC_B_PREG}, +- {0x00A5, SIERRA_DET_STANDEC_C_PREG}, ++ {0x55A5, SIERRA_DET_STANDEC_C_PREG}, + {0x69ad, SIERRA_DET_STANDEC_D_PREG}, + {0x0241, SIERRA_DET_STANDEC_E_PREG}, +- {0x0010, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG}, ++ {0x0110, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG}, + {0x0014, SIERRA_PSM_A0IN_TMR_PREG}, + {0xCF00, SIERRA_PSM_DIAG_PREG}, + {0x001F, SIERRA_PSC_TX_A0_PREG}, +@@ -696,7 +696,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { + {0x0003, SIERRA_PSC_TX_A2_PREG}, + {0x0003, SIERRA_PSC_TX_A3_PREG}, + {0x0FFF, SIERRA_PSC_RX_A0_PREG}, +- {0x0619, SIERRA_PSC_RX_A1_PREG}, ++ {0x0003, SIERRA_PSC_RX_A1_PREG}, + {0x0003, SIERRA_PSC_RX_A2_PREG}, + {0x0001, SIERRA_PSC_RX_A3_PREG}, + {0x0001, SIERRA_PLLCTRL_SUBRATE_PREG}, +@@ -705,19 +705,19 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { + {0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG}, + {0x2512, SIERRA_DFE_BIASTRIM_PREG}, + {0x0000, SIERRA_DRVCTRL_ATTEN_PREG}, +- {0x873E, SIERRA_CLKPATHCTRL_TMR_PREG}, +- {0x03CF, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, +- {0x01CE, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, ++ {0x823E, SIERRA_CLKPATHCTRL_TMR_PREG}, ++ {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, ++ {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, + {0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG}, +- {0x033F, SIERRA_RX_CTLE_MAINTENANCE_PREG}, ++ {0x023C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, + {0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG}, + {0x0000, SIERRA_CREQ_EQ_CTRL_PREG}, +- {0x8000, SIERRA_CREQ_SPARE_PREG}, ++ {0x0000, SIERRA_CREQ_SPARE_PREG}, + {0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, +- {0x8453, SIERRA_CTLELUT_CTRL_PREG}, +- {0x4110, SIERRA_DFE_ECMP_RATESEL_PREG}, +- {0x4110, SIERRA_DFE_SMP_RATESEL_PREG}, +- {0x0002, SIERRA_DEQ_PHALIGN_CTRL}, ++ {0x8452, SIERRA_CTLELUT_CTRL_PREG}, ++ {0x4121, SIERRA_DFE_ECMP_RATESEL_PREG}, ++ {0x4121, SIERRA_DFE_SMP_RATESEL_PREG}, ++ {0x0003, SIERRA_DEQ_PHALIGN_CTRL}, + {0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG}, + {0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG}, + {0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, +@@ -725,7 +725,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { + {0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG}, + {0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG}, + {0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG}, +- {0x9A8A, SIERRA_DEQ_VGATUNE_CTRL_PREG}, ++ {0x9999, SIERRA_DEQ_VGATUNE_CTRL_PREG}, + {0x0014, SIERRA_DEQ_GLUT0}, + {0x0014, SIERRA_DEQ_GLUT1}, + {0x0014, SIERRA_DEQ_GLUT2}, +@@ -772,6 +772,7 @@ static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { + {0x000F, SIERRA_LFPSFILT_NS_PREG}, + {0x0009, SIERRA_LFPSFILT_RD_PREG}, + {0x0001, SIERRA_LFPSFILT_MP_PREG}, ++ {0x6013, SIERRA_SIGDET_SUPPORT_PREG}, + {0x8013, SIERRA_SDFILT_H2L_A_PREG}, + {0x8009, SIERRA_SDFILT_L2H_PREG}, + {0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG}, +diff --git a/drivers/phy/ti/phy-j721e-wiz.c b/drivers/phy/ti/phy-j721e-wiz.c +index 7b51045df783..c8e4ff341cef 100644 +--- a/drivers/phy/ti/phy-j721e-wiz.c ++++ b/drivers/phy/ti/phy-j721e-wiz.c +@@ -794,8 +794,10 @@ static int wiz_probe(struct platform_device *pdev) + } + + base = devm_ioremap(dev, res.start, resource_size(&res)); +- if (!base) ++ if (!base) { ++ ret = -ENOMEM; + goto err_addr_to_resource; ++ } + + regmap = devm_regmap_init_mmio(dev, base, &wiz_regmap_config); + if (IS_ERR(regmap)) { +@@ -812,6 +814,7 @@ static int wiz_probe(struct platform_device *pdev) + + if (num_lanes > WIZ_MAX_LANES) { + dev_err(dev, "Cannot support %d lanes\n", num_lanes); ++ ret = -ENODEV; + goto err_addr_to_resource; + } + +@@ -897,6 +900,7 @@ static int wiz_probe(struct platform_device *pdev) + serdes_pdev = of_platform_device_create(child_node, NULL, dev); + if (!serdes_pdev) { + dev_WARN(dev, "Unable to create SERDES platform device\n"); ++ ret = -ENOMEM; + goto err_pdev_create; + } + wiz->serdes_pdev = serdes_pdev; +diff --git a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c +index f690fc5cd688..71e666178300 100644 +--- a/drivers/pinctrl/bcm/pinctrl-bcm281xx.c ++++ b/drivers/pinctrl/bcm/pinctrl-bcm281xx.c +@@ -1406,7 +1406,7 @@ static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev) + pdata->reg_base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(pdata->reg_base)) { + dev_err(&pdev->dev, "Failed to ioremap MEM resource\n"); +- return -ENODEV; ++ return PTR_ERR(pdata->reg_base); + } + + /* Initialize the dynamic part of pinctrl_desc */ +diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c +index 9f42036c5fbb..1f81569c7ae3 100644 +--- a/drivers/pinctrl/freescale/pinctrl-imx.c ++++ b/drivers/pinctrl/freescale/pinctrl-imx.c +@@ -774,16 +774,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev, + return 0; + } + +-/* +- * imx_free_resources() - free memory used by this driver +- * @info: info driver instance +- */ +-static void imx_free_resources(struct imx_pinctrl *ipctl) +-{ +- if (ipctl->pctl) +- pinctrl_unregister(ipctl->pctl); +-} +- + int imx_pinctrl_probe(struct platform_device *pdev, + const struct imx_pinctrl_soc_info *info) + { +@@ -874,23 +864,18 @@ int imx_pinctrl_probe(struct platform_device *pdev, + &ipctl->pctl); + if (ret) { + dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); +- goto free; ++ return ret; + } + + ret = imx_pinctrl_probe_dt(pdev, ipctl); + if (ret) { + dev_err(&pdev->dev, "fail to probe dt properties\n"); +- goto free; ++ return ret; + } + + dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); + + return pinctrl_enable(ipctl->pctl); +- +-free: +- imx_free_resources(ipctl); +- +- return ret; + } + + static int __maybe_unused imx_pinctrl_suspend(struct device *dev) +diff --git a/drivers/pinctrl/freescale/pinctrl-imx1-core.c b/drivers/pinctrl/freescale/pinctrl-imx1-core.c +index c00d0022d311..421f7d1886e5 100644 +--- a/drivers/pinctrl/freescale/pinctrl-imx1-core.c ++++ b/drivers/pinctrl/freescale/pinctrl-imx1-core.c +@@ -638,7 +638,6 @@ int imx1_pinctrl_core_probe(struct platform_device *pdev, + + ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); + if (ret) { +- pinctrl_unregister(ipctl->pctl); + dev_err(&pdev->dev, "Failed to populate subdevices\n"); + return ret; + } +diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c +index 694912409fd9..54222ccddfb1 100644 +--- a/drivers/pinctrl/pinctrl-at91-pio4.c ++++ b/drivers/pinctrl/pinctrl-at91-pio4.c +@@ -1019,7 +1019,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev) + + atmel_pioctrl->reg_base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(atmel_pioctrl->reg_base)) +- return -EINVAL; ++ return PTR_ERR(atmel_pioctrl->reg_base); + + atmel_pioctrl->clk = devm_clk_get(dev, NULL); + if (IS_ERR(atmel_pioctrl->clk)) { +diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c +index ed8eac6c1494..b1bf46ec207f 100644 +--- a/drivers/pinctrl/pinctrl-ocelot.c ++++ b/drivers/pinctrl/pinctrl-ocelot.c +@@ -714,11 +714,12 @@ static void ocelot_irq_handler(struct irq_desc *desc) + struct irq_chip *parent_chip = irq_desc_get_chip(desc); + struct gpio_chip *chip = irq_desc_get_handler_data(desc); + struct ocelot_pinctrl *info = gpiochip_get_data(chip); ++ unsigned int id_reg = OCELOT_GPIO_INTR_IDENT * info->stride; + unsigned int reg = 0, irq, i; + unsigned long irqs; + + for (i = 0; i < info->stride; i++) { +- regmap_read(info->map, OCELOT_GPIO_INTR_IDENT + 4 * i, ®); ++ regmap_read(info->map, id_reg + 4 * i, ®); + if (!reg) + continue; + +@@ -751,21 +752,21 @@ static int ocelot_gpiochip_register(struct platform_device *pdev, + gc->of_node = info->dev->of_node; + gc->label = "ocelot-gpio"; + +- irq = irq_of_parse_and_map(pdev->dev.of_node, 0); +- if (irq <= 0) +- return irq; +- +- girq = &gc->irq; +- girq->chip = &ocelot_irqchip; +- girq->parent_handler = ocelot_irq_handler; +- girq->num_parents = 1; +- girq->parents = devm_kcalloc(&pdev->dev, 1, sizeof(*girq->parents), +- GFP_KERNEL); +- if (!girq->parents) +- return -ENOMEM; +- girq->parents[0] = irq; +- girq->default_type = IRQ_TYPE_NONE; +- girq->handler = handle_edge_irq; ++ irq = irq_of_parse_and_map(gc->of_node, 0); ++ if (irq) { ++ girq = &gc->irq; ++ girq->chip = &ocelot_irqchip; ++ girq->parent_handler = ocelot_irq_handler; ++ girq->num_parents = 1; ++ girq->parents = devm_kcalloc(&pdev->dev, 1, ++ sizeof(*girq->parents), ++ GFP_KERNEL); ++ if (!girq->parents) ++ return -ENOMEM; ++ girq->parents[0] = irq; ++ girq->default_type = IRQ_TYPE_NONE; ++ girq->handler = handle_edge_irq; ++ } + + ret = devm_gpiochip_add_data(&pdev->dev, gc, info); + if (ret) +diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c +index 098951346339..d7869b636889 100644 +--- a/drivers/pinctrl/pinctrl-rockchip.c ++++ b/drivers/pinctrl/pinctrl-rockchip.c +@@ -508,8 +508,8 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, + } + + map_num += grp->npins; +- new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map), +- GFP_KERNEL); ++ ++ new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL); + if (!new_map) + return -ENOMEM; + +@@ -519,7 +519,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, + /* create mux map */ + parent = of_get_parent(np); + if (!parent) { +- devm_kfree(pctldev->dev, new_map); ++ kfree(new_map); + return -EINVAL; + } + new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; +@@ -546,6 +546,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, + static void rockchip_dt_free_map(struct pinctrl_dev *pctldev, + struct pinctrl_map *map, unsigned num_maps) + { ++ kfree(map); + } + + static const struct pinctrl_ops rockchip_pctrl_ops = { +diff --git a/drivers/pinctrl/pinctrl-rza1.c b/drivers/pinctrl/pinctrl-rza1.c +index da2d8365c690..ff4a7fb518bb 100644 +--- a/drivers/pinctrl/pinctrl-rza1.c ++++ b/drivers/pinctrl/pinctrl-rza1.c +@@ -418,7 +418,7 @@ static const struct rza1_bidir_entry rza1l_bidir_entries[RZA1_NPORTS] = { + }; + + static const struct rza1_swio_entry rza1l_swio_entries[] = { +- [0] = { ARRAY_SIZE(rza1h_swio_pins), rza1h_swio_pins }, ++ [0] = { ARRAY_SIZE(rza1l_swio_pins), rza1l_swio_pins }, + }; + + /* RZ/A1L (r7s72102x) pinmux flags table */ +diff --git a/drivers/pinctrl/qcom/pinctrl-ipq6018.c b/drivers/pinctrl/qcom/pinctrl-ipq6018.c +index 38c33a778cb8..ec50a3b4bd16 100644 +--- a/drivers/pinctrl/qcom/pinctrl-ipq6018.c ++++ b/drivers/pinctrl/qcom/pinctrl-ipq6018.c +@@ -367,7 +367,8 @@ static const char * const wci20_groups[] = { + + static const char * const qpic_pad_groups[] = { + "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio9", "gpio10", +- "gpio11", "gpio17", ++ "gpio11", "gpio17", "gpio15", "gpio12", "gpio13", "gpio14", "gpio5", ++ "gpio6", "gpio7", "gpio8", + }; + + static const char * const burn0_groups[] = { +diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c +index 1ebcb957c654..63a287d5795f 100644 +--- a/drivers/pinctrl/sirf/pinctrl-sirf.c ++++ b/drivers/pinctrl/sirf/pinctrl-sirf.c +@@ -794,13 +794,17 @@ static int sirfsoc_gpio_probe(struct device_node *np) + return -ENODEV; + + sgpio = devm_kzalloc(&pdev->dev, sizeof(*sgpio), GFP_KERNEL); +- if (!sgpio) +- return -ENOMEM; ++ if (!sgpio) { ++ err = -ENOMEM; ++ goto out_put_device; ++ } + spin_lock_init(&sgpio->lock); + + regs = of_iomap(np, 0); +- if (!regs) +- return -ENOMEM; ++ if (!regs) { ++ err = -ENOMEM; ++ goto out_put_device; ++ } + + sgpio->chip.gc.request = sirfsoc_gpio_request; + sgpio->chip.gc.free = sirfsoc_gpio_free; +@@ -824,8 +828,10 @@ static int sirfsoc_gpio_probe(struct device_node *np) + girq->parents = devm_kcalloc(&pdev->dev, SIRFSOC_GPIO_NO_OF_BANKS, + sizeof(*girq->parents), + GFP_KERNEL); +- if (!girq->parents) +- return -ENOMEM; ++ if (!girq->parents) { ++ err = -ENOMEM; ++ goto out_put_device; ++ } + for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { + bank = &sgpio->sgpio_bank[i]; + spin_lock_init(&bank->lock); +@@ -868,6 +874,8 @@ out_no_range: + gpiochip_remove(&sgpio->chip.gc); + out: + iounmap(regs); ++out_put_device: ++ put_device(&pdev->dev); + return err; + } + +diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig +index f3424fdce341..d37ec0d03237 100644 +--- a/drivers/power/supply/Kconfig ++++ b/drivers/power/supply/Kconfig +@@ -577,7 +577,7 @@ config CHARGER_BQ24257 + tristate "TI BQ24250/24251/24257 battery charger driver" + depends on I2C + depends on GPIOLIB || COMPILE_TEST +- depends on REGMAP_I2C ++ select REGMAP_I2C + help + Say Y to enable support for the TI BQ24250, BQ24251, and BQ24257 battery + chargers. +diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c +index 84a206f42a8e..e7931ffb7151 100644 +--- a/drivers/power/supply/lp8788-charger.c ++++ b/drivers/power/supply/lp8788-charger.c +@@ -572,27 +572,14 @@ static void lp8788_setup_adc_channel(struct device *dev, + return; + + /* ADC channel for battery voltage */ +- chan = iio_channel_get(dev, pdata->adc_vbatt); ++ chan = devm_iio_channel_get(dev, pdata->adc_vbatt); + pchg->chan[LP8788_VBATT] = IS_ERR(chan) ? NULL : chan; + + /* ADC channel for battery temperature */ +- chan = iio_channel_get(dev, pdata->adc_batt_temp); ++ chan = devm_iio_channel_get(dev, pdata->adc_batt_temp); + pchg->chan[LP8788_BATT_TEMP] = IS_ERR(chan) ? NULL : chan; + } + +-static void lp8788_release_adc_channel(struct lp8788_charger *pchg) +-{ +- int i; +- +- for (i = 0; i < LP8788_NUM_CHG_ADC; i++) { +- if (!pchg->chan[i]) +- continue; +- +- iio_channel_release(pchg->chan[i]); +- pchg->chan[i] = NULL; +- } +-} +- + static ssize_t lp8788_show_charger_status(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -735,7 +722,6 @@ static int lp8788_charger_remove(struct platform_device *pdev) + flush_work(&pchg->charger_work); + lp8788_irq_unregister(pdev, pchg); + lp8788_psy_unregister(pchg); +- lp8788_release_adc_channel(pchg); + + return 0; + } +diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c +index c1d124b8be0c..d102921b3ab2 100644 +--- a/drivers/power/supply/smb347-charger.c ++++ b/drivers/power/supply/smb347-charger.c +@@ -1138,6 +1138,7 @@ static bool smb347_volatile_reg(struct device *dev, unsigned int reg) + switch (reg) { + case IRQSTAT_A: + case IRQSTAT_C: ++ case IRQSTAT_D: + case IRQSTAT_E: + case IRQSTAT_F: + case STAT_A: +diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c +index 9973c442b455..6b3cbc0490c6 100644 +--- a/drivers/pwm/core.c ++++ b/drivers/pwm/core.c +@@ -121,7 +121,7 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label) + pwm->chip->ops->get_state(pwm->chip, pwm, &pwm->state); + trace_pwm_get(pwm, &pwm->state); + +- if (IS_ENABLED(PWM_DEBUG)) ++ if (IS_ENABLED(CONFIG_PWM_DEBUG)) + pwm->last = pwm->state; + } + +diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c +index c9e57bd109fb..599a0f66a384 100644 +--- a/drivers/pwm/pwm-img.c ++++ b/drivers/pwm/pwm-img.c +@@ -129,8 +129,10 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, + duty = DIV_ROUND_UP(timebase * duty_ns, period_ns); + + ret = pm_runtime_get_sync(chip->dev); +- if (ret < 0) ++ if (ret < 0) { ++ pm_runtime_put_autosuspend(chip->dev); + return ret; ++ } + + val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG); + val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm)); +@@ -331,8 +333,10 @@ static int img_pwm_remove(struct platform_device *pdev) + int ret; + + ret = pm_runtime_get_sync(&pdev->dev); +- if (ret < 0) ++ if (ret < 0) { ++ pm_runtime_put(&pdev->dev); + return ret; ++ } + + for (i = 0; i < pwm_chip->chip.npwm; i++) { + val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG); +diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c +index a6e40d4c485f..732a6f3701e8 100644 +--- a/drivers/pwm/pwm-imx27.c ++++ b/drivers/pwm/pwm-imx27.c +@@ -150,13 +150,12 @@ static void pwm_imx27_get_state(struct pwm_chip *chip, + + prescaler = MX3_PWMCR_PRESCALER_GET(val); + pwm_clk = clk_get_rate(imx->clk_per); +- pwm_clk = DIV_ROUND_CLOSEST_ULL(pwm_clk, prescaler); + val = readl(imx->mmio_base + MX3_PWMPR); + period = val >= MX3_PWMPR_MAX ? MX3_PWMPR_MAX : val; + + /* PWMOUT (Hz) = PWMCLK / (PWMPR + 2) */ +- tmp = NSEC_PER_SEC * (u64)(period + 2); +- state->period = DIV_ROUND_CLOSEST_ULL(tmp, pwm_clk); ++ tmp = NSEC_PER_SEC * (u64)(period + 2) * prescaler; ++ state->period = DIV_ROUND_UP_ULL(tmp, pwm_clk); + + /* + * PWMSAR can be read only if PWM is enabled. If the PWM is disabled, +@@ -167,8 +166,8 @@ static void pwm_imx27_get_state(struct pwm_chip *chip, + else + val = imx->duty_cycle; + +- tmp = NSEC_PER_SEC * (u64)(val); +- state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, pwm_clk); ++ tmp = NSEC_PER_SEC * (u64)(val) * prescaler; ++ state->duty_cycle = DIV_ROUND_UP_ULL(tmp, pwm_clk); + + pwm_imx27_clk_disable_unprepare(imx); + } +@@ -220,22 +219,23 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, + struct pwm_imx27_chip *imx = to_pwm_imx27_chip(chip); + struct pwm_state cstate; + unsigned long long c; ++ unsigned long long clkrate; + int ret; + u32 cr; + + pwm_get_state(pwm, &cstate); + +- c = clk_get_rate(imx->clk_per); +- c *= state->period; ++ clkrate = clk_get_rate(imx->clk_per); ++ c = clkrate * state->period; + +- do_div(c, 1000000000); ++ do_div(c, NSEC_PER_SEC); + period_cycles = c; + + prescale = period_cycles / 0x10000 + 1; + + period_cycles /= prescale; +- c = (unsigned long long)period_cycles * state->duty_cycle; +- do_div(c, state->period); ++ c = clkrate * state->duty_cycle; ++ do_div(c, NSEC_PER_SEC * prescale); + duty_cycles = c; + + /* +diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c +index 2bead57c9cf9..ac13e7b046a6 100644 +--- a/drivers/remoteproc/mtk_scp.c ++++ b/drivers/remoteproc/mtk_scp.c +@@ -132,8 +132,8 @@ static int scp_ipi_init(struct mtk_scp *scp) + (struct mtk_share_obj __iomem *)(scp->sram_base + recv_offset); + scp->send_buf = + (struct mtk_share_obj __iomem *)(scp->sram_base + send_offset); +- memset_io(scp->recv_buf, 0, sizeof(scp->recv_buf)); +- memset_io(scp->send_buf, 0, sizeof(scp->send_buf)); ++ memset_io(scp->recv_buf, 0, sizeof(*scp->recv_buf)); ++ memset_io(scp->send_buf, 0, sizeof(*scp->send_buf)); + + return 0; + } +diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c +index 5475d4f808a8..629abcee2c1d 100644 +--- a/drivers/remoteproc/qcom_q6v5_mss.c ++++ b/drivers/remoteproc/qcom_q6v5_mss.c +@@ -69,13 +69,9 @@ + #define AXI_HALTREQ_REG 0x0 + #define AXI_HALTACK_REG 0x4 + #define AXI_IDLE_REG 0x8 +-#define NAV_AXI_HALTREQ_BIT BIT(0) +-#define NAV_AXI_HALTACK_BIT BIT(1) +-#define NAV_AXI_IDLE_BIT BIT(2) + #define AXI_GATING_VALID_OVERRIDE BIT(0) + + #define HALT_ACK_TIMEOUT_US 100000 +-#define NAV_HALT_ACK_TIMEOUT_US 200 + + /* QDSP6SS_RESET */ + #define Q6SS_STOP_CORE BIT(0) +@@ -143,7 +139,7 @@ struct rproc_hexagon_res { + int version; + bool need_mem_protection; + bool has_alt_reset; +- bool has_halt_nav; ++ bool has_spare_reg; + }; + + struct q6v5 { +@@ -154,13 +150,11 @@ struct q6v5 { + void __iomem *rmb_base; + + struct regmap *halt_map; +- struct regmap *halt_nav_map; + struct regmap *conn_map; + + u32 halt_q6; + u32 halt_modem; + u32 halt_nc; +- u32 halt_nav; + u32 conn_box; + + struct reset_control *mss_restart; +@@ -206,7 +200,7 @@ struct q6v5 { + struct qcom_sysmon *sysmon; + bool need_mem_protection; + bool has_alt_reset; +- bool has_halt_nav; ++ bool has_spare_reg; + int mpss_perm; + int mba_perm; + const char *hexagon_mdt_image; +@@ -427,21 +421,19 @@ static int q6v5_reset_assert(struct q6v5 *qproc) + reset_control_assert(qproc->pdc_reset); + ret = reset_control_reset(qproc->mss_restart); + reset_control_deassert(qproc->pdc_reset); +- } else if (qproc->has_halt_nav) { ++ } else if (qproc->has_spare_reg) { + /* + * When the AXI pipeline is being reset with the Q6 modem partly + * operational there is possibility of AXI valid signal to + * glitch, leading to spurious transactions and Q6 hangs. A work + * around is employed by asserting the AXI_GATING_VALID_OVERRIDE +- * BIT before triggering Q6 MSS reset. Both the HALTREQ and +- * AXI_GATING_VALID_OVERRIDE are withdrawn post MSS assert +- * followed by a MSS deassert, while holding the PDC reset. ++ * BIT before triggering Q6 MSS reset. AXI_GATING_VALID_OVERRIDE ++ * is withdrawn post MSS assert followed by a MSS deassert, ++ * while holding the PDC reset. + */ + reset_control_assert(qproc->pdc_reset); + regmap_update_bits(qproc->conn_map, qproc->conn_box, + AXI_GATING_VALID_OVERRIDE, 1); +- regmap_update_bits(qproc->halt_nav_map, qproc->halt_nav, +- NAV_AXI_HALTREQ_BIT, 0); + reset_control_assert(qproc->mss_restart); + reset_control_deassert(qproc->pdc_reset); + regmap_update_bits(qproc->conn_map, qproc->conn_box, +@@ -464,7 +456,7 @@ static int q6v5_reset_deassert(struct q6v5 *qproc) + ret = reset_control_reset(qproc->mss_restart); + writel(0, qproc->rmb_base + RMB_MBA_ALT_RESET); + reset_control_deassert(qproc->pdc_reset); +- } else if (qproc->has_halt_nav) { ++ } else if (qproc->has_spare_reg) { + ret = reset_control_reset(qproc->mss_restart); + } else { + ret = reset_control_deassert(qproc->mss_restart); +@@ -761,32 +753,6 @@ static void q6v5proc_halt_axi_port(struct q6v5 *qproc, + regmap_write(halt_map, offset + AXI_HALTREQ_REG, 0); + } + +-static void q6v5proc_halt_nav_axi_port(struct q6v5 *qproc, +- struct regmap *halt_map, +- u32 offset) +-{ +- unsigned int val; +- int ret; +- +- /* Check if we're already idle */ +- ret = regmap_read(halt_map, offset, &val); +- if (!ret && (val & NAV_AXI_IDLE_BIT)) +- return; +- +- /* Assert halt request */ +- regmap_update_bits(halt_map, offset, NAV_AXI_HALTREQ_BIT, +- NAV_AXI_HALTREQ_BIT); +- +- /* Wait for halt ack*/ +- regmap_read_poll_timeout(halt_map, offset, val, +- (val & NAV_AXI_HALTACK_BIT), +- 5, NAV_HALT_ACK_TIMEOUT_US); +- +- ret = regmap_read(halt_map, offset, &val); +- if (ret || !(val & NAV_AXI_IDLE_BIT)) +- dev_err(qproc->dev, "port failed halt\n"); +-} +- + static int q6v5_mpss_init_image(struct q6v5 *qproc, const struct firmware *fw) + { + unsigned long dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS; +@@ -951,9 +917,6 @@ static int q6v5_mba_load(struct q6v5 *qproc) + halt_axi_ports: + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6); + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem); +- if (qproc->has_halt_nav) +- q6v5proc_halt_nav_axi_port(qproc, qproc->halt_nav_map, +- qproc->halt_nav); + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc); + + reclaim_mba: +@@ -1001,9 +964,6 @@ static void q6v5_mba_reclaim(struct q6v5 *qproc) + + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_q6); + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_modem); +- if (qproc->has_halt_nav) +- q6v5proc_halt_nav_axi_port(qproc, qproc->halt_nav_map, +- qproc->halt_nav); + q6v5proc_halt_axi_port(qproc, qproc->halt_map, qproc->halt_nc); + if (qproc->version == MSS_MSM8996) { + /* +@@ -1156,7 +1116,13 @@ static int q6v5_mpss_load(struct q6v5 *qproc) + goto release_firmware; + } + +- ptr = qproc->mpss_region + offset; ++ ptr = ioremap_wc(qproc->mpss_phys + offset, phdr->p_memsz); ++ if (!ptr) { ++ dev_err(qproc->dev, ++ "unable to map memory region: %pa+%zx-%x\n", ++ &qproc->mpss_phys, offset, phdr->p_memsz); ++ goto release_firmware; ++ } + + if (phdr->p_filesz && phdr->p_offset < fw->size) { + /* Firmware is large enough to be non-split */ +@@ -1165,6 +1131,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) + "failed to load segment %d from truncated file %s\n", + i, fw_name); + ret = -EINVAL; ++ iounmap(ptr); + goto release_firmware; + } + +@@ -1175,6 +1142,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) + ret = request_firmware(&seg_fw, fw_name, qproc->dev); + if (ret) { + dev_err(qproc->dev, "failed to load %s\n", fw_name); ++ iounmap(ptr); + goto release_firmware; + } + +@@ -1187,6 +1155,7 @@ static int q6v5_mpss_load(struct q6v5 *qproc) + memset(ptr + phdr->p_filesz, 0, + phdr->p_memsz - phdr->p_filesz); + } ++ iounmap(ptr); + size += phdr->p_memsz; + + code_length = readl(qproc->rmb_base + RMB_PMI_CODE_LENGTH_REG); +@@ -1236,7 +1205,8 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc, + int ret = 0; + struct q6v5 *qproc = rproc->priv; + unsigned long mask = BIT((unsigned long)segment->priv); +- void *ptr = rproc_da_to_va(rproc, segment->da, segment->size); ++ int offset = segment->da - qproc->mpss_reloc; ++ void *ptr = NULL; + + /* Unlock mba before copying segments */ + if (!qproc->dump_mba_loaded) { +@@ -1250,10 +1220,15 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc, + } + } + +- if (!ptr || ret) +- memset(dest, 0xff, segment->size); +- else ++ if (!ret) ++ ptr = ioremap_wc(qproc->mpss_phys + offset, segment->size); ++ ++ if (ptr) { + memcpy(dest, ptr, segment->size); ++ iounmap(ptr); ++ } else { ++ memset(dest, 0xff, segment->size); ++ } + + qproc->dump_segment_mask |= mask; + +@@ -1432,36 +1407,12 @@ static int q6v5_init_mem(struct q6v5 *qproc, struct platform_device *pdev) + qproc->halt_modem = args.args[1]; + qproc->halt_nc = args.args[2]; + +- if (qproc->has_halt_nav) { +- struct platform_device *nav_pdev; +- ++ if (qproc->has_spare_reg) { + ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node, +- "qcom,halt-nav-regs", ++ "qcom,spare-regs", + 1, 0, &args); + if (ret < 0) { +- dev_err(&pdev->dev, "failed to parse halt-nav-regs\n"); +- return -EINVAL; +- } +- +- nav_pdev = of_find_device_by_node(args.np); +- of_node_put(args.np); +- if (!nav_pdev) { +- dev_err(&pdev->dev, "failed to get mss clock device\n"); +- return -EPROBE_DEFER; +- } +- +- qproc->halt_nav_map = dev_get_regmap(&nav_pdev->dev, NULL); +- if (!qproc->halt_nav_map) { +- dev_err(&pdev->dev, "failed to get map from device\n"); +- return -EINVAL; +- } +- qproc->halt_nav = args.args[0]; +- +- ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node, +- "qcom,halt-nav-regs", +- 1, 1, &args); +- if (ret < 0) { +- dev_err(&pdev->dev, "failed to parse halt-nav-regs\n"); ++ dev_err(&pdev->dev, "failed to parse spare-regs\n"); + return -EINVAL; + } + +@@ -1547,7 +1498,7 @@ static int q6v5_init_reset(struct q6v5 *qproc) + return PTR_ERR(qproc->mss_restart); + } + +- if (qproc->has_alt_reset || qproc->has_halt_nav) { ++ if (qproc->has_alt_reset || qproc->has_spare_reg) { + qproc->pdc_reset = devm_reset_control_get_exclusive(qproc->dev, + "pdc_reset"); + if (IS_ERR(qproc->pdc_reset)) { +@@ -1595,12 +1546,6 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc) + + qproc->mpss_phys = qproc->mpss_reloc = r.start; + qproc->mpss_size = resource_size(&r); +- qproc->mpss_region = devm_ioremap_wc(qproc->dev, qproc->mpss_phys, qproc->mpss_size); +- if (!qproc->mpss_region) { +- dev_err(qproc->dev, "unable to map memory region: %pa+%zx\n", +- &r.start, qproc->mpss_size); +- return -EBUSY; +- } + + return 0; + } +@@ -1679,7 +1624,7 @@ static int q6v5_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, qproc); + +- qproc->has_halt_nav = desc->has_halt_nav; ++ qproc->has_spare_reg = desc->has_spare_reg; + ret = q6v5_init_mem(qproc, pdev); + if (ret) + goto free_rproc; +@@ -1828,8 +1773,6 @@ static const struct rproc_hexagon_res sc7180_mss = { + .active_clk_names = (char*[]){ + "mnoc_axi", + "nav", +- "mss_nav", +- "mss_crypto", + NULL + }, + .active_pd_names = (char*[]){ +@@ -1844,7 +1787,7 @@ static const struct rproc_hexagon_res sc7180_mss = { + }, + .need_mem_protection = true, + .has_alt_reset = false, +- .has_halt_nav = true, ++ .has_spare_reg = true, + .version = MSS_SC7180, + }; + +@@ -1879,7 +1822,7 @@ static const struct rproc_hexagon_res sdm845_mss = { + }, + .need_mem_protection = true, + .has_alt_reset = true, +- .has_halt_nav = false, ++ .has_spare_reg = false, + .version = MSS_SDM845, + }; + +@@ -1906,7 +1849,7 @@ static const struct rproc_hexagon_res msm8998_mss = { + }, + .need_mem_protection = true, + .has_alt_reset = false, +- .has_halt_nav = false, ++ .has_spare_reg = false, + .version = MSS_MSM8998, + }; + +@@ -1936,7 +1879,7 @@ static const struct rproc_hexagon_res msm8996_mss = { + }, + .need_mem_protection = true, + .has_alt_reset = false, +- .has_halt_nav = false, ++ .has_spare_reg = false, + .version = MSS_MSM8996, + }; + +@@ -1969,7 +1912,7 @@ static const struct rproc_hexagon_res msm8916_mss = { + }, + .need_mem_protection = false, + .has_alt_reset = false, +- .has_halt_nav = false, ++ .has_spare_reg = false, + .version = MSS_MSM8916, + }; + +@@ -2010,7 +1953,7 @@ static const struct rproc_hexagon_res msm8974_mss = { + }, + .need_mem_protection = false, + .has_alt_reset = false, +- .has_halt_nav = false, ++ .has_spare_reg = false, + .version = MSS_MSM8974, + }; + +diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c +index be15aace9b3c..8f79cfd2e467 100644 +--- a/drivers/remoteproc/remoteproc_core.c ++++ b/drivers/remoteproc/remoteproc_core.c +@@ -2053,6 +2053,7 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, + rproc->dev.type = &rproc_type; + rproc->dev.class = &rproc_class; + rproc->dev.driver_data = rproc; ++ idr_init(&rproc->notifyids); + + /* Assign a unique device index and name */ + rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL); +@@ -2078,8 +2079,6 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, + + mutex_init(&rproc->lock); + +- idr_init(&rproc->notifyids); +- + INIT_LIST_HEAD(&rproc->carveouts); + INIT_LIST_HEAD(&rproc->mappings); + INIT_LIST_HEAD(&rproc->traces); +diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c +index afce2c0b4bd6..d6802e6191cb 100644 +--- a/drivers/rtc/rtc-mc13xxx.c ++++ b/drivers/rtc/rtc-mc13xxx.c +@@ -308,8 +308,10 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) + mc13xxx_unlock(mc13xxx); + + ret = rtc_register_device(priv->rtc); +- if (ret) ++ if (ret) { ++ mc13xxx_lock(mc13xxx); + goto err_irq_request; ++ } + + return 0; + +diff --git a/drivers/rtc/rtc-rc5t619.c b/drivers/rtc/rtc-rc5t619.c +index 24e386ecbc7e..dd1a20977478 100644 +--- a/drivers/rtc/rtc-rc5t619.c ++++ b/drivers/rtc/rtc-rc5t619.c +@@ -356,10 +356,8 @@ static int rc5t619_rtc_probe(struct platform_device *pdev) + int err; + + rtc = devm_kzalloc(dev, sizeof(*rtc), GFP_KERNEL); +- if (IS_ERR(rtc)) { +- err = PTR_ERR(rtc); ++ if (!rtc) + return -ENOMEM; +- } + + rtc->rn5t618 = rn5t618; + +diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c +index a0ddc86c975a..ec84db0b3d7a 100644 +--- a/drivers/rtc/rtc-rv3028.c ++++ b/drivers/rtc/rtc-rv3028.c +@@ -755,6 +755,8 @@ static int rv3028_probe(struct i2c_client *client) + return -ENOMEM; + + rv3028->regmap = devm_regmap_init_i2c(client, ®map_config); ++ if (IS_ERR(rv3028->regmap)) ++ return PTR_ERR(rv3028->regmap); + + i2c_set_clientdata(client, rv3028); + +diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h +index b8453b594679..a2afd7bc100b 100644 +--- a/drivers/s390/cio/qdio.h ++++ b/drivers/s390/cio/qdio.h +@@ -364,7 +364,6 @@ static inline int multicast_outbound(struct qdio_q *q) + extern u64 last_ai_time; + + /* prototypes for thin interrupt */ +-void qdio_setup_thinint(struct qdio_irq *irq_ptr); + int qdio_establish_thinint(struct qdio_irq *irq_ptr); + void qdio_shutdown_thinint(struct qdio_irq *irq_ptr); + void tiqdio_add_device(struct qdio_irq *irq_ptr); +@@ -389,6 +388,7 @@ int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr, + struct subchannel_id *schid, + struct qdio_ssqd_desc *data); + int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data); ++void qdio_shutdown_irq(struct qdio_irq *irq); + void qdio_print_subchannel_info(struct qdio_irq *irq_ptr); + void qdio_release_memory(struct qdio_irq *irq_ptr); + int qdio_setup_init(void); +diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c +index bcc3ab14e72d..80cc811bd2e0 100644 +--- a/drivers/s390/cio/qdio_main.c ++++ b/drivers/s390/cio/qdio_main.c +@@ -1154,35 +1154,27 @@ int qdio_shutdown(struct ccw_device *cdev, int how) + + /* cleanup subchannel */ + spin_lock_irq(get_ccwdev_lock(cdev)); +- ++ qdio_set_state(irq_ptr, QDIO_IRQ_STATE_CLEANUP); + if (how & QDIO_FLAG_CLEANUP_USING_CLEAR) + rc = ccw_device_clear(cdev, QDIO_DOING_CLEANUP); + else + /* default behaviour is halt */ + rc = ccw_device_halt(cdev, QDIO_DOING_CLEANUP); ++ spin_unlock_irq(get_ccwdev_lock(cdev)); + if (rc) { + DBF_ERROR("%4x SHUTD ERR", irq_ptr->schid.sch_no); + DBF_ERROR("rc:%4d", rc); + goto no_cleanup; + } + +- qdio_set_state(irq_ptr, QDIO_IRQ_STATE_CLEANUP); +- spin_unlock_irq(get_ccwdev_lock(cdev)); + wait_event_interruptible_timeout(cdev->private->wait_q, + irq_ptr->state == QDIO_IRQ_STATE_INACTIVE || + irq_ptr->state == QDIO_IRQ_STATE_ERR, + 10 * HZ); +- spin_lock_irq(get_ccwdev_lock(cdev)); + + no_cleanup: + qdio_shutdown_thinint(irq_ptr); +- +- /* restore interrupt handler */ +- if ((void *)cdev->handler == (void *)qdio_int_handler) { +- cdev->handler = irq_ptr->orig_handler; +- cdev->private->intparm = 0; +- } +- spin_unlock_irq(get_ccwdev_lock(cdev)); ++ qdio_shutdown_irq(irq_ptr); + + qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE); + mutex_unlock(&irq_ptr->setup_mutex); +@@ -1352,8 +1344,8 @@ int qdio_establish(struct ccw_device *cdev, + + rc = qdio_establish_thinint(irq_ptr); + if (rc) { ++ qdio_shutdown_irq(irq_ptr); + mutex_unlock(&irq_ptr->setup_mutex); +- qdio_shutdown(cdev, QDIO_FLAG_CLEANUP_USING_CLEAR); + return rc; + } + +@@ -1371,8 +1363,9 @@ int qdio_establish(struct ccw_device *cdev, + if (rc) { + DBF_ERROR("%4x est IO ERR", irq_ptr->schid.sch_no); + DBF_ERROR("rc:%4x", rc); ++ qdio_shutdown_thinint(irq_ptr); ++ qdio_shutdown_irq(irq_ptr); + mutex_unlock(&irq_ptr->setup_mutex); +- qdio_shutdown(cdev, QDIO_FLAG_CLEANUP_USING_CLEAR); + return rc; + } + +diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c +index 3083edd61f0c..8edfa0982221 100644 +--- a/drivers/s390/cio/qdio_setup.c ++++ b/drivers/s390/cio/qdio_setup.c +@@ -480,7 +480,6 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data) + } + + setup_qib(irq_ptr, init_data); +- qdio_setup_thinint(irq_ptr); + set_impl_params(irq_ptr, init_data->qib_param_field_format, + init_data->qib_param_field, + init_data->input_slib_elements, +@@ -491,6 +490,12 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data) + + /* qdr, qib, sls, slsbs, slibs, sbales are filled now */ + ++ /* set our IRQ handler */ ++ spin_lock_irq(get_ccwdev_lock(cdev)); ++ irq_ptr->orig_handler = cdev->handler; ++ cdev->handler = qdio_int_handler; ++ spin_unlock_irq(get_ccwdev_lock(cdev)); ++ + /* get qdio commands */ + ciw = ccw_device_get_ciw(cdev, CIW_TYPE_EQUEUE); + if (!ciw) { +@@ -506,12 +511,18 @@ int qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data) + } + irq_ptr->aqueue = *ciw; + +- /* set new interrupt handler */ ++ return 0; ++} ++ ++void qdio_shutdown_irq(struct qdio_irq *irq) ++{ ++ struct ccw_device *cdev = irq->cdev; ++ ++ /* restore IRQ handler */ + spin_lock_irq(get_ccwdev_lock(cdev)); +- irq_ptr->orig_handler = cdev->handler; +- cdev->handler = qdio_int_handler; ++ cdev->handler = irq->orig_handler; ++ cdev->private->intparm = 0; + spin_unlock_irq(get_ccwdev_lock(cdev)); +- return 0; + } + + void qdio_print_subchannel_info(struct qdio_irq *irq_ptr) +diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c +index ae50373617cd..0faa0ad21732 100644 +--- a/drivers/s390/cio/qdio_thinint.c ++++ b/drivers/s390/cio/qdio_thinint.c +@@ -227,17 +227,19 @@ int __init tiqdio_register_thinints(void) + + int qdio_establish_thinint(struct qdio_irq *irq_ptr) + { ++ int rc; ++ + if (!is_thinint_irq(irq_ptr)) + return 0; +- return set_subchannel_ind(irq_ptr, 0); +-} + +-void qdio_setup_thinint(struct qdio_irq *irq_ptr) +-{ +- if (!is_thinint_irq(irq_ptr)) +- return; + irq_ptr->dsci = get_indicator(); + DBF_HEX(&irq_ptr->dsci, sizeof(void *)); ++ ++ rc = set_subchannel_ind(irq_ptr, 0); ++ if (rc) ++ put_indicator(irq_ptr->dsci); ++ ++ return rc; + } + + void qdio_shutdown_thinint(struct qdio_irq *irq_ptr) +diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c +index ddb52e7ba622..9a912fd0f70b 100644 +--- a/drivers/scsi/arm/acornscsi.c ++++ b/drivers/scsi/arm/acornscsi.c +@@ -2911,8 +2911,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) + + ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); + ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); +- if (!ashost->base || !ashost->fast) ++ if (!ashost->base || !ashost->fast) { ++ ret = -ENOMEM; + goto out_put; ++ } + + host->irq = ec->irq; + ashost->host = host; +diff --git a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c +index 524cdbcd29aa..ec7d01f6e2d5 100644 +--- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c ++++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c +@@ -959,6 +959,7 @@ static int init_act_open(struct cxgbi_sock *csk) + struct net_device *ndev = cdev->ports[csk->port_id]; + struct cxgbi_hba *chba = cdev->hbas[csk->port_id]; + struct sk_buff *skb = NULL; ++ int ret; + + log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK, + "csk 0x%p,%u,0x%lx.\n", csk, csk->state, csk->flags); +@@ -979,16 +980,16 @@ static int init_act_open(struct cxgbi_sock *csk) + csk->atid = cxgb3_alloc_atid(t3dev, &t3_client, csk); + if (csk->atid < 0) { + pr_err("NO atid available.\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_sock; + } + cxgbi_sock_set_flag(csk, CTPF_HAS_ATID); + cxgbi_sock_get(csk); + + skb = alloc_wr(sizeof(struct cpl_act_open_req), 0, GFP_KERNEL); + if (!skb) { +- cxgb3_free_atid(t3dev, csk->atid); +- cxgbi_sock_put(csk); +- return -ENOMEM; ++ ret = -ENOMEM; ++ goto free_atid; + } + skb->sk = (struct sock *)csk; + set_arp_failure_handler(skb, act_open_arp_failure); +@@ -1010,6 +1011,15 @@ static int init_act_open(struct cxgbi_sock *csk) + cxgbi_sock_set_state(csk, CTP_ACTIVE_OPEN); + send_act_open_req(csk, skb, csk->l2t); + return 0; ++ ++free_atid: ++ cxgb3_free_atid(t3dev, csk->atid); ++put_sock: ++ cxgbi_sock_put(csk); ++ l2t_release(t3dev, csk->l2t); ++ csk->l2t = NULL; ++ ++ return ret; + } + + cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS] = { +diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c +index 9a6deb21fe4d..11caa4b0d797 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -898,8 +898,11 @@ void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no) + struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no]; + struct device *dev = hisi_hba->dev; + ++ dev_dbg(dev, "phy%d OOB ready\n", phy_no); ++ if (phy->phy_attached) ++ return; ++ + if (!timer_pending(&phy->timer)) { +- dev_dbg(dev, "phy%d OOB ready\n", phy_no); + phy->timer.expires = jiffies + HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ; + add_timer(&phy->timer); + } +diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c +index 59f0f1030c54..c5711c659b51 100644 +--- a/drivers/scsi/ibmvscsi/ibmvscsi.c ++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c +@@ -415,6 +415,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, + int rc = 0; + struct vio_dev *vdev = to_vio_dev(hostdata->dev); + ++ set_adapter_info(hostdata); ++ + /* Re-enable the CRQ */ + do { + if (rc) +diff --git a/drivers/scsi/iscsi_boot_sysfs.c b/drivers/scsi/iscsi_boot_sysfs.c +index e4857b728033..a64abe38db2d 100644 +--- a/drivers/scsi/iscsi_boot_sysfs.c ++++ b/drivers/scsi/iscsi_boot_sysfs.c +@@ -352,7 +352,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset, + boot_kobj->kobj.kset = boot_kset->kset; + if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype, + NULL, name, index)) { +- kfree(boot_kobj); ++ kobject_put(&boot_kobj->kobj); + return NULL; + } + boot_kobj->data = data; +diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c +index 80d1e661b0d4..35fbcb4d52eb 100644 +--- a/drivers/scsi/lpfc/lpfc_els.c ++++ b/drivers/scsi/lpfc/lpfc_els.c +@@ -8514,6 +8514,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, + spin_lock_irq(shost->host_lock); + if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { + spin_unlock_irq(shost->host_lock); ++ if (newnode) ++ lpfc_nlp_put(ndlp); + goto dropit; + } + spin_unlock_irq(shost->host_lock); +diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c +index 663782bb790d..39d233262039 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_base.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_base.c +@@ -4915,7 +4915,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc) + } + + kfree(ioc->hpr_lookup); ++ ioc->hpr_lookup = NULL; + kfree(ioc->internal_lookup); ++ ioc->internal_lookup = NULL; + if (ioc->chain_lookup) { + for (i = 0; i < ioc->scsiio_depth; i++) { + for (j = ioc->chains_per_prp_buffer; +diff --git a/drivers/scsi/qedf/qedf.h b/drivers/scsi/qedf/qedf.h +index f3f399fe10c8..0da4e16fb23a 100644 +--- a/drivers/scsi/qedf/qedf.h ++++ b/drivers/scsi/qedf/qedf.h +@@ -355,6 +355,7 @@ struct qedf_ctx { + #define QEDF_GRCDUMP_CAPTURE 4 + #define QEDF_IN_RECOVERY 5 + #define QEDF_DBG_STOP_IO 6 ++#define QEDF_PROBING 8 + unsigned long flags; /* Miscellaneous state flags */ + int fipvlan_retries; + u8 num_queues; +diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c +index 5b19f5175c5c..3a7d03472922 100644 +--- a/drivers/scsi/qedf/qedf_main.c ++++ b/drivers/scsi/qedf/qedf_main.c +@@ -3153,7 +3153,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) + { + int rc = -EINVAL; + struct fc_lport *lport; +- struct qedf_ctx *qedf; ++ struct qedf_ctx *qedf = NULL; + struct Scsi_Host *host; + bool is_vf = false; + struct qed_ll2_params params; +@@ -3183,6 +3183,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) + + /* Initialize qedf_ctx */ + qedf = lport_priv(lport); ++ set_bit(QEDF_PROBING, &qedf->flags); + qedf->lport = lport; + qedf->ctlr.lp = lport; + qedf->pdev = pdev; +@@ -3206,9 +3207,12 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) + } else { + /* Init pointers during recovery */ + qedf = pci_get_drvdata(pdev); ++ set_bit(QEDF_PROBING, &qedf->flags); + lport = qedf->lport; + } + ++ QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe started.\n"); ++ + host = lport->host; + + /* Allocate mempool for qedf_io_work structs */ +@@ -3513,6 +3517,10 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) + else + fc_fabric_login(lport); + ++ QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); ++ ++ clear_bit(QEDF_PROBING, &qedf->flags); ++ + /* All good */ + return 0; + +@@ -3538,6 +3546,11 @@ err2: + err1: + scsi_host_put(lport->host); + err0: ++ if (qedf) { ++ QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, "Probe done.\n"); ++ ++ clear_bit(QEDF_PROBING, &qedf->flags); ++ } + return rc; + } + +@@ -3687,11 +3700,25 @@ void qedf_get_protocol_tlv_data(void *dev, void *data) + { + struct qedf_ctx *qedf = dev; + struct qed_mfw_tlv_fcoe *fcoe = data; +- struct fc_lport *lport = qedf->lport; +- struct Scsi_Host *host = lport->host; +- struct fc_host_attrs *fc_host = shost_to_fc_host(host); ++ struct fc_lport *lport; ++ struct Scsi_Host *host; ++ struct fc_host_attrs *fc_host; + struct fc_host_statistics *hst; + ++ if (!qedf) { ++ QEDF_ERR(NULL, "qedf is null.\n"); ++ return; ++ } ++ ++ if (test_bit(QEDF_PROBING, &qedf->flags)) { ++ QEDF_ERR(&qedf->dbg_ctx, "Function is still probing.\n"); ++ return; ++ } ++ ++ lport = qedf->lport; ++ host = lport->host; ++ fc_host = shost_to_fc_host(host); ++ + /* Force a refresh of the fc_host stats including offload stats */ + hst = qedf_fc_get_host_stats(host); + +diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c +index 1f4a5fb00a05..366c65b295a5 100644 +--- a/drivers/scsi/qedi/qedi_iscsi.c ++++ b/drivers/scsi/qedi/qedi_iscsi.c +@@ -1001,7 +1001,8 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep) + if (qedi_ep->state == EP_STATE_OFLDCONN_START) + goto ep_exit_recover; + +- flush_work(&qedi_ep->offload_work); ++ if (qedi_ep->state != EP_STATE_OFLDCONN_NONE) ++ flush_work(&qedi_ep->offload_work); + + if (qedi_ep->conn) { + qedi_conn = qedi_ep->conn; +@@ -1218,6 +1219,10 @@ static int qedi_set_path(struct Scsi_Host *shost, struct iscsi_path *path_data) + } + + iscsi_cid = (u32)path_data->handle; ++ if (iscsi_cid >= qedi->max_active_conns) { ++ ret = -EINVAL; ++ goto set_path_exit; ++ } + qedi_ep = qedi->ep_tbl[iscsi_cid]; + QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, + "iscsi_cid=0x%x, qedi_ep=%p\n", iscsi_cid, qedi_ep); +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 1d9a4866f9a7..9179bb4caed8 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -6871,6 +6871,7 @@ qla2x00_do_dpc(void *data) + + if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE, + &base_vha->dpc_flags))) { ++ base_vha->flags.online = 1; + ql_dbg(ql_dbg_dpc, base_vha, 0x4007, + "ISP abort scheduled.\n"); + if (ha->isp_ops->abort_isp(base_vha)) { +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +index 1f0a185b2a95..bf00ae16b487 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -949,6 +949,7 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item, + + atomic_set(&tpg->lport_tpg_enabled, 0); + qlt_stop_phase1(vha->vha_tgt.qla_tgt); ++ qlt_stop_phase2(vha->vha_tgt.qla_tgt); + } + + return count; +@@ -1111,6 +1112,7 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item, + + atomic_set(&tpg->lport_tpg_enabled, 0); + qlt_stop_phase1(vha->vha_tgt.qla_tgt); ++ qlt_stop_phase2(vha->vha_tgt.qla_tgt); + } + + return count; +diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c +index 978be1602f71..927b1e641842 100644 +--- a/drivers/scsi/scsi_error.c ++++ b/drivers/scsi/scsi_error.c +@@ -1412,6 +1412,7 @@ static int scsi_eh_stu(struct Scsi_Host *shost, + sdev_printk(KERN_INFO, sdev, + "%s: skip START_UNIT, past eh deadline\n", + current->comm)); ++ scsi_device_put(sdev); + break; + } + stu_scmd = NULL; +@@ -1478,6 +1479,7 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost, + sdev_printk(KERN_INFO, sdev, + "%s: skip BDR, past eh deadline\n", + current->comm)); ++ scsi_device_put(sdev); + break; + } + bdr_scmd = NULL; +diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index 06c260f6cdae..b8b4366f1200 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -548,7 +548,7 @@ static void scsi_uninit_cmd(struct scsi_cmnd *cmd) + } + } + +-static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd) ++static void scsi_free_sgtables(struct scsi_cmnd *cmd) + { + if (cmd->sdb.table.nents) + sg_free_table_chained(&cmd->sdb.table, +@@ -560,7 +560,7 @@ static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd) + + static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd) + { +- scsi_mq_free_sgtables(cmd); ++ scsi_free_sgtables(cmd); + scsi_uninit_cmd(cmd); + } + +@@ -1059,7 +1059,7 @@ blk_status_t scsi_init_io(struct scsi_cmnd *cmd) + + return BLK_STS_OK; + out_free_sgtables: +- scsi_mq_free_sgtables(cmd); ++ scsi_free_sgtables(cmd); + return ret; + } + EXPORT_SYMBOL(scsi_init_io); +@@ -1190,6 +1190,7 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev, + struct request *req) + { + struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); ++ blk_status_t ret; + + if (!blk_rq_bytes(req)) + cmd->sc_data_direction = DMA_NONE; +@@ -1199,9 +1200,14 @@ static blk_status_t scsi_setup_cmnd(struct scsi_device *sdev, + cmd->sc_data_direction = DMA_FROM_DEVICE; + + if (blk_rq_is_scsi(req)) +- return scsi_setup_scsi_cmnd(sdev, req); ++ ret = scsi_setup_scsi_cmnd(sdev, req); + else +- return scsi_setup_fs_cmnd(sdev, req); ++ ret = scsi_setup_fs_cmnd(sdev, req); ++ ++ if (ret != BLK_STS_OK) ++ scsi_free_sgtables(cmd); ++ ++ return ret; + } + + static blk_status_t +@@ -2859,8 +2865,10 @@ scsi_host_unblock(struct Scsi_Host *shost, int new_state) + + shost_for_each_device(sdev, shost) { + ret = scsi_internal_device_unblock(sdev, new_state); +- if (ret) ++ if (ret) { ++ scsi_device_put(sdev); + break; ++ } + } + return ret; + } +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index b2a803c51288..ea6d498fa923 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -1616,6 +1616,12 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, + static struct sock *nls; + static DEFINE_MUTEX(rx_queue_mutex); + ++/* ++ * conn_mutex protects the {start,bind,stop,destroy}_conn from racing ++ * against the kernel stop_connection recovery mechanism ++ */ ++static DEFINE_MUTEX(conn_mutex); ++ + static LIST_HEAD(sesslist); + static LIST_HEAD(sessdestroylist); + static DEFINE_SPINLOCK(sesslock); +@@ -2445,6 +2451,32 @@ int iscsi_offload_mesg(struct Scsi_Host *shost, + } + EXPORT_SYMBOL_GPL(iscsi_offload_mesg); + ++/* ++ * This can be called without the rx_queue_mutex, if invoked by the kernel ++ * stop work. But, in that case, it is guaranteed not to race with ++ * iscsi_destroy by conn_mutex. ++ */ ++static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag) ++{ ++ /* ++ * It is important that this path doesn't rely on ++ * rx_queue_mutex, otherwise, a thread doing allocation on a ++ * start_session/start_connection could sleep waiting on a ++ * writeback to a failed iscsi device, that cannot be recovered ++ * because the lock is held. If we don't hold it here, the ++ * kernel stop_conn_work_fn has a chance to stop the broken ++ * session and resolve the allocation. ++ * ++ * Still, the user invoked .stop_conn() needs to be serialized ++ * with stop_conn_work_fn by a private mutex. Not pretty, but ++ * it works. ++ */ ++ mutex_lock(&conn_mutex); ++ conn->transport->stop_conn(conn, flag); ++ mutex_unlock(&conn_mutex); ++ ++} ++ + static void stop_conn_work_fn(struct work_struct *work) + { + struct iscsi_cls_conn *conn, *tmp; +@@ -2463,30 +2495,17 @@ static void stop_conn_work_fn(struct work_struct *work) + uint32_t sid = iscsi_conn_get_sid(conn); + struct iscsi_cls_session *session; + +- mutex_lock(&rx_queue_mutex); +- + session = iscsi_session_lookup(sid); + if (session) { + if (system_state != SYSTEM_RUNNING) { + session->recovery_tmo = 0; +- conn->transport->stop_conn(conn, +- STOP_CONN_TERM); ++ iscsi_if_stop_conn(conn, STOP_CONN_TERM); + } else { +- conn->transport->stop_conn(conn, +- STOP_CONN_RECOVER); ++ iscsi_if_stop_conn(conn, STOP_CONN_RECOVER); + } + } + + list_del_init(&conn->conn_list_err); +- +- mutex_unlock(&rx_queue_mutex); +- +- /* we don't want to hold rx_queue_mutex for too long, +- * for instance if many conns failed at the same time, +- * since this stall other iscsi maintenance operations. +- * Give other users a chance to proceed. +- */ +- cond_resched(); + } + } + +@@ -2846,8 +2865,11 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev + spin_unlock_irqrestore(&connlock, flags); + + ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n"); ++ ++ mutex_lock(&conn_mutex); + if (transport->destroy_conn) + transport->destroy_conn(conn); ++ mutex_unlock(&conn_mutex); + + return 0; + } +@@ -3689,9 +3711,12 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) + break; + } + ++ mutex_lock(&conn_mutex); + ev->r.retcode = transport->bind_conn(session, conn, + ev->u.b_conn.transport_eph, + ev->u.b_conn.is_leading); ++ mutex_unlock(&conn_mutex); ++ + if (ev->r.retcode || !transport->ep_connect) + break; + +@@ -3713,9 +3738,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) + case ISCSI_UEVENT_START_CONN: + conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid); + if (conn) { ++ mutex_lock(&conn_mutex); + ev->r.retcode = transport->start_conn(conn); + if (!ev->r.retcode) + conn->state = ISCSI_CONN_UP; ++ mutex_unlock(&conn_mutex); + } + else + err = -EINVAL; +@@ -3723,17 +3750,20 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) + case ISCSI_UEVENT_STOP_CONN: + conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid); + if (conn) +- transport->stop_conn(conn, ev->u.stop_conn.flag); ++ iscsi_if_stop_conn(conn, ev->u.stop_conn.flag); + else + err = -EINVAL; + break; + case ISCSI_UEVENT_SEND_PDU: + conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid); +- if (conn) ++ if (conn) { ++ mutex_lock(&conn_mutex); + ev->r.retcode = transport->send_pdu(conn, + (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), + (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size, + ev->u.send_pdu.data_size); ++ mutex_unlock(&conn_mutex); ++ } + else + err = -EINVAL; + break; +diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c +index d2fe3fa470f9..1e13c6a0f0ca 100644 +--- a/drivers/scsi/sr.c ++++ b/drivers/scsi/sr.c +@@ -797,7 +797,7 @@ static int sr_probe(struct device *dev) + cd->cdi.disk = disk; + + if (register_cdrom(&cd->cdi)) +- goto fail_put; ++ goto fail_minor; + + /* + * Initialize block layer runtime PM stuffs before the +@@ -815,8 +815,13 @@ static int sr_probe(struct device *dev) + + return 0; + ++fail_minor: ++ spin_lock(&sr_index_lock); ++ clear_bit(minor, sr_index_bits); ++ spin_unlock(&sr_index_lock); + fail_put: + put_disk(disk); ++ mutex_destroy(&cd->lock); + fail_free: + kfree(cd); + fail: +diff --git a/drivers/scsi/ufs/ti-j721e-ufs.c b/drivers/scsi/ufs/ti-j721e-ufs.c +index 5216d228cdd9..46bb905b4d6a 100644 +--- a/drivers/scsi/ufs/ti-j721e-ufs.c ++++ b/drivers/scsi/ufs/ti-j721e-ufs.c +@@ -32,14 +32,14 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev) + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + pm_runtime_put_noidle(dev); +- return ret; ++ goto disable_pm; + } + + /* Select MPHY refclk frequency */ + clk = devm_clk_get(dev, NULL); + if (IS_ERR(clk)) { + dev_err(dev, "Cannot claim MPHY clock.\n"); +- return PTR_ERR(clk); ++ goto clk_err; + } + clk_rate = clk_get_rate(clk); + if (clk_rate == 26000000) +@@ -54,16 +54,23 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev) + dev); + if (ret) { + dev_err(dev, "failed to populate child nodes %d\n", ret); +- pm_runtime_put_sync(dev); ++ goto clk_err; + } + + return ret; ++ ++clk_err: ++ pm_runtime_put_sync(dev); ++disable_pm: ++ pm_runtime_disable(dev); ++ return ret; + } + + static int ti_j721e_ufs_remove(struct platform_device *pdev) + { + of_platform_depopulate(&pdev->dev); + pm_runtime_put_sync(&pdev->dev); ++ pm_runtime_disable(&pdev->dev); + + return 0; + } +diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c +index 19aa5c44e0da..f938867301a0 100644 +--- a/drivers/scsi/ufs/ufs-qcom.c ++++ b/drivers/scsi/ufs/ufs-qcom.c +@@ -1658,11 +1658,11 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba) + + /* sleep a bit intermittently as we are dumping too much data */ + ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper); +- usleep_range(1000, 1100); ++ udelay(1000); + ufs_qcom_testbus_read(hba); +- usleep_range(1000, 1100); ++ udelay(1000); + ufs_qcom_print_unipro_testbus(hba); +- usleep_range(1000, 1100); ++ udelay(1000); + } + + /** +diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c +index 53dd87628cbe..516a7f573942 100644 +--- a/drivers/scsi/ufs/ufs_bsg.c ++++ b/drivers/scsi/ufs/ufs_bsg.c +@@ -106,8 +106,10 @@ static int ufs_bsg_request(struct bsg_job *job) + desc_op = bsg_request->upiu_req.qr.opcode; + ret = ufs_bsg_alloc_desc_buffer(hba, job, &desc_buff, + &desc_len, desc_op); +- if (ret) ++ if (ret) { ++ pm_runtime_put_sync(hba->dev); + goto out; ++ } + + /* fall through */ + case UPIU_TRANSACTION_NOP_OUT: +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 698e8d20b4ba..52740b60d786 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -5098,7 +5098,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, + err = ufshcd_enable_auto_bkops(hba); + else + err = ufshcd_disable_auto_bkops(hba); +- hba->urgent_bkops_lvl = curr_status; + out: + return err; + } +diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c +index fc2575fef51b..7426b5884218 100644 +--- a/drivers/slimbus/qcom-ngd-ctrl.c ++++ b/drivers/slimbus/qcom-ngd-ctrl.c +@@ -1361,7 +1361,6 @@ static int of_qcom_slim_ngd_register(struct device *parent, + ngd->pdev->driver_override = QCOM_SLIM_NGD_DRV_NAME; + ngd->pdev->dev.of_node = node; + ctrl->ngd = ngd; +- platform_set_drvdata(ngd->pdev, ctrl); + + platform_device_add(ngd->pdev); + ngd->base = ctrl->base + ngd->id * data->offset + +@@ -1376,12 +1375,13 @@ static int of_qcom_slim_ngd_register(struct device *parent, + + static int qcom_slim_ngd_probe(struct platform_device *pdev) + { +- struct qcom_slim_ngd_ctrl *ctrl = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; ++ struct qcom_slim_ngd_ctrl *ctrl = dev_get_drvdata(dev->parent); + int ret; + + ctrl->ctrl.dev = dev; + ++ platform_set_drvdata(pdev, ctrl); + pm_runtime_use_autosuspend(dev); + pm_runtime_set_autosuspend_delay(dev, QCOM_SLIM_NGD_AUTOSUSPEND); + pm_runtime_set_suspended(dev); +diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c +index aace57fae7f8..4bacdb187eab 100644 +--- a/drivers/soundwire/slave.c ++++ b/drivers/soundwire/slave.c +@@ -68,6 +68,8 @@ static int sdw_slave_add(struct sdw_bus *bus, + list_del(&slave->node); + mutex_unlock(&bus->bus_lock); + put_device(&slave->dev); ++ ++ return ret; + } + sdw_slave_debugfs_init(slave); + +diff --git a/drivers/staging/gasket/gasket_sysfs.c b/drivers/staging/gasket/gasket_sysfs.c +index 5f0e089573a2..af26bc9f184a 100644 +--- a/drivers/staging/gasket/gasket_sysfs.c ++++ b/drivers/staging/gasket/gasket_sysfs.c +@@ -339,6 +339,7 @@ void gasket_sysfs_put_attr(struct device *device, + + dev_err(device, "Unable to put unknown attribute: %s\n", + attr->attr.attr.name); ++ put_mapping(mapping); + } + EXPORT_SYMBOL(gasket_sysfs_put_attr); + +@@ -372,6 +373,7 @@ ssize_t gasket_sysfs_register_store(struct device *device, + gasket_dev = mapping->gasket_dev; + if (!gasket_dev) { + dev_err(device, "Device driver may have been removed\n"); ++ put_mapping(mapping); + return 0; + } + +diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c +index d6ba25f21d80..d2672b65c3f4 100644 +--- a/drivers/staging/greybus/light.c ++++ b/drivers/staging/greybus/light.c +@@ -1026,7 +1026,8 @@ static int gb_lights_light_config(struct gb_lights *glights, u8 id) + + light->channels_count = conf.channel_count; + light->name = kstrndup(conf.name, NAMES_MAX, GFP_KERNEL); +- ++ if (!light->name) ++ return -ENOMEM; + light->channels = kcalloc(light->channels_count, + sizeof(struct gb_channel), GFP_KERNEL); + if (!light->channels) +diff --git a/drivers/staging/mt7621-dts/mt7621.dtsi b/drivers/staging/mt7621-dts/mt7621.dtsi +index 9e5cf68731bb..82aa93634eda 100644 +--- a/drivers/staging/mt7621-dts/mt7621.dtsi ++++ b/drivers/staging/mt7621-dts/mt7621.dtsi +@@ -523,11 +523,10 @@ + 0x01000000 0 0x00000000 0x1e160000 0 0x00010000 /* io space */ + >; + +- #interrupt-cells = <1>; +- interrupt-map-mask = <0xF0000 0 0 1>; +- interrupt-map = <0x10000 0 0 1 &gic GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH>, +- <0x20000 0 0 1 &gic GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH>, +- <0x30000 0 0 1 &gic GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-parent = <&gic>; ++ interrupts = <GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH ++ GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH ++ GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>; + + status = "disabled"; + +diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c +index b9d460a9c041..36207243a71b 100644 +--- a/drivers/staging/mt7621-pci/pci-mt7621.c ++++ b/drivers/staging/mt7621-pci/pci-mt7621.c +@@ -97,6 +97,7 @@ + * @pcie_rst: pointer to port reset control + * @gpio_rst: gpio reset + * @slot: port slot ++ * @irq: GIC irq + * @enabled: indicates if port is enabled + */ + struct mt7621_pcie_port { +@@ -107,6 +108,7 @@ struct mt7621_pcie_port { + struct reset_control *pcie_rst; + struct gpio_desc *gpio_rst; + u32 slot; ++ int irq; + bool enabled; + }; + +@@ -120,6 +122,7 @@ struct mt7621_pcie_port { + * @dev: Pointer to PCIe device + * @io_map_base: virtual memory base address for io + * @ports: pointer to PCIe port information ++ * @irq_map: irq mapping info according pcie link status + * @resets_inverted: depends on chip revision + * reset lines are inverted. + */ +@@ -135,6 +138,7 @@ struct mt7621_pcie { + } offset; + unsigned long io_map_base; + struct list_head ports; ++ int irq_map[PCIE_P2P_MAX]; + bool resets_inverted; + }; + +@@ -279,6 +283,16 @@ static void setup_cm_memory_region(struct mt7621_pcie *pcie) + } + } + ++static int mt7621_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin) ++{ ++ struct mt7621_pcie *pcie = pdev->bus->sysdata; ++ struct device *dev = pcie->dev; ++ int irq = pcie->irq_map[slot]; ++ ++ dev_info(dev, "bus=%d slot=%d irq=%d\n", pdev->bus->number, slot, irq); ++ return irq; ++} ++ + static int mt7621_pci_parse_request_of_pci_ranges(struct mt7621_pcie *pcie) + { + struct device *dev = pcie->dev; +@@ -330,6 +344,7 @@ static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie, + { + struct mt7621_pcie_port *port; + struct device *dev = pcie->dev; ++ struct platform_device *pdev = to_platform_device(dev); + struct device_node *pnode = dev->of_node; + struct resource regs; + char name[10]; +@@ -371,6 +386,12 @@ static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie, + port->slot = slot; + port->pcie = pcie; + ++ port->irq = platform_get_irq(pdev, slot); ++ if (port->irq < 0) { ++ dev_err(dev, "Failed to get IRQ for PCIe%d\n", slot); ++ return -ENXIO; ++ } ++ + INIT_LIST_HEAD(&port->list); + list_add_tail(&port->list, &pcie->ports); + +@@ -585,13 +606,15 @@ static int mt7621_pcie_init_virtual_bridges(struct mt7621_pcie *pcie) + { + u32 pcie_link_status = 0; + u32 n; +- int i; ++ int i = 0; + u32 p2p_br_devnum[PCIE_P2P_MAX]; ++ int irqs[PCIE_P2P_MAX]; + struct mt7621_pcie_port *port; + + list_for_each_entry(port, &pcie->ports, list) { + u32 slot = port->slot; + ++ irqs[i++] = port->irq; + if (port->enabled) + pcie_link_status |= BIT(slot); + } +@@ -614,6 +637,15 @@ static int mt7621_pcie_init_virtual_bridges(struct mt7621_pcie *pcie) + (p2p_br_devnum[1] << PCIE_P2P_BR_DEVNUM1_SHIFT) | + (p2p_br_devnum[2] << PCIE_P2P_BR_DEVNUM2_SHIFT)); + ++ /* Assign IRQs */ ++ n = 0; ++ for (i = 0; i < PCIE_P2P_MAX; i++) ++ if (pcie_link_status & BIT(i)) ++ pcie->irq_map[n++] = irqs[i]; ++ ++ for (i = n; i < PCIE_P2P_MAX; i++) ++ pcie->irq_map[i] = -1; ++ + return 0; + } + +@@ -638,7 +670,7 @@ static int mt7621_pcie_register_host(struct pci_host_bridge *host, + host->busnr = pcie->busn.start; + host->dev.parent = pcie->dev; + host->ops = &mt7621_pci_ops; +- host->map_irq = of_irq_parse_and_map_pci; ++ host->map_irq = mt7621_map_irq; + host->swizzle_irq = pci_common_swizzle; + host->sysdata = pcie; + +diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c +index 59568d18ce23..5b72aa81d94c 100644 +--- a/drivers/staging/sm750fb/sm750.c ++++ b/drivers/staging/sm750fb/sm750.c +@@ -898,6 +898,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index) + fix->visual = FB_VISUAL_PSEUDOCOLOR; + break; + case 16: ++ case 24: + case 32: + fix->visual = FB_VISUAL_TRUECOLOR; + break; +diff --git a/drivers/staging/wfx/bus_sdio.c b/drivers/staging/wfx/bus_sdio.c +index dedc3ff58d3e..c2e4bd1e3b0a 100644 +--- a/drivers/staging/wfx/bus_sdio.c ++++ b/drivers/staging/wfx/bus_sdio.c +@@ -156,7 +156,13 @@ static const struct hwbus_ops wfx_sdio_hwbus_ops = { + .align_size = wfx_sdio_align_size, + }; + +-static const struct of_device_id wfx_sdio_of_match[]; ++static const struct of_device_id wfx_sdio_of_match[] = { ++ { .compatible = "silabs,wfx-sdio" }, ++ { .compatible = "silabs,wf200" }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, wfx_sdio_of_match); ++ + static int wfx_sdio_probe(struct sdio_func *func, + const struct sdio_device_id *id) + { +@@ -248,15 +254,6 @@ static const struct sdio_device_id wfx_sdio_ids[] = { + }; + MODULE_DEVICE_TABLE(sdio, wfx_sdio_ids); + +-#ifdef CONFIG_OF +-static const struct of_device_id wfx_sdio_of_match[] = { +- { .compatible = "silabs,wfx-sdio" }, +- { .compatible = "silabs,wf200" }, +- { }, +-}; +-MODULE_DEVICE_TABLE(of, wfx_sdio_of_match); +-#endif +- + struct sdio_driver wfx_sdio_driver = { + .name = "wfx-sdio", + .id_table = wfx_sdio_ids, +@@ -264,6 +261,6 @@ struct sdio_driver wfx_sdio_driver = { + .remove = wfx_sdio_remove, + .drv = { + .owner = THIS_MODULE, +- .of_match_table = of_match_ptr(wfx_sdio_of_match), ++ .of_match_table = wfx_sdio_of_match, + } + }; +diff --git a/drivers/staging/wfx/debug.c b/drivers/staging/wfx/debug.c +index 1164aba118a1..a73b5bbb578e 100644 +--- a/drivers/staging/wfx/debug.c ++++ b/drivers/staging/wfx/debug.c +@@ -142,7 +142,7 @@ static int wfx_rx_stats_show(struct seq_file *seq, void *v) + mutex_lock(&wdev->rx_stats_lock); + seq_printf(seq, "Timestamp: %dus\n", st->date); + seq_printf(seq, "Low power clock: frequency %uHz, external %s\n", +- st->pwr_clk_freq, ++ le32_to_cpu(st->pwr_clk_freq), + st->is_ext_pwr_clk ? "yes" : "no"); + seq_printf(seq, + "Num. of frames: %d, PER (x10e4): %d, Throughput: %dKbps/s\n", +@@ -152,9 +152,12 @@ static int wfx_rx_stats_show(struct seq_file *seq, void *v) + for (i = 0; i < ARRAY_SIZE(channel_names); i++) { + if (channel_names[i]) + seq_printf(seq, "%5s %8d %8d %8d %8d %8d\n", +- channel_names[i], st->nb_rx_by_rate[i], +- st->per[i], st->rssi[i] / 100, +- st->snr[i] / 100, st->cfo[i]); ++ channel_names[i], ++ le32_to_cpu(st->nb_rx_by_rate[i]), ++ le16_to_cpu(st->per[i]), ++ (s16)le16_to_cpu(st->rssi[i]) / 100, ++ (s16)le16_to_cpu(st->snr[i]) / 100, ++ (s16)le16_to_cpu(st->cfo[i])); + } + mutex_unlock(&wdev->rx_stats_lock); + +diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c +index 77bca43aca42..20b3045d7667 100644 +--- a/drivers/staging/wfx/hif_tx.c ++++ b/drivers/staging/wfx/hif_tx.c +@@ -268,7 +268,7 @@ int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req, + tmo_chan_bg = le32_to_cpu(body->max_channel_time) * USEC_PER_TU; + tmo_chan_fg = 512 * USEC_PER_TU + body->probe_delay; + tmo_chan_fg *= body->num_of_probe_requests; +- tmo = chan_num * max(tmo_chan_bg, tmo_chan_fg); ++ tmo = chan_num * max(tmo_chan_bg, tmo_chan_fg) + 512 * USEC_PER_TU; + + wfx_fill_header(hif, wvif->id, HIF_REQ_ID_START_SCAN, buf_len); + ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false); +diff --git a/drivers/staging/wfx/queue.c b/drivers/staging/wfx/queue.c +index 39d9127ce4b9..8ae23681e29b 100644 +--- a/drivers/staging/wfx/queue.c ++++ b/drivers/staging/wfx/queue.c +@@ -35,6 +35,7 @@ void wfx_tx_flush(struct wfx_dev *wdev) + if (wdev->chip_frozen) + return; + ++ wfx_tx_lock(wdev); + mutex_lock(&wdev->hif_cmd.lock); + ret = wait_event_timeout(wdev->hif.tx_buffers_empty, + !wdev->hif.tx_buffers_used, +@@ -47,6 +48,7 @@ void wfx_tx_flush(struct wfx_dev *wdev) + wdev->chip_frozen = 1; + } + mutex_unlock(&wdev->hif_cmd.lock); ++ wfx_tx_unlock(wdev); + } + + void wfx_tx_lock_flush(struct wfx_dev *wdev) +diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c +index 9d430346a58b..b4cd7cb1ce56 100644 +--- a/drivers/staging/wfx/sta.c ++++ b/drivers/staging/wfx/sta.c +@@ -520,7 +520,9 @@ static void wfx_do_join(struct wfx_vif *wvif) + ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); + if (ssidie) { + ssidlen = ssidie[1]; +- memcpy(ssid, &ssidie[2], ssidie[1]); ++ if (ssidlen > IEEE80211_MAX_SSID_LEN) ++ ssidlen = IEEE80211_MAX_SSID_LEN; ++ memcpy(ssid, &ssidie[2], ssidlen); + } + rcu_read_unlock(); + +@@ -1047,7 +1049,6 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) + init_completion(&wvif->scan_complete); + INIT_WORK(&wvif->scan_work, wfx_hw_scan_work); + +- INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work); + mutex_unlock(&wdev->conf_mutex); + + hif_set_macaddr(wvif, vif->addr); +diff --git a/drivers/staging/wfx/sta.h b/drivers/staging/wfx/sta.h +index cf99a8a74a81..ace845f9ed14 100644 +--- a/drivers/staging/wfx/sta.h ++++ b/drivers/staging/wfx/sta.h +@@ -37,7 +37,7 @@ struct wfx_grp_addr_table { + struct wfx_sta_priv { + int link_id; + int vif_id; +- u8 buffered[IEEE80211_NUM_TIDS]; ++ int buffered[IEEE80211_NUM_TIDS]; + // Ensure atomicity of "buffered" and calls to ieee80211_sta_set_buffered() + spinlock_t lock; + }; +diff --git a/drivers/staging/wilc1000/hif.c b/drivers/staging/wilc1000/hif.c +index 6c7de2f8d3f2..d025a3093015 100644 +--- a/drivers/staging/wilc1000/hif.c ++++ b/drivers/staging/wilc1000/hif.c +@@ -11,6 +11,8 @@ + + #define WILC_FALSE_FRMWR_CHANNEL 100 + ++#define WILC_SCAN_WID_LIST_SIZE 6 ++ + struct wilc_rcvd_mac_info { + u8 status; + }; +@@ -151,7 +153,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 scan_type, + void *user_arg, struct cfg80211_scan_request *request) + { + int result = 0; +- struct wid wid_list[5]; ++ struct wid wid_list[WILC_SCAN_WID_LIST_SIZE]; + u32 index = 0; + u32 i, scan_timeout; + u8 *buffer; +diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c +index 3305b47fdf53..16d5a4e117a2 100644 +--- a/drivers/target/loopback/tcm_loop.c ++++ b/drivers/target/loopback/tcm_loop.c +@@ -545,32 +545,15 @@ static int tcm_loop_write_pending(struct se_cmd *se_cmd) + return 0; + } + +-static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) ++static int tcm_loop_queue_data_or_status(const char *func, ++ struct se_cmd *se_cmd, u8 scsi_status) + { + struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, + struct tcm_loop_cmd, tl_se_cmd); + struct scsi_cmnd *sc = tl_cmd->sc; + + pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n", +- __func__, sc, sc->cmnd[0]); +- +- sc->result = SAM_STAT_GOOD; +- set_host_byte(sc, DID_OK); +- if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || +- (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) +- scsi_set_resid(sc, se_cmd->residual_count); +- sc->scsi_done(sc); +- return 0; +-} +- +-static int tcm_loop_queue_status(struct se_cmd *se_cmd) +-{ +- struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, +- struct tcm_loop_cmd, tl_se_cmd); +- struct scsi_cmnd *sc = tl_cmd->sc; +- +- pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n", +- __func__, sc, sc->cmnd[0]); ++ func, sc, sc->cmnd[0]); + + if (se_cmd->sense_buffer && + ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || +@@ -581,7 +564,7 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd) + sc->result = SAM_STAT_CHECK_CONDITION; + set_driver_byte(sc, DRIVER_SENSE); + } else +- sc->result = se_cmd->scsi_status; ++ sc->result = scsi_status; + + set_host_byte(sc, DID_OK); + if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || +@@ -591,6 +574,17 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd) + return 0; + } + ++static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) ++{ ++ return tcm_loop_queue_data_or_status(__func__, se_cmd, SAM_STAT_GOOD); ++} ++ ++static int tcm_loop_queue_status(struct se_cmd *se_cmd) ++{ ++ return tcm_loop_queue_data_or_status(__func__, ++ se_cmd, se_cmd->scsi_status); ++} ++ + static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd) + { + struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, +diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c +index f769bb1e3735..b63a1e0c4aa6 100644 +--- a/drivers/target/target_core_user.c ++++ b/drivers/target/target_core_user.c +@@ -882,41 +882,24 @@ static inline size_t tcmu_cmd_get_cmd_size(struct tcmu_cmd *tcmu_cmd, + return command_size; + } + +-static int tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo, +- struct timer_list *timer) ++static void tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo, ++ struct timer_list *timer) + { +- struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; +- int cmd_id; +- +- if (tcmu_cmd->cmd_id) +- goto setup_timer; +- +- cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT); +- if (cmd_id < 0) { +- pr_err("tcmu: Could not allocate cmd id.\n"); +- return cmd_id; +- } +- tcmu_cmd->cmd_id = cmd_id; +- +- pr_debug("allocated cmd %u for dev %s tmo %lu\n", tcmu_cmd->cmd_id, +- udev->name, tmo / MSEC_PER_SEC); +- +-setup_timer: + if (!tmo) +- return 0; ++ return; + + tcmu_cmd->deadline = round_jiffies_up(jiffies + msecs_to_jiffies(tmo)); + if (!timer_pending(timer)) + mod_timer(timer, tcmu_cmd->deadline); + +- return 0; ++ pr_debug("Timeout set up for cmd %p, dev = %s, tmo = %lu\n", tcmu_cmd, ++ tcmu_cmd->tcmu_dev->name, tmo / MSEC_PER_SEC); + } + + static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) + { + struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; + unsigned int tmo; +- int ret; + + /* + * For backwards compat if qfull_time_out is not set use +@@ -931,13 +914,11 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) + else + tmo = TCMU_TIME_OUT; + +- ret = tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer); +- if (ret) +- return ret; ++ tcmu_setup_cmd_timer(tcmu_cmd, tmo, &udev->qfull_timer); + + list_add_tail(&tcmu_cmd->queue_entry, &udev->qfull_queue); +- pr_debug("adding cmd %u on dev %s to ring space wait queue\n", +- tcmu_cmd->cmd_id, udev->name); ++ pr_debug("adding cmd %p on dev %s to ring space wait queue\n", ++ tcmu_cmd, udev->name); + return 0; + } + +@@ -959,7 +940,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) + struct tcmu_mailbox *mb; + struct tcmu_cmd_entry *entry; + struct iovec *iov; +- int iov_cnt, ret; ++ int iov_cnt, cmd_id; + uint32_t cmd_head; + uint64_t cdb_off; + bool copy_to_data_area; +@@ -1060,14 +1041,21 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) + } + entry->req.iov_bidi_cnt = iov_cnt; + +- ret = tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, +- &udev->cmd_timer); +- if (ret) { +- tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt); ++ cmd_id = idr_alloc(&udev->commands, tcmu_cmd, 1, USHRT_MAX, GFP_NOWAIT); ++ if (cmd_id < 0) { ++ pr_err("tcmu: Could not allocate cmd id.\n"); + ++ tcmu_cmd_free_data(tcmu_cmd, tcmu_cmd->dbi_cnt); + *scsi_err = TCM_OUT_OF_RESOURCES; + return -1; + } ++ tcmu_cmd->cmd_id = cmd_id; ++ ++ pr_debug("allocated cmd id %u for cmd %p dev %s\n", tcmu_cmd->cmd_id, ++ tcmu_cmd, udev->name); ++ ++ tcmu_setup_cmd_timer(tcmu_cmd, udev->cmd_time_out, &udev->cmd_timer); ++ + entry->hdr.cmd_id = tcmu_cmd->cmd_id; + + /* +@@ -1279,50 +1267,39 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) + return handled; + } + +-static int tcmu_check_expired_cmd(int id, void *p, void *data) ++static void tcmu_check_expired_ring_cmd(struct tcmu_cmd *cmd) + { +- struct tcmu_cmd *cmd = p; +- struct tcmu_dev *udev = cmd->tcmu_dev; +- u8 scsi_status; + struct se_cmd *se_cmd; +- bool is_running; +- +- if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) +- return 0; + + if (!time_after(jiffies, cmd->deadline)) +- return 0; ++ return; + +- is_running = test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags); ++ set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); ++ list_del_init(&cmd->queue_entry); + se_cmd = cmd->se_cmd; ++ cmd->se_cmd = NULL; + +- if (is_running) { +- /* +- * If cmd_time_out is disabled but qfull is set deadline +- * will only reflect the qfull timeout. Ignore it. +- */ +- if (!udev->cmd_time_out) +- return 0; ++ pr_debug("Timing out inflight cmd %u on dev %s.\n", ++ cmd->cmd_id, cmd->tcmu_dev->name); + +- set_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags); +- /* +- * target_complete_cmd will translate this to LUN COMM FAILURE +- */ +- scsi_status = SAM_STAT_CHECK_CONDITION; +- list_del_init(&cmd->queue_entry); +- cmd->se_cmd = NULL; +- } else { +- list_del_init(&cmd->queue_entry); +- idr_remove(&udev->commands, id); +- tcmu_free_cmd(cmd); +- scsi_status = SAM_STAT_TASK_SET_FULL; +- } ++ target_complete_cmd(se_cmd, SAM_STAT_CHECK_CONDITION); ++} + +- pr_debug("Timing out cmd %u on dev %s that is %s.\n", +- id, udev->name, is_running ? "inflight" : "queued"); ++static void tcmu_check_expired_queue_cmd(struct tcmu_cmd *cmd) ++{ ++ struct se_cmd *se_cmd; + +- target_complete_cmd(se_cmd, scsi_status); +- return 0; ++ if (!time_after(jiffies, cmd->deadline)) ++ return; ++ ++ pr_debug("Timing out queued cmd %p on dev %s.\n", ++ cmd, cmd->tcmu_dev->name); ++ ++ list_del_init(&cmd->queue_entry); ++ se_cmd = cmd->se_cmd; ++ tcmu_free_cmd(cmd); ++ ++ target_complete_cmd(se_cmd, SAM_STAT_TASK_SET_FULL); + } + + static void tcmu_device_timedout(struct tcmu_dev *udev) +@@ -1407,16 +1384,15 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name) + return &udev->se_dev; + } + +-static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) ++static void run_qfull_queue(struct tcmu_dev *udev, bool fail) + { + struct tcmu_cmd *tcmu_cmd, *tmp_cmd; + LIST_HEAD(cmds); +- bool drained = true; + sense_reason_t scsi_ret; + int ret; + + if (list_empty(&udev->qfull_queue)) +- return true; ++ return; + + pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail); + +@@ -1425,11 +1401,10 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) + list_for_each_entry_safe(tcmu_cmd, tmp_cmd, &cmds, queue_entry) { + list_del_init(&tcmu_cmd->queue_entry); + +- pr_debug("removing cmd %u on dev %s from queue\n", +- tcmu_cmd->cmd_id, udev->name); ++ pr_debug("removing cmd %p on dev %s from queue\n", ++ tcmu_cmd, udev->name); + + if (fail) { +- idr_remove(&udev->commands, tcmu_cmd->cmd_id); + /* + * We were not able to even start the command, so + * fail with busy to allow a retry in case runner +@@ -1444,10 +1419,8 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) + + ret = queue_cmd_ring(tcmu_cmd, &scsi_ret); + if (ret < 0) { +- pr_debug("cmd %u on dev %s failed with %u\n", +- tcmu_cmd->cmd_id, udev->name, scsi_ret); +- +- idr_remove(&udev->commands, tcmu_cmd->cmd_id); ++ pr_debug("cmd %p on dev %s failed with %u\n", ++ tcmu_cmd, udev->name, scsi_ret); + /* + * Ignore scsi_ret for now. target_complete_cmd + * drops it. +@@ -1462,13 +1435,11 @@ static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) + * the queue + */ + list_splice_tail(&cmds, &udev->qfull_queue); +- drained = false; + break; + } + } + + tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); +- return drained; + } + + static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on) +@@ -1652,6 +1623,8 @@ static void tcmu_dev_kref_release(struct kref *kref) + if (tcmu_check_and_free_pending_cmd(cmd) != 0) + all_expired = false; + } ++ if (!list_empty(&udev->qfull_queue)) ++ all_expired = false; + idr_destroy(&udev->commands); + WARN_ON(!all_expired); + +@@ -2037,9 +2010,6 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) + mutex_lock(&udev->cmdr_lock); + + idr_for_each_entry(&udev->commands, cmd, i) { +- if (!test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags)) +- continue; +- + pr_debug("removing cmd %u on dev %s from ring (is expired %d)\n", + cmd->cmd_id, udev->name, + test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)); +@@ -2077,6 +2047,8 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) + + del_timer(&udev->cmd_timer); + ++ run_qfull_queue(udev, false); ++ + mutex_unlock(&udev->cmdr_lock); + } + +@@ -2698,6 +2670,7 @@ static void find_free_blocks(void) + static void check_timedout_devices(void) + { + struct tcmu_dev *udev, *tmp_dev; ++ struct tcmu_cmd *cmd, *tmp_cmd; + LIST_HEAD(devs); + + spin_lock_bh(&timed_out_udevs_lock); +@@ -2708,9 +2681,24 @@ static void check_timedout_devices(void) + spin_unlock_bh(&timed_out_udevs_lock); + + mutex_lock(&udev->cmdr_lock); +- idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL); + +- tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); ++ /* ++ * If cmd_time_out is disabled but qfull is set deadline ++ * will only reflect the qfull timeout. Ignore it. ++ */ ++ if (udev->cmd_time_out) { ++ list_for_each_entry_safe(cmd, tmp_cmd, ++ &udev->inflight_queue, ++ queue_entry) { ++ tcmu_check_expired_ring_cmd(cmd); ++ } ++ tcmu_set_next_deadline(&udev->inflight_queue, ++ &udev->cmd_timer); ++ } ++ list_for_each_entry_safe(cmd, tmp_cmd, &udev->qfull_queue, ++ queue_entry) { ++ tcmu_check_expired_queue_cmd(cmd); ++ } + tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); + + mutex_unlock(&udev->cmdr_lock); +diff --git a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c +index d3e959d01606..85776db4bf34 100644 +--- a/drivers/thermal/ti-soc-thermal/ti-thermal-common.c ++++ b/drivers/thermal/ti-soc-thermal/ti-thermal-common.c +@@ -169,7 +169,7 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id, + + data = ti_bandgap_get_sensor_data(bgp, id); + +- if (!data || IS_ERR(data)) ++ if (!IS_ERR_OR_NULL(data)) + data = ti_thermal_build_data(bgp, id); + + if (!data) +@@ -196,7 +196,7 @@ int ti_thermal_remove_sensor(struct ti_bandgap *bgp, int id) + + data = ti_bandgap_get_sensor_data(bgp, id); + +- if (data && data->ti_thermal) { ++ if (!IS_ERR_OR_NULL(data) && data->ti_thermal) { + if (data->our_zone) + thermal_zone_device_unregister(data->ti_thermal); + } +@@ -262,7 +262,7 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id) + + data = ti_bandgap_get_sensor_data(bgp, id); + +- if (data) { ++ if (!IS_ERR_OR_NULL(data)) { + cpufreq_cooling_unregister(data->cool_dev); + if (data->policy) + cpufreq_cpu_put(data->policy); +diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c +index cdcc64ea2554..f8e43a6faea9 100644 +--- a/drivers/tty/hvc/hvc_console.c ++++ b/drivers/tty/hvc/hvc_console.c +@@ -75,6 +75,8 @@ static LIST_HEAD(hvc_structs); + */ + static DEFINE_MUTEX(hvc_structs_mutex); + ++/* Mutex to serialize hvc_open */ ++static DEFINE_MUTEX(hvc_open_mutex); + /* + * This value is used to assign a tty->index value to a hvc_struct based + * upon order of exposure via hvc_probe(), when we can not match it to +@@ -346,16 +348,24 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty) + */ + static int hvc_open(struct tty_struct *tty, struct file * filp) + { +- struct hvc_struct *hp = tty->driver_data; ++ struct hvc_struct *hp; + unsigned long flags; + int rc = 0; + ++ mutex_lock(&hvc_open_mutex); ++ ++ hp = tty->driver_data; ++ if (!hp) { ++ rc = -EIO; ++ goto out; ++ } ++ + spin_lock_irqsave(&hp->port.lock, flags); + /* Check and then increment for fast path open. */ + if (hp->port.count++ > 0) { + spin_unlock_irqrestore(&hp->port.lock, flags); + hvc_kick(); +- return 0; ++ goto out; + } /* else count == 0 */ + spin_unlock_irqrestore(&hp->port.lock, flags); + +@@ -383,6 +393,8 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) + /* Force wakeup of the polling thread */ + hvc_kick(); + ++out: ++ mutex_unlock(&hvc_open_mutex); + return rc; + } + +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index d77ed82a4840..f189579db7c4 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -673,11 +673,10 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, + * FIXME: lock against link layer control transmissions + */ + +-static void gsm_data_kick(struct gsm_mux *gsm) ++static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci) + { + struct gsm_msg *msg, *nmsg; + int len; +- int skip_sof = 0; + + list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { + if (gsm->constipated && msg->addr) +@@ -699,18 +698,23 @@ static void gsm_data_kick(struct gsm_mux *gsm) + print_hex_dump_bytes("gsm_data_kick: ", + DUMP_PREFIX_OFFSET, + gsm->txframe, len); +- +- if (gsm->output(gsm, gsm->txframe + skip_sof, +- len - skip_sof) < 0) ++ if (gsm->output(gsm, gsm->txframe, len) < 0) + break; + /* FIXME: Can eliminate one SOF in many more cases */ + gsm->tx_bytes -= msg->len; +- /* For a burst of frames skip the extra SOF within the +- burst */ +- skip_sof = 1; + + list_del(&msg->list); + kfree(msg); ++ ++ if (dlci) { ++ tty_port_tty_wakeup(&dlci->port); ++ } else { ++ int i = 0; ++ ++ for (i = 0; i < NUM_DLCI; i++) ++ if (gsm->dlci[i]) ++ tty_port_tty_wakeup(&gsm->dlci[i]->port); ++ } + } + } + +@@ -762,7 +766,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) + /* Add to the actual output queue */ + list_add_tail(&msg->list, &gsm->tx_list); + gsm->tx_bytes += msg->len; +- gsm_data_kick(gsm); ++ gsm_data_kick(gsm, dlci); + } + + /** +@@ -1223,7 +1227,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, + gsm_control_reply(gsm, CMD_FCON, NULL, 0); + /* Kick the link in case it is idling */ + spin_lock_irqsave(&gsm->tx_lock, flags); +- gsm_data_kick(gsm); ++ gsm_data_kick(gsm, NULL); + spin_unlock_irqrestore(&gsm->tx_lock, flags); + break; + case CMD_FCOFF: +@@ -2545,7 +2549,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty) + /* Queue poll */ + clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); + spin_lock_irqsave(&gsm->tx_lock, flags); +- gsm_data_kick(gsm); ++ gsm_data_kick(gsm, NULL); + if (gsm->tx_bytes < TX_THRESH_LO) { + gsm_dlci_data_sweep(gsm); + } +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index f77bf820b7a3..4d83c85a7389 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -2615,6 +2615,8 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port, + struct ktermios *termios, + struct ktermios *old) + { ++ unsigned int tolerance = port->uartclk / 100; ++ + /* + * Ask the core to calculate the divisor for us. + * Allow 1% tolerance at the upper limit so uart clks marginally +@@ -2623,7 +2625,7 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port, + */ + return uart_get_baud_rate(port, termios, old, + port->uartclk / 16 / UART_DIV_MAX, +- port->uartclk); ++ (port->uartclk + tolerance) / 16); + } + + void +diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c +index 5685ba11480b..e701ab56b0a7 100644 +--- a/drivers/usb/cdns3/cdns3-ti.c ++++ b/drivers/usb/cdns3/cdns3-ti.c +@@ -138,7 +138,7 @@ static int cdns_ti_probe(struct platform_device *pdev) + error = pm_runtime_get_sync(dev); + if (error < 0) { + dev_err(dev, "pm_runtime_get_sync failed: %d\n", error); +- goto err_get; ++ goto err; + } + + /* assert RESET */ +@@ -185,7 +185,6 @@ static int cdns_ti_probe(struct platform_device *pdev) + + err: + pm_runtime_put_sync(data->dev); +-err_get: + pm_runtime_disable(data->dev); + + return error; +diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c +index 0d8e3f3804a3..084c48c5848f 100644 +--- a/drivers/usb/class/usblp.c ++++ b/drivers/usb/class/usblp.c +@@ -468,7 +468,8 @@ static int usblp_release(struct inode *inode, struct file *file) + usb_autopm_put_interface(usblp->intf); + + if (!usblp->present) /* finish cleanup from disconnect */ +- usblp_cleanup(usblp); ++ usblp_cleanup(usblp); /* any URBs must be dead */ ++ + mutex_unlock(&usblp_mutex); + return 0; + } +@@ -1375,9 +1376,11 @@ static void usblp_disconnect(struct usb_interface *intf) + + usblp_unlink_urbs(usblp); + mutex_unlock(&usblp->mut); ++ usb_poison_anchored_urbs(&usblp->urbs); + + if (!usblp->used) + usblp_cleanup(usblp); ++ + mutex_unlock(&usblp_mutex); + } + +diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c +index 876ff31261d5..55f1d14fc414 100644 +--- a/drivers/usb/dwc2/core_intr.c ++++ b/drivers/usb/dwc2/core_intr.c +@@ -416,10 +416,13 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg) + if (ret && (ret != -ENOTSUPP)) + dev_err(hsotg->dev, "exit power_down failed\n"); + ++ /* Change to L0 state */ ++ hsotg->lx_state = DWC2_L0; + call_gadget(hsotg, resume); ++ } else { ++ /* Change to L0 state */ ++ hsotg->lx_state = DWC2_L0; + } +- /* Change to L0 state */ +- hsotg->lx_state = DWC2_L0; + } else { + if (hsotg->params.power_down) + return; +diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c +index b81d085bc534..eabb3bb6fcaa 100644 +--- a/drivers/usb/dwc3/dwc3-meson-g12a.c ++++ b/drivers/usb/dwc3/dwc3-meson-g12a.c +@@ -505,7 +505,7 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev) + if (IS_ERR(priv->reset)) { + ret = PTR_ERR(priv->reset); + dev_err(dev, "failed to get device reset, err=%d\n", ret); +- return ret; ++ goto err_disable_clks; + } + + ret = reset_control_reset(priv->reset); +@@ -525,7 +525,9 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev) + /* Get dr_mode */ + priv->otg_mode = usb_get_dr_mode(dev); + +- dwc3_meson_g12a_usb_init(priv); ++ ret = dwc3_meson_g12a_usb_init(priv); ++ if (ret) ++ goto err_disable_clks; + + /* Init PHYs */ + for (i = 0 ; i < PHY_COUNT ; ++i) { +diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c +index 585cb3deea7a..de3b92680935 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1220,6 +1220,8 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep) + } + } + ++static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep); ++ + static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) + { + struct dwc3_gadget_ep_cmd_params params; +@@ -1259,14 +1261,20 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) + + ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms); + if (ret < 0) { +- /* +- * FIXME we need to iterate over the list of requests +- * here and stop, unmap, free and del each of the linked +- * requests instead of what we do now. +- */ +- if (req->trb) +- memset(req->trb, 0, sizeof(struct dwc3_trb)); +- dwc3_gadget_del_and_unmap_request(dep, req, ret); ++ struct dwc3_request *tmp; ++ ++ if (ret == -EAGAIN) ++ return ret; ++ ++ dwc3_stop_active_transfer(dep, true, true); ++ ++ list_for_each_entry_safe(req, tmp, &dep->started_list, list) ++ dwc3_gadget_move_cancelled_request(req); ++ ++ /* If ep isn't started, then there's no end transfer pending */ ++ if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) ++ dwc3_gadget_ep_cleanup_cancelled_requests(dep); ++ + return ret; + } + +@@ -1508,6 +1516,10 @@ static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *r + { + int i; + ++ /* If req->trb is not set, then the request has not started */ ++ if (!req->trb) ++ return; ++ + /* + * If request was already started, this means we had to + * stop the transfer. With that we also need to ignore +@@ -1598,6 +1610,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) + { + struct dwc3_gadget_ep_cmd_params params; + struct dwc3 *dwc = dep->dwc; ++ struct dwc3_request *req; ++ struct dwc3_request *tmp; + int ret; + + if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { +@@ -1634,13 +1648,37 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) + else + dep->flags |= DWC3_EP_STALL; + } else { ++ /* ++ * Don't issue CLEAR_STALL command to control endpoints. The ++ * controller automatically clears the STALL when it receives ++ * the SETUP token. ++ */ ++ if (dep->number <= 1) { ++ dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); ++ return 0; ++ } + + ret = dwc3_send_clear_stall_ep_cmd(dep); +- if (ret) ++ if (ret) { + dev_err(dwc->dev, "failed to clear STALL on %s\n", + dep->name); +- else +- dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); ++ return ret; ++ } ++ ++ dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); ++ ++ dwc3_stop_active_transfer(dep, true, true); ++ ++ list_for_each_entry_safe(req, tmp, &dep->started_list, list) ++ dwc3_gadget_move_cancelled_request(req); ++ ++ list_for_each_entry_safe(req, tmp, &dep->pending_list, list) ++ dwc3_gadget_move_cancelled_request(req); ++ ++ if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) { ++ dep->flags &= ~DWC3_EP_DELAY_START; ++ dwc3_gadget_ep_cleanup_cancelled_requests(dep); ++ } + } + + return ret; +diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c +index cb4950cf1cdc..5c1eb96a5c57 100644 +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -96,40 +96,43 @@ function_descriptors(struct usb_function *f, + } + + /** +- * next_ep_desc() - advance to the next EP descriptor ++ * next_desc() - advance to the next desc_type descriptor + * @t: currect pointer within descriptor array ++ * @desc_type: descriptor type + * +- * Return: next EP descriptor or NULL ++ * Return: next desc_type descriptor or NULL + * +- * Iterate over @t until either EP descriptor found or ++ * Iterate over @t until either desc_type descriptor found or + * NULL (that indicates end of list) encountered + */ + static struct usb_descriptor_header** +-next_ep_desc(struct usb_descriptor_header **t) ++next_desc(struct usb_descriptor_header **t, u8 desc_type) + { + for (; *t; t++) { +- if ((*t)->bDescriptorType == USB_DT_ENDPOINT) ++ if ((*t)->bDescriptorType == desc_type) + return t; + } + return NULL; + } + + /* +- * for_each_ep_desc()- iterate over endpoint descriptors in the +- * descriptors list +- * @start: pointer within descriptor array. +- * @ep_desc: endpoint descriptor to use as the loop cursor ++ * for_each_desc() - iterate over desc_type descriptors in the ++ * descriptors list ++ * @start: pointer within descriptor array. ++ * @iter_desc: desc_type descriptor to use as the loop cursor ++ * @desc_type: wanted descriptr type + */ +-#define for_each_ep_desc(start, ep_desc) \ +- for (ep_desc = next_ep_desc(start); \ +- ep_desc; ep_desc = next_ep_desc(ep_desc+1)) ++#define for_each_desc(start, iter_desc, desc_type) \ ++ for (iter_desc = next_desc(start, desc_type); \ ++ iter_desc; iter_desc = next_desc(iter_desc + 1, desc_type)) + + /** +- * config_ep_by_speed() - configures the given endpoint ++ * config_ep_by_speed_and_alt() - configures the given endpoint + * according to gadget speed. + * @g: pointer to the gadget + * @f: usb function + * @_ep: the endpoint to configure ++ * @alt: alternate setting number + * + * Return: error code, 0 on success + * +@@ -142,11 +145,13 @@ next_ep_desc(struct usb_descriptor_header **t) + * Note: the supplied function should hold all the descriptors + * for supported speeds + */ +-int config_ep_by_speed(struct usb_gadget *g, +- struct usb_function *f, +- struct usb_ep *_ep) ++int config_ep_by_speed_and_alt(struct usb_gadget *g, ++ struct usb_function *f, ++ struct usb_ep *_ep, ++ u8 alt) + { + struct usb_endpoint_descriptor *chosen_desc = NULL; ++ struct usb_interface_descriptor *int_desc = NULL; + struct usb_descriptor_header **speed_desc = NULL; + + struct usb_ss_ep_comp_descriptor *comp_desc = NULL; +@@ -182,8 +187,21 @@ int config_ep_by_speed(struct usb_gadget *g, + default: + speed_desc = f->fs_descriptors; + } ++ ++ /* find correct alternate setting descriptor */ ++ for_each_desc(speed_desc, d_spd, USB_DT_INTERFACE) { ++ int_desc = (struct usb_interface_descriptor *)*d_spd; ++ ++ if (int_desc->bAlternateSetting == alt) { ++ speed_desc = d_spd; ++ goto intf_found; ++ } ++ } ++ return -EIO; ++ ++intf_found: + /* find descriptors */ +- for_each_ep_desc(speed_desc, d_spd) { ++ for_each_desc(speed_desc, d_spd, USB_DT_ENDPOINT) { + chosen_desc = (struct usb_endpoint_descriptor *)*d_spd; + if (chosen_desc->bEndpointAddress == _ep->address) + goto ep_found; +@@ -237,6 +255,32 @@ ep_found: + } + return 0; + } ++EXPORT_SYMBOL_GPL(config_ep_by_speed_and_alt); ++ ++/** ++ * config_ep_by_speed() - configures the given endpoint ++ * according to gadget speed. ++ * @g: pointer to the gadget ++ * @f: usb function ++ * @_ep: the endpoint to configure ++ * ++ * Return: error code, 0 on success ++ * ++ * This function chooses the right descriptors for a given ++ * endpoint according to gadget speed and saves it in the ++ * endpoint desc field. If the endpoint already has a descriptor ++ * assigned to it - overwrites it with currently corresponding ++ * descriptor. The endpoint maxpacket field is updated according ++ * to the chosen descriptor. ++ * Note: the supplied function should hold all the descriptors ++ * for supported speeds ++ */ ++int config_ep_by_speed(struct usb_gadget *g, ++ struct usb_function *f, ++ struct usb_ep *_ep) ++{ ++ return config_ep_by_speed_and_alt(g, f, _ep, 0); ++} + EXPORT_SYMBOL_GPL(config_ep_by_speed); + + /** +diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c +index 9b11046480fe..2e28dde8376f 100644 +--- a/drivers/usb/gadget/udc/core.c ++++ b/drivers/usb/gadget/udc/core.c +@@ -1297,6 +1297,8 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) + kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); + + usb_gadget_disconnect(udc->gadget); ++ if (udc->gadget->irq) ++ synchronize_irq(udc->gadget->irq); + udc->driver->unbind(udc->gadget); + usb_gadget_udc_stop(udc); + +diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c b/drivers/usb/gadget/udc/lpc32xx_udc.c +index cb997b82c008..465d0b7c6522 100644 +--- a/drivers/usb/gadget/udc/lpc32xx_udc.c ++++ b/drivers/usb/gadget/udc/lpc32xx_udc.c +@@ -1614,17 +1614,17 @@ static int lpc32xx_ep_enable(struct usb_ep *_ep, + const struct usb_endpoint_descriptor *desc) + { + struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); +- struct lpc32xx_udc *udc = ep->udc; ++ struct lpc32xx_udc *udc; + u16 maxpacket; + u32 tmp; + unsigned long flags; + + /* Verify EP data */ + if ((!_ep) || (!ep) || (!desc) || +- (desc->bDescriptorType != USB_DT_ENDPOINT)) { +- dev_dbg(udc->dev, "bad ep or descriptor\n"); ++ (desc->bDescriptorType != USB_DT_ENDPOINT)) + return -EINVAL; +- } ++ ++ udc = ep->udc; + maxpacket = usb_endpoint_maxp(desc); + if ((maxpacket == 0) || (maxpacket > ep->maxpacket)) { + dev_dbg(udc->dev, "bad ep descriptor's packet size\n"); +@@ -1872,7 +1872,7 @@ static int lpc32xx_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) + static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value) + { + struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); +- struct lpc32xx_udc *udc = ep->udc; ++ struct lpc32xx_udc *udc; + unsigned long flags; + + if ((!ep) || (ep->hwep_num <= 1)) +@@ -1882,6 +1882,7 @@ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value) + if (ep->is_in) + return -EAGAIN; + ++ udc = ep->udc; + spin_lock_irqsave(&udc->lock, flags); + + if (value == 1) { +diff --git a/drivers/usb/gadget/udc/m66592-udc.c b/drivers/usb/gadget/udc/m66592-udc.c +index 75d16a8902e6..931e6362a13d 100644 +--- a/drivers/usb/gadget/udc/m66592-udc.c ++++ b/drivers/usb/gadget/udc/m66592-udc.c +@@ -1667,7 +1667,7 @@ static int m66592_probe(struct platform_device *pdev) + + err_add_udc: + m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); +- ++ m66592->ep0_req = NULL; + clean_up3: + if (m66592->pdata->on_chip) { + clk_disable(m66592->clk); +diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c +index 0507a2ca0f55..80002d97b59d 100644 +--- a/drivers/usb/gadget/udc/s3c2410_udc.c ++++ b/drivers/usb/gadget/udc/s3c2410_udc.c +@@ -251,10 +251,6 @@ static void s3c2410_udc_done(struct s3c2410_ep *ep, + static void s3c2410_udc_nuke(struct s3c2410_udc *udc, + struct s3c2410_ep *ep, int status) + { +- /* Sanity check */ +- if (&ep->queue == NULL) +- return; +- + while (!list_empty(&ep->queue)) { + struct s3c2410_request *req; + req = list_entry(ep->queue.next, struct s3c2410_request, +diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c +index c9f91e6c72b6..7f65c86047dd 100644 +--- a/drivers/usb/host/ehci-mxc.c ++++ b/drivers/usb/host/ehci-mxc.c +@@ -50,6 +50,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) + } + + irq = platform_get_irq(pdev, 0); ++ if (irq < 0) ++ return irq; + + hcd = usb_create_hcd(&ehci_mxc_hc_driver, dev, dev_name(dev)); + if (!hcd) +diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c +index e4fc3f66d43b..e9a49007cce4 100644 +--- a/drivers/usb/host/ehci-platform.c ++++ b/drivers/usb/host/ehci-platform.c +@@ -455,6 +455,10 @@ static int ehci_platform_resume(struct device *dev) + + ehci_resume(hcd, priv->reset_on_resume); + ++ pm_runtime_disable(dev); ++ pm_runtime_set_active(dev); ++ pm_runtime_enable(dev); ++ + if (priv->quirk_poll) + quirk_poll_init(priv); + +diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c +index 7addfc2cbadc..4a8456f12a73 100644 +--- a/drivers/usb/host/ohci-platform.c ++++ b/drivers/usb/host/ohci-platform.c +@@ -299,6 +299,11 @@ static int ohci_platform_resume(struct device *dev) + } + + ohci_resume(hcd, false); ++ ++ pm_runtime_disable(dev); ++ pm_runtime_set_active(dev); ++ pm_runtime_enable(dev); ++ + return 0; + } + #endif /* CONFIG_PM_SLEEP */ +diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c +index c158cda9e4b9..cff965240327 100644 +--- a/drivers/usb/host/ohci-sm501.c ++++ b/drivers/usb/host/ohci-sm501.c +@@ -157,9 +157,10 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev) + * the call to usb_hcd_setup_local_mem() below does just that. + */ + +- if (usb_hcd_setup_local_mem(hcd, mem->start, +- mem->start - mem->parent->start, +- resource_size(mem)) < 0) ++ retval = usb_hcd_setup_local_mem(hcd, mem->start, ++ mem->start - mem->parent->start, ++ resource_size(mem)); ++ if (retval < 0) + goto err5; + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (retval) +diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c +index ea460b9682d5..ca82e2c61ddc 100644 +--- a/drivers/usb/host/xhci-plat.c ++++ b/drivers/usb/host/xhci-plat.c +@@ -409,7 +409,15 @@ static int __maybe_unused xhci_plat_resume(struct device *dev) + if (ret) + return ret; + +- return xhci_resume(xhci, 0); ++ ret = xhci_resume(xhci, 0); ++ if (ret) ++ return ret; ++ ++ pm_runtime_disable(dev); ++ pm_runtime_set_active(dev); ++ pm_runtime_enable(dev); ++ ++ return 0; + } + + static int __maybe_unused xhci_plat_runtime_suspend(struct device *dev) +diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c +index 5b17709821df..27d92af29635 100644 +--- a/drivers/usb/roles/class.c ++++ b/drivers/usb/roles/class.c +@@ -49,8 +49,10 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) + mutex_lock(&sw->lock); + + ret = sw->set(sw, role); +- if (!ret) ++ if (!ret) { + sw->role = role; ++ kobject_uevent(&sw->dev.kobj, KOBJ_CHANGE); ++ } + + mutex_unlock(&sw->lock); + +diff --git a/drivers/vfio/mdev/mdev_sysfs.c b/drivers/vfio/mdev/mdev_sysfs.c +index 8ad14e5c02bf..917fd84c1c6f 100644 +--- a/drivers/vfio/mdev/mdev_sysfs.c ++++ b/drivers/vfio/mdev/mdev_sysfs.c +@@ -110,7 +110,7 @@ static struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent, + "%s-%s", dev_driver_string(parent->dev), + group->name); + if (ret) { +- kfree(type); ++ kobject_put(&type->kobj); + return ERR_PTR(ret); + } + +diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c +index 90c0b80f8acf..814bcbe0dd4e 100644 +--- a/drivers/vfio/pci/vfio_pci_config.c ++++ b/drivers/vfio/pci/vfio_pci_config.c +@@ -1462,7 +1462,12 @@ static int vfio_cap_init(struct vfio_pci_device *vdev) + if (ret) + return ret; + +- if (cap <= PCI_CAP_ID_MAX) { ++ /* ++ * ID 0 is a NULL capability, conflicting with our fake ++ * PCI_CAP_ID_BASIC. As it has no content, consider it ++ * hidden for now. ++ */ ++ if (cap && cap <= PCI_CAP_ID_MAX) { + len = pci_cap_length[cap]; + if (len == 0xFF) { /* Variable length */ + len = vfio_cap_len(vdev, cap, pos); +@@ -1728,8 +1733,11 @@ void vfio_config_free(struct vfio_pci_device *vdev) + vdev->vconfig = NULL; + kfree(vdev->pci_config_map); + vdev->pci_config_map = NULL; +- kfree(vdev->msi_perm); +- vdev->msi_perm = NULL; ++ if (vdev->msi_perm) { ++ free_perm_bits(vdev->msi_perm); ++ kfree(vdev->msi_perm); ++ vdev->msi_perm = NULL; ++ } + } + + /* +diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c +index c39952243fd3..8b104f76f324 100644 +--- a/drivers/vhost/scsi.c ++++ b/drivers/vhost/scsi.c +@@ -2280,6 +2280,7 @@ static struct configfs_attribute *vhost_scsi_wwn_attrs[] = { + static const struct target_core_fabric_ops vhost_scsi_ops = { + .module = THIS_MODULE, + .fabric_name = "vhost", ++ .max_data_sg_nents = VHOST_SCSI_PREALLOC_SGLS, + .tpg_get_wwn = vhost_scsi_get_fabric_wwn, + .tpg_get_tag = vhost_scsi_get_tpgt, + .tpg_check_demo_mode = vhost_scsi_check_true, +diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c +index f68920131a4a..e94932c69f54 100644 +--- a/drivers/video/backlight/lp855x_bl.c ++++ b/drivers/video/backlight/lp855x_bl.c +@@ -456,7 +456,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) + ret = regulator_enable(lp->enable); + if (ret < 0) { + dev_err(lp->dev, "failed to enable vddio: %d\n", ret); +- return ret; ++ goto disable_supply; + } + + /* +@@ -471,24 +471,34 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) + ret = lp855x_configure(lp); + if (ret) { + dev_err(lp->dev, "device config err: %d", ret); +- return ret; ++ goto disable_vddio; + } + + ret = lp855x_backlight_register(lp); + if (ret) { + dev_err(lp->dev, + "failed to register backlight. err: %d\n", ret); +- return ret; ++ goto disable_vddio; + } + + ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group); + if (ret) { + dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret); +- return ret; ++ goto disable_vddio; + } + + backlight_update_status(lp->bl); ++ + return 0; ++ ++disable_vddio: ++ if (lp->enable) ++ regulator_disable(lp->enable); ++disable_supply: ++ if (lp->supply) ++ regulator_disable(lp->supply); ++ ++ return ret; + } + + static int lp855x_remove(struct i2c_client *cl) +@@ -497,6 +507,8 @@ static int lp855x_remove(struct i2c_client *cl) + + lp->bl->props.brightness = 0; + backlight_update_status(lp->bl); ++ if (lp->enable) ++ regulator_disable(lp->enable); + if (lp->supply) + regulator_disable(lp->supply); + sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group); +diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c +index 0ad15d55071c..18dec438d518 100644 +--- a/drivers/watchdog/da9062_wdt.c ++++ b/drivers/watchdog/da9062_wdt.c +@@ -58,11 +58,6 @@ static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt, + unsigned int regval) + { + struct da9062 *chip = wdt->hw; +- int ret; +- +- ret = da9062_reset_watchdog_timer(wdt); +- if (ret) +- return ret; + + regmap_update_bits(chip->regmap, + DA9062AA_CONTROL_D, +diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c +index ec975decb5de..b96b11e2b571 100644 +--- a/drivers/xen/cpu_hotplug.c ++++ b/drivers/xen/cpu_hotplug.c +@@ -93,10 +93,8 @@ static int setup_cpu_watcher(struct notifier_block *notifier, + (void)register_xenbus_watch(&cpu_watch); + + for_each_possible_cpu(cpu) { +- if (vcpu_online(cpu) == 0) { +- device_offline(get_cpu_device(cpu)); +- set_cpu_present(cpu, false); +- } ++ if (vcpu_online(cpu) == 0) ++ disable_hotplug_cpu(cpu); + } + + return NOTIFY_DONE; +@@ -119,5 +117,5 @@ static int __init setup_vcpu_hotplug_event(void) + return 0; + } + +-arch_initcall(setup_vcpu_hotplug_event); ++late_initcall(setup_vcpu_hotplug_event); + +diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c +index 380ad5ace7cf..3a9b8b1f5f2b 100644 +--- a/fs/afs/cmservice.c ++++ b/fs/afs/cmservice.c +@@ -305,8 +305,7 @@ static int afs_deliver_cb_callback(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("FID count: %u", call->count); + if (call->count > AFSCBMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_cb_fid_count); ++ return afs_protocol_error(call, afs_eproto_cb_fid_count); + + call->buffer = kmalloc(array3_size(call->count, 3, 4), + GFP_KERNEL); +@@ -351,8 +350,7 @@ static int afs_deliver_cb_callback(struct afs_call *call) + call->count2 = ntohl(call->tmp); + _debug("CB count: %u", call->count2); + if (call->count2 != call->count && call->count2 != 0) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_cb_count); ++ return afs_protocol_error(call, afs_eproto_cb_count); + call->iter = &call->def_iter; + iov_iter_discard(&call->def_iter, READ, call->count2 * 3 * 4); + call->unmarshall++; +@@ -672,8 +670,7 @@ static int afs_deliver_yfs_cb_callback(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("FID count: %u", call->count); + if (call->count > YFSCBMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_cb_fid_count); ++ return afs_protocol_error(call, afs_eproto_cb_fid_count); + + size = array_size(call->count, sizeof(struct yfs_xdr_YFSFid)); + call->buffer = kmalloc(size, GFP_KERNEL); +diff --git a/fs/afs/dir.c b/fs/afs/dir.c +index d1e1caa23c8b..3c486340b220 100644 +--- a/fs/afs/dir.c ++++ b/fs/afs/dir.c +@@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, + + cookie->ctx.actor = afs_lookup_filldir; + cookie->name = dentry->d_name; +- cookie->nr_fids = 1; /* slot 0 is saved for the fid we actually want */ ++ cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want ++ * and slot 1 for the directory */ + + read_seqlock_excl(&dvnode->cb_lock); + dcbi = rcu_dereference_protected(dvnode->cb_interest, +@@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, + if (!cookie->inodes) + goto out_s; + +- for (i = 1; i < cookie->nr_fids; i++) { ++ cookie->fids[1] = dvnode->fid; ++ cookie->statuses[1].cb_break = afs_calc_vnode_cb_break(dvnode); ++ cookie->inodes[1] = igrab(&dvnode->vfs_inode); ++ ++ for (i = 2; i < cookie->nr_fids; i++) { + scb = &cookie->statuses[i]; + + /* Find any inodes that already exist and get their +diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c +index d2b3798c1932..7bca0c13d0c4 100644 +--- a/fs/afs/fsclient.c ++++ b/fs/afs/fsclient.c +@@ -56,16 +56,15 @@ static void xdr_dump_bad(const __be32 *bp) + /* + * decode an AFSFetchStatus block + */ +-static int xdr_decode_AFSFetchStatus(const __be32 **_bp, +- struct afs_call *call, +- struct afs_status_cb *scb) ++static void xdr_decode_AFSFetchStatus(const __be32 **_bp, ++ struct afs_call *call, ++ struct afs_status_cb *scb) + { + const struct afs_xdr_AFSFetchStatus *xdr = (const void *)*_bp; + struct afs_file_status *status = &scb->status; + bool inline_error = (call->operation_ID == afs_FS_InlineBulkStatus); + u64 data_version, size; + u32 type, abort_code; +- int ret; + + abort_code = ntohl(xdr->abort_code); + +@@ -79,7 +78,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, + */ + status->abort_code = abort_code; + scb->have_error = true; +- goto good; ++ goto advance; + } + + pr_warn("Unknown AFSFetchStatus version %u\n", ntohl(xdr->if_version)); +@@ -89,7 +88,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, + if (abort_code != 0 && inline_error) { + status->abort_code = abort_code; + scb->have_error = true; +- goto good; ++ goto advance; + } + + type = ntohl(xdr->type); +@@ -125,15 +124,13 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp, + data_version |= (u64)ntohl(xdr->data_version_hi) << 32; + status->data_version = data_version; + scb->have_status = true; +-good: +- ret = 0; + advance: + *_bp = (const void *)*_bp + sizeof(*xdr); +- return ret; ++ return; + + bad: + xdr_dump_bad(*_bp); +- ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); ++ afs_protocol_error(call, afs_eproto_bad_status); + goto advance; + } + +@@ -254,9 +251,7 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSCallBack(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + +@@ -419,9 +414,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSCallBack(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + +@@ -577,12 +570,8 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call) + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; + xdr_decode_AFSFid(&bp, call->out_fid); +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_AFSCallBack(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + +@@ -691,9 +680,7 @@ static int afs_deliver_fs_dir_status_and_vol(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -784,12 +771,8 @@ static int afs_deliver_fs_link(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -878,12 +861,8 @@ static int afs_deliver_fs_symlink(struct afs_call *call) + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; + xdr_decode_AFSFid(&bp, call->out_fid); +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -986,16 +965,12 @@ static int afs_deliver_fs_rename(struct afs_call *call) + if (ret < 0) + return ret; + ++ bp = call->buffer; + /* If the two dirs are the same, we have two copies of the same status + * report, so we just decode it twice. + */ +- bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_dir_scb); ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -1103,9 +1078,7 @@ static int afs_deliver_fs_store_data(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -1283,9 +1256,7 @@ static int afs_deliver_fs_store_status(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -1499,8 +1470,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("volname length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_volname_len); ++ return afs_protocol_error(call, afs_eproto_volname_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1529,8 +1499,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("offline msg length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_offline_msg_len); ++ return afs_protocol_error(call, afs_eproto_offline_msg_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1560,8 +1529,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("motd length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_motd_len); ++ return afs_protocol_error(call, afs_eproto_motd_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1954,9 +1922,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSCallBack(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + +@@ -2045,8 +2011,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) + tmp = ntohl(call->tmp); + _debug("status count: %u/%u", tmp, call->count2); + if (tmp != call->count2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_ibulkst_count); ++ return afs_protocol_error(call, afs_eproto_ibulkst_count); + + call->count = 0; + call->unmarshall++; +@@ -2062,10 +2027,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) + + bp = call->buffer; + scb = &call->out_scb[call->count]; +- ret = xdr_decode_AFSFetchStatus(&bp, call, scb); +- if (ret < 0) +- return ret; +- ++ xdr_decode_AFSFetchStatus(&bp, call, scb); + call->count++; + if (call->count < call->count2) + goto more_counts; +@@ -2085,8 +2047,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call) + tmp = ntohl(call->tmp); + _debug("CB count: %u", tmp); + if (tmp != call->count2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_ibulkst_cb_count); ++ return afs_protocol_error(call, afs_eproto_ibulkst_cb_count); + call->count = 0; + call->unmarshall++; + more_cbs: +@@ -2243,9 +2204,7 @@ static int afs_deliver_fs_fetch_acl(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + call->unmarshall++; +@@ -2326,9 +2285,7 @@ static int afs_deliver_fs_file_status_and_vol(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_AFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_AFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +diff --git a/fs/afs/inode.c b/fs/afs/inode.c +index 281470fe1183..d7b65fad6679 100644 +--- a/fs/afs/inode.c ++++ b/fs/afs/inode.c +@@ -130,7 +130,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key, + default: + dump_vnode(vnode, parent_vnode); + write_sequnlock(&vnode->cb_lock); +- return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type); ++ return afs_protocol_error(NULL, afs_eproto_file_type); + } + + afs_set_i_size(vnode, status->size); +@@ -170,6 +170,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, + struct timespec64 t; + umode_t mode; + bool data_changed = false; ++ bool change_size = false; + + BUG_ON(test_bit(AFS_VNODE_UNSET, &vnode->flags)); + +@@ -179,7 +180,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, + vnode->fid.vnode, + vnode->fid.unique, + status->type, vnode->status.type); +- afs_protocol_error(NULL, -EBADMSG, afs_eproto_bad_status); ++ afs_protocol_error(NULL, afs_eproto_bad_status); + return; + } + +@@ -225,6 +226,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, + } else { + set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags); + } ++ change_size = true; + } else if (vnode->status.type == AFS_FTYPE_DIR) { + /* Expected directory change is handled elsewhere so + * that we can locally edit the directory and save on a +@@ -232,11 +234,19 @@ static void afs_apply_status(struct afs_fs_cursor *fc, + */ + if (test_bit(AFS_VNODE_DIR_VALID, &vnode->flags)) + data_changed = false; ++ change_size = true; + } + + if (data_changed) { + inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); +- afs_set_i_size(vnode, status->size); ++ ++ /* Only update the size if the data version jumped. If the ++ * file is being modified locally, then we might have our own ++ * idea of what the size should be that's not the same as ++ * what's on the server. ++ */ ++ if (change_size) ++ afs_set_i_size(vnode, status->size); + } + } + +diff --git a/fs/afs/internal.h b/fs/afs/internal.h +index 80255513e230..98e0cebd5e5e 100644 +--- a/fs/afs/internal.h ++++ b/fs/afs/internal.h +@@ -161,6 +161,7 @@ struct afs_call { + bool upgrade; /* T to request service upgrade */ + bool have_reply_time; /* T if have got reply_time */ + bool intr; /* T if interruptible */ ++ bool unmarshalling_error; /* T if an unmarshalling error occurred */ + u16 service_id; /* Actual service ID (after upgrade) */ + unsigned int debug_id; /* Trace ID */ + u32 operation_ID; /* operation ID for an incoming call */ +@@ -1128,7 +1129,7 @@ extern void afs_flat_call_destructor(struct afs_call *); + extern void afs_send_empty_reply(struct afs_call *); + extern void afs_send_simple_reply(struct afs_call *, const void *, size_t); + extern int afs_extract_data(struct afs_call *, bool); +-extern int afs_protocol_error(struct afs_call *, int, enum afs_eproto_cause); ++extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause); + + static inline void afs_set_fc_call(struct afs_call *call, struct afs_fs_cursor *fc) + { +diff --git a/fs/afs/misc.c b/fs/afs/misc.c +index 52b19e9c1535..5334f1bd2bca 100644 +--- a/fs/afs/misc.c ++++ b/fs/afs/misc.c +@@ -83,6 +83,7 @@ int afs_abort_to_error(u32 abort_code) + case UAENOLCK: return -ENOLCK; + case UAENOTEMPTY: return -ENOTEMPTY; + case UAELOOP: return -ELOOP; ++ case UAEOVERFLOW: return -EOVERFLOW; + case UAENOMEDIUM: return -ENOMEDIUM; + case UAEDQUOT: return -EDQUOT; + +diff --git a/fs/afs/proc.c b/fs/afs/proc.c +index 468e1713bce1..6f34c84a0fd0 100644 +--- a/fs/afs/proc.c ++++ b/fs/afs/proc.c +@@ -563,6 +563,7 @@ void afs_put_sysnames(struct afs_sysnames *sysnames) + if (sysnames->subs[i] != afs_init_sysname && + sysnames->subs[i] != sysnames->blank) + kfree(sysnames->subs[i]); ++ kfree(sysnames); + } + } + +diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c +index 1ecc67da6c1a..e3c2655616dc 100644 +--- a/fs/afs/rxrpc.c ++++ b/fs/afs/rxrpc.c +@@ -540,6 +540,8 @@ static void afs_deliver_to_call(struct afs_call *call) + + ret = call->type->deliver(call); + state = READ_ONCE(call->state); ++ if (ret == 0 && call->unmarshalling_error) ++ ret = -EBADMSG; + switch (ret) { + case 0: + afs_queue_call_work(call); +@@ -959,9 +961,11 @@ int afs_extract_data(struct afs_call *call, bool want_more) + /* + * Log protocol error production. + */ +-noinline int afs_protocol_error(struct afs_call *call, int error, ++noinline int afs_protocol_error(struct afs_call *call, + enum afs_eproto_cause cause) + { +- trace_afs_protocol_error(call, error, cause); +- return error; ++ trace_afs_protocol_error(call, cause); ++ if (call) ++ call->unmarshalling_error = true; ++ return -EBADMSG; + } +diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c +index 516e9a3bb5b4..e64b002c3bb3 100644 +--- a/fs/afs/vlclient.c ++++ b/fs/afs/vlclient.c +@@ -447,8 +447,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + call->count2 = ntohl(*bp); /* Type or next count */ + + if (call->count > YFS_MAXENDPOINTS) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_fsendpt_num); ++ return afs_protocol_error(call, afs_eproto_yvl_fsendpt_num); + + alist = afs_alloc_addrlist(call->count, FS_SERVICE, AFS_FS_PORT); + if (!alist) +@@ -468,8 +467,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + size = sizeof(__be32) * (1 + 4 + 1); + break; + default: +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_fsendpt_type); ++ return afs_protocol_error(call, afs_eproto_yvl_fsendpt_type); + } + + size += sizeof(__be32); +@@ -487,21 +485,20 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + switch (call->count2) { + case YFS_ENDPOINT_IPV4: + if (ntohl(bp[0]) != sizeof(__be32) * 2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_fsendpt4_len); ++ return afs_protocol_error( ++ call, afs_eproto_yvl_fsendpt4_len); + afs_merge_fs_addr4(alist, bp[1], ntohl(bp[2])); + bp += 3; + break; + case YFS_ENDPOINT_IPV6: + if (ntohl(bp[0]) != sizeof(__be32) * 5) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_fsendpt6_len); ++ return afs_protocol_error( ++ call, afs_eproto_yvl_fsendpt6_len); + afs_merge_fs_addr6(alist, bp + 1, ntohl(bp[5])); + bp += 6; + break; + default: +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_fsendpt_type); ++ return afs_protocol_error(call, afs_eproto_yvl_fsendpt_type); + } + + /* Got either the type of the next entry or the count of +@@ -519,8 +516,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + if (!call->count) + goto end; + if (call->count > YFS_MAXENDPOINTS) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_vlendpt_type); ++ return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type); + + afs_extract_to_buf(call, 1 * sizeof(__be32)); + call->unmarshall = 3; +@@ -547,8 +543,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + size = sizeof(__be32) * (1 + 4 + 1); + break; + default: +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_vlendpt_type); ++ return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type); + } + + if (call->count > 1) +@@ -566,19 +561,18 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call) + switch (call->count2) { + case YFS_ENDPOINT_IPV4: + if (ntohl(bp[0]) != sizeof(__be32) * 2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_vlendpt4_len); ++ return afs_protocol_error( ++ call, afs_eproto_yvl_vlendpt4_len); + bp += 3; + break; + case YFS_ENDPOINT_IPV6: + if (ntohl(bp[0]) != sizeof(__be32) * 5) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_vlendpt6_len); ++ return afs_protocol_error( ++ call, afs_eproto_yvl_vlendpt6_len); + bp += 6; + break; + default: +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_yvl_vlendpt_type); ++ return afs_protocol_error(call, afs_eproto_yvl_vlendpt_type); + } + + /* Got either the type of the next entry or the count of +diff --git a/fs/afs/write.c b/fs/afs/write.c +index cb76566763db..96b042af6248 100644 +--- a/fs/afs/write.c ++++ b/fs/afs/write.c +@@ -194,11 +194,11 @@ int afs_write_end(struct file *file, struct address_space *mapping, + + i_size = i_size_read(&vnode->vfs_inode); + if (maybe_i_size > i_size) { +- spin_lock(&vnode->wb_lock); ++ write_seqlock(&vnode->cb_lock); + i_size = i_size_read(&vnode->vfs_inode); + if (maybe_i_size > i_size) + i_size_write(&vnode->vfs_inode, maybe_i_size); +- spin_unlock(&vnode->wb_lock); ++ write_sequnlock(&vnode->cb_lock); + } + + if (!PageUptodate(page)) { +@@ -811,6 +811,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf) + vmf->page->index, priv); + SetPagePrivate(vmf->page); + set_page_private(vmf->page, priv); ++ file_update_time(file); + + sb_end_pagefault(inode->i_sb); + return VM_FAULT_LOCKED; +diff --git a/fs/afs/yfsclient.c b/fs/afs/yfsclient.c +index fe413e7a5cf4..bf74c679c02b 100644 +--- a/fs/afs/yfsclient.c ++++ b/fs/afs/yfsclient.c +@@ -179,21 +179,20 @@ static void xdr_dump_bad(const __be32 *bp) + /* + * Decode a YFSFetchStatus block + */ +-static int xdr_decode_YFSFetchStatus(const __be32 **_bp, +- struct afs_call *call, +- struct afs_status_cb *scb) ++static void xdr_decode_YFSFetchStatus(const __be32 **_bp, ++ struct afs_call *call, ++ struct afs_status_cb *scb) + { + const struct yfs_xdr_YFSFetchStatus *xdr = (const void *)*_bp; + struct afs_file_status *status = &scb->status; + u32 type; +- int ret; + + status->abort_code = ntohl(xdr->abort_code); + if (status->abort_code != 0) { + if (status->abort_code == VNOVNODE) + status->nlink = 0; + scb->have_error = true; +- goto good; ++ goto advance; + } + + type = ntohl(xdr->type); +@@ -221,15 +220,13 @@ static int xdr_decode_YFSFetchStatus(const __be32 **_bp, + status->size = xdr_to_u64(xdr->size); + status->data_version = xdr_to_u64(xdr->data_version); + scb->have_status = true; +-good: +- ret = 0; + advance: + *_bp += xdr_size(xdr); +- return ret; ++ return; + + bad: + xdr_dump_bad(*_bp); +- ret = afs_protocol_error(call, -EBADMSG, afs_eproto_bad_status); ++ afs_protocol_error(call, afs_eproto_bad_status); + goto advance; + } + +@@ -348,9 +345,7 @@ static int yfs_deliver_fs_status_cb_and_volsync(struct afs_call *call) + + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_YFSCallBack(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + +@@ -372,9 +367,7 @@ static int yfs_deliver_status_and_volsync(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -534,9 +527,7 @@ static int yfs_deliver_fs_fetch_data64(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_YFSCallBack(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + +@@ -644,12 +635,8 @@ static int yfs_deliver_fs_create_vnode(struct afs_call *call) + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; + xdr_decode_YFSFid(&bp, call->out_fid); +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_YFSCallBack(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + +@@ -802,14 +789,9 @@ static int yfs_deliver_fs_remove_file2(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; +- ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_YFSFid(&bp, &fid); +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + /* Was deleted if vnode->status.abort_code == VNOVNODE. */ + + xdr_decode_YFSVolSync(&bp, call->out_volsync); +@@ -889,10 +871,7 @@ static int yfs_deliver_fs_remove(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; +- ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + return 0; + } +@@ -974,12 +953,8 @@ static int yfs_deliver_fs_link(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + _leave(" = 0 [done]"); + return 0; +@@ -1061,12 +1036,8 @@ static int yfs_deliver_fs_symlink(struct afs_call *call) + /* unmarshall the reply once we've received all of it */ + bp = call->buffer; + xdr_decode_YFSFid(&bp, call->out_fid); +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + + _leave(" = 0 [done]"); +@@ -1154,13 +1125,11 @@ static int yfs_deliver_fs_rename(struct afs_call *call) + return ret; + + bp = call->buffer; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); +- if (ret < 0) +- return ret; +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; +- ++ /* If the two dirs are the same, we have two copies of the same status ++ * report, so we just decode it twice. ++ */ ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_dir_scb); ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + _leave(" = 0 [done]"); + return 0; +@@ -1457,8 +1426,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("volname length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_volname_len); ++ return afs_protocol_error(call, afs_eproto_volname_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1487,8 +1455,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("offline msg length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_offline_msg_len); ++ return afs_protocol_error(call, afs_eproto_offline_msg_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1518,8 +1485,7 @@ static int yfs_deliver_fs_get_volume_status(struct afs_call *call) + call->count = ntohl(call->tmp); + _debug("motd length: %u", call->count); + if (call->count >= AFSNAMEMAX) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_motd_len); ++ return afs_protocol_error(call, afs_eproto_motd_len); + size = (call->count + 3) & ~3; /* It's padded */ + afs_extract_to_buf(call, size); + call->unmarshall++; +@@ -1828,8 +1794,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call) + tmp = ntohl(call->tmp); + _debug("status count: %u/%u", tmp, call->count2); + if (tmp != call->count2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_ibulkst_count); ++ return afs_protocol_error(call, afs_eproto_ibulkst_count); + + call->count = 0; + call->unmarshall++; +@@ -1845,9 +1810,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call) + + bp = call->buffer; + scb = &call->out_scb[call->count]; +- ret = xdr_decode_YFSFetchStatus(&bp, call, scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, scb); + + call->count++; + if (call->count < call->count2) +@@ -1868,8 +1831,7 @@ static int yfs_deliver_fs_inline_bulk_status(struct afs_call *call) + tmp = ntohl(call->tmp); + _debug("CB count: %u", tmp); + if (tmp != call->count2) +- return afs_protocol_error(call, -EBADMSG, +- afs_eproto_ibulkst_cb_count); ++ return afs_protocol_error(call, afs_eproto_ibulkst_cb_count); + call->count = 0; + call->unmarshall++; + more_cbs: +@@ -2067,9 +2029,7 @@ static int yfs_deliver_fs_fetch_opaque_acl(struct afs_call *call) + bp = call->buffer; + yacl->inherit_flag = ntohl(*bp++); + yacl->num_cleaned = ntohl(*bp++); +- ret = xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); +- if (ret < 0) +- return ret; ++ xdr_decode_YFSFetchStatus(&bp, call, call->out_scb); + xdr_decode_YFSVolSync(&bp, call->out_volsync); + + call->unmarshall++; +diff --git a/fs/block_dev.c b/fs/block_dev.c +index 93672c3f1c78..313aae95818e 100644 +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -1583,10 +1583,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) + */ + if (!for_part) { + ret = devcgroup_inode_permission(bdev->bd_inode, perm); +- if (ret != 0) { +- bdput(bdev); ++ if (ret != 0) + return ret; +- } + } + + restart: +@@ -1655,8 +1653,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) + goto out_clear; + BUG_ON(for_part); + ret = __blkdev_get(whole, mode, 1); +- if (ret) ++ if (ret) { ++ bdput(whole); + goto out_clear; ++ } + bdev->bd_contains = whole; + bdev->bd_part = disk_get_part(disk, partno); + if (!(disk->flags & GENHD_FL_UP) || +@@ -1706,7 +1706,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) + disk_unblock_events(disk); + put_disk_and_module(disk); + out: +- bdput(bdev); + + return ret; + } +@@ -1773,6 +1772,9 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) + bdput(whole); + } + ++ if (res) ++ bdput(bdev); ++ + return res; + } + EXPORT_SYMBOL(blkdev_get); +diff --git a/fs/ceph/export.c b/fs/ceph/export.c +index 79dc06881e78..e088843a7734 100644 +--- a/fs/ceph/export.c ++++ b/fs/ceph/export.c +@@ -172,9 +172,16 @@ struct inode *ceph_lookup_inode(struct super_block *sb, u64 ino) + static struct dentry *__fh_to_dentry(struct super_block *sb, u64 ino) + { + struct inode *inode = __lookup_inode(sb, ino); ++ int err; ++ + if (IS_ERR(inode)) + return ERR_CAST(inode); +- if (inode->i_nlink == 0) { ++ /* We need LINK caps to reliably check i_nlink */ ++ err = ceph_do_getattr(inode, CEPH_CAP_LINK_SHARED, false); ++ if (err) ++ return ERR_PTR(err); ++ /* -ESTALE if inode as been unlinked and no file is open */ ++ if ((inode->i_nlink == 0) && (atomic_read(&inode->i_count) == 1)) { + iput(inode); + return ERR_PTR(-ESTALE); + } +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 28268ed461b8..47b9fbb70bf5 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -572,26 +572,26 @@ cifs_reconnect(struct TCP_Server_Info *server) + try_to_freeze(); + + mutex_lock(&server->srv_mutex); ++#ifdef CONFIG_CIFS_DFS_UPCALL + /* + * Set up next DFS target server (if any) for reconnect. If DFS + * feature is disabled, then we will retry last server we + * connected to before. + */ ++ reconn_inval_dfs_target(server, cifs_sb, &tgt_list, &tgt_it); ++#endif ++ rc = reconn_set_ipaddr(server); ++ if (rc) { ++ cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n", ++ __func__, rc); ++ } ++ + if (cifs_rdma_enabled(server)) + rc = smbd_reconnect(server); + else + rc = generic_ip_connect(server); + if (rc) { + cifs_dbg(FYI, "reconnect error %d\n", rc); +-#ifdef CONFIG_CIFS_DFS_UPCALL +- reconn_inval_dfs_target(server, cifs_sb, &tgt_list, +- &tgt_it); +-#endif +- rc = reconn_set_ipaddr(server); +- if (rc) { +- cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n", +- __func__, rc); +- } + mutex_unlock(&server->srv_mutex); + msleep(3000); + } else { +diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h +index 416d9de35679..4311d01b02a8 100644 +--- a/fs/dlm/dlm_internal.h ++++ b/fs/dlm/dlm_internal.h +@@ -97,7 +97,6 @@ do { \ + __LINE__, __FILE__, #x, jiffies); \ + {do} \ + printk("\n"); \ +- BUG(); \ + panic("DLM: Record message above and reboot.\n"); \ + } \ + } +diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c +index 8c7bbf3e566d..470be69f19aa 100644 +--- a/fs/ext4/acl.c ++++ b/fs/ext4/acl.c +@@ -256,7 +256,7 @@ retry: + if (!error && update_mode) { + inode->i_mode = mode; + inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ error = ext4_mark_inode_dirty(handle, inode); + } + out_stop: + ext4_journal_stop(handle); +diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c +index c654205f648d..1d82336b1cd4 100644 +--- a/fs/ext4/dir.c ++++ b/fs/ext4/dir.c +@@ -675,6 +675,7 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, + struct qstr qstr = {.name = str, .len = len }; + const struct dentry *parent = READ_ONCE(dentry->d_parent); + const struct inode *inode = READ_ONCE(parent->d_inode); ++ char strbuf[DNAME_INLINE_LEN]; + + if (!inode || !IS_CASEFOLDED(inode) || + !EXT4_SB(inode->i_sb)->s_encoding) { +@@ -683,6 +684,21 @@ static int ext4_d_compare(const struct dentry *dentry, unsigned int len, + return memcmp(str, name->name, len); + } + ++ /* ++ * If the dentry name is stored in-line, then it may be concurrently ++ * modified by a rename. If this happens, the VFS will eventually retry ++ * the lookup, so it doesn't matter what ->d_compare() returns. ++ * However, it's unsafe to call utf8_strncasecmp() with an unstable ++ * string. Therefore, we have to copy the name into a temporary buffer. ++ */ ++ if (len <= DNAME_INLINE_LEN - 1) { ++ memcpy(strbuf, str, len); ++ strbuf[len] = 0; ++ qstr.name = strbuf; ++ /* prevent compiler from optimizing out the temporary buffer */ ++ barrier(); ++ } ++ + return ext4_ci_compare(inode, name, &qstr, false); + } + +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index ad2dbf6e4924..51a85b50033a 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -3354,7 +3354,7 @@ struct ext4_extent; + */ + #define EXT_MAX_BLOCKS 0xffffffff + +-extern int ext4_ext_tree_init(handle_t *handle, struct inode *); ++extern void ext4_ext_tree_init(handle_t *handle, struct inode *inode); + extern int ext4_ext_index_trans_blocks(struct inode *inode, int extents); + extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, + struct ext4_map_blocks *map, int flags); +diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h +index 4b9002f0e84c..3bacf76d2609 100644 +--- a/fs/ext4/ext4_jbd2.h ++++ b/fs/ext4/ext4_jbd2.h +@@ -222,7 +222,10 @@ ext4_mark_iloc_dirty(handle_t *handle, + int ext4_reserve_inode_write(handle_t *handle, struct inode *inode, + struct ext4_iloc *iloc); + +-int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode); ++#define ext4_mark_inode_dirty(__h, __i) \ ++ __ext4_mark_inode_dirty((__h), (__i), __func__, __LINE__) ++int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode, ++ const char *func, unsigned int line); + + int ext4_expand_extra_isize(struct inode *inode, + unsigned int new_extra_isize, +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c +index 2b4b94542e34..d5453072eb63 100644 +--- a/fs/ext4/extents.c ++++ b/fs/ext4/extents.c +@@ -816,7 +816,7 @@ ext4_ext_binsearch(struct inode *inode, + + } + +-int ext4_ext_tree_init(handle_t *handle, struct inode *inode) ++void ext4_ext_tree_init(handle_t *handle, struct inode *inode) + { + struct ext4_extent_header *eh; + +@@ -826,7 +826,6 @@ int ext4_ext_tree_init(handle_t *handle, struct inode *inode) + eh->eh_magic = EXT4_EXT_MAGIC; + eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0)); + ext4_mark_inode_dirty(handle, inode); +- return 0; + } + + struct ext4_ext_path * +@@ -1319,7 +1318,7 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, + ext4_idx_pblock(EXT_FIRST_INDEX(neh))); + + le16_add_cpu(&neh->eh_depth, 1); +- ext4_mark_inode_dirty(handle, inode); ++ err = ext4_mark_inode_dirty(handle, inode); + out: + brelse(bh); + +@@ -2828,7 +2827,7 @@ again: + * in use to avoid freeing it when removing blocks. + */ + if (sbi->s_cluster_ratio > 1) { +- pblk = ext4_ext_pblock(ex) + end - ee_block + 2; ++ pblk = ext4_ext_pblock(ex) + end - ee_block + 1; + partial.pclu = EXT4_B2C(sbi, pblk); + partial.state = nofree; + } +@@ -4363,7 +4362,7 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset, + struct inode *inode = file_inode(file); + handle_t *handle; + int ret = 0; +- int ret2 = 0; ++ int ret2 = 0, ret3 = 0; + int retries = 0; + int depth = 0; + struct ext4_map_blocks map; +@@ -4423,10 +4422,11 @@ retry: + if (ext4_update_inode_size(inode, epos) & 0x1) + inode->i_mtime = inode->i_ctime; + } +- ext4_mark_inode_dirty(handle, inode); ++ ret2 = ext4_mark_inode_dirty(handle, inode); + ext4_update_inode_fsync_trans(handle, inode, 1); +- ret2 = ext4_journal_stop(handle); +- if (ret2) ++ ret3 = ext4_journal_stop(handle); ++ ret2 = ret3 ? ret3 : ret2; ++ if (unlikely(ret2)) + break; + } + if (ret == -ENOSPC && +@@ -4577,7 +4577,9 @@ static long ext4_zero_range(struct file *file, loff_t offset, + inode->i_mtime = inode->i_ctime = current_time(inode); + if (new_size) + ext4_update_inode_size(inode, new_size); +- ext4_mark_inode_dirty(handle, inode); ++ ret = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(ret)) ++ goto out_handle; + + /* Zero out partial block at the edges of the range */ + ret = ext4_zero_partial_blocks(handle, inode, offset, len); +@@ -4587,6 +4589,7 @@ static long ext4_zero_range(struct file *file, loff_t offset, + if (file->f_flags & O_SYNC) + ext4_handle_sync(handle); + ++out_handle: + ext4_journal_stop(handle); + out_mutex: + inode_unlock(inode); +@@ -4700,8 +4703,7 @@ int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode, + loff_t offset, ssize_t len) + { + unsigned int max_blocks; +- int ret = 0; +- int ret2 = 0; ++ int ret = 0, ret2 = 0, ret3 = 0; + struct ext4_map_blocks map; + unsigned int blkbits = inode->i_blkbits; + unsigned int credits = 0; +@@ -4734,9 +4736,13 @@ int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode, + "ext4_ext_map_blocks returned %d", + inode->i_ino, map.m_lblk, + map.m_len, ret); +- ext4_mark_inode_dirty(handle, inode); +- if (credits) +- ret2 = ext4_journal_stop(handle); ++ ret2 = ext4_mark_inode_dirty(handle, inode); ++ if (credits) { ++ ret3 = ext4_journal_stop(handle); ++ if (unlikely(ret3)) ++ ret2 = ret3; ++ } ++ + if (ret <= 0 || ret2) + break; + } +@@ -5304,7 +5310,7 @@ static int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + inode->i_mtime = inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ ret = ext4_mark_inode_dirty(handle, inode); + ext4_update_inode_fsync_trans(handle, inode, 1); + + out_stop: +diff --git a/fs/ext4/file.c b/fs/ext4/file.c +index 0d624250a62b..2a01e31a032c 100644 +--- a/fs/ext4/file.c ++++ b/fs/ext4/file.c +@@ -287,6 +287,7 @@ static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset, + bool truncate = false; + u8 blkbits = inode->i_blkbits; + ext4_lblk_t written_blk, end_blk; ++ int ret; + + /* + * Note that EXT4_I(inode)->i_disksize can get extended up to +@@ -327,8 +328,14 @@ static ssize_t ext4_handle_inode_extension(struct inode *inode, loff_t offset, + goto truncate; + } + +- if (ext4_update_inode_size(inode, offset + written)) +- ext4_mark_inode_dirty(handle, inode); ++ if (ext4_update_inode_size(inode, offset + written)) { ++ ret = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(ret)) { ++ written = ret; ++ ext4_journal_stop(handle); ++ goto truncate; ++ } ++ } + + /* + * We may need to truncate allocated but not written blocks beyond EOF. +@@ -495,6 +502,12 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) + if (ret <= 0) + return ret; + ++ /* if we're going to block and IOCB_NOWAIT is set, return -EAGAIN */ ++ if ((iocb->ki_flags & IOCB_NOWAIT) && (unaligned_io || extend)) { ++ ret = -EAGAIN; ++ goto out; ++ } ++ + offset = iocb->ki_pos; + count = ret; + +diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c +index 107f0043f67f..be2b66eb65f7 100644 +--- a/fs/ext4/indirect.c ++++ b/fs/ext4/indirect.c +@@ -467,7 +467,9 @@ static int ext4_splice_branch(handle_t *handle, + /* + * OK, we spliced it into the inode itself on a direct block. + */ +- ext4_mark_inode_dirty(handle, ar->inode); ++ err = ext4_mark_inode_dirty(handle, ar->inode); ++ if (unlikely(err)) ++ goto err_out; + jbd_debug(5, "splicing direct\n"); + } + return err; +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index f35e289e17aa..c3a1ad2db122 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1260,7 +1260,7 @@ out: + int ext4_try_add_inline_entry(handle_t *handle, struct ext4_filename *fname, + struct inode *dir, struct inode *inode) + { +- int ret, inline_size, no_expand; ++ int ret, ret2, inline_size, no_expand; + void *inline_start; + struct ext4_iloc iloc; + +@@ -1314,7 +1314,9 @@ int ext4_try_add_inline_entry(handle_t *handle, struct ext4_filename *fname, + + out: + ext4_write_unlock_xattr(dir, &no_expand); +- ext4_mark_inode_dirty(handle, dir); ++ ret2 = ext4_mark_inode_dirty(handle, dir); ++ if (unlikely(ret2 && !ret)) ++ ret = ret2; + brelse(iloc.bh); + return ret; + } +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index 2a4aae6acdcb..87430d276bcc 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -1296,7 +1296,7 @@ static int ext4_write_end(struct file *file, + * filesystems. + */ + if (i_size_changed || inline_data) +- ext4_mark_inode_dirty(handle, inode); ++ ret = ext4_mark_inode_dirty(handle, inode); + + if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) + /* if we have allocated more blocks and copied +@@ -3077,7 +3077,7 @@ static int ext4_da_write_end(struct file *file, + * new_i_size is less that inode->i_size + * bu greater than i_disksize.(hint delalloc) + */ +- ext4_mark_inode_dirty(handle, inode); ++ ret = ext4_mark_inode_dirty(handle, inode); + } + } + +@@ -3094,7 +3094,7 @@ static int ext4_da_write_end(struct file *file, + if (ret2 < 0) + ret = ret2; + ret2 = ext4_journal_stop(handle); +- if (!ret) ++ if (unlikely(ret2 && !ret)) + ret = ret2; + + return ret ? ret : copied; +@@ -3886,6 +3886,8 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, + loff_t len) + { + handle_t *handle; ++ int ret; ++ + loff_t size = i_size_read(inode); + + WARN_ON(!inode_is_locked(inode)); +@@ -3899,10 +3901,10 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, + if (IS_ERR(handle)) + return PTR_ERR(handle); + ext4_update_i_disksize(inode, size); +- ext4_mark_inode_dirty(handle, inode); ++ ret = ext4_mark_inode_dirty(handle, inode); + ext4_journal_stop(handle); + +- return 0; ++ return ret; + } + + static void ext4_wait_dax_page(struct ext4_inode_info *ei) +@@ -3954,7 +3956,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) + loff_t first_block_offset, last_block_offset; + handle_t *handle; + unsigned int credits; +- int ret = 0; ++ int ret = 0, ret2 = 0; + + trace_ext4_punch_hole(inode, offset, length, 0); + +@@ -4077,7 +4079,9 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) + ext4_handle_sync(handle); + + inode->i_mtime = inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ ret2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(ret2)) ++ ret = ret2; + if (ret >= 0) + ext4_update_inode_fsync_trans(handle, inode, 1); + out_stop: +@@ -4146,7 +4150,7 @@ int ext4_truncate(struct inode *inode) + { + struct ext4_inode_info *ei = EXT4_I(inode); + unsigned int credits; +- int err = 0; ++ int err = 0, err2; + handle_t *handle; + struct address_space *mapping = inode->i_mapping; + +@@ -4234,7 +4238,9 @@ out_stop: + ext4_orphan_del(handle, inode); + + inode->i_mtime = inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ err2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(err2 && !err)) ++ err = err2; + ext4_journal_stop(handle); + + trace_ext4_truncate_exit(inode); +@@ -5292,6 +5298,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) + inode->i_gid = attr->ia_gid; + error = ext4_mark_inode_dirty(handle, inode); + ext4_journal_stop(handle); ++ if (unlikely(error)) ++ return error; + } + + if (attr->ia_valid & ATTR_SIZE) { +@@ -5777,7 +5785,8 @@ out_unlock: + * Whenever the user wants stuff synced (sys_sync, sys_msync, sys_fsync) + * we start and wait on commits. + */ +-int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) ++int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode, ++ const char *func, unsigned int line) + { + struct ext4_iloc iloc; + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); +@@ -5787,13 +5796,18 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) + trace_ext4_mark_inode_dirty(inode, _RET_IP_); + err = ext4_reserve_inode_write(handle, inode, &iloc); + if (err) +- return err; ++ goto out; + + if (EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize) + ext4_try_to_expand_extra_isize(inode, sbi->s_want_extra_isize, + iloc, handle); + +- return ext4_mark_iloc_dirty(handle, inode, &iloc); ++ err = ext4_mark_iloc_dirty(handle, inode, &iloc); ++out: ++ if (unlikely(err)) ++ ext4_error_inode_err(inode, func, line, 0, err, ++ "mark_inode_dirty error"); ++ return err; + } + + /* +diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c +index fb6520f37135..c5e3fc998211 100644 +--- a/fs/ext4/migrate.c ++++ b/fs/ext4/migrate.c +@@ -287,7 +287,7 @@ static int free_ind_block(handle_t *handle, struct inode *inode, __le32 *i_data) + static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode, + struct inode *tmp_inode) + { +- int retval; ++ int retval, retval2 = 0; + __le32 i_data[3]; + struct ext4_inode_info *ei = EXT4_I(inode); + struct ext4_inode_info *tmp_ei = EXT4_I(tmp_inode); +@@ -342,7 +342,9 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode, + * i_blocks when freeing the indirect meta-data blocks + */ + retval = free_ind_block(handle, inode, i_data); +- ext4_mark_inode_dirty(handle, inode); ++ retval2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(retval2 && !retval)) ++ retval = retval2; + + err_out: + return retval; +@@ -601,7 +603,7 @@ int ext4_ind_migrate(struct inode *inode) + ext4_lblk_t start, end; + ext4_fsblk_t blk; + handle_t *handle; +- int ret; ++ int ret, ret2 = 0; + + if (!ext4_has_feature_extents(inode->i_sb) || + (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) +@@ -655,7 +657,9 @@ int ext4_ind_migrate(struct inode *inode) + memset(ei->i_data, 0, sizeof(ei->i_data)); + for (i = start; i <= end; i++) + ei->i_data[i] = cpu_to_le32(blk++); +- ext4_mark_inode_dirty(handle, inode); ++ ret2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(ret2 && !ret)) ++ ret = ret2; + errout: + ext4_journal_stop(handle); + up_write(&EXT4_I(inode)->i_data_sem); +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index a8aca4772aaa..56738b538ddf 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -1993,7 +1993,7 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname, + { + unsigned int blocksize = dir->i_sb->s_blocksize; + int csum_size = 0; +- int err; ++ int err, err2; + + if (ext4_has_metadata_csum(inode->i_sb)) + csum_size = sizeof(struct ext4_dir_entry_tail); +@@ -2028,12 +2028,12 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname, + dir->i_mtime = dir->i_ctime = current_time(dir); + ext4_update_dx_flag(dir); + inode_inc_iversion(dir); +- ext4_mark_inode_dirty(handle, dir); ++ err2 = ext4_mark_inode_dirty(handle, dir); + BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); + err = ext4_handle_dirty_dirblock(handle, dir, bh); + if (err) + ext4_std_error(dir->i_sb, err); +- return 0; ++ return err ? err : err2; + } + + /* +@@ -2223,7 +2223,9 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, + } + ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); + dx_fallback++; +- ext4_mark_inode_dirty(handle, dir); ++ retval = ext4_mark_inode_dirty(handle, dir); ++ if (unlikely(retval)) ++ goto out; + } + blocks = dir->i_size >> sb->s_blocksize_bits; + for (block = 0; block < blocks; block++) { +@@ -2576,12 +2578,12 @@ static int ext4_add_nondir(handle_t *handle, + struct inode *inode = *inodep; + int err = ext4_add_entry(handle, dentry, inode); + if (!err) { +- ext4_mark_inode_dirty(handle, inode); ++ err = ext4_mark_inode_dirty(handle, inode); + if (IS_DIRSYNC(dir)) + ext4_handle_sync(handle); + d_instantiate_new(dentry, inode); + *inodep = NULL; +- return 0; ++ return err; + } + drop_nlink(inode); + ext4_orphan_add(handle, inode); +@@ -2775,7 +2777,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) + { + handle_t *handle; + struct inode *inode; +- int err, credits, retries = 0; ++ int err, err2 = 0, credits, retries = 0; + + if (EXT4_DIR_LINK_MAX(dir)) + return -EMLINK; +@@ -2808,7 +2810,9 @@ out_clear_inode: + clear_nlink(inode); + ext4_orphan_add(handle, inode); + unlock_new_inode(inode); +- ext4_mark_inode_dirty(handle, inode); ++ err2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(err2)) ++ err = err2; + ext4_journal_stop(handle); + iput(inode); + goto out_retry; +@@ -3148,10 +3152,12 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry) + inode->i_size = 0; + ext4_orphan_add(handle, inode); + inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ retval = ext4_mark_inode_dirty(handle, inode); ++ if (retval) ++ goto end_rmdir; + ext4_dec_count(handle, dir); + ext4_update_dx_flag(dir); +- ext4_mark_inode_dirty(handle, dir); ++ retval = ext4_mark_inode_dirty(handle, dir); + + #ifdef CONFIG_UNICODE + /* VFS negative dentries are incompatible with Encoding and +@@ -3221,7 +3227,9 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) + goto end_unlink; + dir->i_ctime = dir->i_mtime = current_time(dir); + ext4_update_dx_flag(dir); +- ext4_mark_inode_dirty(handle, dir); ++ retval = ext4_mark_inode_dirty(handle, dir); ++ if (retval) ++ goto end_unlink; + if (inode->i_nlink == 0) + ext4_warning_inode(inode, "Deleting file '%.*s' with no links", + dentry->d_name.len, dentry->d_name.name); +@@ -3230,7 +3238,7 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) + if (!inode->i_nlink) + ext4_orphan_add(handle, inode); + inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ retval = ext4_mark_inode_dirty(handle, inode); + + #ifdef CONFIG_UNICODE + /* VFS negative dentries are incompatible with Encoding and +@@ -3419,7 +3427,7 @@ retry: + + err = ext4_add_entry(handle, dentry, inode); + if (!err) { +- ext4_mark_inode_dirty(handle, inode); ++ err = ext4_mark_inode_dirty(handle, inode); + /* this can happen only for tmpfile being + * linked the first time + */ +@@ -3531,7 +3539,7 @@ static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent, + static int ext4_setent(handle_t *handle, struct ext4_renament *ent, + unsigned ino, unsigned file_type) + { +- int retval; ++ int retval, retval2; + + BUFFER_TRACE(ent->bh, "get write access"); + retval = ext4_journal_get_write_access(handle, ent->bh); +@@ -3543,19 +3551,19 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent, + inode_inc_iversion(ent->dir); + ent->dir->i_ctime = ent->dir->i_mtime = + current_time(ent->dir); +- ext4_mark_inode_dirty(handle, ent->dir); ++ retval = ext4_mark_inode_dirty(handle, ent->dir); + BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata"); + if (!ent->inlined) { +- retval = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh); +- if (unlikely(retval)) { +- ext4_std_error(ent->dir->i_sb, retval); +- return retval; ++ retval2 = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh); ++ if (unlikely(retval2)) { ++ ext4_std_error(ent->dir->i_sb, retval2); ++ return retval2; + } + } + brelse(ent->bh); + ent->bh = NULL; + +- return 0; ++ return retval; + } + + static int ext4_find_delete_entry(handle_t *handle, struct inode *dir, +@@ -3790,7 +3798,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, + EXT4_FT_CHRDEV); + if (retval) + goto end_rename; +- ext4_mark_inode_dirty(handle, whiteout); ++ retval = ext4_mark_inode_dirty(handle, whiteout); ++ if (unlikely(retval)) ++ goto end_rename; + } + if (!new.bh) { + retval = ext4_add_entry(handle, new.dentry, old.inode); +@@ -3811,7 +3821,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, + * rename. + */ + old.inode->i_ctime = current_time(old.inode); +- ext4_mark_inode_dirty(handle, old.inode); ++ retval = ext4_mark_inode_dirty(handle, old.inode); ++ if (unlikely(retval)) ++ goto end_rename; + + if (!whiteout) { + /* +@@ -3840,12 +3852,18 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, + } else { + ext4_inc_count(handle, new.dir); + ext4_update_dx_flag(new.dir); +- ext4_mark_inode_dirty(handle, new.dir); ++ retval = ext4_mark_inode_dirty(handle, new.dir); ++ if (unlikely(retval)) ++ goto end_rename; + } + } +- ext4_mark_inode_dirty(handle, old.dir); ++ retval = ext4_mark_inode_dirty(handle, old.dir); ++ if (unlikely(retval)) ++ goto end_rename; + if (new.inode) { +- ext4_mark_inode_dirty(handle, new.inode); ++ retval = ext4_mark_inode_dirty(handle, new.inode); ++ if (unlikely(retval)) ++ goto end_rename; + if (!new.inode->i_nlink) + ext4_orphan_add(handle, new.inode); + } +@@ -3979,8 +3997,12 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry, + ctime = current_time(old.inode); + old.inode->i_ctime = ctime; + new.inode->i_ctime = ctime; +- ext4_mark_inode_dirty(handle, old.inode); +- ext4_mark_inode_dirty(handle, new.inode); ++ retval = ext4_mark_inode_dirty(handle, old.inode); ++ if (unlikely(retval)) ++ goto end_rename; ++ retval = ext4_mark_inode_dirty(handle, new.inode); ++ if (unlikely(retval)) ++ goto end_rename; + + if (old.dir_bh) { + retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index bf5fcb477f66..7318ca71b69e 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -522,9 +522,6 @@ static void ext4_handle_error(struct super_block *sb) + smp_wmb(); + sb->s_flags |= SB_RDONLY; + } else if (test_opt(sb, ERRORS_PANIC)) { +- if (EXT4_SB(sb)->s_journal && +- !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) +- return; + panic("EXT4-fs (device %s): panic forced after error\n", + sb->s_id); + } +@@ -725,23 +722,20 @@ void __ext4_abort(struct super_block *sb, const char *function, + va_end(args); + + if (sb_rdonly(sb) == 0) { +- ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only"); + EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED; ++ if (EXT4_SB(sb)->s_journal) ++ jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); ++ ++ ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only"); + /* + * Make sure updated value of ->s_mount_flags will be visible + * before ->s_flags update + */ + smp_wmb(); + sb->s_flags |= SB_RDONLY; +- if (EXT4_SB(sb)->s_journal) +- jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); + } +- if (test_opt(sb, ERRORS_PANIC) && !system_going_down()) { +- if (EXT4_SB(sb)->s_journal && +- !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) +- return; ++ if (test_opt(sb, ERRORS_PANIC) && !system_going_down()) + panic("EXT4-fs panic from previous error\n"); +- } + } + + void __ext4_msg(struct super_block *sb, +@@ -2086,6 +2080,16 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, + #endif + } else if (token == Opt_dax) { + #ifdef CONFIG_FS_DAX ++ if (is_remount && test_opt(sb, DAX)) { ++ ext4_msg(sb, KERN_ERR, "can't mount with " ++ "both data=journal and dax"); ++ return -1; ++ } ++ if (is_remount && !(sbi->s_mount_opt & EXT4_MOUNT_DAX)) { ++ ext4_msg(sb, KERN_ERR, "can't change " ++ "dax mount option while remounting"); ++ return -1; ++ } + ext4_msg(sb, KERN_WARNING, + "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); + sbi->s_mount_opt |= m->mount_opt; +@@ -2344,6 +2348,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, + ext4_msg(sb, KERN_ERR, "revision level too high, " + "forcing read-only mode"); + err = -EROFS; ++ goto done; + } + if (read_only) + goto done; +@@ -5412,12 +5417,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) + err = -EINVAL; + goto restore_opts; + } +- if (test_opt(sb, DAX)) { +- ext4_msg(sb, KERN_ERR, "can't mount with " +- "both data=journal and dax"); +- err = -EINVAL; +- goto restore_opts; +- } + } else if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) { + if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { + ext4_msg(sb, KERN_ERR, "can't mount with " +@@ -5433,12 +5432,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) + goto restore_opts; + } + +- if ((sbi->s_mount_opt ^ old_opts.s_mount_opt) & EXT4_MOUNT_DAX) { +- ext4_msg(sb, KERN_WARNING, "warning: refusing change of " +- "dax flag with busy inodes while remounting"); +- sbi->s_mount_opt ^= EXT4_MOUNT_DAX; +- } +- + if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) + ext4_abort(sb, EXT4_ERR_ESHUTDOWN, "Abort forced by user"); + +@@ -5885,7 +5878,7 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, + EXT4_I(inode)->i_flags |= EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL; + inode_set_flags(inode, S_NOATIME | S_IMMUTABLE, + S_NOATIME | S_IMMUTABLE); +- ext4_mark_inode_dirty(handle, inode); ++ err = ext4_mark_inode_dirty(handle, inode); + ext4_journal_stop(handle); + unlock_inode: + inode_unlock(inode); +@@ -5987,12 +5980,14 @@ static int ext4_quota_off(struct super_block *sb, int type) + * this is not a hard failure and quotas are already disabled. + */ + handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1); +- if (IS_ERR(handle)) ++ if (IS_ERR(handle)) { ++ err = PTR_ERR(handle); + goto out_unlock; ++ } + EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL); + inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE); + inode->i_mtime = inode->i_ctime = current_time(inode); +- ext4_mark_inode_dirty(handle, inode); ++ err = ext4_mark_inode_dirty(handle, inode); + ext4_journal_stop(handle); + out_unlock: + inode_unlock(inode); +@@ -6050,7 +6045,7 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type, + { + struct inode *inode = sb_dqopt(sb)->files[type]; + ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); +- int err, offset = off & (sb->s_blocksize - 1); ++ int err = 0, err2 = 0, offset = off & (sb->s_blocksize - 1); + int retries = 0; + struct buffer_head *bh; + handle_t *handle = journal_current_handle(); +@@ -6098,9 +6093,11 @@ out: + if (inode->i_size < off + len) { + i_size_write(inode, off + len); + EXT4_I(inode)->i_disksize = inode->i_size; +- ext4_mark_inode_dirty(handle, inode); ++ err2 = ext4_mark_inode_dirty(handle, inode); ++ if (unlikely(err2 && !err)) ++ err = err2; + } +- return len; ++ return err ? err : len; + } + #endif + +diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c +index 01ba66373e97..9b29a40738ac 100644 +--- a/fs/ext4/xattr.c ++++ b/fs/ext4/xattr.c +@@ -1327,7 +1327,7 @@ static int ext4_xattr_inode_write(handle_t *handle, struct inode *ea_inode, + int blocksize = ea_inode->i_sb->s_blocksize; + int max_blocks = (bufsize + blocksize - 1) >> ea_inode->i_blkbits; + int csize, wsize = 0; +- int ret = 0; ++ int ret = 0, ret2 = 0; + int retries = 0; + + retry: +@@ -1385,7 +1385,9 @@ retry: + ext4_update_i_disksize(ea_inode, wsize); + inode_unlock(ea_inode); + +- ext4_mark_inode_dirty(handle, ea_inode); ++ ret2 = ext4_mark_inode_dirty(handle, ea_inode); ++ if (unlikely(ret2 && !ret)) ++ ret = ret2; + + out: + brelse(bh); +diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c +index 852890b72d6a..448b3dc6f925 100644 +--- a/fs/f2fs/checkpoint.c ++++ b/fs/f2fs/checkpoint.c +@@ -889,8 +889,8 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + int i; + int err; + +- sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks), +- GFP_KERNEL); ++ sbi->ckpt = f2fs_kvzalloc(sbi, array_size(blk_size, cp_blks), ++ GFP_KERNEL); + if (!sbi->ckpt) + return -ENOMEM; + /* +diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c +index df7b2d15eacd..a5b2e72174bb 100644 +--- a/fs/f2fs/compress.c ++++ b/fs/f2fs/compress.c +@@ -236,7 +236,12 @@ static int lz4_init_compress_ctx(struct compress_ctx *cc) + if (!cc->private) + return -ENOMEM; + +- cc->clen = LZ4_compressBound(PAGE_SIZE << cc->log_cluster_size); ++ /* ++ * we do not change cc->clen to LZ4_compressBound(inputsize) to ++ * adapt worst compress case, because lz4 compressor can handle ++ * output budget properly. ++ */ ++ cc->clen = cc->rlen - PAGE_SIZE - COMPRESS_HEADER_SIZE; + return 0; + } + +@@ -252,11 +257,9 @@ static int lz4_compress_pages(struct compress_ctx *cc) + + len = LZ4_compress_default(cc->rbuf, cc->cbuf->cdata, cc->rlen, + cc->clen, cc->private); +- if (!len) { +- printk_ratelimited("%sF2FS-fs (%s): lz4 compress failed\n", +- KERN_ERR, F2FS_I_SB(cc->inode)->sb->s_id); +- return -EIO; +- } ++ if (!len) ++ return -EAGAIN; ++ + cc->clen = len; + return 0; + } +@@ -366,6 +369,13 @@ static int zstd_compress_pages(struct compress_ctx *cc) + return -EIO; + } + ++ /* ++ * there is compressed data remained in intermediate buffer due to ++ * no more space in cbuf.cdata ++ */ ++ if (ret) ++ return -EAGAIN; ++ + cc->clen = outbuf.pos; + return 0; + } +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index cdf2f626bea7..10491ae1cb85 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -2130,16 +2130,16 @@ submit_and_realloc: + page->index, for_write); + if (IS_ERR(bio)) { + ret = PTR_ERR(bio); +- bio = NULL; + dic->failed = true; + if (refcount_sub_and_test(dic->nr_cpages - i, +- &dic->ref)) ++ &dic->ref)) { + f2fs_decompress_end_io(dic->rpages, + cc->cluster_size, true, + false); +- f2fs_free_dic(dic); ++ f2fs_free_dic(dic); ++ } + f2fs_put_dnode(&dn); +- *bio_ret = bio; ++ *bio_ret = NULL; + return ret; + } + } +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index 44bfc464df78..54e90dbb09e7 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -107,36 +107,28 @@ static struct f2fs_dir_entry *find_in_block(struct inode *dir, + /* + * Test whether a case-insensitive directory entry matches the filename + * being searched for. +- * +- * Returns: 0 if the directory entry matches, more than 0 if it +- * doesn't match or less than zero on error. + */ +-int f2fs_ci_compare(const struct inode *parent, const struct qstr *name, +- const struct qstr *entry, bool quick) ++static bool f2fs_match_ci_name(const struct inode *dir, const struct qstr *name, ++ const struct qstr *entry, bool quick) + { +- const struct f2fs_sb_info *sbi = F2FS_SB(parent->i_sb); ++ const struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb); + const struct unicode_map *um = sbi->s_encoding; +- int ret; ++ int res; + + if (quick) +- ret = utf8_strncasecmp_folded(um, name, entry); ++ res = utf8_strncasecmp_folded(um, name, entry); + else +- ret = utf8_strncasecmp(um, name, entry); +- +- if (ret < 0) { +- /* Handle invalid character sequence as either an error +- * or as an opaque byte sequence. ++ res = utf8_strncasecmp(um, name, entry); ++ if (res < 0) { ++ /* ++ * In strict mode, ignore invalid names. In non-strict mode, ++ * fall back to treating them as opaque byte sequences. + */ +- if (f2fs_has_strict_mode(sbi)) +- return -EINVAL; +- +- if (name->len != entry->len) +- return 1; +- +- return !!memcmp(name->name, entry->name, name->len); ++ if (f2fs_has_strict_mode(sbi) || name->len != entry->len) ++ return false; ++ return !memcmp(name->name, entry->name, name->len); + } +- +- return ret; ++ return res == 0; + } + + static void f2fs_fname_setup_ci_filename(struct inode *dir, +@@ -188,10 +180,10 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d, + if (cf_str->name) { + struct qstr cf = {.name = cf_str->name, + .len = cf_str->len}; +- return !f2fs_ci_compare(parent, &cf, &entry, true); ++ return f2fs_match_ci_name(parent, &cf, &entry, true); + } +- return !f2fs_ci_compare(parent, fname->usr_fname, &entry, +- false); ++ return f2fs_match_ci_name(parent, fname->usr_fname, &entry, ++ false); + } + #endif + if (fscrypt_match_name(fname, d->filename[bit_pos], +@@ -1080,17 +1072,41 @@ const struct file_operations f2fs_dir_operations = { + static int f2fs_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) + { +- struct qstr qstr = {.name = str, .len = len }; + const struct dentry *parent = READ_ONCE(dentry->d_parent); +- const struct inode *inode = READ_ONCE(parent->d_inode); ++ const struct inode *dir = READ_ONCE(parent->d_inode); ++ const struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb); ++ struct qstr entry = QSTR_INIT(str, len); ++ char strbuf[DNAME_INLINE_LEN]; ++ int res; ++ ++ if (!dir || !IS_CASEFOLDED(dir)) ++ goto fallback; + +- if (!inode || !IS_CASEFOLDED(inode)) { +- if (len != name->len) +- return -1; +- return memcmp(str, name->name, len); ++ /* ++ * If the dentry name is stored in-line, then it may be concurrently ++ * modified by a rename. If this happens, the VFS will eventually retry ++ * the lookup, so it doesn't matter what ->d_compare() returns. ++ * However, it's unsafe to call utf8_strncasecmp() with an unstable ++ * string. Therefore, we have to copy the name into a temporary buffer. ++ */ ++ if (len <= DNAME_INLINE_LEN - 1) { ++ memcpy(strbuf, str, len); ++ strbuf[len] = 0; ++ entry.name = strbuf; ++ /* prevent compiler from optimizing out the temporary buffer */ ++ barrier(); + } + +- return f2fs_ci_compare(inode, name, &qstr, false); ++ res = utf8_strncasecmp(sbi->s_encoding, name, &entry); ++ if (res >= 0) ++ return res; ++ ++ if (f2fs_has_strict_mode(sbi)) ++ return -EINVAL; ++fallback: ++ if (len != name->len) ++ return 1; ++ return !!memcmp(str, name->name, len); + } + + static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str) +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 7c5dd7f666a0..5a0f95dfbac2 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -2936,18 +2936,12 @@ static inline bool f2fs_may_extent_tree(struct inode *inode) + static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, + size_t size, gfp_t flags) + { +- void *ret; +- + if (time_to_inject(sbi, FAULT_KMALLOC)) { + f2fs_show_injection_info(sbi, FAULT_KMALLOC); + return NULL; + } + +- ret = kmalloc(size, flags); +- if (ret) +- return ret; +- +- return kvmalloc(size, flags); ++ return kmalloc(size, flags); + } + + static inline void *f2fs_kzalloc(struct f2fs_sb_info *sbi, +@@ -3107,11 +3101,6 @@ int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name, + bool hot, bool set); + struct dentry *f2fs_get_parent(struct dentry *child); + +-extern int f2fs_ci_compare(const struct inode *parent, +- const struct qstr *name, +- const struct qstr *entry, +- bool quick); +- + /* + * dir.c + */ +@@ -3656,7 +3645,7 @@ static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; } + static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { } + static inline void __init f2fs_create_root_stats(void) { } + static inline void f2fs_destroy_root_stats(void) { } +-static inline void update_sit_info(struct f2fs_sb_info *sbi) {} ++static inline void f2fs_update_sit_info(struct f2fs_sb_info *sbi) {} + #endif + + extern const struct file_operations f2fs_dir_operations; +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 6ab8f621a3c5..30b35915fa3a 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -2219,8 +2219,15 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) + + if (in != F2FS_GOING_DOWN_FULLSYNC) { + ret = mnt_want_write_file(filp); +- if (ret) ++ if (ret) { ++ if (ret == -EROFS) { ++ ret = 0; ++ f2fs_stop_checkpoint(sbi, false); ++ set_sbi_flag(sbi, SBI_IS_SHUTDOWN); ++ trace_f2fs_shutdown(sbi, in, ret); ++ } + return ret; ++ } + } + + switch (in) { +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index ecbd6bd14a49..daf531e69b67 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -2928,7 +2928,7 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi) + return 0; + + nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8); +- nm_i->nat_bits = f2fs_kzalloc(sbi, ++ nm_i->nat_bits = f2fs_kvzalloc(sbi, + nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL); + if (!nm_i->nat_bits) + return -ENOMEM; +@@ -3061,9 +3061,9 @@ static int init_free_nid_cache(struct f2fs_sb_info *sbi) + int i; + + nm_i->free_nid_bitmap = +- f2fs_kzalloc(sbi, array_size(sizeof(unsigned char *), +- nm_i->nat_blocks), +- GFP_KERNEL); ++ f2fs_kvzalloc(sbi, array_size(sizeof(unsigned char *), ++ nm_i->nat_blocks), ++ GFP_KERNEL); + if (!nm_i->free_nid_bitmap) + return -ENOMEM; + +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 56ccb8323e21..4696c9cb47a5 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1303,7 +1303,8 @@ static int f2fs_statfs_project(struct super_block *sb, + limit >>= sb->s_blocksize_bits; + + if (limit && buf->f_blocks > limit) { +- curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; ++ curblock = (dquot->dq_dqb.dqb_curspace + ++ dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; + buf->f_blocks = limit; + buf->f_bfree = buf->f_bavail = + (buf->f_blocks > curblock) ? +@@ -3038,7 +3039,7 @@ static int init_blkz_info(struct f2fs_sb_info *sbi, int devi) + if (nr_sectors & (bdev_zone_sectors(bdev) - 1)) + FDEV(devi).nr_blkz++; + +- FDEV(devi).blkz_seq = f2fs_kzalloc(sbi, ++ FDEV(devi).blkz_seq = f2fs_kvzalloc(sbi, + BITS_TO_LONGS(FDEV(devi).nr_blkz) + * sizeof(unsigned long), + GFP_KERNEL); +diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c +index 97eec7522bf2..5c155437a455 100644 +--- a/fs/fuse/dev.c ++++ b/fs/fuse/dev.c +@@ -1977,8 +1977,9 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, + struct pipe_buffer *ibuf; + struct pipe_buffer *obuf; + +- BUG_ON(nbuf >= pipe->ring_size); +- BUG_ON(tail == head); ++ if (WARN_ON(nbuf >= count || tail == head)) ++ goto out_free; ++ + ibuf = &pipe->bufs[tail & mask]; + obuf = &bufs[nbuf]; + +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index 9d67b830fb7a..e3afceecaa6b 100644 +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -712,6 +712,7 @@ static ssize_t fuse_async_req_send(struct fuse_conn *fc, + spin_unlock(&io->lock); + + ia->ap.args.end = fuse_aio_complete_req; ++ ia->ap.args.may_block = io->should_dirty; + err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL); + if (err) + fuse_aio_complete_req(fc, &ia->ap.args, err); +@@ -3279,13 +3280,11 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, + if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) + return -EXDEV; + +- if (fc->writeback_cache) { +- inode_lock(inode_in); +- err = fuse_writeback_range(inode_in, pos_in, pos_in + len); +- inode_unlock(inode_in); +- if (err) +- return err; +- } ++ inode_lock(inode_in); ++ err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1); ++ inode_unlock(inode_in); ++ if (err) ++ return err; + + inode_lock(inode_out); + +@@ -3293,11 +3292,27 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, + if (err) + goto out; + +- if (fc->writeback_cache) { +- err = fuse_writeback_range(inode_out, pos_out, pos_out + len); +- if (err) +- goto out; +- } ++ /* ++ * Write out dirty pages in the destination file before sending the COPY ++ * request to userspace. After the request is completed, truncate off ++ * pages (including partial ones) from the cache that have been copied, ++ * since these contain stale data at that point. ++ * ++ * This should be mostly correct, but if the COPY writes to partial ++ * pages (at the start or end) and the parts not covered by the COPY are ++ * written through a memory map after calling fuse_writeback_range(), ++ * then these partial page modifications will be lost on truncation. ++ * ++ * It is unlikely that someone would rely on such mixed style ++ * modifications. Yet this does give less guarantees than if the ++ * copying was performed with write(2). ++ * ++ * To fix this a i_mmap_sem style lock could be used to prevent new ++ * faults while the copy is ongoing. ++ */ ++ err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1); ++ if (err) ++ goto out; + + if (is_unstable) + set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state); +@@ -3318,6 +3333,10 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in, + if (err) + goto out; + ++ truncate_inode_pages_range(inode_out->i_mapping, ++ ALIGN_DOWN(pos_out, PAGE_SIZE), ++ ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1); ++ + if (fc->writeback_cache) { + fuse_write_update_size(inode_out, pos_out + outarg.size); + file_update_time(file_out); +diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h +index ca344bf71404..d7cde216fc87 100644 +--- a/fs/fuse/fuse_i.h ++++ b/fs/fuse/fuse_i.h +@@ -249,6 +249,7 @@ struct fuse_args { + bool out_argvar:1; + bool page_zeroing:1; + bool page_replace:1; ++ bool may_block:1; + struct fuse_in_arg in_args[3]; + struct fuse_arg out_args[2]; + void (*end)(struct fuse_conn *fc, struct fuse_args *args, int error); +diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c +index bade74768903..0c6ef5d3c6ab 100644 +--- a/fs/fuse/virtio_fs.c ++++ b/fs/fuse/virtio_fs.c +@@ -60,6 +60,12 @@ struct virtio_fs_forget { + struct virtio_fs_forget_req req; + }; + ++struct virtio_fs_req_work { ++ struct fuse_req *req; ++ struct virtio_fs_vq *fsvq; ++ struct work_struct done_work; ++}; ++ + static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq, + struct fuse_req *req, bool in_flight); + +@@ -485,19 +491,67 @@ static void copy_args_from_argbuf(struct fuse_args *args, struct fuse_req *req) + } + + /* Work function for request completion */ ++static void virtio_fs_request_complete(struct fuse_req *req, ++ struct virtio_fs_vq *fsvq) ++{ ++ struct fuse_pqueue *fpq = &fsvq->fud->pq; ++ struct fuse_conn *fc = fsvq->fud->fc; ++ struct fuse_args *args; ++ struct fuse_args_pages *ap; ++ unsigned int len, i, thislen; ++ struct page *page; ++ ++ /* ++ * TODO verify that server properly follows FUSE protocol ++ * (oh.uniq, oh.len) ++ */ ++ args = req->args; ++ copy_args_from_argbuf(args, req); ++ ++ if (args->out_pages && args->page_zeroing) { ++ len = args->out_args[args->out_numargs - 1].size; ++ ap = container_of(args, typeof(*ap), args); ++ for (i = 0; i < ap->num_pages; i++) { ++ thislen = ap->descs[i].length; ++ if (len < thislen) { ++ WARN_ON(ap->descs[i].offset); ++ page = ap->pages[i]; ++ zero_user_segment(page, len, thislen); ++ len = 0; ++ } else { ++ len -= thislen; ++ } ++ } ++ } ++ ++ spin_lock(&fpq->lock); ++ clear_bit(FR_SENT, &req->flags); ++ spin_unlock(&fpq->lock); ++ ++ fuse_request_end(fc, req); ++ spin_lock(&fsvq->lock); ++ dec_in_flight_req(fsvq); ++ spin_unlock(&fsvq->lock); ++} ++ ++static void virtio_fs_complete_req_work(struct work_struct *work) ++{ ++ struct virtio_fs_req_work *w = ++ container_of(work, typeof(*w), done_work); ++ ++ virtio_fs_request_complete(w->req, w->fsvq); ++ kfree(w); ++} ++ + static void virtio_fs_requests_done_work(struct work_struct *work) + { + struct virtio_fs_vq *fsvq = container_of(work, struct virtio_fs_vq, + done_work); + struct fuse_pqueue *fpq = &fsvq->fud->pq; +- struct fuse_conn *fc = fsvq->fud->fc; + struct virtqueue *vq = fsvq->vq; + struct fuse_req *req; +- struct fuse_args_pages *ap; + struct fuse_req *next; +- struct fuse_args *args; +- unsigned int len, i, thislen; +- struct page *page; ++ unsigned int len; + LIST_HEAD(reqs); + + /* Collect completed requests off the virtqueue */ +@@ -515,38 +569,20 @@ static void virtio_fs_requests_done_work(struct work_struct *work) + + /* End requests */ + list_for_each_entry_safe(req, next, &reqs, list) { +- /* +- * TODO verify that server properly follows FUSE protocol +- * (oh.uniq, oh.len) +- */ +- args = req->args; +- copy_args_from_argbuf(args, req); +- +- if (args->out_pages && args->page_zeroing) { +- len = args->out_args[args->out_numargs - 1].size; +- ap = container_of(args, typeof(*ap), args); +- for (i = 0; i < ap->num_pages; i++) { +- thislen = ap->descs[i].length; +- if (len < thislen) { +- WARN_ON(ap->descs[i].offset); +- page = ap->pages[i]; +- zero_user_segment(page, len, thislen); +- len = 0; +- } else { +- len -= thislen; +- } +- } +- } +- +- spin_lock(&fpq->lock); +- clear_bit(FR_SENT, &req->flags); + list_del_init(&req->list); +- spin_unlock(&fpq->lock); + +- fuse_request_end(fc, req); +- spin_lock(&fsvq->lock); +- dec_in_flight_req(fsvq); +- spin_unlock(&fsvq->lock); ++ /* blocking async request completes in a worker context */ ++ if (req->args->may_block) { ++ struct virtio_fs_req_work *w; ++ ++ w = kzalloc(sizeof(*w), GFP_NOFS | __GFP_NOFAIL); ++ INIT_WORK(&w->done_work, virtio_fs_complete_req_work); ++ w->fsvq = fsvq; ++ w->req = req; ++ schedule_work(&w->done_work); ++ } else { ++ virtio_fs_request_complete(req, fsvq); ++ } + } + } + +diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c +index 0644e58c6191..b7a5221bea7d 100644 +--- a/fs/gfs2/log.c ++++ b/fs/gfs2/log.c +@@ -1003,8 +1003,10 @@ out: + * @new: New transaction to be merged + */ + +-static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new) ++static void gfs2_merge_trans(struct gfs2_sbd *sdp, struct gfs2_trans *new) + { ++ struct gfs2_trans *old = sdp->sd_log_tr; ++ + WARN_ON_ONCE(!test_bit(TR_ATTACHED, &old->tr_flags)); + + old->tr_num_buf_new += new->tr_num_buf_new; +@@ -1016,6 +1018,11 @@ static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new) + + list_splice_tail_init(&new->tr_databuf, &old->tr_databuf); + list_splice_tail_init(&new->tr_buf, &old->tr_buf); ++ ++ spin_lock(&sdp->sd_ail_lock); ++ list_splice_tail_init(&new->tr_ail1_list, &old->tr_ail1_list); ++ list_splice_tail_init(&new->tr_ail2_list, &old->tr_ail2_list); ++ spin_unlock(&sdp->sd_ail_lock); + } + + static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) +@@ -1027,7 +1034,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) + gfs2_log_lock(sdp); + + if (sdp->sd_log_tr) { +- gfs2_merge_trans(sdp->sd_log_tr, tr); ++ gfs2_merge_trans(sdp, tr); + } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) { + gfs2_assert_withdraw(sdp, test_bit(TR_ALLOCED, &tr->tr_flags)); + sdp->sd_log_tr = tr; +diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c +index e2b69ffcc6a8..094f5fe7c009 100644 +--- a/fs/gfs2/ops_fstype.c ++++ b/fs/gfs2/ops_fstype.c +@@ -880,7 +880,7 @@ fail: + } + + static const match_table_t nolock_tokens = { +- { Opt_jid, "jid=%d\n", }, ++ { Opt_jid, "jid=%d", }, + { Opt_err, NULL }, + }; + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 2698e9b08490..1829be7f63a3 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -513,7 +513,6 @@ enum { + REQ_F_INFLIGHT_BIT, + REQ_F_CUR_POS_BIT, + REQ_F_NOWAIT_BIT, +- REQ_F_IOPOLL_COMPLETED_BIT, + REQ_F_LINK_TIMEOUT_BIT, + REQ_F_TIMEOUT_BIT, + REQ_F_ISREG_BIT, +@@ -556,8 +555,6 @@ enum { + REQ_F_CUR_POS = BIT(REQ_F_CUR_POS_BIT), + /* must not punt to workers */ + REQ_F_NOWAIT = BIT(REQ_F_NOWAIT_BIT), +- /* polled IO has completed */ +- REQ_F_IOPOLL_COMPLETED = BIT(REQ_F_IOPOLL_COMPLETED_BIT), + /* has linked timeout */ + REQ_F_LINK_TIMEOUT = BIT(REQ_F_LINK_TIMEOUT_BIT), + /* timeout request */ +@@ -618,6 +615,8 @@ struct io_kiocb { + int cflags; + bool needs_fixed_file; + u8 opcode; ++ /* polled IO has completed */ ++ u8 iopoll_completed; + + u16 buf_index; + +@@ -1691,6 +1690,18 @@ static int io_put_kbuf(struct io_kiocb *req) + return cflags; + } + ++static void io_iopoll_queue(struct list_head *again) ++{ ++ struct io_kiocb *req; ++ ++ do { ++ req = list_first_entry(again, struct io_kiocb, list); ++ list_del(&req->list); ++ refcount_inc(&req->refs); ++ io_queue_async_work(req); ++ } while (!list_empty(again)); ++} ++ + /* + * Find and free completed poll iocbs + */ +@@ -1699,12 +1710,21 @@ static void io_iopoll_complete(struct io_ring_ctx *ctx, unsigned int *nr_events, + { + struct req_batch rb; + struct io_kiocb *req; ++ LIST_HEAD(again); ++ ++ /* order with ->result store in io_complete_rw_iopoll() */ ++ smp_rmb(); + + rb.to_free = rb.need_iter = 0; + while (!list_empty(done)) { + int cflags = 0; + + req = list_first_entry(done, struct io_kiocb, list); ++ if (READ_ONCE(req->result) == -EAGAIN) { ++ req->iopoll_completed = 0; ++ list_move_tail(&req->list, &again); ++ continue; ++ } + list_del(&req->list); + + if (req->flags & REQ_F_BUFFER_SELECTED) +@@ -1722,18 +1742,9 @@ static void io_iopoll_complete(struct io_ring_ctx *ctx, unsigned int *nr_events, + if (ctx->flags & IORING_SETUP_SQPOLL) + io_cqring_ev_posted(ctx); + io_free_req_many(ctx, &rb); +-} + +-static void io_iopoll_queue(struct list_head *again) +-{ +- struct io_kiocb *req; +- +- do { +- req = list_first_entry(again, struct io_kiocb, list); +- list_del(&req->list); +- refcount_inc(&req->refs); +- io_queue_async_work(req); +- } while (!list_empty(again)); ++ if (!list_empty(&again)) ++ io_iopoll_queue(&again); + } + + static int io_do_iopoll(struct io_ring_ctx *ctx, unsigned int *nr_events, +@@ -1741,7 +1752,6 @@ static int io_do_iopoll(struct io_ring_ctx *ctx, unsigned int *nr_events, + { + struct io_kiocb *req, *tmp; + LIST_HEAD(done); +- LIST_HEAD(again); + bool spin; + int ret; + +@@ -1760,20 +1770,13 @@ static int io_do_iopoll(struct io_ring_ctx *ctx, unsigned int *nr_events, + * If we find a request that requires polling, break out + * and complete those lists first, if we have entries there. + */ +- if (req->flags & REQ_F_IOPOLL_COMPLETED) { ++ if (READ_ONCE(req->iopoll_completed)) { + list_move_tail(&req->list, &done); + continue; + } + if (!list_empty(&done)) + break; + +- if (req->result == -EAGAIN) { +- list_move_tail(&req->list, &again); +- continue; +- } +- if (!list_empty(&again)) +- break; +- + ret = kiocb->ki_filp->f_op->iopoll(kiocb, spin); + if (ret < 0) + break; +@@ -1786,9 +1789,6 @@ static int io_do_iopoll(struct io_ring_ctx *ctx, unsigned int *nr_events, + if (!list_empty(&done)) + io_iopoll_complete(ctx, nr_events, &done); + +- if (!list_empty(&again)) +- io_iopoll_queue(&again); +- + return ret; + } + +@@ -1937,11 +1937,15 @@ static void io_complete_rw_iopoll(struct kiocb *kiocb, long res, long res2) + if (kiocb->ki_flags & IOCB_WRITE) + kiocb_end_write(req); + +- if (res != req->result) ++ if (res != -EAGAIN && res != req->result) + req_set_fail_links(req); +- req->result = res; +- if (res != -EAGAIN) +- req->flags |= REQ_F_IOPOLL_COMPLETED; ++ ++ WRITE_ONCE(req->result, res); ++ /* order with io_poll_complete() checking ->result */ ++ if (res != -EAGAIN) { ++ smp_wmb(); ++ WRITE_ONCE(req->iopoll_completed, 1); ++ } + } + + /* +@@ -1974,7 +1978,7 @@ static void io_iopoll_req_issued(struct io_kiocb *req) + * For fast devices, IO may have already completed. If it has, add + * it to the front so we find it first. + */ +- if (req->flags & REQ_F_IOPOLL_COMPLETED) ++ if (READ_ONCE(req->iopoll_completed)) + list_add(&req->list, &ctx->poll_list); + else + list_add_tail(&req->list, &ctx->poll_list); +@@ -2098,6 +2102,7 @@ static int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe, + kiocb->ki_flags |= IOCB_HIPRI; + kiocb->ki_complete = io_complete_rw_iopoll; + req->result = 0; ++ req->iopoll_completed = 0; + } else { + if (kiocb->ki_flags & IOCB_HIPRI) + return -EINVAL; +@@ -2609,8 +2614,8 @@ copy_iov: + } + } + out_free: +- kfree(iovec); +- req->flags &= ~REQ_F_NEED_CLEANUP; ++ if (!(req->flags & REQ_F_NEED_CLEANUP)) ++ kfree(iovec); + return ret; + } + +@@ -2732,8 +2737,8 @@ copy_iov: + } + } + out_free: +- req->flags &= ~REQ_F_NEED_CLEANUP; +- kfree(iovec); ++ if (!(req->flags & REQ_F_NEED_CLEANUP)) ++ kfree(iovec); + return ret; + } + +@@ -4297,6 +4302,28 @@ static void io_async_queue_proc(struct file *file, struct wait_queue_head *head, + __io_queue_proc(&pt->req->apoll->poll, pt, head); + } + ++static void io_sq_thread_drop_mm(struct io_ring_ctx *ctx) ++{ ++ struct mm_struct *mm = current->mm; ++ ++ if (mm) { ++ unuse_mm(mm); ++ mmput(mm); ++ } ++} ++ ++static int io_sq_thread_acquire_mm(struct io_ring_ctx *ctx, ++ struct io_kiocb *req) ++{ ++ if (io_op_defs[req->opcode].needs_mm && !current->mm) { ++ if (unlikely(!mmget_not_zero(ctx->sqo_mm))) ++ return -EFAULT; ++ use_mm(ctx->sqo_mm); ++ } ++ ++ return 0; ++} ++ + static void io_async_task_func(struct callback_head *cb) + { + struct io_kiocb *req = container_of(cb, struct io_kiocb, task_work); +@@ -4328,12 +4355,17 @@ static void io_async_task_func(struct callback_head *cb) + if (canceled) { + kfree(apoll); + io_cqring_ev_posted(ctx); ++end_req: + req_set_fail_links(req); + io_double_put_req(req); + return; + } + + __set_current_state(TASK_RUNNING); ++ if (io_sq_thread_acquire_mm(ctx, req)) { ++ io_cqring_add_event(req, -EFAULT); ++ goto end_req; ++ } + mutex_lock(&ctx->uring_lock); + __io_queue_sqe(req, NULL); + mutex_unlock(&ctx->uring_lock); +@@ -5892,11 +5924,8 @@ static int io_init_req(struct io_ring_ctx *ctx, struct io_kiocb *req, + if (unlikely(req->opcode >= IORING_OP_LAST)) + return -EINVAL; + +- if (io_op_defs[req->opcode].needs_mm && !current->mm) { +- if (unlikely(!mmget_not_zero(ctx->sqo_mm))) +- return -EFAULT; +- use_mm(ctx->sqo_mm); +- } ++ if (unlikely(io_sq_thread_acquire_mm(ctx, req))) ++ return -EFAULT; + + sqe_flags = READ_ONCE(sqe->flags); + /* enforce forwards compatibility on users */ +@@ -6006,16 +6035,6 @@ fail_req: + return submitted; + } + +-static inline void io_sq_thread_drop_mm(struct io_ring_ctx *ctx) +-{ +- struct mm_struct *mm = current->mm; +- +- if (mm) { +- unuse_mm(mm); +- mmput(mm); +- } +-} +- + static int io_sq_thread(void *data) + { + struct io_ring_ctx *ctx = data; +@@ -7385,7 +7404,17 @@ static void io_ring_exit_work(struct work_struct *work) + if (ctx->rings) + io_cqring_overflow_flush(ctx, true); + +- wait_for_completion(&ctx->completions[0]); ++ /* ++ * If we're doing polled IO and end up having requests being ++ * submitted async (out-of-line), then completions can come in while ++ * we're waiting for refs to drop. We need to reap these manually, ++ * as nobody else will be looking for them. ++ */ ++ while (!wait_for_completion_timeout(&ctx->completions[0], HZ/20)) { ++ io_iopoll_reap_events(ctx); ++ if (ctx->rings) ++ io_cqring_overflow_flush(ctx, true); ++ } + io_ring_ctx_free(ctx); + } + +diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c +index a49d0e670ddf..e4944436e733 100644 +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -1140,6 +1140,7 @@ static journal_t *journal_init_common(struct block_device *bdev, + init_waitqueue_head(&journal->j_wait_commit); + init_waitqueue_head(&journal->j_wait_updates); + init_waitqueue_head(&journal->j_wait_reserved); ++ mutex_init(&journal->j_abort_mutex); + mutex_init(&journal->j_barrier); + mutex_init(&journal->j_checkpoint_mutex); + spin_lock_init(&journal->j_revoke_lock); +@@ -1402,7 +1403,8 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) + printk(KERN_ERR "JBD2: Error %d detected when updating " + "journal superblock for %s.\n", ret, + journal->j_devname); +- jbd2_journal_abort(journal, ret); ++ if (!is_journal_aborted(journal)) ++ jbd2_journal_abort(journal, ret); + } + + return ret; +@@ -2153,6 +2155,13 @@ void jbd2_journal_abort(journal_t *journal, int errno) + { + transaction_t *transaction; + ++ /* ++ * Lock the aborting procedure until everything is done, this avoid ++ * races between filesystem's error handling flow (e.g. ext4_abort()), ++ * ensure panic after the error info is written into journal's ++ * superblock. ++ */ ++ mutex_lock(&journal->j_abort_mutex); + /* + * ESHUTDOWN always takes precedence because a file system check + * caused by any other journal abort error is not required after +@@ -2167,6 +2176,7 @@ void jbd2_journal_abort(journal_t *journal, int errno) + journal->j_errno = errno; + jbd2_journal_update_sb_errno(journal); + } ++ mutex_unlock(&journal->j_abort_mutex); + return; + } + +@@ -2188,10 +2198,7 @@ void jbd2_journal_abort(journal_t *journal, int errno) + * layer could realise that a filesystem check is needed. + */ + jbd2_journal_update_sb_errno(journal); +- +- write_lock(&journal->j_state_lock); +- journal->j_flags |= JBD2_REC_ERR; +- write_unlock(&journal->j_state_lock); ++ mutex_unlock(&journal->j_abort_mutex); + } + + /** +diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c +index a57e7c72c7f4..d49b1d197908 100644 +--- a/fs/nfs/direct.c ++++ b/fs/nfs/direct.c +@@ -731,6 +731,8 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) + nfs_list_remove_request(req); + if (request_commit) { + kref_get(&req->wb_kref); ++ memcpy(&req->wb_verf, &hdr->verf.verifier, ++ sizeof(req->wb_verf)); + nfs_mark_request_commit(req, hdr->lseg, &cinfo, + hdr->ds_commit_idx); + } +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c +index b9d0921cb4fe..0bf1f835de01 100644 +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -833,6 +833,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat, + do_update |= cache_validity & NFS_INO_INVALID_ATIME; + if (request_mask & (STATX_CTIME|STATX_MTIME)) + do_update |= cache_validity & NFS_INO_REVAL_PAGECACHE; ++ if (request_mask & STATX_BLOCKS) ++ do_update |= cache_validity & NFS_INO_INVALID_BLOCKS; + if (do_update) { + /* Update the attribute cache */ + if (!(server->flags & NFS_MOUNT_NOAC)) +@@ -1764,7 +1766,8 @@ out_noforce: + status = nfs_post_op_update_inode_locked(inode, fattr, + NFS_INO_INVALID_CHANGE + | NFS_INO_INVALID_CTIME +- | NFS_INO_INVALID_MTIME); ++ | NFS_INO_INVALID_MTIME ++ | NFS_INO_INVALID_BLOCKS); + return status; + } + +@@ -1871,7 +1874,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) + nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR + | NFS_INO_INVALID_ATIME + | NFS_INO_REVAL_FORCED +- | NFS_INO_REVAL_PAGECACHE); ++ | NFS_INO_REVAL_PAGECACHE ++ | NFS_INO_INVALID_BLOCKS); + + /* Do atomic weak cache consistency updates */ + nfs_wcc_update_inode(inode, fattr); +@@ -2033,8 +2037,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) + inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used); + } else if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED) + inode->i_blocks = fattr->du.nfs2.blocks; +- else ++ else { ++ nfsi->cache_validity |= save_cache_validity & ++ (NFS_INO_INVALID_BLOCKS ++ | NFS_INO_REVAL_FORCED); + cache_revalidated = false; ++ } + + /* Update attrtimeo value if we're out of the unstable period */ + if (attr_changed) { +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index 9056f3dd380e..e32717fd1169 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -7909,7 +7909,7 @@ nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata) + } + + static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = { +- .rpc_call_done = &nfs4_bind_one_conn_to_session_done, ++ .rpc_call_done = nfs4_bind_one_conn_to_session_done, + }; + + /* +diff --git a/fs/nfsd/cache.h b/fs/nfsd/cache.h +index 10ec5ecdf117..65c331f75e9c 100644 +--- a/fs/nfsd/cache.h ++++ b/fs/nfsd/cache.h +@@ -78,6 +78,8 @@ enum { + /* Checksum this amount of the request */ + #define RC_CSUMLEN (256U) + ++int nfsd_drc_slab_create(void); ++void nfsd_drc_slab_free(void); + int nfsd_reply_cache_init(struct nfsd_net *); + void nfsd_reply_cache_shutdown(struct nfsd_net *); + int nfsd_cache_lookup(struct svc_rqst *); +diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h +index 09aa545825bd..9217cb64bf0e 100644 +--- a/fs/nfsd/netns.h ++++ b/fs/nfsd/netns.h +@@ -139,7 +139,6 @@ struct nfsd_net { + * Duplicate reply cache + */ + struct nfsd_drc_bucket *drc_hashtbl; +- struct kmem_cache *drc_slab; + + /* max number of entries allowed in the cache */ + unsigned int max_drc_entries; +diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c +index 5cf91322de0f..07e0c6f6322f 100644 +--- a/fs/nfsd/nfs4callback.c ++++ b/fs/nfsd/nfs4callback.c +@@ -1301,6 +1301,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) + err = setup_callback_client(clp, &conn, ses); + if (err) { + nfsd4_mark_cb_down(clp, err); ++ if (c) ++ svc_xprt_put(c->cn_xprt); + return; + } + } +diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c +index 96352ab7bd81..4a258065188e 100644 +--- a/fs/nfsd/nfscache.c ++++ b/fs/nfsd/nfscache.c +@@ -36,6 +36,8 @@ struct nfsd_drc_bucket { + spinlock_t cache_lock; + }; + ++static struct kmem_cache *drc_slab; ++ + static int nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *vec); + static unsigned long nfsd_reply_cache_count(struct shrinker *shrink, + struct shrink_control *sc); +@@ -95,7 +97,7 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum, + { + struct svc_cacherep *rp; + +- rp = kmem_cache_alloc(nn->drc_slab, GFP_KERNEL); ++ rp = kmem_cache_alloc(drc_slab, GFP_KERNEL); + if (rp) { + rp->c_state = RC_UNUSED; + rp->c_type = RC_NOCACHE; +@@ -129,7 +131,7 @@ nfsd_reply_cache_free_locked(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, + atomic_dec(&nn->num_drc_entries); + nn->drc_mem_usage -= sizeof(*rp); + } +- kmem_cache_free(nn->drc_slab, rp); ++ kmem_cache_free(drc_slab, rp); + } + + static void +@@ -141,6 +143,18 @@ nfsd_reply_cache_free(struct nfsd_drc_bucket *b, struct svc_cacherep *rp, + spin_unlock(&b->cache_lock); + } + ++int nfsd_drc_slab_create(void) ++{ ++ drc_slab = kmem_cache_create("nfsd_drc", ++ sizeof(struct svc_cacherep), 0, 0, NULL); ++ return drc_slab ? 0: -ENOMEM; ++} ++ ++void nfsd_drc_slab_free(void) ++{ ++ kmem_cache_destroy(drc_slab); ++} ++ + int nfsd_reply_cache_init(struct nfsd_net *nn) + { + unsigned int hashsize; +@@ -159,18 +173,13 @@ int nfsd_reply_cache_init(struct nfsd_net *nn) + if (status) + goto out_nomem; + +- nn->drc_slab = kmem_cache_create("nfsd_drc", +- sizeof(struct svc_cacherep), 0, 0, NULL); +- if (!nn->drc_slab) +- goto out_shrinker; +- + nn->drc_hashtbl = kcalloc(hashsize, + sizeof(*nn->drc_hashtbl), GFP_KERNEL); + if (!nn->drc_hashtbl) { + nn->drc_hashtbl = vzalloc(array_size(hashsize, + sizeof(*nn->drc_hashtbl))); + if (!nn->drc_hashtbl) +- goto out_slab; ++ goto out_shrinker; + } + + for (i = 0; i < hashsize; i++) { +@@ -180,8 +189,6 @@ int nfsd_reply_cache_init(struct nfsd_net *nn) + nn->drc_hashsize = hashsize; + + return 0; +-out_slab: +- kmem_cache_destroy(nn->drc_slab); + out_shrinker: + unregister_shrinker(&nn->nfsd_reply_cache_shrinker); + out_nomem: +@@ -209,8 +216,6 @@ void nfsd_reply_cache_shutdown(struct nfsd_net *nn) + nn->drc_hashtbl = NULL; + nn->drc_hashsize = 0; + +- kmem_cache_destroy(nn->drc_slab); +- nn->drc_slab = NULL; + } + + /* +@@ -464,8 +469,7 @@ found_entry: + rtn = RC_REPLY; + break; + default: +- printk(KERN_WARNING "nfsd: bad repcache type %d\n", rp->c_type); +- nfsd_reply_cache_free_locked(b, rp, nn); ++ WARN_ONCE(1, "nfsd: bad repcache type %d\n", rp->c_type); + } + + goto out; +diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c +index 3bb2db947d29..71687d99b090 100644 +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -1533,6 +1533,9 @@ static int __init init_nfsd(void) + goto out_free_slabs; + nfsd_fault_inject_init(); /* nfsd fault injection controls */ + nfsd_stat_init(); /* Statistics */ ++ retval = nfsd_drc_slab_create(); ++ if (retval) ++ goto out_free_stat; + nfsd_lockd_init(); /* lockd->nfsd callbacks */ + retval = create_proc_exports_entry(); + if (retval) +@@ -1546,6 +1549,8 @@ out_free_all: + remove_proc_entry("fs/nfs", NULL); + out_free_lockd: + nfsd_lockd_shutdown(); ++ nfsd_drc_slab_free(); ++out_free_stat: + nfsd_stat_shutdown(); + nfsd_fault_inject_cleanup(); + nfsd4_exit_pnfs(); +@@ -1560,6 +1565,7 @@ out_unregister_pernet: + + static void __exit exit_nfsd(void) + { ++ nfsd_drc_slab_free(); + remove_proc_entry("fs/nfs/exports", NULL); + remove_proc_entry("fs/nfs", NULL); + nfsd_stat_shutdown(); +diff --git a/fs/proc/bootconfig.c b/fs/proc/bootconfig.c +index 9955d75c0585..ad31ec4ad627 100644 +--- a/fs/proc/bootconfig.c ++++ b/fs/proc/bootconfig.c +@@ -26,8 +26,9 @@ static int boot_config_proc_show(struct seq_file *m, void *v) + static int __init copy_xbc_key_value_list(char *dst, size_t size) + { + struct xbc_node *leaf, *vnode; +- const char *val; + char *key, *end = dst + size; ++ const char *val; ++ char q; + int ret = 0; + + key = kzalloc(XBC_KEYLEN_MAX, GFP_KERNEL); +@@ -41,16 +42,20 @@ static int __init copy_xbc_key_value_list(char *dst, size_t size) + break; + dst += ret; + vnode = xbc_node_get_child(leaf); +- if (vnode && xbc_node_is_array(vnode)) { ++ if (vnode) { + xbc_array_for_each_value(vnode, val) { +- ret = snprintf(dst, rest(dst, end), "\"%s\"%s", +- val, vnode->next ? ", " : "\n"); ++ if (strchr(val, '"')) ++ q = '\''; ++ else ++ q = '"'; ++ ret = snprintf(dst, rest(dst, end), "%c%s%c%s", ++ q, val, q, vnode->next ? ", " : "\n"); + if (ret < 0) + goto out; + dst += ret; + } + } else { +- ret = snprintf(dst, rest(dst, end), "\"%s\"\n", val); ++ ret = snprintf(dst, rest(dst, end), "\"\"\n"); + if (ret < 0) + break; + dst += ret; +diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c +index d1772786af29..8845faa8161a 100644 +--- a/fs/xfs/xfs_inode.c ++++ b/fs/xfs/xfs_inode.c +@@ -2639,8 +2639,10 @@ xfs_ifree_cluster( + error = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, + mp->m_bsize * igeo->blocks_per_cluster, + XBF_UNMAPPED, &bp); +- if (error) ++ if (error) { ++ xfs_perag_put(pag); + return error; ++ } + + /* + * This buffer may not have been correctly initialised as we +diff --git a/include/linux/bitops.h b/include/linux/bitops.h +index 9acf654f0b19..99f2ac30b1d9 100644 +--- a/include/linux/bitops.h ++++ b/include/linux/bitops.h +@@ -72,7 +72,7 @@ static inline int get_bitmask_order(unsigned int count) + + static __always_inline unsigned long hweight_long(unsigned long w) + { +- return sizeof(w) == 4 ? hweight32(w) : hweight64(w); ++ return sizeof(w) == 4 ? hweight32(w) : hweight64((__u64)w); + } + + /** +diff --git a/include/linux/coresight.h b/include/linux/coresight.h +index 193cc9dbf448..09f0565a5de3 100644 +--- a/include/linux/coresight.h ++++ b/include/linux/coresight.h +@@ -100,10 +100,12 @@ union coresight_dev_subtype { + }; + + /** +- * struct coresight_platform_data - data harvested from the DT specification +- * @nr_inport: number of input ports for this component. +- * @nr_outport: number of output ports for this component. +- * @conns: Array of nr_outport connections from this component ++ * struct coresight_platform_data - data harvested from the firmware ++ * specification. ++ * ++ * @nr_inport: Number of elements for the input connections. ++ * @nr_outport: Number of elements for the output connections. ++ * @conns: Sparse array of nr_outport connections from this component. + */ + struct coresight_platform_data { + int nr_inport; +diff --git a/include/linux/ioport.h b/include/linux/ioport.h +index a9b9170b5dd2..6c3eca90cbc4 100644 +--- a/include/linux/ioport.h ++++ b/include/linux/ioport.h +@@ -301,5 +301,11 @@ struct resource *devm_request_free_mem_region(struct device *dev, + struct resource *request_free_mem_region(struct resource *base, + unsigned long size, const char *name); + ++#ifdef CONFIG_IO_STRICT_DEVMEM ++void revoke_devmem(struct resource *res); ++#else ++static inline void revoke_devmem(struct resource *res) { }; ++#endif ++ + #endif /* __ASSEMBLY__ */ + #endif /* _LINUX_IOPORT_H */ +diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h +index f613d8529863..d56128df2aff 100644 +--- a/include/linux/jbd2.h ++++ b/include/linux/jbd2.h +@@ -765,6 +765,11 @@ struct journal_s + */ + int j_errno; + ++ /** ++ * @j_abort_mutex: Lock the whole aborting procedure. ++ */ ++ struct mutex j_abort_mutex; ++ + /** + * @j_sb_buffer: The first part of the superblock buffer. + */ +@@ -1247,7 +1252,6 @@ JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3) + #define JBD2_ABORT_ON_SYNCDATA_ERR 0x040 /* Abort the journal on file + * data write error in ordered + * mode */ +-#define JBD2_REC_ERR 0x080 /* The errno in the sb has been recorded */ + + /* + * Function declarations for the journaling transaction and buffer +diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h +index 04bdaf01112c..645fd401c856 100644 +--- a/include/linux/kprobes.h ++++ b/include/linux/kprobes.h +@@ -350,6 +350,10 @@ static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void) + return this_cpu_ptr(&kprobe_ctlblk); + } + ++extern struct kprobe kprobe_busy; ++void kprobe_busy_begin(void); ++void kprobe_busy_end(void); ++ + kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset); + int register_kprobe(struct kprobe *p); + void unregister_kprobe(struct kprobe *p); +diff --git a/include/linux/libata.h b/include/linux/libata.h +index cffa4714bfa8..ae6dfc107ea8 100644 +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -22,6 +22,7 @@ + #include <linux/acpi.h> + #include <linux/cdrom.h> + #include <linux/sched.h> ++#include <linux/async.h> + + /* + * Define if arch has non-standard setup. This is a _PCI_ standard +@@ -872,6 +873,8 @@ struct ata_port { + struct timer_list fastdrain_timer; + unsigned long fastdrain_cnt; + ++ async_cookie_t cookie; ++ + int em_message_type; + void *private_data; + +diff --git a/include/linux/mfd/stmfx.h b/include/linux/mfd/stmfx.h +index 3c67983678ec..744dce63946e 100644 +--- a/include/linux/mfd/stmfx.h ++++ b/include/linux/mfd/stmfx.h +@@ -109,6 +109,7 @@ struct stmfx { + struct device *dev; + struct regmap *map; + struct regulator *vdd; ++ int irq; + struct irq_domain *irq_domain; + struct mutex lock; /* IRQ bus lock */ + u8 irq_src; +diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h +index 73eda45f1cfd..6ee9119acc5d 100644 +--- a/include/linux/nfs_fs.h ++++ b/include/linux/nfs_fs.h +@@ -230,6 +230,7 @@ struct nfs4_copy_state { + #define NFS_INO_INVALID_OTHER BIT(12) /* other attrs are invalid */ + #define NFS_INO_DATA_INVAL_DEFER \ + BIT(13) /* Deferred cache invalidation */ ++#define NFS_INO_INVALID_BLOCKS BIT(14) /* cached blocks are invalid */ + + #define NFS_INO_INVALID_ATTR (NFS_INO_INVALID_CHANGE \ + | NFS_INO_INVALID_CTIME \ +diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h +index 8675e145ea8b..2040696d75b6 100644 +--- a/include/linux/usb/composite.h ++++ b/include/linux/usb/composite.h +@@ -249,6 +249,9 @@ int usb_function_activate(struct usb_function *); + + int usb_interface_id(struct usb_configuration *, struct usb_function *); + ++int config_ep_by_speed_and_alt(struct usb_gadget *g, struct usb_function *f, ++ struct usb_ep *_ep, u8 alt); ++ + int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f, + struct usb_ep *_ep); + +diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h +index 9411c08a5c7e..73a6113322c6 100644 +--- a/include/linux/usb/gadget.h ++++ b/include/linux/usb/gadget.h +@@ -373,6 +373,7 @@ struct usb_gadget_ops { + * @connected: True if gadget is connected. + * @lpm_capable: If the gadget max_speed is FULL or HIGH, this flag + * indicates that it supports LPM as per the LPM ECN & errata. ++ * @irq: the interrupt number for device controller. + * + * Gadgets have a mostly-portable "gadget driver" implementing device + * functions, handling all usb configurations and interfaces. Gadget +@@ -427,6 +428,7 @@ struct usb_gadget { + unsigned deactivated:1; + unsigned connected:1; + unsigned lpm_capable:1; ++ int irq; + }; + #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) + +diff --git a/include/sound/soc.h b/include/sound/soc.h +index 946f88a6c63d..8e480efeda2a 100644 +--- a/include/sound/soc.h ++++ b/include/sound/soc.h +@@ -790,9 +790,6 @@ struct snd_soc_dai_link { + const struct snd_soc_pcm_stream *params; + unsigned int num_params; + +- struct snd_soc_dapm_widget *playback_widget; +- struct snd_soc_dapm_widget *capture_widget; +- + unsigned int dai_fmt; /* format to set on init */ + + enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */ +@@ -1156,6 +1153,9 @@ struct snd_soc_pcm_runtime { + struct snd_soc_dai **cpu_dais; + unsigned int num_cpus; + ++ struct snd_soc_dapm_widget *playback_widget; ++ struct snd_soc_dapm_widget *capture_widget; ++ + struct delayed_work delayed_work; + void (*close_delayed_work_func)(struct snd_soc_pcm_runtime *rtd); + #ifdef CONFIG_DEBUG_FS +@@ -1177,7 +1177,7 @@ struct snd_soc_pcm_runtime { + #define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus] + + #define for_each_rtd_components(rtd, i, component) \ +- for ((i) = 0; \ ++ for ((i) = 0, component = NULL; \ + ((i) < rtd->num_components) && ((component) = rtd->components[i]);\ + (i)++) + #define for_each_rtd_cpu_dais(rtd, i, dai) \ +diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h +index c612cabbc378..93eddd32bd74 100644 +--- a/include/trace/events/afs.h ++++ b/include/trace/events/afs.h +@@ -988,24 +988,22 @@ TRACE_EVENT(afs_edit_dir, + ); + + TRACE_EVENT(afs_protocol_error, +- TP_PROTO(struct afs_call *call, int error, enum afs_eproto_cause cause), ++ TP_PROTO(struct afs_call *call, enum afs_eproto_cause cause), + +- TP_ARGS(call, error, cause), ++ TP_ARGS(call, cause), + + TP_STRUCT__entry( + __field(unsigned int, call ) +- __field(int, error ) + __field(enum afs_eproto_cause, cause ) + ), + + TP_fast_assign( + __entry->call = call ? call->debug_id : 0; +- __entry->error = error; + __entry->cause = cause; + ), + +- TP_printk("c=%08x r=%d %s", +- __entry->call, __entry->error, ++ TP_printk("c=%08x %s", ++ __entry->call, + __print_symbolic(__entry->cause, afs_eproto_causes)) + ); + +diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h +index d78064007b17..f3956fc11de6 100644 +--- a/include/uapi/linux/magic.h ++++ b/include/uapi/linux/magic.h +@@ -94,6 +94,7 @@ + #define BALLOON_KVM_MAGIC 0x13661366 + #define ZSMALLOC_MAGIC 0x58295829 + #define DMA_BUF_MAGIC 0x444d4142 /* "DMAB" */ ++#define DEVMEM_MAGIC 0x454d444d /* "DMEM" */ + #define Z3FOLD_MAGIC 0x33 + #define PPC_CMM_MAGIC 0xc7571590 + +diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c +index 5e52765161f9..c8acc8f37583 100644 +--- a/kernel/bpf/syscall.c ++++ b/kernel/bpf/syscall.c +@@ -2924,6 +2924,7 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog) + struct bpf_insn *insns; + u32 off, type; + u64 imm; ++ u8 code; + int i; + + insns = kmemdup(prog->insnsi, bpf_prog_insn_size(prog), +@@ -2932,21 +2933,27 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog) + return insns; + + for (i = 0; i < prog->len; i++) { +- if (insns[i].code == (BPF_JMP | BPF_TAIL_CALL)) { ++ code = insns[i].code; ++ ++ if (code == (BPF_JMP | BPF_TAIL_CALL)) { + insns[i].code = BPF_JMP | BPF_CALL; + insns[i].imm = BPF_FUNC_tail_call; + /* fall-through */ + } +- if (insns[i].code == (BPF_JMP | BPF_CALL) || +- insns[i].code == (BPF_JMP | BPF_CALL_ARGS)) { +- if (insns[i].code == (BPF_JMP | BPF_CALL_ARGS)) ++ if (code == (BPF_JMP | BPF_CALL) || ++ code == (BPF_JMP | BPF_CALL_ARGS)) { ++ if (code == (BPF_JMP | BPF_CALL_ARGS)) + insns[i].code = BPF_JMP | BPF_CALL; + if (!bpf_dump_raw_ok()) + insns[i].imm = 0; + continue; + } ++ if (BPF_CLASS(code) == BPF_LDX && BPF_MODE(code) == BPF_PROBE_MEM) { ++ insns[i].code = BPF_LDX | BPF_SIZE(code) | BPF_MEM; ++ continue; ++ } + +- if (insns[i].code != (BPF_LD | BPF_IMM | BPF_DW)) ++ if (code != (BPF_LD | BPF_IMM | BPF_DW)) + continue; + + imm = ((u64)insns[i + 1].imm << 32) | (u32)insns[i].imm; +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index efe14cf24bc6..739d9ba3ba6b 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -7366,7 +7366,7 @@ static int check_btf_func(struct bpf_verifier_env *env, + const struct btf *btf; + void __user *urecord; + u32 prev_offset = 0; +- int ret = 0; ++ int ret = -ENOMEM; + + nfuncs = attr->func_info_cnt; + if (!nfuncs) +diff --git a/kernel/kprobes.c b/kernel/kprobes.c +index 2625c241ac00..195ecb955fcc 100644 +--- a/kernel/kprobes.c ++++ b/kernel/kprobes.c +@@ -586,11 +586,12 @@ static void kprobe_optimizer(struct work_struct *work) + mutex_unlock(&module_mutex); + mutex_unlock(&text_mutex); + cpus_read_unlock(); +- mutex_unlock(&kprobe_mutex); + + /* Step 5: Kick optimizer again if needed */ + if (!list_empty(&optimizing_list) || !list_empty(&unoptimizing_list)) + kick_kprobe_optimizer(); ++ ++ mutex_unlock(&kprobe_mutex); + } + + /* Wait for completing optimization and unoptimization */ +@@ -1236,6 +1237,26 @@ __releases(hlist_lock) + } + NOKPROBE_SYMBOL(kretprobe_table_unlock); + ++struct kprobe kprobe_busy = { ++ .addr = (void *) get_kprobe, ++}; ++ ++void kprobe_busy_begin(void) ++{ ++ struct kprobe_ctlblk *kcb; ++ ++ preempt_disable(); ++ __this_cpu_write(current_kprobe, &kprobe_busy); ++ kcb = get_kprobe_ctlblk(); ++ kcb->kprobe_status = KPROBE_HIT_ACTIVE; ++} ++ ++void kprobe_busy_end(void) ++{ ++ __this_cpu_write(current_kprobe, NULL); ++ preempt_enable(); ++} ++ + /* + * This function is called from finish_task_switch when task tk becomes dead, + * so that we can recycle any function-return probe instances associated +@@ -1253,6 +1274,8 @@ void kprobe_flush_task(struct task_struct *tk) + /* Early boot. kretprobe_table_locks not yet initialized. */ + return; + ++ kprobe_busy_begin(); ++ + INIT_HLIST_HEAD(&empty_rp); + hash = hash_ptr(tk, KPROBE_HASH_BITS); + head = &kretprobe_inst_table[hash]; +@@ -1266,6 +1289,8 @@ void kprobe_flush_task(struct task_struct *tk) + hlist_del(&ri->hlist); + kfree(ri); + } ++ ++ kprobe_busy_end(); + } + NOKPROBE_SYMBOL(kprobe_flush_task); + +diff --git a/kernel/resource.c b/kernel/resource.c +index 76036a41143b..841737bbda9e 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -1126,6 +1126,7 @@ struct resource * __request_region(struct resource *parent, + { + DECLARE_WAITQUEUE(wait, current); + struct resource *res = alloc_resource(GFP_KERNEL); ++ struct resource *orig_parent = parent; + + if (!res) + return NULL; +@@ -1176,6 +1177,10 @@ struct resource * __request_region(struct resource *parent, + break; + } + write_unlock(&resource_lock); ++ ++ if (res && orig_parent == &iomem_resource) ++ revoke_devmem(res); ++ + return res; + } + EXPORT_SYMBOL(__request_region); +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index ca39dc3230cb..35610a4be4a9 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -995,8 +995,10 @@ static void blk_add_trace_split(void *ignore, + + __blk_add_trace(bt, bio->bi_iter.bi_sector, + bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf, +- BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu), +- &rpdu, blk_trace_bio_get_cgid(q, bio)); ++ BLK_TA_SPLIT, ++ blk_status_to_errno(bio->bi_status), ++ sizeof(rpdu), &rpdu, ++ blk_trace_bio_get_cgid(q, bio)); + } + rcu_read_unlock(); + } +@@ -1033,7 +1035,8 @@ static void blk_add_trace_bio_remap(void *ignore, + r.sector_from = cpu_to_be64(from); + + __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, +- bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status, ++ bio_op(bio), bio->bi_opf, BLK_TA_REMAP, ++ blk_status_to_errno(bio->bi_status), + sizeof(r), &r, blk_trace_bio_get_cgid(q, bio)); + rcu_read_unlock(); + } +@@ -1253,21 +1256,10 @@ static inline __u16 t_error(const struct trace_entry *ent) + + static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg) + { +- const __u64 *val = pdu_start(ent, has_cg); ++ const __be64 *val = pdu_start(ent, has_cg); + return be64_to_cpu(*val); + } + +-static void get_pdu_remap(const struct trace_entry *ent, +- struct blk_io_trace_remap *r, bool has_cg) +-{ +- const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg); +- __u64 sector_from = __r->sector_from; +- +- r->device_from = be32_to_cpu(__r->device_from); +- r->device_to = be32_to_cpu(__r->device_to); +- r->sector_from = be64_to_cpu(sector_from); +-} +- + typedef void (blk_log_action_t) (struct trace_iterator *iter, const char *act, + bool has_cg); + +@@ -1407,13 +1399,13 @@ static void blk_log_with_error(struct trace_seq *s, + + static void blk_log_remap(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) + { +- struct blk_io_trace_remap r = { .device_from = 0, }; ++ const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg); + +- get_pdu_remap(ent, &r, has_cg); + trace_seq_printf(s, "%llu + %u <- (%d,%d) %llu\n", + t_sector(ent), t_sec(ent), +- MAJOR(r.device_from), MINOR(r.device_from), +- (unsigned long long)r.sector_from); ++ MAJOR(be32_to_cpu(__r->device_from)), ++ MINOR(be32_to_cpu(__r->device_from)), ++ be64_to_cpu(__r->sector_from)); + } + + static void blk_log_plug(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index 4eb1d004d5f2..7fb2f4c1bc49 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -61,6 +61,9 @@ enum trace_type { + #undef __field_desc + #define __field_desc(type, container, item) + ++#undef __field_packed ++#define __field_packed(type, container, item) ++ + #undef __array + #define __array(type, item, size) type item[size]; + +diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h +index a523da0dae0a..18c4a58aff79 100644 +--- a/kernel/trace/trace_entries.h ++++ b/kernel/trace/trace_entries.h +@@ -78,8 +78,8 @@ FTRACE_ENTRY_PACKED(funcgraph_entry, ftrace_graph_ent_entry, + + F_STRUCT( + __field_struct( struct ftrace_graph_ent, graph_ent ) +- __field_desc( unsigned long, graph_ent, func ) +- __field_desc( int, graph_ent, depth ) ++ __field_packed( unsigned long, graph_ent, func ) ++ __field_packed( int, graph_ent, depth ) + ), + + F_printk("--> %ps (%d)", (void *)__entry->func, __entry->depth) +@@ -92,11 +92,11 @@ FTRACE_ENTRY_PACKED(funcgraph_exit, ftrace_graph_ret_entry, + + F_STRUCT( + __field_struct( struct ftrace_graph_ret, ret ) +- __field_desc( unsigned long, ret, func ) +- __field_desc( unsigned long, ret, overrun ) +- __field_desc( unsigned long long, ret, calltime) +- __field_desc( unsigned long long, ret, rettime ) +- __field_desc( int, ret, depth ) ++ __field_packed( unsigned long, ret, func ) ++ __field_packed( unsigned long, ret, overrun ) ++ __field_packed( unsigned long long, ret, calltime) ++ __field_packed( unsigned long long, ret, rettime ) ++ __field_packed( int, ret, depth ) + ), + + F_printk("<-- %ps (%d) (start: %llx end: %llx) over: %d", +diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c +index 77ce5a3b6773..70d3d0a09053 100644 +--- a/kernel/trace/trace_export.c ++++ b/kernel/trace/trace_export.c +@@ -45,6 +45,9 @@ static int ftrace_event_register(struct trace_event_call *call, + #undef __field_desc + #define __field_desc(type, container, item) type item; + ++#undef __field_packed ++#define __field_packed(type, container, item) type item; ++ + #undef __array + #define __array(type, item, size) type item[size]; + +@@ -85,6 +88,13 @@ static void __always_unused ____ftrace_check_##name(void) \ + .size = sizeof(_type), .align = __alignof__(_type), \ + is_signed_type(_type), .filter_type = _filter_type }, + ++ ++#undef __field_ext_packed ++#define __field_ext_packed(_type, _item, _filter_type) { \ ++ .type = #_type, .name = #_item, \ ++ .size = sizeof(_type), .align = 1, \ ++ is_signed_type(_type), .filter_type = _filter_type }, ++ + #undef __field + #define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER) + +@@ -94,6 +104,9 @@ static void __always_unused ____ftrace_check_##name(void) \ + #undef __field_desc + #define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER) + ++#undef __field_packed ++#define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER) ++ + #undef __array + #define __array(_type, _item, _len) { \ + .type = #_type"["__stringify(_len)"]", .name = #_item, \ +@@ -129,6 +142,9 @@ static struct trace_event_fields ftrace_event_fields_##name[] = { \ + #undef __field_desc + #define __field_desc(type, container, item) + ++#undef __field_packed ++#define __field_packed(type, container, item) ++ + #undef __array + #define __array(type, item, len) + +diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c +index 35989383ae11..8eeb95e04bf5 100644 +--- a/kernel/trace/trace_kprobe.c ++++ b/kernel/trace/trace_kprobe.c +@@ -1629,7 +1629,7 @@ int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type, + if (perf_type_tracepoint) + tk = find_trace_kprobe(pevent, group); + else +- tk = event->tp_event->data; ++ tk = trace_kprobe_primary_from_call(event->tp_event); + if (!tk) + return -EINVAL; + +diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c +index ab8b6436d53f..f98d6d94cbbf 100644 +--- a/kernel/trace/trace_probe.c ++++ b/kernel/trace/trace_probe.c +@@ -639,8 +639,8 @@ static int traceprobe_parse_probe_arg_body(char *arg, ssize_t *size, + ret = -EINVAL; + goto fail; + } +- if ((code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM) || +- parg->count) { ++ if ((code->op == FETCH_OP_IMM || code->op == FETCH_OP_COMM || ++ code->op == FETCH_OP_DATA) || parg->count) { + /* + * IMM, DATA and COMM is pointing actual address, those + * must be kept, and if parg->count != 0, this is an +diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c +index 2a8e8e9c1c75..fdd47f99b18f 100644 +--- a/kernel/trace/trace_uprobe.c ++++ b/kernel/trace/trace_uprobe.c +@@ -1412,7 +1412,7 @@ int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type, + if (perf_type_tracepoint) + tu = find_probe_event(pevent, group); + else +- tu = event->tp_event->data; ++ tu = trace_uprobe_primary_from_call(event->tp_event); + if (!tu) + return -EINVAL; + +diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c +index 2c13ecc5bb2c..ed1f3df27260 100644 +--- a/lib/zlib_inflate/inffast.c ++++ b/lib/zlib_inflate/inffast.c +@@ -10,17 +10,6 @@ + + #ifndef ASMINF + +-/* Allow machine dependent optimization for post-increment or pre-increment. +- Based on testing to date, +- Pre-increment preferred for: +- - PowerPC G3 (Adler) +- - MIPS R5000 (Randers-Pehrson) +- Post-increment preferred for: +- - none +- No measurable difference: +- - Pentium III (Anderson) +- - M68060 (Nikl) +- */ + union uu { + unsigned short us; + unsigned char b[2]; +@@ -38,16 +27,6 @@ get_unaligned16(const unsigned short *p) + return mm.us; + } + +-#ifdef POSTINC +-# define OFF 0 +-# define PUP(a) *(a)++ +-# define UP_UNALIGNED(a) get_unaligned16((a)++) +-#else +-# define OFF 1 +-# define PUP(a) *++(a) +-# define UP_UNALIGNED(a) get_unaligned16(++(a)) +-#endif +- + /* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is +@@ -115,9 +94,9 @@ void inflate_fast(z_streamp strm, unsigned start) + + /* copy state to local variables */ + state = (struct inflate_state *)strm->state; +- in = strm->next_in - OFF; ++ in = strm->next_in; + last = in + (strm->avail_in - 5); +- out = strm->next_out - OFF; ++ out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); + #ifdef INFLATE_STRICT +@@ -138,9 +117,9 @@ void inflate_fast(z_streamp strm, unsigned start) + input data or output space */ + do { + if (bits < 15) { +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; + } + this = lcode[hold & lmask]; +@@ -150,14 +129,14 @@ void inflate_fast(z_streamp strm, unsigned start) + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ +- PUP(out) = (unsigned char)(this.val); ++ *out++ = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); +@@ -165,9 +144,9 @@ void inflate_fast(z_streamp strm, unsigned start) + bits -= op; + } + if (bits < 15) { +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; + } + this = dcode[hold & dmask]; +@@ -180,10 +159,10 @@ void inflate_fast(z_streamp strm, unsigned start) + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; ++ hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } +@@ -205,13 +184,13 @@ void inflate_fast(z_streamp strm, unsigned start) + state->mode = BAD; + break; + } +- from = window - OFF; ++ from = window; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { +- PUP(out) = PUP(from); ++ *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } +@@ -222,14 +201,14 @@ void inflate_fast(z_streamp strm, unsigned start) + if (op < len) { /* some from end of window */ + len -= op; + do { +- PUP(out) = PUP(from); ++ *out++ = *from++; + } while (--op); +- from = window - OFF; ++ from = window; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { +- PUP(out) = PUP(from); ++ *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } +@@ -240,21 +219,21 @@ void inflate_fast(z_streamp strm, unsigned start) + if (op < len) { /* some from window */ + len -= op; + do { +- PUP(out) = PUP(from); ++ *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); ++ *out++ = *from++; ++ *out++ = *from++; ++ *out++ = *from++; + len -= 3; + } + if (len) { +- PUP(out) = PUP(from); ++ *out++ = *from++; + if (len > 1) +- PUP(out) = PUP(from); ++ *out++ = *from++; + } + } + else { +@@ -264,29 +243,29 @@ void inflate_fast(z_streamp strm, unsigned start) + from = out - dist; /* copy direct from output */ + /* minimum length is three */ + /* Align out addr */ +- if (!((long)(out - 1 + OFF) & 1)) { +- PUP(out) = PUP(from); ++ if (!((long)(out - 1) & 1)) { ++ *out++ = *from++; + len--; + } +- sout = (unsigned short *)(out - OFF); ++ sout = (unsigned short *)(out); + if (dist > 2) { + unsigned short *sfrom; + +- sfrom = (unsigned short *)(from - OFF); ++ sfrom = (unsigned short *)(from); + loops = len >> 1; + do + #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS +- PUP(sout) = PUP(sfrom); ++ *sout++ = *sfrom++; + #else +- PUP(sout) = UP_UNALIGNED(sfrom); ++ *sout++ = get_unaligned16(sfrom++); + #endif + while (--loops); +- out = (unsigned char *)sout + OFF; +- from = (unsigned char *)sfrom + OFF; ++ out = (unsigned char *)sout; ++ from = (unsigned char *)sfrom; + } else { /* dist == 1 or dist == 2 */ + unsigned short pat16; + +- pat16 = *(sout-1+OFF); ++ pat16 = *(sout-1); + if (dist == 1) { + union uu mm; + /* copy one char pattern to both bytes */ +@@ -296,12 +275,12 @@ void inflate_fast(z_streamp strm, unsigned start) + } + loops = len >> 1; + do +- PUP(sout) = pat16; ++ *sout++ = pat16; + while (--loops); +- out = (unsigned char *)sout + OFF; ++ out = (unsigned char *)sout; + } + if (len & 1) +- PUP(out) = PUP(from); ++ *out++ = *from++; + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ +@@ -336,8 +315,8 @@ void inflate_fast(z_streamp strm, unsigned start) + hold &= (1U << bits) - 1; + + /* update state and return */ +- strm->next_in = in + OFF; +- strm->next_out = out + OFF; ++ strm->next_in = in; ++ strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); +diff --git a/net/core/dev.c b/net/core/dev.c +index 2d8aceee4284..93a279ab4e97 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -79,6 +79,7 @@ + #include <linux/sched.h> + #include <linux/sched/mm.h> + #include <linux/mutex.h> ++#include <linux/rwsem.h> + #include <linux/string.h> + #include <linux/mm.h> + #include <linux/socket.h> +@@ -194,7 +195,7 @@ static DEFINE_SPINLOCK(napi_hash_lock); + static unsigned int napi_gen_id = NR_CPUS; + static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8); + +-static seqcount_t devnet_rename_seq; ++static DECLARE_RWSEM(devnet_rename_sem); + + static inline void dev_base_seq_inc(struct net *net) + { +@@ -930,33 +931,28 @@ EXPORT_SYMBOL(dev_get_by_napi_id); + * @net: network namespace + * @name: a pointer to the buffer where the name will be stored. + * @ifindex: the ifindex of the interface to get the name from. +- * +- * The use of raw_seqcount_begin() and cond_resched() before +- * retrying is required as we want to give the writers a chance +- * to complete when CONFIG_PREEMPTION is not set. + */ + int netdev_get_name(struct net *net, char *name, int ifindex) + { + struct net_device *dev; +- unsigned int seq; ++ int ret; + +-retry: +- seq = raw_seqcount_begin(&devnet_rename_seq); ++ down_read(&devnet_rename_sem); + rcu_read_lock(); ++ + dev = dev_get_by_index_rcu(net, ifindex); + if (!dev) { +- rcu_read_unlock(); +- return -ENODEV; ++ ret = -ENODEV; ++ goto out; + } + + strcpy(name, dev->name); +- rcu_read_unlock(); +- if (read_seqcount_retry(&devnet_rename_seq, seq)) { +- cond_resched(); +- goto retry; +- } + +- return 0; ++ ret = 0; ++out: ++ rcu_read_unlock(); ++ up_read(&devnet_rename_sem); ++ return ret; + } + + /** +@@ -1228,10 +1224,10 @@ int dev_change_name(struct net_device *dev, const char *newname) + likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) + return -EBUSY; + +- write_seqcount_begin(&devnet_rename_seq); ++ down_write(&devnet_rename_sem); + + if (strncmp(newname, dev->name, IFNAMSIZ) == 0) { +- write_seqcount_end(&devnet_rename_seq); ++ up_write(&devnet_rename_sem); + return 0; + } + +@@ -1239,7 +1235,7 @@ int dev_change_name(struct net_device *dev, const char *newname) + + err = dev_get_valid_name(net, dev, newname); + if (err < 0) { +- write_seqcount_end(&devnet_rename_seq); ++ up_write(&devnet_rename_sem); + return err; + } + +@@ -1254,11 +1250,11 @@ rollback: + if (ret) { + memcpy(dev->name, oldname, IFNAMSIZ); + dev->name_assign_type = old_assign_type; +- write_seqcount_end(&devnet_rename_seq); ++ up_write(&devnet_rename_sem); + return ret; + } + +- write_seqcount_end(&devnet_rename_seq); ++ up_write(&devnet_rename_sem); + + netdev_adjacent_rename_links(dev, oldname); + +@@ -1279,7 +1275,7 @@ rollback: + /* err >= 0 after dev_alloc_name() or stores the first errno */ + if (err >= 0) { + err = ret; +- write_seqcount_begin(&devnet_rename_seq); ++ down_write(&devnet_rename_sem); + memcpy(dev->name, oldname, IFNAMSIZ); + memcpy(oldname, newname, IFNAMSIZ); + dev->name_assign_type = old_assign_type; +diff --git a/net/core/filter.c b/net/core/filter.c +index 11b97c31bca5..9512a9772d69 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -1766,25 +1766,27 @@ BPF_CALL_5(bpf_skb_load_bytes_relative, const struct sk_buff *, skb, + u32, offset, void *, to, u32, len, u32, start_header) + { + u8 *end = skb_tail_pointer(skb); +- u8 *net = skb_network_header(skb); +- u8 *mac = skb_mac_header(skb); +- u8 *ptr; ++ u8 *start, *ptr; + +- if (unlikely(offset > 0xffff || len > (end - mac))) ++ if (unlikely(offset > 0xffff)) + goto err_clear; + + switch (start_header) { + case BPF_HDR_START_MAC: +- ptr = mac + offset; ++ if (unlikely(!skb_mac_header_was_set(skb))) ++ goto err_clear; ++ start = skb_mac_header(skb); + break; + case BPF_HDR_START_NET: +- ptr = net + offset; ++ start = skb_network_header(skb); + break; + default: + goto err_clear; + } + +- if (likely(ptr >= mac && ptr + len <= end)) { ++ ptr = start + offset; ++ ++ if (likely(ptr + len <= end)) { + memcpy(to, ptr, len); + return 0; + } +diff --git a/net/core/sock_map.c b/net/core/sock_map.c +index b08dfae10f88..591457fcbd02 100644 +--- a/net/core/sock_map.c ++++ b/net/core/sock_map.c +@@ -417,10 +417,7 @@ static int sock_map_get_next_key(struct bpf_map *map, void *key, void *next) + return 0; + } + +-static bool sock_map_redirect_allowed(const struct sock *sk) +-{ +- return sk->sk_state != TCP_LISTEN; +-} ++static bool sock_map_redirect_allowed(const struct sock *sk); + + static int sock_map_update_common(struct bpf_map *map, u32 idx, + struct sock *sk, u64 flags) +@@ -501,6 +498,11 @@ static bool sk_is_udp(const struct sock *sk) + sk->sk_protocol == IPPROTO_UDP; + } + ++static bool sock_map_redirect_allowed(const struct sock *sk) ++{ ++ return sk_is_tcp(sk) && sk->sk_state != TCP_LISTEN; ++} ++ + static bool sock_map_sk_is_suitable(const struct sock *sk) + { + return sk_is_tcp(sk) || sk_is_udp(sk); +@@ -982,11 +984,15 @@ static struct bpf_map *sock_hash_alloc(union bpf_attr *attr) + err = -EINVAL; + goto free_htab; + } ++ err = bpf_map_charge_init(&htab->map.memory, cost); ++ if (err) ++ goto free_htab; + + htab->buckets = bpf_map_area_alloc(htab->buckets_num * + sizeof(struct bpf_htab_bucket), + htab->map.numa_node); + if (!htab->buckets) { ++ bpf_map_charge_finish(&htab->map.memory); + err = -ENOMEM; + goto free_htab; + } +@@ -1006,6 +1012,7 @@ static void sock_hash_free(struct bpf_map *map) + { + struct bpf_htab *htab = container_of(map, struct bpf_htab, map); + struct bpf_htab_bucket *bucket; ++ struct hlist_head unlink_list; + struct bpf_htab_elem *elem; + struct hlist_node *node; + int i; +@@ -1017,13 +1024,32 @@ static void sock_hash_free(struct bpf_map *map) + synchronize_rcu(); + for (i = 0; i < htab->buckets_num; i++) { + bucket = sock_hash_select_bucket(htab, i); +- hlist_for_each_entry_safe(elem, node, &bucket->head, node) { +- hlist_del_rcu(&elem->node); ++ ++ /* We are racing with sock_hash_delete_from_link to ++ * enter the spin-lock critical section. Every socket on ++ * the list is still linked to sockhash. Since link ++ * exists, psock exists and holds a ref to socket. That ++ * lets us to grab a socket ref too. ++ */ ++ raw_spin_lock_bh(&bucket->lock); ++ hlist_for_each_entry(elem, &bucket->head, node) ++ sock_hold(elem->sk); ++ hlist_move_list(&bucket->head, &unlink_list); ++ raw_spin_unlock_bh(&bucket->lock); ++ ++ /* Process removed entries out of atomic context to ++ * block for socket lock before deleting the psock's ++ * link to sockhash. ++ */ ++ hlist_for_each_entry_safe(elem, node, &unlink_list, node) { ++ hlist_del(&elem->node); + lock_sock(elem->sk); + rcu_read_lock(); + sock_map_unref(elem->sk, elem); + rcu_read_unlock(); + release_sock(elem->sk); ++ sock_put(elem->sk); ++ sock_hash_free_elem(htab, elem); + } + } + +diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c +index 629aaa9a1eb9..7aa68f4aae6c 100644 +--- a/net/ipv4/tcp_bpf.c ++++ b/net/ipv4/tcp_bpf.c +@@ -64,6 +64,9 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock, + } while (i != msg_rx->sg.end); + + if (unlikely(peek)) { ++ if (msg_rx == list_last_entry(&psock->ingress_msg, ++ struct sk_msg, list)) ++ break; + msg_rx = list_next_entry(msg_rx, list); + continue; + } +@@ -242,6 +245,9 @@ static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock, + DEFINE_WAIT_FUNC(wait, woken_wake_function); + int ret = 0; + ++ if (sk->sk_shutdown & RCV_SHUTDOWN) ++ return 1; ++ + if (!timeo) + return ret; + +diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c +index 8b5acc6910fd..8c04388296b0 100644 +--- a/net/netfilter/nft_set_pipapo.c ++++ b/net/netfilter/nft_set_pipapo.c +@@ -1242,7 +1242,9 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set, + end += NFT_PIPAPO_GROUPS_PADDED_SIZE(f); + } + +- if (!*this_cpu_ptr(m->scratch) || bsize_max > m->bsize_max) { ++ if (!*get_cpu_ptr(m->scratch) || bsize_max > m->bsize_max) { ++ put_cpu_ptr(m->scratch); ++ + err = pipapo_realloc_scratch(m, bsize_max); + if (err) + return err; +@@ -1250,6 +1252,8 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set, + this_cpu_write(nft_pipapo_scratch_index, false); + + m->bsize_max = bsize_max; ++ } else { ++ put_cpu_ptr(m->scratch); + } + + *ext2 = &e->ext; +diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c +index 62f416bc0579..b6aad3fc46c3 100644 +--- a/net/netfilter/nft_set_rbtree.c ++++ b/net/netfilter/nft_set_rbtree.c +@@ -271,12 +271,14 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, + + if (nft_rbtree_interval_start(new)) { + if (nft_rbtree_interval_end(rbe) && +- nft_set_elem_active(&rbe->ext, genmask)) ++ nft_set_elem_active(&rbe->ext, genmask) && ++ !nft_set_elem_expired(&rbe->ext)) + overlap = false; + } else { + overlap = nft_rbtree_interval_end(rbe) && + nft_set_elem_active(&rbe->ext, +- genmask); ++ genmask) && ++ !nft_set_elem_expired(&rbe->ext); + } + } else if (d > 0) { + p = &parent->rb_right; +@@ -284,9 +286,11 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, + if (nft_rbtree_interval_end(new)) { + overlap = nft_rbtree_interval_end(rbe) && + nft_set_elem_active(&rbe->ext, +- genmask); ++ genmask) && ++ !nft_set_elem_expired(&rbe->ext); + } else if (nft_rbtree_interval_end(rbe) && +- nft_set_elem_active(&rbe->ext, genmask)) { ++ nft_set_elem_active(&rbe->ext, genmask) && ++ !nft_set_elem_expired(&rbe->ext)) { + overlap = true; + } + } else { +@@ -294,15 +298,18 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, + nft_rbtree_interval_start(new)) { + p = &parent->rb_left; + +- if (nft_set_elem_active(&rbe->ext, genmask)) ++ if (nft_set_elem_active(&rbe->ext, genmask) && ++ !nft_set_elem_expired(&rbe->ext)) + overlap = false; + } else if (nft_rbtree_interval_start(rbe) && + nft_rbtree_interval_end(new)) { + p = &parent->rb_right; + +- if (nft_set_elem_active(&rbe->ext, genmask)) ++ if (nft_set_elem_active(&rbe->ext, genmask) && ++ !nft_set_elem_expired(&rbe->ext)) + overlap = false; +- } else if (nft_set_elem_active(&rbe->ext, genmask)) { ++ } else if (nft_set_elem_active(&rbe->ext, genmask) && ++ !nft_set_elem_expired(&rbe->ext)) { + *ext = &rbe->ext; + return -EEXIST; + } else { +diff --git a/net/rxrpc/proc.c b/net/rxrpc/proc.c +index 8b179e3c802a..543afd9bd664 100644 +--- a/net/rxrpc/proc.c ++++ b/net/rxrpc/proc.c +@@ -68,7 +68,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) + "Proto Local " + " Remote " + " SvID ConnID CallID End Use State Abort " +- " UserID TxSeq TW RxSeq RW RxSerial RxTimo\n"); ++ " DebugId TxSeq TW RxSeq RW RxSerial RxTimo\n"); + return 0; + } + +@@ -100,7 +100,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) + rx_hard_ack = READ_ONCE(call->rx_hard_ack); + seq_printf(seq, + "UDP %-47.47s %-47.47s %4x %08x %08x %s %3u" +- " %-8.8s %08x %lx %08x %02x %08x %02x %08x %06lx\n", ++ " %-8.8s %08x %08x %08x %02x %08x %02x %08x %06lx\n", + lbuff, + rbuff, + call->service_id, +@@ -110,7 +110,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) + atomic_read(&call->usage), + rxrpc_call_states[call->state], + call->abort_code, +- call->user_call_ID, ++ call->debug_id, + tx_hard_ack, READ_ONCE(call->tx_top) - tx_hard_ack, + rx_hard_ack, READ_ONCE(call->rx_top) - rx_hard_ack, + call->rx_serial, +diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c +index 8b4d72b1a066..010dcb876f9d 100644 +--- a/net/sunrpc/addr.c ++++ b/net/sunrpc/addr.c +@@ -82,11 +82,11 @@ static size_t rpc_ntop6(const struct sockaddr *sap, + + rc = snprintf(scopebuf, sizeof(scopebuf), "%c%u", + IPV6_SCOPE_DELIMITER, sin6->sin6_scope_id); +- if (unlikely((size_t)rc > sizeof(scopebuf))) ++ if (unlikely((size_t)rc >= sizeof(scopebuf))) + return 0; + + len += rc; +- if (unlikely(len > buflen)) ++ if (unlikely(len >= buflen)) + return 0; + + strcat(buf, scopebuf); +diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c +index c350108aa38d..a4676107fad0 100644 +--- a/net/xdp/xsk.c ++++ b/net/xdp/xsk.c +@@ -397,10 +397,8 @@ static int xsk_generic_xmit(struct sock *sk) + + len = desc.len; + skb = sock_alloc_send_skb(sk, len, 1, &err); +- if (unlikely(!skb)) { +- err = -EAGAIN; ++ if (unlikely(!skb)) + goto out; +- } + + skb_put(skb, len); + addr = desc.addr; +diff --git a/samples/ftrace/sample-trace-array.c b/samples/ftrace/sample-trace-array.c +index d523450d73eb..6aba02a31c96 100644 +--- a/samples/ftrace/sample-trace-array.c ++++ b/samples/ftrace/sample-trace-array.c +@@ -6,6 +6,7 @@ + #include <linux/timer.h> + #include <linux/err.h> + #include <linux/jiffies.h> ++#include <linux/workqueue.h> + + /* + * Any file that uses trace points, must include the header. +@@ -20,6 +21,16 @@ struct trace_array *tr; + static void mytimer_handler(struct timer_list *unused); + static struct task_struct *simple_tsk; + ++static void trace_work_fn(struct work_struct *work) ++{ ++ /* ++ * Disable tracing for event "sample_event". ++ */ ++ trace_array_set_clr_event(tr, "sample-subsystem", "sample_event", ++ false); ++} ++static DECLARE_WORK(trace_work, trace_work_fn); ++ + /* + * mytimer: Timer setup to disable tracing for event "sample_event". This + * timer is only for the purposes of the sample module to demonstrate access of +@@ -29,11 +40,7 @@ static DEFINE_TIMER(mytimer, mytimer_handler); + + static void mytimer_handler(struct timer_list *unused) + { +- /* +- * Disable tracing for event "sample_event". +- */ +- trace_array_set_clr_event(tr, "sample-subsystem", "sample_event", +- false); ++ schedule_work(&trace_work); + } + + static void simple_thread_func(int count) +@@ -76,6 +83,7 @@ static int simple_thread(void *arg) + simple_thread_func(count++); + + del_timer(&mytimer); ++ cancel_work_sync(&trace_work); + + /* + * trace_array_put() decrements the reference counter associated with +@@ -107,8 +115,12 @@ static int __init sample_trace_array_init(void) + trace_printk_init_buffers(); + + simple_tsk = kthread_run(simple_thread, NULL, "sample-instance"); +- if (IS_ERR(simple_tsk)) ++ if (IS_ERR(simple_tsk)) { ++ trace_array_put(tr); ++ trace_array_destroy(tr); + return -1; ++ } ++ + return 0; + } + +diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost +index 957eed6a17a5..33aaa572f686 100644 +--- a/scripts/Makefile.modpost ++++ b/scripts/Makefile.modpost +@@ -66,7 +66,7 @@ __modpost: + + else + +-MODPOST += $(subst -i,-n,$(filter -i,$(MAKEFLAGS))) -s -T - \ ++MODPOST += -s -T - \ + $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS)) + + ifeq ($(KBUILD_EXTMOD),) +@@ -82,6 +82,11 @@ include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \ + $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile) + endif + ++# 'make -i -k' ignores compile errors, and builds as many modules as possible. ++ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),) ++MODPOST += -n ++endif ++ + # find all modules listed in modules.order + modules := $(sort $(shell cat $(MODORDER))) + +diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh +index a07668a5c36b..94a833597a88 100755 +--- a/scripts/headers_install.sh ++++ b/scripts/headers_install.sh +@@ -64,7 +64,7 @@ configs=$(sed -e ' + d + ' $OUTFILE) + +-# The entries in the following list are not warned. ++# The entries in the following list do not result in an error. + # Please do not add a new entry. This list is only for existing ones. + # The list will be reduced gradually, and deleted eventually. (hopefully) + # +@@ -98,18 +98,19 @@ include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS + + for c in $configs + do +- warn=1 ++ leak_error=1 + + for ignore in $config_leak_ignores + do + if echo "$INFILE:$c" | grep -q "$ignore$"; then +- warn= ++ leak_error= + break + fi + done + +- if [ "$warn" = 1 ]; then +- echo "warning: $INFILE: leak $c to user-space" >&2 ++ if [ "$leak_error" = 1 ]; then ++ echo "error: $INFILE: leak $c to user-space" >&2 ++ exit 1 + fi + done + +diff --git a/scripts/mksysmap b/scripts/mksysmap +index a35acc0d0b82..9aa23d15862a 100755 +--- a/scripts/mksysmap ++++ b/scripts/mksysmap +@@ -41,4 +41,4 @@ + # so we just ignore them to let readprofile continue to work. + # (At least sparc64 has __crc_ in the middle). + +-$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( .L\)' > $2 ++$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2 +diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c +index a84ef030fbd7..4cfa58c07778 100644 +--- a/security/apparmor/domain.c ++++ b/security/apparmor/domain.c +@@ -929,7 +929,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm) + * aways results in a further reduction of permissions. + */ + if ((bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS) && +- !unconfined(label) && !aa_label_is_subset(new, ctx->nnp)) { ++ !unconfined(label) && ++ !aa_label_is_unconfined_subset(new, ctx->nnp)) { + error = -EPERM; + info = "no new privs"; + goto audit; +@@ -1207,7 +1208,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags) + * reduce restrictions. + */ + if (task_no_new_privs(current) && !unconfined(label) && +- !aa_label_is_subset(new, ctx->nnp)) { ++ !aa_label_is_unconfined_subset(new, ctx->nnp)) { + /* not an apparmor denial per se, so don't log it */ + AA_DEBUG("no_new_privs - change_hat denied"); + error = -EPERM; +@@ -1228,7 +1229,7 @@ int aa_change_hat(const char *hats[], int count, u64 token, int flags) + * reduce restrictions. + */ + if (task_no_new_privs(current) && !unconfined(label) && +- !aa_label_is_subset(previous, ctx->nnp)) { ++ !aa_label_is_unconfined_subset(previous, ctx->nnp)) { + /* not an apparmor denial per se, so don't log it */ + AA_DEBUG("no_new_privs - change_hat denied"); + error = -EPERM; +@@ -1423,7 +1424,7 @@ check: + * reduce restrictions. + */ + if (task_no_new_privs(current) && !unconfined(label) && +- !aa_label_is_subset(new, ctx->nnp)) { ++ !aa_label_is_unconfined_subset(new, ctx->nnp)) { + /* not an apparmor denial per se, so don't log it */ + AA_DEBUG("no_new_privs - change_hat denied"); + error = -EPERM; +diff --git a/security/apparmor/include/label.h b/security/apparmor/include/label.h +index 47942c4ba7ca..255764ab06e2 100644 +--- a/security/apparmor/include/label.h ++++ b/security/apparmor/include/label.h +@@ -281,6 +281,7 @@ bool aa_label_init(struct aa_label *label, int size, gfp_t gfp); + struct aa_label *aa_label_alloc(int size, struct aa_proxy *proxy, gfp_t gfp); + + bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub); ++bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub); + struct aa_profile *__aa_label_next_not_in_set(struct label_it *I, + struct aa_label *set, + struct aa_label *sub); +diff --git a/security/apparmor/label.c b/security/apparmor/label.c +index 470693239e64..5f324d63ceaa 100644 +--- a/security/apparmor/label.c ++++ b/security/apparmor/label.c +@@ -550,6 +550,39 @@ bool aa_label_is_subset(struct aa_label *set, struct aa_label *sub) + return __aa_label_next_not_in_set(&i, set, sub) == NULL; + } + ++/** ++ * aa_label_is_unconfined_subset - test if @sub is a subset of @set ++ * @set: label to test against ++ * @sub: label to test if is subset of @set ++ * ++ * This checks for subset but taking into account unconfined. IF ++ * @sub contains an unconfined profile that does not have a matching ++ * unconfined in @set then this will not cause the test to fail. ++ * Conversely we don't care about an unconfined in @set that is not in ++ * @sub ++ * ++ * Returns: true if @sub is special_subset of @set ++ * else false ++ */ ++bool aa_label_is_unconfined_subset(struct aa_label *set, struct aa_label *sub) ++{ ++ struct label_it i = { }; ++ struct aa_profile *p; ++ ++ AA_BUG(!set); ++ AA_BUG(!sub); ++ ++ if (sub == set) ++ return true; ++ ++ do { ++ p = __aa_label_next_not_in_set(&i, set, sub); ++ if (p && !profile_unconfined(p)) ++ break; ++ } while (p); ++ ++ return p == NULL; ++} + + + /** +@@ -1531,13 +1564,13 @@ static const char *label_modename(struct aa_ns *ns, struct aa_label *label, + + label_for_each(i, label, profile) { + if (aa_ns_visible(ns, profile->ns, flags & FLAG_VIEW_SUBNS)) { +- if (profile->mode == APPARMOR_UNCONFINED) ++ count++; ++ if (profile == profile->ns->unconfined) + /* special case unconfined so stacks with + * unconfined don't report as mixed. ie. + * profile_foo//&:ns1:unconfined (mixed) + */ + continue; +- count++; + if (mode == -1) + mode = profile->mode; + else if (mode != profile->mode) +diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c +index b621ad74f54a..66a8504c8bea 100644 +--- a/security/apparmor/lsm.c ++++ b/security/apparmor/lsm.c +@@ -804,7 +804,12 @@ static void apparmor_sk_clone_security(const struct sock *sk, + struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *new = SK_CTX(newsk); + ++ if (new->label) ++ aa_put_label(new->label); + new->label = aa_get_label(ctx->label); ++ ++ if (new->peer) ++ aa_put_label(new->peer); + new->peer = aa_get_label(ctx->peer); + } + +diff --git a/security/selinux/ss/conditional.c b/security/selinux/ss/conditional.c +index da94a1b4bfda..0cc7cdd58465 100644 +--- a/security/selinux/ss/conditional.c ++++ b/security/selinux/ss/conditional.c +@@ -27,6 +27,9 @@ static int cond_evaluate_expr(struct policydb *p, struct cond_expr *expr) + int s[COND_EXPR_MAXDEPTH]; + int sp = -1; + ++ if (expr->len == 0) ++ return -1; ++ + for (i = 0; i < expr->len; i++) { + struct cond_expr_node *node = &expr->nodes[i]; + +@@ -392,27 +395,19 @@ static int cond_read_node(struct policydb *p, struct cond_node *node, void *fp) + + rc = next_entry(buf, fp, sizeof(u32) * 2); + if (rc) +- goto err; ++ return rc; + + expr->expr_type = le32_to_cpu(buf[0]); + expr->bool = le32_to_cpu(buf[1]); + +- if (!expr_node_isvalid(p, expr)) { +- rc = -EINVAL; +- goto err; +- } ++ if (!expr_node_isvalid(p, expr)) ++ return -EINVAL; + } + + rc = cond_read_av_list(p, fp, &node->true_list, NULL); + if (rc) +- goto err; +- rc = cond_read_av_list(p, fp, &node->false_list, &node->true_list); +- if (rc) +- goto err; +- return 0; +-err: +- cond_node_destroy(node); +- return rc; ++ return rc; ++ return cond_read_av_list(p, fp, &node->false_list, &node->true_list); + } + + int cond_read_list(struct policydb *p, void *fp) +diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c +index 8ad34fd031d1..77e591fce919 100644 +--- a/security/selinux/ss/services.c ++++ b/security/selinux/ss/services.c +@@ -2923,8 +2923,12 @@ err: + if (*names) { + for (i = 0; i < *len; i++) + kfree((*names)[i]); ++ kfree(*names); + } + kfree(*values); ++ *len = 0; ++ *names = NULL; ++ *values = NULL; + goto out; + } + +diff --git a/sound/firewire/amdtp-am824.c b/sound/firewire/amdtp-am824.c +index 67d735e9a6a4..fea92e148790 100644 +--- a/sound/firewire/amdtp-am824.c ++++ b/sound/firewire/amdtp-am824.c +@@ -82,7 +82,8 @@ int amdtp_am824_set_parameters(struct amdtp_stream *s, unsigned int rate, + if (err < 0) + return err; + +- s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc; ++ if (s->direction == AMDTP_OUT_STREAM) ++ s->ctx_data.rx.fdf = AMDTP_FDF_AM824 | s->sfc; + + p->pcm_channels = pcm_channels; + p->midi_ports = midi_ports; +diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c +index c5b1d5900eed..d6420d224d09 100644 +--- a/sound/isa/wavefront/wavefront_synth.c ++++ b/sound/isa/wavefront/wavefront_synth.c +@@ -1171,7 +1171,10 @@ wavefront_send_alias (snd_wavefront_t *dev, wavefront_patch_info *header) + "alias for %d\n", + header->number, + header->hdr.a.OriginalSample); +- ++ ++ if (header->number >= WF_MAX_SAMPLE) ++ return -EINVAL; ++ + munge_int32 (header->number, &alias_hdr[0], 2); + munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2); + munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset), +@@ -1202,6 +1205,9 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header) + int num_samples; + unsigned char *msample_hdr; + ++ if (header->number >= WF_MAX_SAMPLE) ++ return -EINVAL; ++ + msample_hdr = kmalloc(WF_MSAMPLE_BYTES, GFP_KERNEL); + if (! msample_hdr) + return -ENOMEM; +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index 2c4575909441..e057ecb5a904 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -81,6 +81,7 @@ struct alc_spec { + + /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */ + int mute_led_polarity; ++ int micmute_led_polarity; + hda_nid_t mute_led_nid; + hda_nid_t cap_mute_led_nid; + +@@ -4080,11 +4081,9 @@ static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec, + + /* update LED status via GPIO */ + static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask, +- bool enabled) ++ int polarity, bool enabled) + { +- struct alc_spec *spec = codec->spec; +- +- if (spec->mute_led_polarity) ++ if (polarity) + enabled = !enabled; + alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */ + } +@@ -4095,7 +4094,8 @@ static void alc_fixup_gpio_mute_hook(void *private_data, int enabled) + struct hda_codec *codec = private_data; + struct alc_spec *spec = codec->spec; + +- alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled); ++ alc_update_gpio_led(codec, spec->gpio_mute_led_mask, ++ spec->mute_led_polarity, enabled); + } + + /* turn on/off mic-mute LED via GPIO per capture hook */ +@@ -4104,6 +4104,7 @@ static void alc_gpio_micmute_update(struct hda_codec *codec) + struct alc_spec *spec = codec->spec; + + alc_update_gpio_led(codec, spec->gpio_mic_led_mask, ++ spec->micmute_led_polarity, + spec->gen.micmute_led.led_value); + } + +@@ -5808,7 +5809,8 @@ static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, + + snd_hda_gen_hp_automute(codec, jack); + /* mute_led_polarity is set to 0, so we pass inverted value here */ +- alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present); ++ alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity, ++ !spec->gen.hp_jack_present); + } + + /* Manage GPIOs for HP EliteBook Folio 9480m. +diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig +index e60e0b6a689c..8a66f23a7b05 100644 +--- a/sound/soc/codecs/Kconfig ++++ b/sound/soc/codecs/Kconfig +@@ -1136,10 +1136,13 @@ config SND_SOC_RT5677_SPI + config SND_SOC_RT5682 + tristate + depends on I2C || SOUNDWIRE ++ depends on SOUNDWIRE || !SOUNDWIRE ++ depends on I2C || !I2C + + config SND_SOC_RT5682_SDW + tristate "Realtek RT5682 Codec - SDW" + depends on SOUNDWIRE ++ depends on I2C || !I2C + select SND_SOC_RT5682 + select REGMAP_SOUNDWIRE + +@@ -1620,19 +1623,19 @@ config SND_SOC_WM9090 + + config SND_SOC_WM9705 + tristate +- depends on SND_SOC_AC97_BUS ++ depends on SND_SOC_AC97_BUS || AC97_BUS_NEW + select REGMAP_AC97 + select AC97_BUS_COMPAT if AC97_BUS_NEW + + config SND_SOC_WM9712 + tristate +- depends on SND_SOC_AC97_BUS ++ depends on SND_SOC_AC97_BUS || AC97_BUS_NEW + select REGMAP_AC97 + select AC97_BUS_COMPAT if AC97_BUS_NEW + + config SND_SOC_WM9713 + tristate +- depends on SND_SOC_AC97_BUS ++ depends on SND_SOC_AC97_BUS || AC97_BUS_NEW + select REGMAP_AC97 + select AC97_BUS_COMPAT if AC97_BUS_NEW + +diff --git a/sound/soc/codecs/max98373.c b/sound/soc/codecs/max98373.c +index cae1def8902d..96718e3a1ad0 100644 +--- a/sound/soc/codecs/max98373.c ++++ b/sound/soc/codecs/max98373.c +@@ -850,8 +850,8 @@ static int max98373_resume(struct device *dev) + { + struct max98373_priv *max98373 = dev_get_drvdata(dev); + +- max98373_reset(max98373, dev); + regcache_cache_only(max98373->regmap, false); ++ max98373_reset(max98373, dev); + regcache_sync(max98373->regmap); + return 0; + } +diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c +index a5a7e46de246..a7f45191364d 100644 +--- a/sound/soc/codecs/rt1308-sdw.c ++++ b/sound/soc/codecs/rt1308-sdw.c +@@ -482,6 +482,9 @@ static int rt1308_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, + { + struct sdw_stream_data *stream; + ++ if (!sdw_stream) ++ return 0; ++ + stream = kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; +diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c +index 6ba1849a77b0..e2e1d5b03b38 100644 +--- a/sound/soc/codecs/rt5645.c ++++ b/sound/soc/codecs/rt5645.c +@@ -3625,6 +3625,12 @@ static const struct rt5645_platform_data asus_t100ha_platform_data = { + .inv_jd1_1 = true, + }; + ++static const struct rt5645_platform_data asus_t101ha_platform_data = { ++ .dmic1_data_pin = RT5645_DMIC_DATA_IN2N, ++ .dmic2_data_pin = RT5645_DMIC2_DISABLE, ++ .jd_mode = 3, ++}; ++ + static const struct rt5645_platform_data lenovo_ideapad_miix_310_pdata = { + .jd_mode = 3, + .in2_diff = true, +@@ -3708,6 +3714,14 @@ static const struct dmi_system_id dmi_platform_data[] = { + }, + .driver_data = (void *)&asus_t100ha_platform_data, + }, ++ { ++ .ident = "ASUS T101HA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"), ++ }, ++ .driver_data = (void *)&asus_t101ha_platform_data, ++ }, + { + .ident = "MINIX Z83-4", + .matches = { +diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c +index d36f560ad7a8..c4892af14850 100644 +--- a/sound/soc/codecs/rt5682.c ++++ b/sound/soc/codecs/rt5682.c +@@ -2958,6 +2958,9 @@ static int rt5682_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, + { + struct sdw_stream_data *stream; + ++ if (!sdw_stream) ++ return 0; ++ + stream = kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; +diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c +index ff68f0e4f629..687ac2153666 100644 +--- a/sound/soc/codecs/rt700.c ++++ b/sound/soc/codecs/rt700.c +@@ -860,6 +860,9 @@ static int rt700_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, + { + struct sdw_stream_data *stream; + ++ if (!sdw_stream) ++ return 0; ++ + stream = kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; +diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c +index 2daed7692a3b..65b59dbfb43c 100644 +--- a/sound/soc/codecs/rt711.c ++++ b/sound/soc/codecs/rt711.c +@@ -906,6 +906,9 @@ static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, + { + struct sdw_stream_data *stream; + ++ if (!sdw_stream) ++ return 0; ++ + stream = kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; +diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c +index 2cbc57b16b13..099c8bd20006 100644 +--- a/sound/soc/codecs/rt715.c ++++ b/sound/soc/codecs/rt715.c +@@ -530,6 +530,9 @@ static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, + + struct sdw_stream_data *stream; + ++ if (!sdw_stream) ++ return 0; ++ + stream = kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; +diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c +index e7178817d7a7..1ee10eafe3e6 100644 +--- a/sound/soc/fsl/fsl_asrc_dma.c ++++ b/sound/soc/fsl/fsl_asrc_dma.c +@@ -252,6 +252,7 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component, + ret = dmaengine_slave_config(pair->dma_chan[dir], &config_be); + if (ret) { + dev_err(dev, "failed to config DMA channel for Back-End\n"); ++ dma_release_channel(pair->dma_chan[dir]); + return ret; + } + +diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c +index c7a49d03463a..84290be778f0 100644 +--- a/sound/soc/fsl/fsl_esai.c ++++ b/sound/soc/fsl/fsl_esai.c +@@ -87,6 +87,10 @@ static irqreturn_t esai_isr(int irq, void *devid) + if ((saisr & (ESAI_SAISR_TUE | ESAI_SAISR_ROE)) && + esai_priv->reset_at_xrun) { + dev_dbg(&pdev->dev, "reset module for xrun\n"); ++ regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, ++ ESAI_xCR_xEIE_MASK, 0); ++ regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, ++ ESAI_xCR_xEIE_MASK, 0); + tasklet_schedule(&esai_priv->task); + } + +diff --git a/sound/soc/img/img-i2s-in.c b/sound/soc/img/img-i2s-in.c +index a495d1050d49..e30b66b94bf6 100644 +--- a/sound/soc/img/img-i2s-in.c ++++ b/sound/soc/img/img-i2s-in.c +@@ -482,6 +482,7 @@ static int img_i2s_in_probe(struct platform_device *pdev) + if (IS_ERR(rst)) { + if (PTR_ERR(rst) == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; ++ pm_runtime_put(&pdev->dev); + goto err_suspend; + } + +diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c +index 08f4ae964b02..5c1a5e2aff6f 100644 +--- a/sound/soc/intel/boards/bytcr_rt5640.c ++++ b/sound/soc/intel/boards/bytcr_rt5640.c +@@ -742,6 +742,30 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { + BYT_RT5640_SSP0_AIF1 | + BYT_RT5640_MCLK_EN), + }, ++ { /* Toshiba Encore WT8-A */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT8-A"), ++ }, ++ .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | ++ BYT_RT5640_JD_SRC_JD2_IN4N | ++ BYT_RT5640_OVCD_TH_2000UA | ++ BYT_RT5640_OVCD_SF_0P75 | ++ BYT_RT5640_JD_NOT_INV | ++ BYT_RT5640_MCLK_EN), ++ }, ++ { /* Toshiba Encore WT10-A */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT10-A-103"), ++ }, ++ .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | ++ BYT_RT5640_JD_SRC_JD1_IN4P | ++ BYT_RT5640_OVCD_TH_2000UA | ++ BYT_RT5640_OVCD_SF_0P75 | ++ BYT_RT5640_SSP0_AIF2 | ++ BYT_RT5640_MCLK_EN), ++ }, + { /* Catch-all for generic Insyde tablets, must be last */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), +diff --git a/sound/soc/meson/axg-fifo.c b/sound/soc/meson/axg-fifo.c +index 2e9b56b29d31..b2e867113226 100644 +--- a/sound/soc/meson/axg-fifo.c ++++ b/sound/soc/meson/axg-fifo.c +@@ -249,7 +249,7 @@ int axg_fifo_pcm_open(struct snd_soc_component *component, + /* Enable pclk to access registers and clock the fifo ip */ + ret = clk_prepare_enable(fifo->pclk); + if (ret) +- return ret; ++ goto free_irq; + + /* Setup status2 so it reports the memory pointer */ + regmap_update_bits(fifo->map, FIFO_CTRL1, +@@ -269,8 +269,14 @@ int axg_fifo_pcm_open(struct snd_soc_component *component, + /* Take memory arbitror out of reset */ + ret = reset_control_deassert(fifo->arb); + if (ret) +- clk_disable_unprepare(fifo->pclk); ++ goto free_clk; ++ ++ return 0; + ++free_clk: ++ clk_disable_unprepare(fifo->pclk); ++free_irq: ++ free_irq(fifo->irq, ss); + return ret; + } + EXPORT_SYMBOL_GPL(axg_fifo_pcm_open); +diff --git a/sound/soc/meson/meson-card-utils.c b/sound/soc/meson/meson-card-utils.c +index 2ca8c98e204f..5a4a91c88734 100644 +--- a/sound/soc/meson/meson-card-utils.c ++++ b/sound/soc/meson/meson-card-utils.c +@@ -49,19 +49,26 @@ int meson_card_reallocate_links(struct snd_soc_card *card, + links = krealloc(priv->card.dai_link, + num_links * sizeof(*priv->card.dai_link), + GFP_KERNEL | __GFP_ZERO); ++ if (!links) ++ goto err_links; ++ + ldata = krealloc(priv->link_data, + num_links * sizeof(*priv->link_data), + GFP_KERNEL | __GFP_ZERO); +- +- if (!links || !ldata) { +- dev_err(priv->card.dev, "failed to allocate links\n"); +- return -ENOMEM; +- } ++ if (!ldata) ++ goto err_ldata; + + priv->card.dai_link = links; + priv->link_data = ldata; + priv->card.num_links = num_links; + return 0; ++ ++err_ldata: ++ kfree(links); ++err_links: ++ dev_err(priv->card.dev, "failed to allocate links\n"); ++ return -ENOMEM; ++ + } + EXPORT_SYMBOL_GPL(meson_card_reallocate_links); + +diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c +index 125af00bba53..4640804aab7f 100644 +--- a/sound/soc/qcom/qdsp6/q6asm-dai.c ++++ b/sound/soc/qcom/qdsp6/q6asm-dai.c +@@ -176,7 +176,7 @@ static const struct snd_compr_codec_caps q6asm_compr_caps = { + }; + + static void event_handler(uint32_t opcode, uint32_t token, +- uint32_t *payload, void *priv) ++ void *payload, void *priv) + { + struct q6asm_dai_rtd *prtd = priv; + struct snd_pcm_substream *substream = prtd->substream; +@@ -490,7 +490,7 @@ static int q6asm_dai_hw_params(struct snd_soc_component *component, + } + + static void compress_event_handler(uint32_t opcode, uint32_t token, +- uint32_t *payload, void *priv) ++ void *payload, void *priv) + { + struct q6asm_dai_rtd *prtd = priv; + struct snd_compr_stream *substream = prtd->cstream; +diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c +index af19010b9d88..8bd49c8a9517 100644 +--- a/sound/soc/sh/rcar/gen.c ++++ b/sound/soc/sh/rcar/gen.c +@@ -224,6 +224,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv) + RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884), + RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888), + RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE0, 0x850), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE1, 0x854), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE2, 0x858), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE3, 0x85c), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE4, 0x890), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE5, 0x894), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE6, 0x898), ++ RSND_GEN_S_REG(SSI_SYS_INT_ENABLE7, 0x89c), + RSND_GEN_S_REG(HDMI0_SEL, 0x9e0), + RSND_GEN_S_REG(HDMI1_SEL, 0x9e4), + +diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h +index ea6cbaa9743e..d47608ff5fac 100644 +--- a/sound/soc/sh/rcar/rsnd.h ++++ b/sound/soc/sh/rcar/rsnd.h +@@ -189,6 +189,14 @@ enum rsnd_reg { + SSI_SYS_STATUS5, + SSI_SYS_STATUS6, + SSI_SYS_STATUS7, ++ SSI_SYS_INT_ENABLE0, ++ SSI_SYS_INT_ENABLE1, ++ SSI_SYS_INT_ENABLE2, ++ SSI_SYS_INT_ENABLE3, ++ SSI_SYS_INT_ENABLE4, ++ SSI_SYS_INT_ENABLE5, ++ SSI_SYS_INT_ENABLE6, ++ SSI_SYS_INT_ENABLE7, + HDMI0_SEL, + HDMI1_SEL, + SSI9_BUSIF0_MODE, +@@ -237,6 +245,7 @@ enum rsnd_reg { + #define SSI9_BUSIF_ADINR(i) (SSI9_BUSIF0_ADINR + (i)) + #define SSI9_BUSIF_DALIGN(i) (SSI9_BUSIF0_DALIGN + (i)) + #define SSI_SYS_STATUS(i) (SSI_SYS_STATUS0 + (i)) ++#define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i)) + + + struct rsnd_priv; +diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c +index 4a7d3413917f..47d5ddb526f2 100644 +--- a/sound/soc/sh/rcar/ssi.c ++++ b/sound/soc/sh/rcar/ssi.c +@@ -372,6 +372,9 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, + u32 wsr = ssi->wsr; + int width; + int is_tdm, is_tdm_split; ++ int id = rsnd_mod_id(mod); ++ int i; ++ u32 sys_int_enable = 0; + + is_tdm = rsnd_runtime_is_tdm(io); + is_tdm_split = rsnd_runtime_is_tdm_split(io); +@@ -447,6 +450,38 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, + cr_mode = DIEN; /* PIO : enable Data interrupt */ + } + ++ /* enable busif buffer over/under run interrupt. */ ++ if (is_tdm || is_tdm_split) { ++ switch (id) { ++ case 0: ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ for (i = 0; i < 4; i++) { ++ sys_int_enable = rsnd_mod_read(mod, ++ SSI_SYS_INT_ENABLE(i * 2)); ++ sys_int_enable |= 0xf << (id * 4); ++ rsnd_mod_write(mod, ++ SSI_SYS_INT_ENABLE(i * 2), ++ sys_int_enable); ++ } ++ ++ break; ++ case 9: ++ for (i = 0; i < 4; i++) { ++ sys_int_enable = rsnd_mod_read(mod, ++ SSI_SYS_INT_ENABLE((i * 2) + 1)); ++ sys_int_enable |= 0xf << 4; ++ rsnd_mod_write(mod, ++ SSI_SYS_INT_ENABLE((i * 2) + 1), ++ sys_int_enable); ++ } ++ ++ break; ++ } ++ } ++ + init_end: + ssi->cr_own = cr_own; + ssi->cr_mode = cr_mode; +@@ -496,6 +531,13 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, + { + struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); + struct device *dev = rsnd_priv_to_dev(priv); ++ int is_tdm, is_tdm_split; ++ int id = rsnd_mod_id(mod); ++ int i; ++ u32 sys_int_enable = 0; ++ ++ is_tdm = rsnd_runtime_is_tdm(io); ++ is_tdm_split = rsnd_runtime_is_tdm_split(io); + + if (!rsnd_ssi_is_run_mods(mod, io)) + return 0; +@@ -517,6 +559,38 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, + ssi->wsr = 0; + } + ++ /* disable busif buffer over/under run interrupt. */ ++ if (is_tdm || is_tdm_split) { ++ switch (id) { ++ case 0: ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ for (i = 0; i < 4; i++) { ++ sys_int_enable = rsnd_mod_read(mod, ++ SSI_SYS_INT_ENABLE(i * 2)); ++ sys_int_enable &= ~(0xf << (id * 4)); ++ rsnd_mod_write(mod, ++ SSI_SYS_INT_ENABLE(i * 2), ++ sys_int_enable); ++ } ++ ++ break; ++ case 9: ++ for (i = 0; i < 4; i++) { ++ sys_int_enable = rsnd_mod_read(mod, ++ SSI_SYS_INT_ENABLE((i * 2) + 1)); ++ sys_int_enable &= ~(0xf << 4); ++ rsnd_mod_write(mod, ++ SSI_SYS_INT_ENABLE((i * 2) + 1), ++ sys_int_enable); ++ } ++ ++ break; ++ } ++ } ++ + return 0; + } + +@@ -622,6 +696,11 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, + int enable) + { + u32 val = 0; ++ int is_tdm, is_tdm_split; ++ int id = rsnd_mod_id(mod); ++ ++ is_tdm = rsnd_runtime_is_tdm(io); ++ is_tdm_split = rsnd_runtime_is_tdm_split(io); + + if (rsnd_is_gen1(priv)) + return 0; +@@ -635,6 +714,19 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, + if (enable) + val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000; + ++ if (is_tdm || is_tdm_split) { ++ switch (id) { ++ case 0: ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ case 9: ++ val |= 0x0000ff00; ++ break; ++ } ++ } ++ + rsnd_mod_write(mod, SSI_INT_ENABLE, val); + + return 0; +@@ -651,6 +743,12 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, + u32 status; + bool elapsed = false; + bool stop = false; ++ int id = rsnd_mod_id(mod); ++ int i; ++ int is_tdm, is_tdm_split; ++ ++ is_tdm = rsnd_runtime_is_tdm(io); ++ is_tdm_split = rsnd_runtime_is_tdm_split(io); + + spin_lock(&priv->lock); + +@@ -672,6 +770,53 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, + stop = true; + } + ++ status = 0; ++ ++ if (is_tdm || is_tdm_split) { ++ switch (id) { ++ case 0: ++ case 1: ++ case 2: ++ case 3: ++ case 4: ++ for (i = 0; i < 4; i++) { ++ status = rsnd_mod_read(mod, ++ SSI_SYS_STATUS(i * 2)); ++ status &= 0xf << (id * 4); ++ ++ if (status) { ++ rsnd_dbg_irq_status(dev, ++ "%s err status : 0x%08x\n", ++ rsnd_mod_name(mod), status); ++ rsnd_mod_write(mod, ++ SSI_SYS_STATUS(i * 2), ++ 0xf << (id * 4)); ++ stop = true; ++ break; ++ } ++ } ++ break; ++ case 9: ++ for (i = 0; i < 4; i++) { ++ status = rsnd_mod_read(mod, ++ SSI_SYS_STATUS((i * 2) + 1)); ++ status &= 0xf << 4; ++ ++ if (status) { ++ rsnd_dbg_irq_status(dev, ++ "%s err status : 0x%08x\n", ++ rsnd_mod_name(mod), status); ++ rsnd_mod_write(mod, ++ SSI_SYS_STATUS((i * 2) + 1), ++ 0xf << 4); ++ stop = true; ++ break; ++ } ++ } ++ break; ++ } ++ } ++ + rsnd_ssi_status_clear(mod); + rsnd_ssi_interrupt_out: + spin_unlock(&priv->lock); +diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c +index 843b8b1c89d4..e5433e8fcf19 100644 +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -1720,9 +1720,25 @@ match: + dai_link->platforms->name = component->name; + + /* convert non BE into BE */ +- dai_link->no_pcm = 1; +- dai_link->dpcm_playback = 1; +- dai_link->dpcm_capture = 1; ++ if (!dai_link->no_pcm) { ++ dai_link->no_pcm = 1; ++ ++ if (dai_link->dpcm_playback) ++ dev_warn(card->dev, ++ "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n", ++ dai_link->name); ++ if (dai_link->dpcm_capture) ++ dev_warn(card->dev, ++ "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n", ++ dai_link->name); ++ ++ /* convert normal link into DPCM one */ ++ if (!(dai_link->dpcm_playback || ++ dai_link->dpcm_capture)) { ++ dai_link->dpcm_playback = !dai_link->capture_only; ++ dai_link->dpcm_capture = !dai_link->playback_only; ++ } ++ } + + /* override any BE fixups */ + dai_link->be_hw_params_fixup = +diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c +index e2632841b321..c0aa64ff8e32 100644 +--- a/sound/soc/soc-dapm.c ++++ b/sound/soc/soc-dapm.c +@@ -4340,16 +4340,16 @@ static void dapm_connect_dai_pair(struct snd_soc_card *card, + codec = codec_dai->playback_widget; + + if (playback_cpu && codec) { +- if (dai_link->params && !dai_link->playback_widget) { ++ if (dai_link->params && !rtd->playback_widget) { + substream = streams[SNDRV_PCM_STREAM_PLAYBACK].substream; + dai = snd_soc_dapm_new_dai(card, substream, "playback"); + if (IS_ERR(dai)) + goto capture; +- dai_link->playback_widget = dai; ++ rtd->playback_widget = dai; + } + + dapm_connect_dai_routes(&card->dapm, cpu_dai, playback_cpu, +- dai_link->playback_widget, ++ rtd->playback_widget, + codec_dai, codec); + } + +@@ -4358,16 +4358,16 @@ capture: + codec = codec_dai->capture_widget; + + if (codec && capture_cpu) { +- if (dai_link->params && !dai_link->capture_widget) { ++ if (dai_link->params && !rtd->capture_widget) { + substream = streams[SNDRV_PCM_STREAM_CAPTURE].substream; + dai = snd_soc_dapm_new_dai(card, substream, "capture"); + if (IS_ERR(dai)) + return; +- dai_link->capture_widget = dai; ++ rtd->capture_widget = dai; + } + + dapm_connect_dai_routes(&card->dapm, codec_dai, codec, +- dai_link->capture_widget, ++ rtd->capture_widget, + cpu_dai, capture_cpu); + } + } +diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c +index 1f302de44052..39ce61c5b874 100644 +--- a/sound/soc/soc-pcm.c ++++ b/sound/soc/soc-pcm.c +@@ -2908,20 +2908,44 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) + struct snd_pcm *pcm; + char new_name[64]; + int ret = 0, playback = 0, capture = 0; ++ int stream; + int i; + ++ if (rtd->dai_link->dynamic && rtd->num_cpus > 1) { ++ dev_err(rtd->dev, ++ "DPCM doesn't support Multi CPU for Front-Ends yet\n"); ++ return -EINVAL; ++ } ++ + if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) { +- cpu_dai = asoc_rtd_to_cpu(rtd, 0); +- if (rtd->num_cpus > 1) { +- dev_err(rtd->dev, +- "DPCM doesn't support Multi CPU yet\n"); +- return -EINVAL; ++ if (rtd->dai_link->dpcm_playback) { ++ stream = SNDRV_PCM_STREAM_PLAYBACK; ++ ++ for_each_rtd_cpu_dais(rtd, i, cpu_dai) ++ if (!snd_soc_dai_stream_valid(cpu_dai, ++ stream)) { ++ dev_err(rtd->card->dev, ++ "CPU DAI %s for rtd %s does not support playback\n", ++ cpu_dai->name, ++ rtd->dai_link->stream_name); ++ return -EINVAL; ++ } ++ playback = 1; ++ } ++ if (rtd->dai_link->dpcm_capture) { ++ stream = SNDRV_PCM_STREAM_CAPTURE; ++ ++ for_each_rtd_cpu_dais(rtd, i, cpu_dai) ++ if (!snd_soc_dai_stream_valid(cpu_dai, ++ stream)) { ++ dev_err(rtd->card->dev, ++ "CPU DAI %s for rtd %s does not support capture\n", ++ cpu_dai->name, ++ rtd->dai_link->stream_name); ++ return -EINVAL; ++ } ++ capture = 1; + } +- +- playback = rtd->dai_link->dpcm_playback && +- snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_PLAYBACK); +- capture = rtd->dai_link->dpcm_capture && +- snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_CAPTURE); + } else { + /* Adapt stream for codec2codec links */ + int cpu_capture = rtd->dai_link->params ? +diff --git a/sound/soc/sof/control.c b/sound/soc/sof/control.c +index dfc412e2d956..6d63768d42aa 100644 +--- a/sound/soc/sof/control.c ++++ b/sound/soc/sof/control.c +@@ -19,8 +19,8 @@ static void update_mute_led(struct snd_sof_control *scontrol, + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) + { +- unsigned int temp = 0; +- unsigned int mask; ++ int temp = 0; ++ int mask; + int i; + + mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); +diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c +index 91acfae7935c..74b438216216 100644 +--- a/sound/soc/sof/core.c ++++ b/sound/soc/sof/core.c +@@ -176,6 +176,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) + /* init the IPC */ + sdev->ipc = snd_sof_ipc_init(sdev); + if (!sdev->ipc) { ++ ret = -ENOMEM; + dev_err(sdev->dev, "error: failed to init DSP IPC %d\n", ret); + goto ipc_err; + } +diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig +index bae4f7bf5f75..812749064ca8 100644 +--- a/sound/soc/sof/imx/Kconfig ++++ b/sound/soc/sof/imx/Kconfig +@@ -14,7 +14,7 @@ if SND_SOC_SOF_IMX_TOPLEVEL + config SND_SOC_SOF_IMX8_SUPPORT + bool "SOF support for i.MX8" + depends on IMX_SCU +- depends on IMX_DSP ++ select IMX_DSP + help + This adds support for Sound Open Firmware for NXP i.MX8 platforms + Say Y if you have such a device. +diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c +index 3041fbbb010a..ea021db697b8 100644 +--- a/sound/soc/sof/intel/hda-codec.c ++++ b/sound/soc/sof/intel/hda-codec.c +@@ -24,19 +24,44 @@ + #define IDISP_VID_INTEL 0x80860000 + + /* load the legacy HDA codec driver */ +-static int hda_codec_load_module(struct hda_codec *codec) ++static int request_codec_module(struct hda_codec *codec) + { + #ifdef MODULE + char alias[MODULE_NAME_LEN]; +- const char *module = alias; ++ const char *mod = NULL; + +- snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias)); +- dev_dbg(&codec->core.dev, "loading codec module: %s\n", module); +- request_module(module); ++ switch (codec->probe_id) { ++ case HDA_CODEC_ID_GENERIC: ++#if IS_MODULE(CONFIG_SND_HDA_GENERIC) ++ mod = "snd-hda-codec-generic"; + #endif ++ break; ++ default: ++ snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias)); ++ mod = alias; ++ break; ++ } ++ ++ if (mod) { ++ dev_dbg(&codec->core.dev, "loading codec module: %s\n", mod); ++ request_module(mod); ++ } ++#endif /* MODULE */ + return device_attach(hda_codec_dev(codec)); + } + ++static int hda_codec_load_module(struct hda_codec *codec) ++{ ++ int ret = request_codec_module(codec); ++ ++ if (ret <= 0) { ++ codec->probe_id = HDA_CODEC_ID_GENERIC; ++ ret = request_codec_module(codec); ++ } ++ ++ return ret; ++} ++ + /* enable controller wake up event for all codecs with jack connectors */ + void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev) + { +@@ -78,6 +103,13 @@ void hda_codec_jack_check(struct snd_sof_dev *sdev) {} + EXPORT_SYMBOL_NS(hda_codec_jack_wake_enable, SND_SOC_SOF_HDA_AUDIO_CODEC); + EXPORT_SYMBOL_NS(hda_codec_jack_check, SND_SOC_SOF_HDA_AUDIO_CODEC); + ++#if IS_ENABLED(CONFIG_SND_HDA_GENERIC) ++#define is_generic_config(bus) \ ++ ((bus)->modelname && !strcmp((bus)->modelname, "generic")) ++#else ++#define is_generic_config(x) 0 ++#endif ++ + /* probe individual codec */ + static int hda_codec_probe(struct snd_sof_dev *sdev, int address, + bool hda_codec_use_common_hdmi) +@@ -87,6 +119,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, + #endif + struct hda_bus *hbus = sof_to_hbus(sdev); + struct hdac_device *hdev; ++ struct hda_codec *codec; + u32 hda_cmd = (address << 28) | (AC_NODE_ROOT << 20) | + (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID; + u32 resp = -1; +@@ -108,6 +141,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, + + hda_priv->codec.bus = hbus; + hdev = &hda_priv->codec.core; ++ codec = &hda_priv->codec; + + ret = snd_hdac_ext_bus_device_init(&hbus->core, address, hdev); + if (ret < 0) +@@ -122,6 +156,11 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, + hda_priv->need_display_power = true; + } + ++ if (is_generic_config(hbus)) ++ codec->probe_id = HDA_CODEC_ID_GENERIC; ++ else ++ codec->probe_id = 0; ++ + /* + * if common HDMI codec driver is not used, codec load + * is skipped here and hdac_hdmi is used instead +@@ -129,7 +168,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, + if (hda_codec_use_common_hdmi || + (resp & 0xFFFF0000) != IDISP_VID_INTEL) { + hdev->type = HDA_DEV_LEGACY; +- ret = hda_codec_load_module(&hda_priv->codec); ++ ret = hda_codec_load_module(codec); + /* + * handle ret==0 (no driver bound) as an error, but pass + * other return codes without modification +diff --git a/sound/soc/sof/nocodec.c b/sound/soc/sof/nocodec.c +index 2233146386cc..71cf5f9db79d 100644 +--- a/sound/soc/sof/nocodec.c ++++ b/sound/soc/sof/nocodec.c +@@ -52,8 +52,10 @@ static int sof_nocodec_bes_setup(struct device *dev, + links[i].platforms->name = dev_name(dev); + links[i].codecs->dai_name = "snd-soc-dummy-dai"; + links[i].codecs->name = "snd-soc-dummy"; +- links[i].dpcm_playback = 1; +- links[i].dpcm_capture = 1; ++ if (ops->drv[i].playback.channels_min) ++ links[i].dpcm_playback = 1; ++ if (ops->drv[i].capture.channels_min) ++ links[i].dpcm_capture = 1; + } + + card->dai_link = links; +diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c +index c410822d9920..01d83ddc16ba 100644 +--- a/sound/soc/sof/pm.c ++++ b/sound/soc/sof/pm.c +@@ -90,7 +90,10 @@ static int sof_resume(struct device *dev, bool runtime_resume) + int ret; + + /* do nothing if dsp resume callbacks are not set */ +- if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume) ++ if (!runtime_resume && !sof_ops(sdev)->resume) ++ return 0; ++ ++ if (runtime_resume && !sof_ops(sdev)->runtime_resume) + return 0; + + /* DSP was never successfully started, nothing to resume */ +@@ -175,7 +178,10 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) + int ret; + + /* do nothing if dsp suspend callback is not set */ +- if (!sof_ops(sdev)->suspend) ++ if (!runtime_suspend && !sof_ops(sdev)->suspend) ++ return 0; ++ ++ if (runtime_suspend && !sof_ops(sdev)->runtime_suspend) + return 0; + + if (sdev->fw_state != SOF_FW_BOOT_COMPLETE) +diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h +index bf65f31af858..875a5fc13297 100644 +--- a/sound/soc/sof/sof-audio.h ++++ b/sound/soc/sof/sof-audio.h +@@ -56,7 +56,7 @@ struct snd_sof_pcm { + struct snd_sof_led_control { + unsigned int use_led; + unsigned int direction; +- unsigned int led_value; ++ int led_value; + }; + + /* ALSA SOF Kcontrol device */ +diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c +index fe8ba3e05e08..ab2b69de1d4d 100644 +--- a/sound/soc/sof/topology.c ++++ b/sound/soc/sof/topology.c +@@ -1203,6 +1203,8 @@ static int sof_control_load(struct snd_soc_component *scomp, int index, + return ret; + } + ++ scontrol->led_ctl.led_value = -1; ++ + dobj->private = scontrol; + list_add(&scontrol->list, &sdev->kcontrol_list); + return ret; +diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c +index 9b5651502f12..3aca354f9e08 100644 +--- a/sound/soc/tegra/tegra_wm8903.c ++++ b/sound/soc/tegra/tegra_wm8903.c +@@ -177,6 +177,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) + struct snd_soc_component *component = codec_dai->component; + struct snd_soc_card *card = rtd->card; + struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); ++ int shrt = 0; + + if (gpio_is_valid(machine->gpio_hp_det)) { + tegra_wm8903_hp_jack_gpio.gpio = machine->gpio_hp_det; +@@ -189,12 +190,15 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) + &tegra_wm8903_hp_jack_gpio); + } + ++ if (of_property_read_bool(card->dev->of_node, "nvidia,headset")) ++ shrt = SND_JACK_MICROPHONE; ++ + snd_soc_card_jack_new(rtd->card, "Mic Jack", SND_JACK_MICROPHONE, + &tegra_wm8903_mic_jack, + tegra_wm8903_mic_jack_pins, + ARRAY_SIZE(tegra_wm8903_mic_jack_pins)); + wm8903_mic_detect(component, &tegra_wm8903_mic_jack, SND_JACK_MICROPHONE, +- 0); ++ shrt); + + snd_soc_dapm_force_enable_pin(&card->dapm, "MICBIAS"); + +diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c +index 734ffe925c4d..7a7db743dc5b 100644 +--- a/sound/soc/ti/davinci-mcasp.c ++++ b/sound/soc/ti/davinci-mcasp.c +@@ -1896,8 +1896,10 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp) + PTR_ERR(chan)); + return PTR_ERR(chan); + } +- if (WARN_ON(!chan->device || !chan->device->dev)) ++ if (WARN_ON(!chan->device || !chan->device->dev)) { ++ dma_release_channel(chan); + return -EINVAL; ++ } + + if (chan->device->dev->of_node) + ret = of_property_read_string(chan->device->dev->of_node, +diff --git a/sound/soc/ti/omap-mcbsp.c b/sound/soc/ti/omap-mcbsp.c +index 3d41ca2238d4..4f33ddb7b441 100644 +--- a/sound/soc/ti/omap-mcbsp.c ++++ b/sound/soc/ti/omap-mcbsp.c +@@ -686,7 +686,7 @@ static int omap_mcbsp_init(struct platform_device *pdev) + mcbsp->dma_data[1].addr = omap_mcbsp_dma_reg_params(mcbsp, + SNDRV_PCM_STREAM_CAPTURE); + +- mcbsp->fclk = clk_get(&pdev->dev, "fck"); ++ mcbsp->fclk = devm_clk_get(&pdev->dev, "fck"); + if (IS_ERR(mcbsp->fclk)) { + ret = PTR_ERR(mcbsp->fclk); + dev_err(mcbsp->dev, "unable to get fck: %d\n", ret); +@@ -711,7 +711,7 @@ static int omap_mcbsp_init(struct platform_device *pdev) + if (ret) { + dev_err(mcbsp->dev, + "Unable to create additional controls\n"); +- goto err_thres; ++ return ret; + } + } + +@@ -724,8 +724,6 @@ static int omap_mcbsp_init(struct platform_device *pdev) + err_st: + if (mcbsp->pdata->buffer_size) + sysfs_remove_group(&mcbsp->dev->kobj, &additional_attr_group); +-err_thres: +- clk_put(mcbsp->fclk); + return ret; + } + +@@ -1442,8 +1440,6 @@ static int asoc_mcbsp_remove(struct platform_device *pdev) + + omap_mcbsp_st_cleanup(pdev); + +- clk_put(mcbsp->fclk); +- + return 0; + } + +diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c +index 2873e8e6f02b..cdae1190b930 100644 +--- a/sound/soc/ux500/mop500.c ++++ b/sound/soc/ux500/mop500.c +@@ -63,10 +63,11 @@ static void mop500_of_node_put(void) + { + int i; + +- for (i = 0; i < 2; i++) { ++ for (i = 0; i < 2; i++) + of_node_put(mop500_dai_links[i].cpus->of_node); +- of_node_put(mop500_dai_links[i].codecs->of_node); +- } ++ ++ /* Both links use the same codec, which is refcounted only once */ ++ of_node_put(mop500_dai_links[0].codecs->of_node); + } + + static int mop500_of_probe(struct platform_device *pdev, +@@ -81,7 +82,9 @@ static int mop500_of_probe(struct platform_device *pdev, + + if (!(msp_np[0] && msp_np[1] && codec_np)) { + dev_err(&pdev->dev, "Phandle missing or invalid\n"); +- mop500_of_node_put(); ++ for (i = 0; i < 2; i++) ++ of_node_put(msp_np[i]); ++ of_node_put(codec_np); + return -EINVAL; + } + +diff --git a/sound/usb/card.h b/sound/usb/card.h +index 395403a2d33f..d6219fba9699 100644 +--- a/sound/usb/card.h ++++ b/sound/usb/card.h +@@ -84,6 +84,10 @@ struct snd_usb_endpoint { + dma_addr_t sync_dma; /* DMA address of syncbuf */ + + unsigned int pipe; /* the data i/o pipe */ ++ unsigned int framesize[2]; /* small/large frame sizes in samples */ ++ unsigned int sample_rem; /* remainder from division fs/fps */ ++ unsigned int sample_accum; /* sample accumulator */ ++ unsigned int fps; /* frames per second */ + unsigned int freqn; /* nominal sampling rate in fs/fps in Q16.16 format */ + unsigned int freqm; /* momentary sampling rate in fs/fps in Q16.16 format */ + int freqshift; /* how much to shift the feedback value to get Q16.16 */ +@@ -104,6 +108,7 @@ struct snd_usb_endpoint { + int iface, altsetting; + int skip_packets; /* quirks for devices to ignore the first n packets + in a stream */ ++ bool is_implicit_feedback; /* This endpoint is used as implicit feedback */ + + spinlock_t lock; + struct list_head list; +diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c +index 4a9a2f6ef5a4..9bea7d3f99f8 100644 +--- a/sound/usb/endpoint.c ++++ b/sound/usb/endpoint.c +@@ -124,12 +124,12 @@ int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep) + + /* + * For streaming based on information derived from sync endpoints, +- * prepare_outbound_urb_sizes() will call next_packet_size() to ++ * prepare_outbound_urb_sizes() will call slave_next_packet_size() to + * determine the number of samples to be sent in the next packet. + * +- * For implicit feedback, next_packet_size() is unused. ++ * For implicit feedback, slave_next_packet_size() is unused. + */ +-int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) ++int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep) + { + unsigned long flags; + int ret; +@@ -146,6 +146,29 @@ int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) + return ret; + } + ++/* ++ * For adaptive and synchronous endpoints, prepare_outbound_urb_sizes() ++ * will call next_packet_size() to determine the number of samples to be ++ * sent in the next packet. ++ */ ++int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) ++{ ++ int ret; ++ ++ if (ep->fill_max) ++ return ep->maxframesize; ++ ++ ep->sample_accum += ep->sample_rem; ++ if (ep->sample_accum >= ep->fps) { ++ ep->sample_accum -= ep->fps; ++ ret = ep->framesize[1]; ++ } else { ++ ret = ep->framesize[0]; ++ } ++ ++ return ret; ++} ++ + static void retire_outbound_urb(struct snd_usb_endpoint *ep, + struct snd_urb_ctx *urb_ctx) + { +@@ -190,6 +213,8 @@ static void prepare_silent_urb(struct snd_usb_endpoint *ep, + + if (ctx->packet_size[i]) + counts = ctx->packet_size[i]; ++ else if (ep->sync_master) ++ counts = snd_usb_endpoint_slave_next_packet_size(ep); + else + counts = snd_usb_endpoint_next_packet_size(ep); + +@@ -321,17 +346,17 @@ static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) + ep->next_packet_read_pos %= MAX_URBS; + + /* take URB out of FIFO */ +- if (!list_empty(&ep->ready_playback_urbs)) ++ if (!list_empty(&ep->ready_playback_urbs)) { + ctx = list_first_entry(&ep->ready_playback_urbs, + struct snd_urb_ctx, ready_list); ++ list_del_init(&ctx->ready_list); ++ } + } + spin_unlock_irqrestore(&ep->lock, flags); + + if (ctx == NULL) + return; + +- list_del_init(&ctx->ready_list); +- + /* copy over the length information */ + for (i = 0; i < packet->packets; i++) + ctx->packet_size[i] = packet->packet_size[i]; +@@ -497,6 +522,8 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, + + list_add_tail(&ep->list, &chip->ep_list); + ++ ep->is_implicit_feedback = 0; ++ + __exit_unlock: + mutex_unlock(&chip->mutex); + +@@ -596,6 +623,178 @@ static void release_urbs(struct snd_usb_endpoint *ep, int force) + ep->nurbs = 0; + } + ++/* ++ * Check data endpoint for format differences ++ */ ++static bool check_ep_params(struct snd_usb_endpoint *ep, ++ snd_pcm_format_t pcm_format, ++ unsigned int channels, ++ unsigned int period_bytes, ++ unsigned int frames_per_period, ++ unsigned int periods_per_buffer, ++ struct audioformat *fmt, ++ struct snd_usb_endpoint *sync_ep) ++{ ++ unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb; ++ unsigned int max_packs_per_period, urbs_per_period, urb_packs; ++ unsigned int max_urbs; ++ int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels; ++ int tx_length_quirk = (ep->chip->tx_length_quirk && ++ usb_pipeout(ep->pipe)); ++ bool ret = 1; ++ ++ if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) { ++ /* ++ * When operating in DSD DOP mode, the size of a sample frame ++ * in hardware differs from the actual physical format width ++ * because we need to make room for the DOP markers. ++ */ ++ frame_bits += channels << 3; ++ } ++ ++ ret = ret && (ep->datainterval == fmt->datainterval); ++ ret = ret && (ep->stride == frame_bits >> 3); ++ ++ switch (pcm_format) { ++ case SNDRV_PCM_FORMAT_U8: ++ ret = ret && (ep->silence_value == 0x80); ++ break; ++ case SNDRV_PCM_FORMAT_DSD_U8: ++ case SNDRV_PCM_FORMAT_DSD_U16_LE: ++ case SNDRV_PCM_FORMAT_DSD_U32_LE: ++ case SNDRV_PCM_FORMAT_DSD_U16_BE: ++ case SNDRV_PCM_FORMAT_DSD_U32_BE: ++ ret = ret && (ep->silence_value == 0x69); ++ break; ++ default: ++ ret = ret && (ep->silence_value == 0); ++ } ++ ++ /* assume max. frequency is 50% higher than nominal */ ++ ret = ret && (ep->freqmax == ep->freqn + (ep->freqn >> 1)); ++ /* Round up freqmax to nearest integer in order to calculate maximum ++ * packet size, which must represent a whole number of frames. ++ * This is accomplished by adding 0x0.ffff before converting the ++ * Q16.16 format into integer. ++ * In order to accurately calculate the maximum packet size when ++ * the data interval is more than 1 (i.e. ep->datainterval > 0), ++ * multiply by the data interval prior to rounding. For instance, ++ * a freqmax of 41 kHz will result in a max packet size of 6 (5.125) ++ * frames with a data interval of 1, but 11 (10.25) frames with a ++ * data interval of 2. ++ * (ep->freqmax << ep->datainterval overflows at 8.192 MHz for the ++ * maximum datainterval value of 3, at USB full speed, higher for ++ * USB high speed, noting that ep->freqmax is in units of ++ * frames per packet in Q16.16 format.) ++ */ ++ maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) * ++ (frame_bits >> 3); ++ if (tx_length_quirk) ++ maxsize += sizeof(__le32); /* Space for length descriptor */ ++ /* but wMaxPacketSize might reduce this */ ++ if (ep->maxpacksize && ep->maxpacksize < maxsize) { ++ /* whatever fits into a max. size packet */ ++ unsigned int data_maxsize = maxsize = ep->maxpacksize; ++ ++ if (tx_length_quirk) ++ /* Need to remove the length descriptor to calc freq */ ++ data_maxsize -= sizeof(__le32); ++ ret = ret && (ep->freqmax == (data_maxsize / (frame_bits >> 3)) ++ << (16 - ep->datainterval)); ++ } ++ ++ if (ep->fill_max) ++ ret = ret && (ep->curpacksize == ep->maxpacksize); ++ else ++ ret = ret && (ep->curpacksize == maxsize); ++ ++ if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) { ++ packs_per_ms = 8 >> ep->datainterval; ++ max_packs_per_urb = MAX_PACKS_HS; ++ } else { ++ packs_per_ms = 1; ++ max_packs_per_urb = MAX_PACKS; ++ } ++ if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep)) ++ max_packs_per_urb = min(max_packs_per_urb, ++ 1U << sync_ep->syncinterval); ++ max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); ++ ++ /* ++ * Capture endpoints need to use small URBs because there's no way ++ * to tell in advance where the next period will end, and we don't ++ * want the next URB to complete much after the period ends. ++ * ++ * Playback endpoints with implicit sync much use the same parameters ++ * as their corresponding capture endpoint. ++ */ ++ if (usb_pipein(ep->pipe) || ++ snd_usb_endpoint_implicit_feedback_sink(ep)) { ++ ++ urb_packs = packs_per_ms; ++ /* ++ * Wireless devices can poll at a max rate of once per 4ms. ++ * For dataintervals less than 5, increase the packet count to ++ * allow the host controller to use bursting to fill in the ++ * gaps. ++ */ ++ if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_WIRELESS) { ++ int interval = ep->datainterval; ++ ++ while (interval < 5) { ++ urb_packs <<= 1; ++ ++interval; ++ } ++ } ++ /* make capture URBs <= 1 ms and smaller than a period */ ++ urb_packs = min(max_packs_per_urb, urb_packs); ++ while (urb_packs > 1 && urb_packs * maxsize >= period_bytes) ++ urb_packs >>= 1; ++ ret = ret && (ep->nurbs == MAX_URBS); ++ ++ /* ++ * Playback endpoints without implicit sync are adjusted so that ++ * a period fits as evenly as possible in the smallest number of ++ * URBs. The total number of URBs is adjusted to the size of the ++ * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits. ++ */ ++ } else { ++ /* determine how small a packet can be */ ++ minsize = (ep->freqn >> (16 - ep->datainterval)) * ++ (frame_bits >> 3); ++ /* with sync from device, assume it can be 12% lower */ ++ if (sync_ep) ++ minsize -= minsize >> 3; ++ minsize = max(minsize, 1u); ++ ++ /* how many packets will contain an entire ALSA period? */ ++ max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize); ++ ++ /* how many URBs will contain a period? */ ++ urbs_per_period = DIV_ROUND_UP(max_packs_per_period, ++ max_packs_per_urb); ++ /* how many packets are needed in each URB? */ ++ urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period); ++ ++ /* limit the number of frames in a single URB */ ++ ret = ret && (ep->max_urb_frames == ++ DIV_ROUND_UP(frames_per_period, urbs_per_period)); ++ ++ /* try to use enough URBs to contain an entire ALSA buffer */ ++ max_urbs = min((unsigned) MAX_URBS, ++ MAX_QUEUE * packs_per_ms / urb_packs); ++ ret = ret && (ep->nurbs == min(max_urbs, ++ urbs_per_period * periods_per_buffer)); ++ } ++ ++ ret = ret && (ep->datainterval == fmt->datainterval); ++ ret = ret && (ep->maxpacksize == fmt->maxpacksize); ++ ret = ret && ++ (ep->fill_max == !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX)); ++ ++ return ret; ++} ++ + /* + * configure a data endpoint + */ +@@ -861,10 +1060,23 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, + int err; + + if (ep->use_count != 0) { +- usb_audio_warn(ep->chip, +- "Unable to change format on ep #%x: already in use\n", +- ep->ep_num); +- return -EBUSY; ++ bool check = ep->is_implicit_feedback && ++ check_ep_params(ep, pcm_format, ++ channels, period_bytes, ++ period_frames, buffer_periods, ++ fmt, sync_ep); ++ ++ if (!check) { ++ usb_audio_warn(ep->chip, ++ "Unable to change format on ep #%x: already in use\n", ++ ep->ep_num); ++ return -EBUSY; ++ } ++ ++ usb_audio_dbg(ep->chip, ++ "Ep #%x already in use as implicit feedback but format not changed\n", ++ ep->ep_num); ++ return 0; + } + + /* release old buffers, if any */ +@@ -874,10 +1086,17 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, + ep->maxpacksize = fmt->maxpacksize; + ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX); + +- if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) ++ if (snd_usb_get_speed(ep->chip->dev) == USB_SPEED_FULL) { + ep->freqn = get_usb_full_speed_rate(rate); +- else ++ ep->fps = 1000; ++ } else { + ep->freqn = get_usb_high_speed_rate(rate); ++ ep->fps = 8000; ++ } ++ ++ ep->sample_rem = rate % ep->fps; ++ ep->framesize[0] = rate / ep->fps; ++ ep->framesize[1] = (rate + (ep->fps - 1)) / ep->fps; + + /* calculate the frequency in 16.16 format */ + ep->freqm = ep->freqn; +@@ -936,6 +1155,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) + ep->active_mask = 0; + ep->unlink_mask = 0; + ep->phase = 0; ++ ep->sample_accum = 0; + + snd_usb_endpoint_start_quirk(ep); + +diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h +index 63a39d4fa8d8..d23fa0a8c11b 100644 +--- a/sound/usb/endpoint.h ++++ b/sound/usb/endpoint.h +@@ -28,6 +28,7 @@ void snd_usb_endpoint_release(struct snd_usb_endpoint *ep); + void snd_usb_endpoint_free(struct snd_usb_endpoint *ep); + + int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep); ++int snd_usb_endpoint_slave_next_packet_size(struct snd_usb_endpoint *ep); + int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep); + + void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, +diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c +index a5f65a9a0254..aad2683ff793 100644 +--- a/sound/usb/mixer_quirks.c ++++ b/sound/usb/mixer_quirks.c +@@ -2185,6 +2185,421 @@ static int snd_rme_controls_create(struct usb_mixer_interface *mixer) + return 0; + } + ++/* ++ * RME Babyface Pro (FS) ++ * ++ * These devices exposes a couple of DSP functions via request to EP0. ++ * Switches are available via control registers, while routing is controlled ++ * by controlling the volume on each possible crossing point. ++ * Volume control is linear, from -inf (dec. 0) to +6dB (dec. 65536) with ++ * 0dB being at dec. 32768. ++ */ ++enum { ++ SND_BBFPRO_CTL_REG1 = 0, ++ SND_BBFPRO_CTL_REG2 ++}; ++ ++#define SND_BBFPRO_CTL_REG_MASK 1 ++#define SND_BBFPRO_CTL_IDX_MASK 0xff ++#define SND_BBFPRO_CTL_IDX_SHIFT 1 ++#define SND_BBFPRO_CTL_VAL_MASK 1 ++#define SND_BBFPRO_CTL_VAL_SHIFT 9 ++#define SND_BBFPRO_CTL_REG1_CLK_MASTER 0 ++#define SND_BBFPRO_CTL_REG1_CLK_OPTICAL 1 ++#define SND_BBFPRO_CTL_REG1_SPDIF_PRO 7 ++#define SND_BBFPRO_CTL_REG1_SPDIF_EMPH 8 ++#define SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL 10 ++#define SND_BBFPRO_CTL_REG2_48V_AN1 0 ++#define SND_BBFPRO_CTL_REG2_48V_AN2 1 ++#define SND_BBFPRO_CTL_REG2_SENS_IN3 2 ++#define SND_BBFPRO_CTL_REG2_SENS_IN4 3 ++#define SND_BBFPRO_CTL_REG2_PAD_AN1 4 ++#define SND_BBFPRO_CTL_REG2_PAD_AN2 5 ++ ++#define SND_BBFPRO_MIXER_IDX_MASK 0x1ff ++#define SND_BBFPRO_MIXER_VAL_MASK 0x3ffff ++#define SND_BBFPRO_MIXER_VAL_SHIFT 9 ++#define SND_BBFPRO_MIXER_VAL_MIN 0 // -inf ++#define SND_BBFPRO_MIXER_VAL_MAX 65536 // +6dB ++ ++#define SND_BBFPRO_USBREQ_CTL_REG1 0x10 ++#define SND_BBFPRO_USBREQ_CTL_REG2 0x17 ++#define SND_BBFPRO_USBREQ_MIXER 0x12 ++ ++static int snd_bbfpro_ctl_update(struct usb_mixer_interface *mixer, u8 reg, ++ u8 index, u8 value) ++{ ++ int err; ++ u16 usb_req, usb_idx, usb_val; ++ struct snd_usb_audio *chip = mixer->chip; ++ ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ ++ if (reg == SND_BBFPRO_CTL_REG1) { ++ usb_req = SND_BBFPRO_USBREQ_CTL_REG1; ++ if (index == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) { ++ usb_idx = 3; ++ usb_val = value ? 3 : 0; ++ } else { ++ usb_idx = 1 << index; ++ usb_val = value ? usb_idx : 0; ++ } ++ } else { ++ usb_req = SND_BBFPRO_USBREQ_CTL_REG2; ++ usb_idx = 1 << index; ++ usb_val = value ? usb_idx : 0; ++ } ++ ++ err = snd_usb_ctl_msg(chip->dev, ++ usb_sndctrlpipe(chip->dev, 0), usb_req, ++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, ++ usb_val, usb_idx, 0, 0); ++ ++ snd_usb_unlock_shutdown(chip); ++ return err; ++} ++ ++static int snd_bbfpro_ctl_get(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ u8 reg, idx, val; ++ int pv; ++ ++ pv = kcontrol->private_value; ++ reg = pv & SND_BBFPRO_CTL_REG_MASK; ++ idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK; ++ val = kcontrol->private_value >> SND_BBFPRO_CTL_VAL_SHIFT; ++ ++ if ((reg == SND_BBFPRO_CTL_REG1 && ++ idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) || ++ (reg == SND_BBFPRO_CTL_REG2 && ++ (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 || ++ idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) { ++ ucontrol->value.enumerated.item[0] = val; ++ } else { ++ ucontrol->value.integer.value[0] = val; ++ } ++ return 0; ++} ++ ++static int snd_bbfpro_ctl_info(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_info *uinfo) ++{ ++ u8 reg, idx; ++ int pv; ++ ++ pv = kcontrol->private_value; ++ reg = pv & SND_BBFPRO_CTL_REG_MASK; ++ idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK; ++ ++ if (reg == SND_BBFPRO_CTL_REG1 && ++ idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) { ++ static const char * const texts[2] = { ++ "AutoSync", ++ "Internal" ++ }; ++ return snd_ctl_enum_info(uinfo, 1, 2, texts); ++ } else if (reg == SND_BBFPRO_CTL_REG2 && ++ (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 || ++ idx == SND_BBFPRO_CTL_REG2_SENS_IN4)) { ++ static const char * const texts[2] = { ++ "-10dBV", ++ "+4dBu" ++ }; ++ return snd_ctl_enum_info(uinfo, 1, 2, texts); ++ } ++ ++ uinfo->count = 1; ++ uinfo->value.integer.min = 0; ++ uinfo->value.integer.max = 1; ++ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; ++ return 0; ++} ++ ++static int snd_bbfpro_ctl_put(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ int err; ++ u8 reg, idx; ++ int old_value, pv, val; ++ ++ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol); ++ struct usb_mixer_interface *mixer = list->mixer; ++ ++ pv = kcontrol->private_value; ++ reg = pv & SND_BBFPRO_CTL_REG_MASK; ++ idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK; ++ old_value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK; ++ ++ if ((reg == SND_BBFPRO_CTL_REG1 && ++ idx == SND_BBFPRO_CTL_REG1_CLK_OPTICAL) || ++ (reg == SND_BBFPRO_CTL_REG2 && ++ (idx == SND_BBFPRO_CTL_REG2_SENS_IN3 || ++ idx == SND_BBFPRO_CTL_REG2_SENS_IN4))) { ++ val = ucontrol->value.enumerated.item[0]; ++ } else { ++ val = ucontrol->value.integer.value[0]; ++ } ++ ++ if (val > 1) ++ return -EINVAL; ++ ++ if (val == old_value) ++ return 0; ++ ++ kcontrol->private_value = reg ++ | ((idx & SND_BBFPRO_CTL_IDX_MASK) << SND_BBFPRO_CTL_IDX_SHIFT) ++ | ((val & SND_BBFPRO_CTL_VAL_MASK) << SND_BBFPRO_CTL_VAL_SHIFT); ++ ++ err = snd_bbfpro_ctl_update(mixer, reg, idx, val); ++ return err < 0 ? err : 1; ++} ++ ++static int snd_bbfpro_ctl_resume(struct usb_mixer_elem_list *list) ++{ ++ u8 reg, idx; ++ int value, pv; ++ ++ pv = list->kctl->private_value; ++ reg = pv & SND_BBFPRO_CTL_REG_MASK; ++ idx = (pv >> SND_BBFPRO_CTL_IDX_SHIFT) & SND_BBFPRO_CTL_IDX_MASK; ++ value = (pv >> SND_BBFPRO_CTL_VAL_SHIFT) & SND_BBFPRO_CTL_VAL_MASK; ++ ++ return snd_bbfpro_ctl_update(list->mixer, reg, idx, value); ++} ++ ++static int snd_bbfpro_vol_update(struct usb_mixer_interface *mixer, u16 index, ++ u32 value) ++{ ++ struct snd_usb_audio *chip = mixer->chip; ++ int err; ++ u16 idx; ++ u16 usb_idx, usb_val; ++ u32 v; ++ ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ ++ idx = index & SND_BBFPRO_MIXER_IDX_MASK; ++ // 18 bit linear volume, split so 2 bits end up in index. ++ v = value & SND_BBFPRO_MIXER_VAL_MASK; ++ usb_idx = idx | (v & 0x3) << 14; ++ usb_val = (v >> 2) & 0xffff; ++ ++ err = snd_usb_ctl_msg(chip->dev, ++ usb_sndctrlpipe(chip->dev, 0), ++ SND_BBFPRO_USBREQ_MIXER, ++ USB_DIR_OUT | USB_TYPE_VENDOR | ++ USB_RECIP_DEVICE, ++ usb_val, usb_idx, 0, 0); ++ ++ snd_usb_unlock_shutdown(chip); ++ return err; ++} ++ ++static int snd_bbfpro_vol_get(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ ucontrol->value.integer.value[0] = ++ kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT; ++ return 0; ++} ++ ++static int snd_bbfpro_vol_info(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_info *uinfo) ++{ ++ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; ++ uinfo->count = 1; ++ uinfo->value.integer.min = SND_BBFPRO_MIXER_VAL_MIN; ++ uinfo->value.integer.max = SND_BBFPRO_MIXER_VAL_MAX; ++ return 0; ++} ++ ++static int snd_bbfpro_vol_put(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ int err; ++ u16 idx; ++ u32 new_val, old_value, uvalue; ++ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol); ++ struct usb_mixer_interface *mixer = list->mixer; ++ ++ uvalue = ucontrol->value.integer.value[0]; ++ idx = kcontrol->private_value & SND_BBFPRO_MIXER_IDX_MASK; ++ old_value = kcontrol->private_value >> SND_BBFPRO_MIXER_VAL_SHIFT; ++ ++ if (uvalue > SND_BBFPRO_MIXER_VAL_MAX) ++ return -EINVAL; ++ ++ if (uvalue == old_value) ++ return 0; ++ ++ new_val = uvalue & SND_BBFPRO_MIXER_VAL_MASK; ++ ++ kcontrol->private_value = idx ++ | (new_val << SND_BBFPRO_MIXER_VAL_SHIFT); ++ ++ err = snd_bbfpro_vol_update(mixer, idx, new_val); ++ return err < 0 ? err : 1; ++} ++ ++static int snd_bbfpro_vol_resume(struct usb_mixer_elem_list *list) ++{ ++ int pv = list->kctl->private_value; ++ u16 idx = pv & SND_BBFPRO_MIXER_IDX_MASK; ++ u32 val = (pv >> SND_BBFPRO_MIXER_VAL_SHIFT) ++ & SND_BBFPRO_MIXER_VAL_MASK; ++ return snd_bbfpro_vol_update(list->mixer, idx, val); ++} ++ ++// Predfine elements ++static const struct snd_kcontrol_new snd_bbfpro_ctl_control = { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, ++ .index = 0, ++ .info = snd_bbfpro_ctl_info, ++ .get = snd_bbfpro_ctl_get, ++ .put = snd_bbfpro_ctl_put ++}; ++ ++static const struct snd_kcontrol_new snd_bbfpro_vol_control = { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, ++ .index = 0, ++ .info = snd_bbfpro_vol_info, ++ .get = snd_bbfpro_vol_get, ++ .put = snd_bbfpro_vol_put ++}; ++ ++static int snd_bbfpro_ctl_add(struct usb_mixer_interface *mixer, u8 reg, ++ u8 index, char *name) ++{ ++ struct snd_kcontrol_new knew = snd_bbfpro_ctl_control; ++ ++ knew.name = name; ++ knew.private_value = (reg & SND_BBFPRO_CTL_REG_MASK) ++ | ((index & SND_BBFPRO_CTL_IDX_MASK) ++ << SND_BBFPRO_CTL_IDX_SHIFT); ++ ++ return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_ctl_resume, ++ &knew, NULL); ++} ++ ++static int snd_bbfpro_vol_add(struct usb_mixer_interface *mixer, u16 index, ++ char *name) ++{ ++ struct snd_kcontrol_new knew = snd_bbfpro_vol_control; ++ ++ knew.name = name; ++ knew.private_value = index & SND_BBFPRO_MIXER_IDX_MASK; ++ ++ return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_vol_resume, ++ &knew, NULL); ++} ++ ++static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer) ++{ ++ int err, i, o; ++ char name[48]; ++ ++ static const char * const input[] = { ++ "AN1", "AN2", "IN3", "IN4", "AS1", "AS2", "ADAT3", ++ "ADAT4", "ADAT5", "ADAT6", "ADAT7", "ADAT8"}; ++ ++ static const char * const output[] = { ++ "AN1", "AN2", "PH3", "PH4", "AS1", "AS2", "ADAT3", "ADAT4", ++ "ADAT5", "ADAT6", "ADAT7", "ADAT8"}; ++ ++ for (o = 0 ; o < 12 ; ++o) { ++ for (i = 0 ; i < 12 ; ++i) { ++ // Line routing ++ snprintf(name, sizeof(name), ++ "%s-%s-%s Playback Volume", ++ (i < 2 ? "Mic" : "Line"), ++ input[i], output[o]); ++ err = snd_bbfpro_vol_add(mixer, (26 * o + i), name); ++ if (err < 0) ++ return err; ++ ++ // PCM routing... yes, it is output remapping ++ snprintf(name, sizeof(name), ++ "PCM-%s-%s Playback Volume", ++ output[i], output[o]); ++ err = snd_bbfpro_vol_add(mixer, (26 * o + 12 + i), ++ name); ++ if (err < 0) ++ return err; ++ } ++ } ++ ++ // Control Reg 1 ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1, ++ SND_BBFPRO_CTL_REG1_CLK_OPTICAL, ++ "Sample Clock Source"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1, ++ SND_BBFPRO_CTL_REG1_SPDIF_PRO, ++ "IEC958 Pro Mask"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1, ++ SND_BBFPRO_CTL_REG1_SPDIF_EMPH, ++ "IEC958 Emphasis"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1, ++ SND_BBFPRO_CTL_REG1_SPDIF_OPTICAL, ++ "IEC958 Switch"); ++ if (err < 0) ++ return err; ++ ++ // Control Reg 2 ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_48V_AN1, ++ "Mic-AN1 48V"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_48V_AN2, ++ "Mic-AN2 48V"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_SENS_IN3, ++ "Line-IN3 Sens."); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_SENS_IN4, ++ "Line-IN4 Sens."); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_PAD_AN1, ++ "Mic-AN1 PAD"); ++ if (err < 0) ++ return err; ++ ++ err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2, ++ SND_BBFPRO_CTL_REG2_PAD_AN2, ++ "Mic-AN2 PAD"); ++ if (err < 0) ++ return err; ++ ++ return 0; ++} ++ + int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) + { + int err = 0; +@@ -2286,6 +2701,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) + case USB_ID(0x0194f, 0x010c): /* Presonus Studio 1810c */ + err = snd_sc1810_init_mixer(mixer); + break; ++ case USB_ID(0x2a39, 0x3fb0): /* RME Babyface Pro FS */ ++ err = snd_bbfpro_controls_create(mixer); ++ break; + } + + return err; +diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c +index a4e4064f9aee..d61c2f1095b5 100644 +--- a/sound/usb/pcm.c ++++ b/sound/usb/pcm.c +@@ -404,6 +404,8 @@ add_sync_ep: + if (!subs->sync_endpoint) + return -EINVAL; + ++ subs->sync_endpoint->is_implicit_feedback = 1; ++ + subs->data_endpoint->sync_master = subs->sync_endpoint; + + return 1; +@@ -502,12 +504,15 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, + implicit_fb ? + SND_USB_ENDPOINT_TYPE_DATA : + SND_USB_ENDPOINT_TYPE_SYNC); ++ + if (!subs->sync_endpoint) { + if (is_playback && attr == USB_ENDPOINT_SYNC_NONE) + return 0; + return -EINVAL; + } + ++ subs->sync_endpoint->is_implicit_feedback = implicit_fb; ++ + subs->data_endpoint->sync_master = subs->sync_endpoint; + + return 0; +@@ -1579,6 +1584,8 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, + for (i = 0; i < ctx->packets; i++) { + if (ctx->packet_size[i]) + counts = ctx->packet_size[i]; ++ else if (ep->sync_master) ++ counts = snd_usb_endpoint_slave_next_packet_size(ep); + else + counts = snd_usb_endpoint_next_packet_size(ep); + +diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c +index 0efaf45f7367..e0878f5f74b1 100644 +--- a/tools/bootconfig/main.c ++++ b/tools/bootconfig/main.c +@@ -14,13 +14,18 @@ + #include <linux/kernel.h> + #include <linux/bootconfig.h> + +-static int xbc_show_array(struct xbc_node *node) ++static int xbc_show_value(struct xbc_node *node) + { + const char *val; ++ char q; + int i = 0; + + xbc_array_for_each_value(node, val) { +- printf("\"%s\"%s", val, node->next ? ", " : ";\n"); ++ if (strchr(val, '"')) ++ q = '\''; ++ else ++ q = '"'; ++ printf("%c%s%c%s", q, val, q, node->next ? ", " : ";\n"); + i++; + } + return i; +@@ -48,10 +53,7 @@ static void xbc_show_compact_tree(void) + continue; + } else if (cnode && xbc_node_is_value(cnode)) { + printf("%s = ", xbc_node_get_data(node)); +- if (cnode->next) +- xbc_show_array(cnode); +- else +- printf("\"%s\";\n", xbc_node_get_data(cnode)); ++ xbc_show_value(cnode); + } else { + printf("%s;\n", xbc_node_get_data(node)); + } +@@ -205,11 +207,13 @@ int show_xbc(const char *path) + } + + ret = load_xbc_from_initrd(fd, &buf); +- if (ret < 0) ++ if (ret < 0) { + pr_err("Failed to load a boot config from initrd: %d\n", ret); +- else +- xbc_show_compact_tree(); +- ++ goto out; ++ } ++ xbc_show_compact_tree(); ++ ret = 0; ++out: + close(fd); + free(buf); + +diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c +index f8113b3646f5..f5960b48c861 100644 +--- a/tools/bpf/bpftool/gen.c ++++ b/tools/bpf/bpftool/gen.c +@@ -225,6 +225,7 @@ static int codegen(const char *template, ...) + } else { + p_err("unrecognized character at pos %td in template '%s'", + src - template - 1, template); ++ free(s); + return -EINVAL; + } + } +@@ -235,6 +236,7 @@ static int codegen(const char *template, ...) + if (*src != '\t') { + p_err("not enough tabs at pos %td in template '%s'", + src - template - 1, template); ++ free(s); + return -EINVAL; + } + } +diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c +index 0c28ee82834b..653dbbe2e366 100644 +--- a/tools/lib/bpf/btf_dump.c ++++ b/tools/lib/bpf/btf_dump.c +@@ -1137,6 +1137,20 @@ static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) + } + } + ++static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) ++{ ++ const struct btf_type *t; ++ __u32 id; ++ ++ while (decl_stack->cnt) { ++ id = decl_stack->ids[decl_stack->cnt - 1]; ++ t = btf__type_by_id(d->btf, id); ++ if (!btf_is_mod(t)) ++ return; ++ decl_stack->cnt--; ++ } ++} ++ + static void btf_dump_emit_name(const struct btf_dump *d, + const char *name, bool last_was_ptr) + { +@@ -1235,14 +1249,7 @@ static void btf_dump_emit_type_chain(struct btf_dump *d, + * a const/volatile modifier for array, so we are + * going to silently skip them here. + */ +- while (decls->cnt) { +- next_id = decls->ids[decls->cnt - 1]; +- next_t = btf__type_by_id(d->btf, next_id); +- if (btf_is_mod(next_t)) +- decls->cnt--; +- else +- break; +- } ++ btf_dump_drop_mods(d, decls); + + if (decls->cnt == 0) { + btf_dump_emit_name(d, fname, last_was_ptr); +@@ -1270,7 +1277,15 @@ static void btf_dump_emit_type_chain(struct btf_dump *d, + __u16 vlen = btf_vlen(t); + int i; + +- btf_dump_emit_mods(d, decls); ++ /* ++ * GCC emits extra volatile qualifier for ++ * __attribute__((noreturn)) function pointers. Clang ++ * doesn't do it. It's a GCC quirk for backwards ++ * compatibility with code written for GCC <2.5. So, ++ * similarly to extra qualifiers for array, just drop ++ * them, instead of handling them. ++ */ ++ btf_dump_drop_mods(d, decls); + if (decls->cnt) { + btf_dump_printf(d, " ("); + btf_dump_emit_type_chain(d, decls, fname, lvl); +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index 0c5b4fb553fb..c417cff2cdaf 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -3455,10 +3455,6 @@ bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) + char *cp, errmsg[STRERR_BUFSIZE]; + int err, zero = 0; + +- /* kernel already zero-initializes .bss map. */ +- if (map_type == LIBBPF_MAP_BSS) +- return 0; +- + err = bpf_map_update_elem(map->fd, &zero, map->mmaped, 0); + if (err) { + err = -errno; +diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c +index 26d8fc27e427..fc7855262162 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -476,8 +476,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report + if (rep->time_str) + ret += fprintf(fp, " (time slices: %s)", rep->time_str); + +- if (symbol_conf.show_ref_callgraph && +- strstr(evname, "call-graph=no")) { ++ if (symbol_conf.show_ref_callgraph && evname && strstr(evname, "call-graph=no")) { + ret += fprintf(fp, ", show reference callgraph"); + } + +diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y +index 94f8bcd83582..9a41247c602b 100644 +--- a/tools/perf/util/parse-events.y ++++ b/tools/perf/util/parse-events.y +@@ -348,7 +348,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc + struct list_head *list; + char pmu_name[128]; + +- snprintf(&pmu_name, 128, "%s-%s", $1, $3); ++ snprintf(pmu_name, sizeof(pmu_name), "%s-%s", $1, $3); + free($1); + free($3); + if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0) +diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c +index a08f373d3305..df713a5d1e26 100644 +--- a/tools/perf/util/probe-event.c ++++ b/tools/perf/util/probe-event.c +@@ -1575,7 +1575,7 @@ static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg) + } + + tmp = strchr(str, '@'); +- if (tmp && tmp != str && strcmp(tmp + 1, "user")) { /* user attr */ ++ if (tmp && tmp != str && !strcmp(tmp + 1, "user")) { /* user attr */ + if (!user_access_is_supported()) { + semantic_error("ftrace does not support user access\n"); + return -EINVAL; +@@ -1995,7 +1995,10 @@ static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, + if (depth < 0) + return depth; + } +- err = strbuf_addf(buf, "%+ld(", ref->offset); ++ if (ref->user_access) ++ err = strbuf_addf(buf, "%s%ld(", "+u", ref->offset); ++ else ++ err = strbuf_addf(buf, "%+ld(", ref->offset); + return (err < 0) ? err : depth; + } + +diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c +index 8c852948513e..064b63a6a3f3 100644 +--- a/tools/perf/util/probe-file.c ++++ b/tools/perf/util/probe-file.c +@@ -1044,7 +1044,7 @@ static struct { + DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"), + DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"), + DEFINE_TYPE(FTRACE_README_UPROBE_REF_CTR, "*ref_ctr_offset*"), +- DEFINE_TYPE(FTRACE_README_USER_ACCESS, "*[u]<offset>*"), ++ DEFINE_TYPE(FTRACE_README_USER_ACCESS, "*u]<offset>*"), + DEFINE_TYPE(FTRACE_README_MULTIPROBE_EVENT, "*Create/append/*"), + DEFINE_TYPE(FTRACE_README_IMMEDIATE_VALUE, "*\\imm-value,*"), + }; +diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c +index 9e757d18d713..cf393c3eea23 100644 +--- a/tools/perf/util/stat-display.c ++++ b/tools/perf/util/stat-display.c +@@ -671,7 +671,7 @@ static void print_aggr(struct perf_stat_config *config, + int s; + bool first; + +- if (!(config->aggr_map || config->aggr_get_id)) ++ if (!config->aggr_map || !config->aggr_get_id) + return; + + aggr_update_shadow(config, evlist); +@@ -1172,7 +1172,7 @@ static void print_percore(struct perf_stat_config *config, + int s; + bool first = true; + +- if (!(config->aggr_map || config->aggr_get_id)) ++ if (!config->aggr_map || !config->aggr_get_id) + return; + + if (config->percore_show_thread) +diff --git a/tools/testing/selftests/bpf/prog_tests/skeleton.c b/tools/testing/selftests/bpf/prog_tests/skeleton.c +index 9264a2736018..fa153cf67b1b 100644 +--- a/tools/testing/selftests/bpf/prog_tests/skeleton.c ++++ b/tools/testing/selftests/bpf/prog_tests/skeleton.c +@@ -15,6 +15,8 @@ void test_skeleton(void) + int duration = 0, err; + struct test_skeleton* skel; + struct test_skeleton__bss *bss; ++ struct test_skeleton__data *data; ++ struct test_skeleton__rodata *rodata; + struct test_skeleton__kconfig *kcfg; + + skel = test_skeleton__open(); +@@ -24,13 +26,45 @@ void test_skeleton(void) + if (CHECK(skel->kconfig, "skel_kconfig", "kconfig is mmaped()!\n")) + goto cleanup; + ++ bss = skel->bss; ++ data = skel->data; ++ rodata = skel->rodata; ++ ++ /* validate values are pre-initialized correctly */ ++ CHECK(data->in1 != -1, "in1", "got %d != exp %d\n", data->in1, -1); ++ CHECK(data->out1 != -1, "out1", "got %d != exp %d\n", data->out1, -1); ++ CHECK(data->in2 != -1, "in2", "got %lld != exp %lld\n", data->in2, -1LL); ++ CHECK(data->out2 != -1, "out2", "got %lld != exp %lld\n", data->out2, -1LL); ++ ++ CHECK(bss->in3 != 0, "in3", "got %d != exp %d\n", bss->in3, 0); ++ CHECK(bss->out3 != 0, "out3", "got %d != exp %d\n", bss->out3, 0); ++ CHECK(bss->in4 != 0, "in4", "got %lld != exp %lld\n", bss->in4, 0LL); ++ CHECK(bss->out4 != 0, "out4", "got %lld != exp %lld\n", bss->out4, 0LL); ++ ++ CHECK(rodata->in6 != 0, "in6", "got %d != exp %d\n", rodata->in6, 0); ++ CHECK(bss->out6 != 0, "out6", "got %d != exp %d\n", bss->out6, 0); ++ ++ /* validate we can pre-setup global variables, even in .bss */ ++ data->in1 = 10; ++ data->in2 = 11; ++ bss->in3 = 12; ++ bss->in4 = 13; ++ rodata->in6 = 14; ++ + err = test_skeleton__load(skel); + if (CHECK(err, "skel_load", "failed to load skeleton: %d\n", err)) + goto cleanup; + +- bss = skel->bss; +- bss->in1 = 1; +- bss->in2 = 2; ++ /* validate pre-setup values are still there */ ++ CHECK(data->in1 != 10, "in1", "got %d != exp %d\n", data->in1, 10); ++ CHECK(data->in2 != 11, "in2", "got %lld != exp %lld\n", data->in2, 11LL); ++ CHECK(bss->in3 != 12, "in3", "got %d != exp %d\n", bss->in3, 12); ++ CHECK(bss->in4 != 13, "in4", "got %lld != exp %lld\n", bss->in4, 13LL); ++ CHECK(rodata->in6 != 14, "in6", "got %d != exp %d\n", rodata->in6, 14); ++ ++ /* now set new values and attach to get them into outX variables */ ++ data->in1 = 1; ++ data->in2 = 2; + bss->in3 = 3; + bss->in4 = 4; + bss->in5.a = 5; +@@ -44,14 +78,15 @@ void test_skeleton(void) + /* trigger tracepoint */ + usleep(1); + +- CHECK(bss->out1 != 1, "res1", "got %d != exp %d\n", bss->out1, 1); +- CHECK(bss->out2 != 2, "res2", "got %lld != exp %d\n", bss->out2, 2); ++ CHECK(data->out1 != 1, "res1", "got %d != exp %d\n", data->out1, 1); ++ CHECK(data->out2 != 2, "res2", "got %lld != exp %d\n", data->out2, 2); + CHECK(bss->out3 != 3, "res3", "got %d != exp %d\n", (int)bss->out3, 3); + CHECK(bss->out4 != 4, "res4", "got %lld != exp %d\n", bss->out4, 4); + CHECK(bss->handler_out5.a != 5, "res5", "got %d != exp %d\n", + bss->handler_out5.a, 5); + CHECK(bss->handler_out5.b != 6, "res6", "got %lld != exp %d\n", + bss->handler_out5.b, 6); ++ CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14); + + CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1", + "got %d != exp %d\n", bss->bpf_syscall, kcfg->CONFIG_BPF_SYSCALL); +diff --git a/tools/testing/selftests/bpf/progs/test_skeleton.c b/tools/testing/selftests/bpf/progs/test_skeleton.c +index de03a90f78ca..77ae86f44db5 100644 +--- a/tools/testing/selftests/bpf/progs/test_skeleton.c ++++ b/tools/testing/selftests/bpf/progs/test_skeleton.c +@@ -10,16 +10,26 @@ struct s { + long long b; + } __attribute__((packed)); + +-int in1 = 0; +-long long in2 = 0; ++/* .data section */ ++int in1 = -1; ++long long in2 = -1; ++ ++/* .bss section */ + char in3 = '\0'; + long long in4 __attribute__((aligned(64))) = 0; + struct s in5 = {}; + +-long long out2 = 0; ++/* .rodata section */ ++const volatile int in6 = 0; ++ ++/* .data section */ ++int out1 = -1; ++long long out2 = -1; ++ ++/* .bss section */ + char out3 = 0; + long long out4 = 0; +-int out1 = 0; ++int out6 = 0; + + extern bool CONFIG_BPF_SYSCALL __kconfig; + extern int LINUX_KERNEL_VERSION __kconfig; +@@ -36,6 +46,7 @@ int handler(const void *ctx) + out3 = in3; + out4 = in4; + out5 = in5; ++ out6 = in6; + + bpf_syscall = CONFIG_BPF_SYSCALL; + kern_ver = LINUX_KERNEL_VERSION; +diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile +index 42f4f49f2a48..2c85b9dd86f5 100644 +--- a/tools/testing/selftests/kvm/Makefile ++++ b/tools/testing/selftests/kvm/Makefile +@@ -80,7 +80,11 @@ LIBKVM += $(LIBKVM_$(UNAME_M)) + INSTALL_HDR_PATH = $(top_srcdir)/usr + LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/ + LINUX_TOOL_INCLUDE = $(top_srcdir)/tools/include ++ifeq ($(ARCH),x86_64) ++LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/x86/include ++else + LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include ++endif + CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ + -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \ + -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \ +diff --git a/tools/testing/selftests/net/timestamping.c b/tools/testing/selftests/net/timestamping.c +index aca3491174a1..f4bb4fef0f39 100644 +--- a/tools/testing/selftests/net/timestamping.c ++++ b/tools/testing/selftests/net/timestamping.c +@@ -313,10 +313,16 @@ int main(int argc, char **argv) + int val; + socklen_t len; + struct timeval next; ++ size_t if_len; + + if (argc < 2) + usage(0); + interface = argv[1]; ++ if_len = strlen(interface); ++ if (if_len >= IFNAMSIZ) { ++ printf("interface name exceeds IFNAMSIZ\n"); ++ exit(1); ++ } + + for (i = 2; i < argc; i++) { + if (!strcasecmp(argv[i], "SO_TIMESTAMP")) +@@ -350,12 +356,12 @@ int main(int argc, char **argv) + bail("socket"); + + memset(&device, 0, sizeof(device)); +- strncpy(device.ifr_name, interface, sizeof(device.ifr_name)); ++ memcpy(device.ifr_name, interface, if_len + 1); + if (ioctl(sock, SIOCGIFADDR, &device) < 0) + bail("getting interface IP address"); + + memset(&hwtstamp, 0, sizeof(hwtstamp)); +- strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name)); ++ memcpy(hwtstamp.ifr_name, interface, if_len + 1); + hwtstamp.ifr_data = (void *)&hwconfig; + memset(&hwconfig, 0, sizeof(hwconfig)); + hwconfig.tx_type = +diff --git a/tools/testing/selftests/ntb/ntb_test.sh b/tools/testing/selftests/ntb/ntb_test.sh +index 9c60337317c6..020137b61407 100755 +--- a/tools/testing/selftests/ntb/ntb_test.sh ++++ b/tools/testing/selftests/ntb/ntb_test.sh +@@ -241,7 +241,7 @@ function get_files_count() + split_remote $LOC + + if [[ "$REMOTE" == "" ]]; then +- echo $(ls -1 "$LOC"/${NAME}* 2>/dev/null | wc -l) ++ echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l) + else + echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \ + wc -l" 2> /dev/null) +diff --git a/tools/testing/selftests/timens/clock_nanosleep.c b/tools/testing/selftests/timens/clock_nanosleep.c +index 8e7b7c72ef65..72d41b955fb2 100644 +--- a/tools/testing/selftests/timens/clock_nanosleep.c ++++ b/tools/testing/selftests/timens/clock_nanosleep.c +@@ -119,7 +119,7 @@ int main(int argc, char *argv[]) + + ksft_set_plan(4); + +- check_config_posix_timers(); ++ check_supported_timers(); + + if (unshare_timens()) + return 1; +diff --git a/tools/testing/selftests/timens/timens.c b/tools/testing/selftests/timens/timens.c +index 098be7c83be3..52b6a1185f52 100644 +--- a/tools/testing/selftests/timens/timens.c ++++ b/tools/testing/selftests/timens/timens.c +@@ -155,7 +155,7 @@ int main(int argc, char *argv[]) + + nscheck(); + +- check_config_posix_timers(); ++ check_supported_timers(); + + ksft_set_plan(ARRAY_SIZE(clocks) * 2); + +diff --git a/tools/testing/selftests/timens/timens.h b/tools/testing/selftests/timens/timens.h +index e09e7e39bc52..d4fc52d47146 100644 +--- a/tools/testing/selftests/timens/timens.h ++++ b/tools/testing/selftests/timens/timens.h +@@ -14,15 +14,26 @@ + #endif + + static int config_posix_timers = true; ++static int config_alarm_timers = true; + +-static inline void check_config_posix_timers(void) ++static inline void check_supported_timers(void) + { ++ struct timespec ts; ++ + if (timer_create(-1, 0, 0) == -1 && errno == ENOSYS) + config_posix_timers = false; ++ ++ if (clock_gettime(CLOCK_BOOTTIME_ALARM, &ts) == -1 && errno == EINVAL) ++ config_alarm_timers = false; + } + + static inline bool check_skip(int clockid) + { ++ if (!config_alarm_timers && clockid == CLOCK_BOOTTIME_ALARM) { ++ ksft_test_result_skip("CLOCK_BOOTTIME_ALARM isn't supported\n"); ++ return true; ++ } ++ + if (config_posix_timers) + return false; + +diff --git a/tools/testing/selftests/timens/timer.c b/tools/testing/selftests/timens/timer.c +index 96dba11ebe44..5e7f0051bd7b 100644 +--- a/tools/testing/selftests/timens/timer.c ++++ b/tools/testing/selftests/timens/timer.c +@@ -22,6 +22,9 @@ int run_test(int clockid, struct timespec now) + timer_t fd; + int i; + ++ if (check_skip(clockid)) ++ return 0; ++ + for (i = 0; i < 2; i++) { + struct sigevent sevp = {.sigev_notify = SIGEV_NONE}; + int flags = 0; +@@ -74,6 +77,8 @@ int main(int argc, char *argv[]) + + nscheck(); + ++ check_supported_timers(); ++ + ksft_set_plan(3); + + clock_gettime(CLOCK_MONOTONIC, &mtime_now); +diff --git a/tools/testing/selftests/timens/timerfd.c b/tools/testing/selftests/timens/timerfd.c +index eff1ec5ff215..9edd43d6b2c1 100644 +--- a/tools/testing/selftests/timens/timerfd.c ++++ b/tools/testing/selftests/timens/timerfd.c +@@ -28,6 +28,9 @@ int run_test(int clockid, struct timespec now) + long long elapsed; + int fd, i; + ++ if (check_skip(clockid)) ++ return 0; ++ + if (tclock_gettime(clockid, &now)) + return pr_perror("clock_gettime(%d)", clockid); + +@@ -81,6 +84,8 @@ int main(int argc, char *argv[]) + + nscheck(); + ++ check_supported_timers(); ++ + ksft_set_plan(3); + + clock_gettime(CLOCK_MONOTONIC, &mtime_now); +diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c +index 480995bceefa..47191af46617 100644 +--- a/tools/testing/selftests/x86/protection_keys.c ++++ b/tools/testing/selftests/x86/protection_keys.c +@@ -24,6 +24,7 @@ + #define _GNU_SOURCE + #include <errno.h> + #include <linux/futex.h> ++#include <time.h> + #include <sys/time.h> + #include <sys/syscall.h> + #include <string.h> +@@ -612,10 +613,10 @@ int alloc_random_pkey(void) + int nr_alloced = 0; + int random_index; + memset(alloced_pkeys, 0, sizeof(alloced_pkeys)); ++ srand((unsigned int)time(NULL)); + + /* allocate every possible key and make a note of which ones we got */ + max_nr_pkey_allocs = NR_PKEYS; +- max_nr_pkey_allocs = 1; + for (i = 0; i < max_nr_pkey_allocs; i++) { + int new_pkey = alloc_pkey(); + if (new_pkey < 0) |