Merge remote-tracking branch 'stable/linux-5.15.y' into rpi-5.15.y
This commit is contained in:
@@ -24,8 +24,10 @@ properties:
|
|||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
|
maxItems: 2
|
||||||
description:
|
description:
|
||||||
Should be configured with type IRQ_TYPE_EDGE_RISING.
|
Should be configured with type IRQ_TYPE_EDGE_RISING.
|
||||||
|
If two interrupts are provided, expected order is INT1 and INT2.
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
|||||||
@@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes:
|
|||||||
* AVB Mag Turbo Force
|
* AVB Mag Turbo Force
|
||||||
* AVB Top Shot Pegasus
|
* AVB Top Shot Pegasus
|
||||||
* AVB Top Shot Force Feedback Racing Wheel
|
* AVB Top Shot Force Feedback Racing Wheel
|
||||||
|
* Boeder Force Feedback Wheel
|
||||||
* Logitech WingMan Force
|
* Logitech WingMan Force
|
||||||
* Logitech WingMan Force Wheel
|
* Logitech WingMan Force Wheel
|
||||||
* Guillemot Race Leader Force Feedback
|
* Guillemot Race Leader Force Feedback
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 15
|
PATCHLEVEL = 15
|
||||||
SUBLEVEL = 68
|
SUBLEVEL = 70
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Trick or Treat
|
NAME = Trick or Treat
|
||||||
|
|
||||||
|
|||||||
@@ -169,8 +169,8 @@
|
|||||||
regulators {
|
regulators {
|
||||||
vdd_3v3: VDD_IO {
|
vdd_3v3: VDD_IO {
|
||||||
regulator-name = "VDD_IO";
|
regulator-name = "VDD_IO";
|
||||||
regulator-min-microvolt = <1200000>;
|
regulator-min-microvolt = <3300000>;
|
||||||
regulator-max-microvolt = <3700000>;
|
regulator-max-microvolt = <3300000>;
|
||||||
regulator-initial-mode = <2>;
|
regulator-initial-mode = <2>;
|
||||||
regulator-allowed-modes = <2>, <4>;
|
regulator-allowed-modes = <2>, <4>;
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
@@ -188,8 +188,8 @@
|
|||||||
|
|
||||||
vddioddr: VDD_DDR {
|
vddioddr: VDD_DDR {
|
||||||
regulator-name = "VDD_DDR";
|
regulator-name = "VDD_DDR";
|
||||||
regulator-min-microvolt = <1300000>;
|
regulator-min-microvolt = <1350000>;
|
||||||
regulator-max-microvolt = <1450000>;
|
regulator-max-microvolt = <1350000>;
|
||||||
regulator-initial-mode = <2>;
|
regulator-initial-mode = <2>;
|
||||||
regulator-allowed-modes = <2>, <4>;
|
regulator-allowed-modes = <2>, <4>;
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
@@ -209,8 +209,8 @@
|
|||||||
|
|
||||||
vddcore: VDD_CORE {
|
vddcore: VDD_CORE {
|
||||||
regulator-name = "VDD_CORE";
|
regulator-name = "VDD_CORE";
|
||||||
regulator-min-microvolt = <1100000>;
|
regulator-min-microvolt = <1150000>;
|
||||||
regulator-max-microvolt = <1850000>;
|
regulator-max-microvolt = <1150000>;
|
||||||
regulator-initial-mode = <2>;
|
regulator-initial-mode = <2>;
|
||||||
regulator-allowed-modes = <2>, <4>;
|
regulator-allowed-modes = <2>, <4>;
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
@@ -228,8 +228,8 @@
|
|||||||
|
|
||||||
vddcpu: VDD_OTHER {
|
vddcpu: VDD_OTHER {
|
||||||
regulator-name = "VDD_OTHER";
|
regulator-name = "VDD_OTHER";
|
||||||
regulator-min-microvolt = <1125000>;
|
regulator-min-microvolt = <1050000>;
|
||||||
regulator-max-microvolt = <1850000>;
|
regulator-max-microvolt = <1250000>;
|
||||||
regulator-initial-mode = <2>;
|
regulator-initial-mode = <2>;
|
||||||
regulator-allowed-modes = <2>, <4>;
|
regulator-allowed-modes = <2>, <4>;
|
||||||
regulator-ramp-delay = <3125>;
|
regulator-ramp-delay = <3125>;
|
||||||
@@ -248,8 +248,8 @@
|
|||||||
|
|
||||||
vldo1: LDO1 {
|
vldo1: LDO1 {
|
||||||
regulator-name = "LDO1";
|
regulator-name = "LDO1";
|
||||||
regulator-min-microvolt = <1200000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <3700000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
|
|
||||||
regulator-state-standby {
|
regulator-state-standby {
|
||||||
|
|||||||
@@ -129,7 +129,7 @@
|
|||||||
pinctrl-0 = <&spi2_pins_a>;
|
pinctrl-0 = <&spi2_pins_a>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
pinctrl-0 = <&spi2_pins_a>;
|
pinctrl-0 = <&spi2_pins_a>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "m25p80", "jedec,spi-nor";
|
compatible = "m25p80", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
pinctrl-0 = <&spi2_pins_a>;
|
pinctrl-0 = <&spi2_pins_a>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "everspin,mr25h256", "mr25h256";
|
compatible = "everspin,mr25h256", "mr25h256";
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&ecspi3 {
|
&ecspi3 {
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -142,7 +142,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: n25q032@0 {
|
flash: flash@0 {
|
||||||
compatible = "jedec,spi-nor";
|
compatible = "jedec,spi-nor";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|||||||
@@ -160,7 +160,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi5>;
|
pinctrl-0 = <&pinctrl_ecspi5>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
m25_eeprom: m25p80@0 {
|
m25_eeprom: flash@0 {
|
||||||
compatible = "atmel,at25";
|
compatible = "atmel,at25";
|
||||||
spi-max-frequency = <10000000>;
|
spi-max-frequency = <10000000>;
|
||||||
size = <0x8000>;
|
size = <0x8000>;
|
||||||
|
|||||||
@@ -260,7 +260,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
m25p80@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "st,m25p", "jedec,spi-nor";
|
compatible = "st,m25p", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -102,7 +102,7 @@
|
|||||||
cs-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
|
cs-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "m25p80", "jedec,spi-nor";
|
compatible = "m25p80", "jedec,spi-nor";
|
||||||
spi-max-frequency = <40000000>;
|
spi-max-frequency = <40000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi5>;
|
pinctrl-0 = <&pinctrl_ecspi5>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
m25_eeprom: m25p80@0 {
|
m25_eeprom: flash@0 {
|
||||||
compatible = "atmel,at25256B", "atmel,at25";
|
compatible = "atmel,at25256B", "atmel,at25";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
size = <0x8000>;
|
size = <0x8000>;
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "sst,w25q256", "jedec,spi-nor";
|
compatible = "sst,w25q256", "jedec,spi-nor";
|
||||||
spi-max-frequency = <30000000>;
|
spi-max-frequency = <30000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@
|
|||||||
cs-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
|
cs-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
m25p80@0 {
|
flash@0 {
|
||||||
compatible = "microchip,sst25vf016b";
|
compatible = "microchip,sst25vf016b";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&ecspi3 {
|
&ecspi3 {
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "sst,sst25vf032b", "jedec,spi-nor";
|
compatible = "sst,sst25vf032b", "jedec,spi-nor";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi4>;
|
pinctrl-0 = <&pinctrl_ecspi4>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "micron,n25q128a11", "jedec,spi-nor";
|
compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -131,7 +131,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi4>;
|
pinctrl-0 = <&pinctrl_ecspi4>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@1 {
|
flash: flash@1 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "micron,n25q128a11", "jedec,spi-nor";
|
compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi3>;
|
pinctrl-0 = <&pinctrl_ecspi3>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "sst,sst25vf040b", "jedec,spi-nor";
|
compatible = "sst,sst25vf040b", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -248,8 +248,8 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
/* default boot source: workaround #1 for errata ERR006282 */
|
/* default boot source: workaround #1 for errata ERR006282 */
|
||||||
smarc_flash: spi-flash@0 {
|
smarc_flash: flash@0 {
|
||||||
compatible = "winbond,w25q16dw", "jedec,spi-nor";
|
compatible = "jedec,spi-nor";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -179,7 +179,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "microchip,sst25vf016b";
|
compatible = "microchip,sst25vf016b";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -321,7 +321,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "microchip,sst25vf016b";
|
compatible = "microchip,sst25vf016b";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -252,7 +252,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "microchip,sst25vf016b";
|
compatible = "microchip,sst25vf016b";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -237,7 +237,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -272,7 +272,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>;
|
pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>;
|
||||||
status = "disabled"; /* pin conflict with WEIM NOR */
|
status = "disabled"; /* pin conflict with WEIM NOR */
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "st,m25p32", "jedec,spi-nor";
|
compatible = "st,m25p32", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -313,7 +313,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
compatible = "sst,sst25vf016b", "jedec,spi-nor";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -197,7 +197,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "st,m25p32", "jedec,spi-nor";
|
compatible = "st,m25p32", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "st,m25p32", "jedec,spi-nor";
|
compatible = "st,m25p32", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi1>;
|
pinctrl-0 = <&pinctrl_ecspi1>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash: m25p80@0 {
|
flash: flash@0 {
|
||||||
compatible = "microchip,sst25vf016b";
|
compatible = "microchip,sst25vf016b";
|
||||||
spi-max-frequency = <20000000>;
|
spi-max-frequency = <20000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -123,7 +123,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_qspi2>;
|
pinctrl-0 = <&pinctrl_qspi2>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash0: s25fl128s@0 {
|
flash0: flash@0 {
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
spi-tx-bus-width = <4>;
|
spi-tx-bus-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
flash1: s25fl128s@2 {
|
flash1: flash@2 {
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_qspi2>;
|
pinctrl-0 = <&pinctrl_qspi2>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash0: n25q256a@0 {
|
flash0: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
reg = <0>;
|
reg = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
flash1: n25q256a@2 {
|
flash1: flash@2 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -286,7 +286,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_qspi>;
|
pinctrl-0 = <&pinctrl_qspi>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
flash0: n25q256a@0 {
|
flash0: flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
spi-flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "spi-nand";
|
compatible = "spi-nand";
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
spi-flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "spi-nand";
|
compatible = "spi-nand";
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
pinctrl-0 = <&pinctrl_ecspi2>;
|
pinctrl-0 = <&pinctrl_ecspi2>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
spi-flash@0 {
|
flash@0 {
|
||||||
compatible = "mxicy,mx25v8035f", "jedec,spi-nor";
|
compatible = "mxicy,mx25v8035f", "jedec,spi-nor";
|
||||||
spi-max-frequency = <50000000>;
|
spi-max-frequency = <50000000>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
spi-flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "spi-nand";
|
compatible = "spi-nand";
|
||||||
|
|||||||
@@ -26,7 +26,8 @@
|
|||||||
compatible = "arm,mhu", "arm,primecell";
|
compatible = "arm,mhu", "arm,primecell";
|
||||||
reg = <0x0 0x2b1f0000 0x0 0x1000>;
|
reg = <0x0 0x2b1f0000 0x0 0x1000>;
|
||||||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
|
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
#mbox-cells = <1>;
|
#mbox-cells = <1>;
|
||||||
clocks = <&soc_refclk100mhz>;
|
clocks = <&soc_refclk100mhz>;
|
||||||
clock-names = "apb_pclk";
|
clock-names = "apb_pclk";
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ static __always_inline void __exit_to_kernel_mode(struct pt_regs *regs)
|
|||||||
if (interrupts_enabled(regs)) {
|
if (interrupts_enabled(regs)) {
|
||||||
if (regs->exit_rcu) {
|
if (regs->exit_rcu) {
|
||||||
trace_hardirqs_on_prepare();
|
trace_hardirqs_on_prepare();
|
||||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
lockdep_hardirqs_on_prepare();
|
||||||
rcu_irq_exit();
|
rcu_irq_exit();
|
||||||
lockdep_hardirqs_on(CALLER_ADDR0);
|
lockdep_hardirqs_on(CALLER_ADDR0);
|
||||||
return;
|
return;
|
||||||
@@ -117,7 +117,7 @@ static __always_inline void enter_from_user_mode(struct pt_regs *regs)
|
|||||||
static __always_inline void __exit_to_user_mode(void)
|
static __always_inline void __exit_to_user_mode(void)
|
||||||
{
|
{
|
||||||
trace_hardirqs_on_prepare();
|
trace_hardirqs_on_prepare();
|
||||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
lockdep_hardirqs_on_prepare();
|
||||||
user_enter_irqoff();
|
user_enter_irqoff();
|
||||||
lockdep_hardirqs_on(CALLER_ADDR0);
|
lockdep_hardirqs_on(CALLER_ADDR0);
|
||||||
}
|
}
|
||||||
@@ -175,7 +175,7 @@ static void noinstr arm64_exit_nmi(struct pt_regs *regs)
|
|||||||
ftrace_nmi_exit();
|
ftrace_nmi_exit();
|
||||||
if (restore) {
|
if (restore) {
|
||||||
trace_hardirqs_on_prepare();
|
trace_hardirqs_on_prepare();
|
||||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
lockdep_hardirqs_on_prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_nmi_exit();
|
rcu_nmi_exit();
|
||||||
@@ -211,7 +211,7 @@ static void noinstr arm64_exit_el1_dbg(struct pt_regs *regs)
|
|||||||
|
|
||||||
if (restore) {
|
if (restore) {
|
||||||
trace_hardirqs_on_prepare();
|
trace_hardirqs_on_prepare();
|
||||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
lockdep_hardirqs_on_prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_nmi_exit();
|
rcu_nmi_exit();
|
||||||
|
|||||||
@@ -127,6 +127,16 @@ static void octeon_irq_free_cd(struct irq_domain *d, unsigned int irq)
|
|||||||
static int octeon_irq_force_ciu_mapping(struct irq_domain *domain,
|
static int octeon_irq_force_ciu_mapping(struct irq_domain *domain,
|
||||||
int irq, int line, int bit)
|
int irq, int line, int bit)
|
||||||
{
|
{
|
||||||
|
struct device_node *of_node;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
of_node = irq_domain_get_of_node(domain);
|
||||||
|
if (!of_node)
|
||||||
|
return -EINVAL;
|
||||||
|
ret = irq_alloc_desc_at(irq, of_node_to_nid(of_node));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return irq_domain_associate(domain, irq, line << 6 | bit);
|
return irq_domain_associate(domain, irq, line << 6 | bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -220,8 +220,18 @@ config MLONGCALLS
|
|||||||
Enabling this option will probably slow down your kernel.
|
Enabling this option will probably slow down your kernel.
|
||||||
|
|
||||||
config 64BIT
|
config 64BIT
|
||||||
def_bool "$(ARCH)" = "parisc64"
|
def_bool y if "$(ARCH)" = "parisc64"
|
||||||
|
bool "64-bit kernel" if "$(ARCH)" = "parisc"
|
||||||
depends on PA8X00
|
depends on PA8X00
|
||||||
|
help
|
||||||
|
Enable this if you want to support 64bit kernel on PA-RISC platform.
|
||||||
|
|
||||||
|
At the moment, only people willing to use more than 2GB of RAM,
|
||||||
|
or having a 64bit-only capable PA-RISC machine should say Y here.
|
||||||
|
|
||||||
|
Since there is no 64bit userland on PA-RISC, there is no point to
|
||||||
|
enable this option otherwise. The 64bit kernel is significantly bigger
|
||||||
|
and slower than the 32bit one.
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Kernel page size"
|
prompt "Kernel page size"
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ extern void cea_set_pte(void *cea_vaddr, phys_addr_t pa, pgprot_t flags);
|
|||||||
|
|
||||||
extern struct cpu_entry_area *get_cpu_entry_area(int cpu);
|
extern struct cpu_entry_area *get_cpu_entry_area(int cpu);
|
||||||
|
|
||||||
static inline struct entry_stack *cpu_entry_stack(int cpu)
|
static __always_inline struct entry_stack *cpu_entry_stack(int cpu)
|
||||||
{
|
{
|
||||||
return &get_cpu_entry_area(cpu)->entry_stack_page.stack;
|
return &get_cpu_entry_area(cpu)->entry_stack_page.stack;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ KVM_X86_OP(enable_smi_window)
|
|||||||
KVM_X86_OP_NULL(mem_enc_op)
|
KVM_X86_OP_NULL(mem_enc_op)
|
||||||
KVM_X86_OP_NULL(mem_enc_reg_region)
|
KVM_X86_OP_NULL(mem_enc_reg_region)
|
||||||
KVM_X86_OP_NULL(mem_enc_unreg_region)
|
KVM_X86_OP_NULL(mem_enc_unreg_region)
|
||||||
|
KVM_X86_OP_NULL(guest_memory_reclaimed)
|
||||||
KVM_X86_OP(get_msr_feature)
|
KVM_X86_OP(get_msr_feature)
|
||||||
KVM_X86_OP(can_emulate_instruction)
|
KVM_X86_OP(can_emulate_instruction)
|
||||||
KVM_X86_OP(apic_init_signal_blocked)
|
KVM_X86_OP(apic_init_signal_blocked)
|
||||||
|
|||||||
@@ -1476,6 +1476,7 @@ struct kvm_x86_ops {
|
|||||||
int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
|
int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
|
||||||
int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
|
int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp);
|
||||||
int (*vm_copy_enc_context_from)(struct kvm *kvm, unsigned int source_fd);
|
int (*vm_copy_enc_context_from)(struct kvm *kvm, unsigned int source_fd);
|
||||||
|
void (*guest_memory_reclaimed)(struct kvm *kvm);
|
||||||
|
|
||||||
int (*get_msr_feature)(struct kvm_msr_entry *entry);
|
int (*get_msr_feature)(struct kvm_msr_entry *entry);
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ extern unsigned long page_offset_base;
|
|||||||
extern unsigned long vmalloc_base;
|
extern unsigned long vmalloc_base;
|
||||||
extern unsigned long vmemmap_base;
|
extern unsigned long vmemmap_base;
|
||||||
|
|
||||||
static inline unsigned long __phys_addr_nodebug(unsigned long x)
|
static __always_inline unsigned long __phys_addr_nodebug(unsigned long x)
|
||||||
{
|
{
|
||||||
unsigned long y = x - __START_KERNEL_map;
|
unsigned long y = x - __START_KERNEL_map;
|
||||||
|
|
||||||
|
|||||||
@@ -2037,6 +2037,14 @@ static void sev_flush_guest_memory(struct vcpu_svm *svm, void *va,
|
|||||||
wbinvd_on_all_cpus();
|
wbinvd_on_all_cpus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sev_guest_memory_reclaimed(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
if (!sev_guest(kvm))
|
||||||
|
return;
|
||||||
|
|
||||||
|
wbinvd_on_all_cpus();
|
||||||
|
}
|
||||||
|
|
||||||
void sev_free_vcpu(struct kvm_vcpu *vcpu)
|
void sev_free_vcpu(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct vcpu_svm *svm;
|
struct vcpu_svm *svm;
|
||||||
|
|||||||
@@ -4678,6 +4678,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
|
|||||||
.mem_enc_op = svm_mem_enc_op,
|
.mem_enc_op = svm_mem_enc_op,
|
||||||
.mem_enc_reg_region = svm_register_enc_region,
|
.mem_enc_reg_region = svm_register_enc_region,
|
||||||
.mem_enc_unreg_region = svm_unregister_enc_region,
|
.mem_enc_unreg_region = svm_unregister_enc_region,
|
||||||
|
.guest_memory_reclaimed = sev_guest_memory_reclaimed,
|
||||||
|
|
||||||
.vm_copy_enc_context_from = svm_vm_copy_asid_from,
|
.vm_copy_enc_context_from = svm_vm_copy_asid_from,
|
||||||
|
|
||||||
|
|||||||
@@ -555,6 +555,8 @@ int svm_register_enc_region(struct kvm *kvm,
|
|||||||
int svm_unregister_enc_region(struct kvm *kvm,
|
int svm_unregister_enc_region(struct kvm *kvm,
|
||||||
struct kvm_enc_region *range);
|
struct kvm_enc_region *range);
|
||||||
int svm_vm_copy_asid_from(struct kvm *kvm, unsigned int source_fd);
|
int svm_vm_copy_asid_from(struct kvm *kvm, unsigned int source_fd);
|
||||||
|
void sev_guest_memory_reclaimed(struct kvm *kvm);
|
||||||
|
|
||||||
void pre_sev_run(struct vcpu_svm *svm, int cpu);
|
void pre_sev_run(struct vcpu_svm *svm, int cpu);
|
||||||
void __init sev_set_cpu_caps(void);
|
void __init sev_set_cpu_caps(void);
|
||||||
void __init sev_hardware_setup(void);
|
void __init sev_hardware_setup(void);
|
||||||
|
|||||||
@@ -9557,6 +9557,11 @@ void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
|
|||||||
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
|
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
static_call_cond(kvm_x86_guest_memory_reclaimed)(kvm);
|
||||||
|
}
|
||||||
|
|
||||||
void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu)
|
void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (!lapic_in_kernel(vcpu))
|
if (!lapic_in_kernel(vcpu))
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ static __always_inline void kvm_guest_enter_irqoff(void)
|
|||||||
*/
|
*/
|
||||||
instrumentation_begin();
|
instrumentation_begin();
|
||||||
trace_hardirqs_on_prepare();
|
trace_hardirqs_on_prepare();
|
||||||
lockdep_hardirqs_on_prepare(CALLER_ADDR0);
|
lockdep_hardirqs_on_prepare();
|
||||||
instrumentation_end();
|
instrumentation_end();
|
||||||
|
|
||||||
guest_enter_irqoff();
|
guest_enter_irqoff();
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
|
|||||||
|
|
||||||
while (!blk_try_enter_queue(q, pm)) {
|
while (!blk_try_enter_queue(q, pm)) {
|
||||||
if (flags & BLK_MQ_REQ_NOWAIT)
|
if (flags & BLK_MQ_REQ_NOWAIT)
|
||||||
return -EBUSY;
|
return -EAGAIN;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* read pair of barrier in blk_freeze_queue_start(), we need to
|
* read pair of barrier in blk_freeze_queue_start(), we need to
|
||||||
@@ -478,7 +478,7 @@ static inline int bio_queue_enter(struct bio *bio)
|
|||||||
if (test_bit(GD_DEAD, &disk->state))
|
if (test_bit(GD_DEAD, &disk->state))
|
||||||
goto dead;
|
goto dead;
|
||||||
bio_wouldblock_error(bio);
|
bio_wouldblock_error(bio);
|
||||||
return -EBUSY;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -416,6 +416,16 @@ static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
/*
|
||||||
|
* IRQ override isn't needed on modern AMD Zen systems and
|
||||||
|
* this override breaks active low IRQs on AMD Ryzen 6000 and
|
||||||
|
* newer systems. Skip it.
|
||||||
|
*/
|
||||||
|
if (boot_cpu_has(X86_FEATURE_ZEN))
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) {
|
for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) {
|
||||||
const struct irq_override_cmp *entry = &skip_override_table[i];
|
const struct irq_override_cmp *entry = &skip_override_table[i];
|
||||||
|
|
||||||
|
|||||||
@@ -315,16 +315,9 @@ static inline void binder_alloc_set_vma(struct binder_alloc *alloc,
|
|||||||
{
|
{
|
||||||
unsigned long vm_start = 0;
|
unsigned long vm_start = 0;
|
||||||
|
|
||||||
/*
|
|
||||||
* Allow clearing the vma with holding just the read lock to allow
|
|
||||||
* munmapping downgrade of the write lock before freeing and closing the
|
|
||||||
* file using binder_alloc_vma_close().
|
|
||||||
*/
|
|
||||||
if (vma) {
|
if (vma) {
|
||||||
vm_start = vma->vm_start;
|
vm_start = vma->vm_start;
|
||||||
mmap_assert_write_locked(alloc->vma_vm_mm);
|
mmap_assert_write_locked(alloc->vma_vm_mm);
|
||||||
} else {
|
|
||||||
mmap_assert_locked(alloc->vma_vm_mm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
alloc->vma_addr = vm_start;
|
alloc->vma_addr = vm_start;
|
||||||
|
|||||||
@@ -373,6 +373,13 @@ static void gpio_mockup_debugfs_setup(struct device *dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gpio_mockup_debugfs_cleanup(void *data)
|
||||||
|
{
|
||||||
|
struct gpio_mockup_chip *chip = data;
|
||||||
|
|
||||||
|
debugfs_remove_recursive(chip->dbg_dir);
|
||||||
|
}
|
||||||
|
|
||||||
static void gpio_mockup_dispose_mappings(void *data)
|
static void gpio_mockup_dispose_mappings(void *data)
|
||||||
{
|
{
|
||||||
struct gpio_mockup_chip *chip = data;
|
struct gpio_mockup_chip *chip = data;
|
||||||
@@ -455,7 +462,7 @@ static int gpio_mockup_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
gpio_mockup_debugfs_setup(dev, chip);
|
gpio_mockup_debugfs_setup(dev, chip);
|
||||||
|
|
||||||
return 0;
|
return devm_add_action_or_reset(dev, gpio_mockup_debugfs_cleanup, chip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id gpio_mockup_of_match[] = {
|
static const struct of_device_id gpio_mockup_of_match[] = {
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ static int mpc8xxx_irq_set_type(struct irq_data *d, unsigned int flow_type)
|
|||||||
|
|
||||||
switch (flow_type) {
|
switch (flow_type) {
|
||||||
case IRQ_TYPE_EDGE_FALLING:
|
case IRQ_TYPE_EDGE_FALLING:
|
||||||
|
case IRQ_TYPE_LEVEL_LOW:
|
||||||
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
raw_spin_lock_irqsave(&mpc8xxx_gc->lock, flags);
|
||||||
gc->write_reg(mpc8xxx_gc->regs + GPIO_ICR,
|
gc->write_reg(mpc8xxx_gc->regs + GPIO_ICR,
|
||||||
gc->read_reg(mpc8xxx_gc->regs + GPIO_ICR)
|
gc->read_reg(mpc8xxx_gc->regs + GPIO_ICR)
|
||||||
|
|||||||
@@ -418,11 +418,11 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)
|
|||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
bank->toggle_edge_mode |= mask;
|
bank->toggle_edge_mode |= mask;
|
||||||
level |= mask;
|
level &= ~mask;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine gpio state. If 1 next interrupt should be
|
* Determine gpio state. If 1 next interrupt should be
|
||||||
* falling otherwise rising.
|
* low otherwise high.
|
||||||
*/
|
*/
|
||||||
data = readl(bank->reg_base + bank->gpio_regs->ext_port);
|
data = readl(bank->reg_base + bank->gpio_regs->ext_port);
|
||||||
if (data & mask)
|
if (data & mask)
|
||||||
|
|||||||
@@ -2505,7 +2505,7 @@ static int psp_load_smu_fw(struct psp_context *psp)
|
|||||||
static bool fw_load_skip_check(struct psp_context *psp,
|
static bool fw_load_skip_check(struct psp_context *psp,
|
||||||
struct amdgpu_firmware_info *ucode)
|
struct amdgpu_firmware_info *ucode)
|
||||||
{
|
{
|
||||||
if (!ucode->fw)
|
if (!ucode->fw || !ucode->ucode_size)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
|
if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
|
||||||
|
|||||||
@@ -366,6 +366,7 @@ static void nbio_v2_3_enable_aspm(struct amdgpu_device *adev,
|
|||||||
WREG32_PCIE(smnPCIE_LC_CNTL, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
static void nbio_v2_3_program_ltr(struct amdgpu_device *adev)
|
static void nbio_v2_3_program_ltr(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
@@ -387,9 +388,11 @@ static void nbio_v2_3_program_ltr(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void nbio_v2_3_program_aspm(struct amdgpu_device *adev)
|
static void nbio_v2_3_program_aspm(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
|
|
||||||
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
||||||
@@ -445,7 +448,10 @@ static void nbio_v2_3_program_aspm(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
||||||
|
|
||||||
nbio_v2_3_program_ltr(adev);
|
/* Don't bother about LTR if LTR is not enabled
|
||||||
|
* in the path */
|
||||||
|
if (adev->pdev->ltr_path)
|
||||||
|
nbio_v2_3_program_ltr(adev);
|
||||||
|
|
||||||
def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3);
|
def = data = RREG32_SOC15(NBIO, 0, mmRCC_BIF_STRAP3);
|
||||||
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
||||||
@@ -469,6 +475,7 @@ static void nbio_v2_3_program_aspm(struct amdgpu_device *adev)
|
|||||||
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nbio_v2_3_apply_lc_spc_mode_wa(struct amdgpu_device *adev)
|
static void nbio_v2_3_apply_lc_spc_mode_wa(struct amdgpu_device *adev)
|
||||||
|
|||||||
@@ -278,6 +278,7 @@ static void nbio_v6_1_init_registers(struct amdgpu_device *adev)
|
|||||||
WREG32_PCIE(smnPCIE_CI_CNTL, data);
|
WREG32_PCIE(smnPCIE_CI_CNTL, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
static void nbio_v6_1_program_ltr(struct amdgpu_device *adev)
|
static void nbio_v6_1_program_ltr(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
@@ -299,9 +300,11 @@ static void nbio_v6_1_program_ltr(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void nbio_v6_1_program_aspm(struct amdgpu_device *adev)
|
static void nbio_v6_1_program_aspm(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
|
|
||||||
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
||||||
@@ -357,7 +360,10 @@ static void nbio_v6_1_program_aspm(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
||||||
|
|
||||||
nbio_v6_1_program_ltr(adev);
|
/* Don't bother about LTR if LTR is not enabled
|
||||||
|
* in the path */
|
||||||
|
if (adev->pdev->ltr_path)
|
||||||
|
nbio_v6_1_program_ltr(adev);
|
||||||
|
|
||||||
def = data = RREG32_PCIE(smnRCC_BIF_STRAP3);
|
def = data = RREG32_PCIE(smnRCC_BIF_STRAP3);
|
||||||
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
||||||
@@ -381,6 +387,7 @@ static void nbio_v6_1_program_aspm(struct amdgpu_device *adev)
|
|||||||
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct amdgpu_nbio_funcs nbio_v6_1_funcs = {
|
const struct amdgpu_nbio_funcs nbio_v6_1_funcs = {
|
||||||
|
|||||||
@@ -630,6 +630,7 @@ const struct amdgpu_nbio_ras_funcs nbio_v7_4_ras_funcs = {
|
|||||||
.ras_fini = amdgpu_nbio_ras_fini,
|
.ras_fini = amdgpu_nbio_ras_fini,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
static void nbio_v7_4_program_ltr(struct amdgpu_device *adev)
|
static void nbio_v7_4_program_ltr(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
@@ -651,9 +652,11 @@ static void nbio_v7_4_program_ltr(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
WREG32_PCIE(smnBIF_CFG_DEV0_EPF0_DEVICE_CNTL2, data);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void nbio_v7_4_program_aspm(struct amdgpu_device *adev)
|
static void nbio_v7_4_program_aspm(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_PCIEASPM
|
||||||
uint32_t def, data;
|
uint32_t def, data;
|
||||||
|
|
||||||
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
def = data = RREG32_PCIE(smnPCIE_LC_CNTL);
|
||||||
@@ -709,7 +712,10 @@ static void nbio_v7_4_program_aspm(struct amdgpu_device *adev)
|
|||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL6, data);
|
||||||
|
|
||||||
nbio_v7_4_program_ltr(adev);
|
/* Don't bother about LTR if LTR is not enabled
|
||||||
|
* in the path */
|
||||||
|
if (adev->pdev->ltr_path)
|
||||||
|
nbio_v7_4_program_ltr(adev);
|
||||||
|
|
||||||
def = data = RREG32_PCIE(smnRCC_BIF_STRAP3);
|
def = data = RREG32_PCIE(smnRCC_BIF_STRAP3);
|
||||||
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
data |= 0x5DE0 << RCC_BIF_STRAP3__STRAP_VLINK_ASPM_IDLE_TIMER__SHIFT;
|
||||||
@@ -733,6 +739,7 @@ static void nbio_v7_4_program_aspm(struct amdgpu_device *adev)
|
|||||||
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
data &= ~PCIE_LC_CNTL3__LC_DSC_DONT_ENTER_L23_AFTER_PME_ACK_MASK;
|
||||||
if (def != data)
|
if (def != data)
|
||||||
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
WREG32_PCIE(smnPCIE_LC_CNTL3, data);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {
|
const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {
|
||||||
|
|||||||
@@ -1507,6 +1507,11 @@ static int sdma_v4_0_start(struct amdgpu_device *adev)
|
|||||||
WREG32_SDMA(i, mmSDMA0_CNTL, temp);
|
WREG32_SDMA(i, mmSDMA0_CNTL, temp);
|
||||||
|
|
||||||
if (!amdgpu_sriov_vf(adev)) {
|
if (!amdgpu_sriov_vf(adev)) {
|
||||||
|
ring = &adev->sdma.instance[i].ring;
|
||||||
|
adev->nbio.funcs->sdma_doorbell_range(adev, i,
|
||||||
|
ring->use_doorbell, ring->doorbell_index,
|
||||||
|
adev->doorbell_index.sdma_doorbell_range);
|
||||||
|
|
||||||
/* unhalt engine */
|
/* unhalt engine */
|
||||||
temp = RREG32_SDMA(i, mmSDMA0_F32_CNTL);
|
temp = RREG32_SDMA(i, mmSDMA0_F32_CNTL);
|
||||||
temp = REG_SET_FIELD(temp, SDMA0_F32_CNTL, HALT, 0);
|
temp = REG_SET_FIELD(temp, SDMA0_F32_CNTL, HALT, 0);
|
||||||
|
|||||||
@@ -1416,25 +1416,6 @@ static int soc15_common_sw_fini(void *handle)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void soc15_doorbell_range_init(struct amdgpu_device *adev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct amdgpu_ring *ring;
|
|
||||||
|
|
||||||
/* sdma/ih doorbell range are programed by hypervisor */
|
|
||||||
if (!amdgpu_sriov_vf(adev)) {
|
|
||||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
|
||||||
ring = &adev->sdma.instance[i].ring;
|
|
||||||
adev->nbio.funcs->sdma_doorbell_range(adev, i,
|
|
||||||
ring->use_doorbell, ring->doorbell_index,
|
|
||||||
adev->doorbell_index.sdma_doorbell_range);
|
|
||||||
}
|
|
||||||
|
|
||||||
adev->nbio.funcs->ih_doorbell_range(adev, adev->irq.ih.use_doorbell,
|
|
||||||
adev->irq.ih.doorbell_index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int soc15_common_hw_init(void *handle)
|
static int soc15_common_hw_init(void *handle)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
@@ -1454,12 +1435,6 @@ static int soc15_common_hw_init(void *handle)
|
|||||||
|
|
||||||
/* enable the doorbell aperture */
|
/* enable the doorbell aperture */
|
||||||
soc15_enable_doorbell_aperture(adev, true);
|
soc15_enable_doorbell_aperture(adev, true);
|
||||||
/* HW doorbell routing policy: doorbell writing not
|
|
||||||
* in SDMA/IH/MM/ACV range will be routed to CP. So
|
|
||||||
* we need to init SDMA/IH/MM/ACV doorbell range prior
|
|
||||||
* to CP ip block init and ring test.
|
|
||||||
*/
|
|
||||||
soc15_doorbell_range_init(adev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -289,6 +289,10 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!amdgpu_sriov_vf(adev))
|
||||||
|
adev->nbio.funcs->ih_doorbell_range(adev, adev->irq.ih.use_doorbell,
|
||||||
|
adev->irq.ih.doorbell_index);
|
||||||
|
|
||||||
pci_set_master(adev->pdev);
|
pci_set_master(adev->pdev);
|
||||||
|
|
||||||
/* enable interrupts */
|
/* enable interrupts */
|
||||||
|
|||||||
@@ -340,6 +340,10 @@ static int vega20_ih_irq_init(struct amdgpu_device *adev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!amdgpu_sriov_vf(adev))
|
||||||
|
adev->nbio.funcs->ih_doorbell_range(adev, adev->irq.ih.use_doorbell,
|
||||||
|
adev->irq.ih.doorbell_index);
|
||||||
|
|
||||||
pci_set_master(adev->pdev);
|
pci_set_master(adev->pdev);
|
||||||
|
|
||||||
/* enable interrupts */
|
/* enable interrupts */
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ static void meson_plane_atomic_update(struct drm_plane *plane,
|
|||||||
|
|
||||||
/* Enable OSD and BLK0, set max global alpha */
|
/* Enable OSD and BLK0, set max global alpha */
|
||||||
priv->viu.osd1_ctrl_stat = OSD_ENABLE |
|
priv->viu.osd1_ctrl_stat = OSD_ENABLE |
|
||||||
(0xFF << OSD_GLOBAL_ALPHA_SHIFT) |
|
(0x100 << OSD_GLOBAL_ALPHA_SHIFT) |
|
||||||
OSD_BLK0_ENABLE;
|
OSD_BLK0_ENABLE;
|
||||||
|
|
||||||
priv->viu.osd1_ctrl_stat2 = readl(priv->io_base +
|
priv->viu.osd1_ctrl_stat2 = readl(priv->io_base +
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ static void meson_viu_set_g12a_osd1_matrix(struct meson_drm *priv,
|
|||||||
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF11_12));
|
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF11_12));
|
||||||
writel(((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff),
|
writel(((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff),
|
||||||
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF20_21));
|
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF20_21));
|
||||||
writel((m[11] & 0x1fff) << 16,
|
writel((m[11] & 0x1fff),
|
||||||
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF22));
|
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF22));
|
||||||
|
|
||||||
writel(((m[18] & 0xfff) << 16) | (m[19] & 0xfff),
|
writel(((m[18] & 0xfff) << 16) | (m[19] & 0xfff),
|
||||||
|
|||||||
@@ -191,6 +191,9 @@ static int rd_open(struct inode *inode, struct file *file)
|
|||||||
file->private_data = rd;
|
file->private_data = rd;
|
||||||
rd->open = true;
|
rd->open = true;
|
||||||
|
|
||||||
|
/* Reset fifo to clear any previously unread data: */
|
||||||
|
rd->fifo.head = rd->fifo.tail = 0;
|
||||||
|
|
||||||
/* the parsing tools need to know gpu-id to know which
|
/* the parsing tools need to know gpu-id to know which
|
||||||
* register database to load.
|
* register database to load.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -132,6 +132,17 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
|
|||||||
return PTR_ERR(opp);
|
return PTR_ERR(opp);
|
||||||
|
|
||||||
panfrost_devfreq_profile.initial_freq = cur_freq;
|
panfrost_devfreq_profile.initial_freq = cur_freq;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the recommend OPP this will enable and configure the regulator
|
||||||
|
* if any and will avoid a switch off by regulator_late_cleanup()
|
||||||
|
*/
|
||||||
|
ret = dev_pm_opp_set_opp(dev, opp);
|
||||||
|
if (ret) {
|
||||||
|
DRM_DEV_ERROR(dev, "Couldn't set recommended OPP\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
dev_pm_opp_put(opp);
|
dev_pm_opp_put(opp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int vic_runtime_resume(struct device *dev)
|
static int __maybe_unused vic_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct vic *vic = dev_get_drvdata(dev);
|
struct vic *vic = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
@@ -309,7 +309,7 @@ disable:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vic_runtime_suspend(struct device *dev)
|
static int __maybe_unused vic_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct vic *vic = dev_get_drvdata(dev);
|
struct vic *vic = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ struct report_list {
|
|||||||
* @multi_packet_cnt: Count of fragmented packet count
|
* @multi_packet_cnt: Count of fragmented packet count
|
||||||
*
|
*
|
||||||
* This structure is used to store completion flags and per client data like
|
* This structure is used to store completion flags and per client data like
|
||||||
* like report description, number of HID devices etc.
|
* report description, number of HID devices etc.
|
||||||
*/
|
*/
|
||||||
struct ishtp_cl_data {
|
struct ishtp_cl_data {
|
||||||
/* completion flags */
|
/* completion flags */
|
||||||
|
|||||||
@@ -626,13 +626,14 @@ static void ishtp_cl_read_complete(struct ishtp_cl_rb *rb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ipc_tx_callback() - IPC tx callback function
|
* ipc_tx_send() - IPC tx send function
|
||||||
* @prm: Pointer to client device instance
|
* @prm: Pointer to client device instance
|
||||||
*
|
*
|
||||||
* Send message over IPC either first time or on callback on previous message
|
* Send message over IPC. Message will be split into fragments
|
||||||
* completion
|
* if message size is bigger than IPC FIFO size, and all
|
||||||
|
* fragments will be sent one by one.
|
||||||
*/
|
*/
|
||||||
static void ipc_tx_callback(void *prm)
|
static void ipc_tx_send(void *prm)
|
||||||
{
|
{
|
||||||
struct ishtp_cl *cl = prm;
|
struct ishtp_cl *cl = prm;
|
||||||
struct ishtp_cl_tx_ring *cl_msg;
|
struct ishtp_cl_tx_ring *cl_msg;
|
||||||
@@ -677,32 +678,41 @@ static void ipc_tx_callback(void *prm)
|
|||||||
list);
|
list);
|
||||||
rem = cl_msg->send_buf.size - cl->tx_offs;
|
rem = cl_msg->send_buf.size - cl->tx_offs;
|
||||||
|
|
||||||
ishtp_hdr.host_addr = cl->host_client_id;
|
while (rem > 0) {
|
||||||
ishtp_hdr.fw_addr = cl->fw_client_id;
|
ishtp_hdr.host_addr = cl->host_client_id;
|
||||||
ishtp_hdr.reserved = 0;
|
ishtp_hdr.fw_addr = cl->fw_client_id;
|
||||||
pmsg = cl_msg->send_buf.data + cl->tx_offs;
|
ishtp_hdr.reserved = 0;
|
||||||
|
pmsg = cl_msg->send_buf.data + cl->tx_offs;
|
||||||
|
|
||||||
if (rem <= dev->mtu) {
|
if (rem <= dev->mtu) {
|
||||||
ishtp_hdr.length = rem;
|
/* Last fragment or only one packet */
|
||||||
ishtp_hdr.msg_complete = 1;
|
ishtp_hdr.length = rem;
|
||||||
cl->sending = 0;
|
ishtp_hdr.msg_complete = 1;
|
||||||
list_del_init(&cl_msg->list); /* Must be before write */
|
/* Submit to IPC queue with no callback */
|
||||||
spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
|
ishtp_write_message(dev, &ishtp_hdr, pmsg);
|
||||||
/* Submit to IPC queue with no callback */
|
cl->tx_offs = 0;
|
||||||
ishtp_write_message(dev, &ishtp_hdr, pmsg);
|
cl->sending = 0;
|
||||||
spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
|
|
||||||
list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
|
break;
|
||||||
++cl->tx_ring_free_size;
|
} else {
|
||||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock,
|
/* Send ipc fragment */
|
||||||
tx_free_flags);
|
ishtp_hdr.length = dev->mtu;
|
||||||
} else {
|
ishtp_hdr.msg_complete = 0;
|
||||||
/* Send IPC fragment */
|
/* All fregments submitted to IPC queue with no callback */
|
||||||
spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
|
ishtp_write_message(dev, &ishtp_hdr, pmsg);
|
||||||
cl->tx_offs += dev->mtu;
|
cl->tx_offs += dev->mtu;
|
||||||
ishtp_hdr.length = dev->mtu;
|
rem = cl_msg->send_buf.size - cl->tx_offs;
|
||||||
ishtp_hdr.msg_complete = 0;
|
}
|
||||||
ishtp_send_msg(dev, &ishtp_hdr, pmsg, ipc_tx_callback, cl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_del_init(&cl_msg->list);
|
||||||
|
spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||||
|
list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
|
||||||
|
++cl->tx_ring_free_size;
|
||||||
|
spin_unlock_irqrestore(&cl->tx_free_list_spinlock,
|
||||||
|
tx_free_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -720,7 +730,7 @@ static void ishtp_cl_send_msg_ipc(struct ishtp_device *dev,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
cl->tx_offs = 0;
|
cl->tx_offs = 0;
|
||||||
ipc_tx_callback(cl);
|
ipc_tx_send(cl);
|
||||||
++cl->send_msg_cnt_ipc;
|
++cl->send_msg_cnt_ipc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -501,7 +501,8 @@ enum irdma_status_code irdma_uk_send(struct irdma_qp_uk *qp,
|
|||||||
FIELD_PREP(IRDMAQPSQ_IMMDATA, info->imm_data));
|
FIELD_PREP(IRDMAQPSQ_IMMDATA, info->imm_data));
|
||||||
i = 0;
|
i = 0;
|
||||||
} else {
|
} else {
|
||||||
qp->wqe_ops.iw_set_fragment(wqe, 0, op_info->sg_list,
|
qp->wqe_ops.iw_set_fragment(wqe, 0,
|
||||||
|
frag_cnt ? op_info->sg_list : NULL,
|
||||||
qp->swqe_polarity);
|
qp->swqe_polarity);
|
||||||
i = 1;
|
i = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ static struct iforce_device iforce_device[] = {
|
|||||||
{ 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce },
|
{ 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce },
|
||||||
{ 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_joystick_avb, abs_avb_pegasus, ff_iforce },
|
{ 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_joystick_avb, abs_avb_pegasus, ff_iforce },
|
||||||
{ 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_wheel, abs_wheel, ff_iforce },
|
{ 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_wheel, abs_wheel, ff_iforce },
|
||||||
|
{ 0x05ef, 0x8886, "Boeder Force Feedback Wheel", btn_wheel, abs_wheel, ff_iforce },
|
||||||
{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //?
|
{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //?
|
||||||
{ 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //?
|
{ 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //?
|
||||||
{ 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce },
|
{ 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce },
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ static const struct goodix_chip_data gt9x_chip_data = {
|
|||||||
|
|
||||||
static const struct goodix_chip_id goodix_chip_ids[] = {
|
static const struct goodix_chip_id goodix_chip_ids[] = {
|
||||||
{ .id = "1151", .data = >1x_chip_data },
|
{ .id = "1151", .data = >1x_chip_data },
|
||||||
|
{ .id = "1158", .data = >1x_chip_data },
|
||||||
{ .id = "5663", .data = >1x_chip_data },
|
{ .id = "5663", .data = >1x_chip_data },
|
||||||
{ .id = "5688", .data = >1x_chip_data },
|
{ .id = "5688", .data = >1x_chip_data },
|
||||||
{ .id = "917S", .data = >1x_chip_data },
|
{ .id = "917S", .data = >1x_chip_data },
|
||||||
@@ -1362,6 +1363,7 @@ MODULE_DEVICE_TABLE(acpi, goodix_acpi_match);
|
|||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
static const struct of_device_id goodix_of_match[] = {
|
static const struct of_device_id goodix_of_match[] = {
|
||||||
{ .compatible = "goodix,gt1151" },
|
{ .compatible = "goodix,gt1151" },
|
||||||
|
{ .compatible = "goodix,gt1158" },
|
||||||
{ .compatible = "goodix,gt5663" },
|
{ .compatible = "goodix,gt5663" },
|
||||||
{ .compatible = "goodix,gt5688" },
|
{ .compatible = "goodix,gt5688" },
|
||||||
{ .compatible = "goodix,gt911" },
|
{ .compatible = "goodix,gt911" },
|
||||||
|
|||||||
@@ -191,38 +191,6 @@ static phys_addr_t root_entry_uctp(struct root_entry *re)
|
|||||||
return re->hi & VTD_PAGE_MASK;
|
return re->hi & VTD_PAGE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void context_clear_pasid_enable(struct context_entry *context)
|
|
||||||
{
|
|
||||||
context->lo &= ~(1ULL << 11);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool context_pasid_enabled(struct context_entry *context)
|
|
||||||
{
|
|
||||||
return !!(context->lo & (1ULL << 11));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void context_set_copied(struct context_entry *context)
|
|
||||||
{
|
|
||||||
context->hi |= (1ull << 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool context_copied(struct context_entry *context)
|
|
||||||
{
|
|
||||||
return !!(context->hi & (1ULL << 3));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool __context_present(struct context_entry *context)
|
|
||||||
{
|
|
||||||
return (context->lo & 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool context_present(struct context_entry *context)
|
|
||||||
{
|
|
||||||
return context_pasid_enabled(context) ?
|
|
||||||
__context_present(context) :
|
|
||||||
__context_present(context) && !context_copied(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void context_set_present(struct context_entry *context)
|
static inline void context_set_present(struct context_entry *context)
|
||||||
{
|
{
|
||||||
context->lo |= 1;
|
context->lo |= 1;
|
||||||
@@ -270,6 +238,26 @@ static inline void context_clear_entry(struct context_entry *context)
|
|||||||
context->hi = 0;
|
context->hi = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool context_copied(struct intel_iommu *iommu, u8 bus, u8 devfn)
|
||||||
|
{
|
||||||
|
if (!iommu->copied_tables)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return test_bit(((long)bus << 8) | devfn, iommu->copied_tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
set_context_copied(struct intel_iommu *iommu, u8 bus, u8 devfn)
|
||||||
|
{
|
||||||
|
set_bit(((long)bus << 8) | devfn, iommu->copied_tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
clear_context_copied(struct intel_iommu *iommu, u8 bus, u8 devfn)
|
||||||
|
{
|
||||||
|
clear_bit(((long)bus << 8) | devfn, iommu->copied_tables);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This domain is a statically identity mapping domain.
|
* This domain is a statically identity mapping domain.
|
||||||
* 1. This domain creats a static 1:1 mapping to all usable memory.
|
* 1. This domain creats a static 1:1 mapping to all usable memory.
|
||||||
@@ -792,6 +780,13 @@ struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus,
|
|||||||
struct context_entry *context;
|
struct context_entry *context;
|
||||||
u64 *entry;
|
u64 *entry;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Except that the caller requested to allocate a new entry,
|
||||||
|
* returning a copied context entry makes no sense.
|
||||||
|
*/
|
||||||
|
if (!alloc && context_copied(iommu, bus, devfn))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
entry = &root->lo;
|
entry = &root->lo;
|
||||||
if (sm_supported(iommu)) {
|
if (sm_supported(iommu)) {
|
||||||
if (devfn >= 0x80) {
|
if (devfn >= 0x80) {
|
||||||
@@ -1899,6 +1894,11 @@ static void free_dmar_iommu(struct intel_iommu *iommu)
|
|||||||
iommu->domain_ids = NULL;
|
iommu->domain_ids = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (iommu->copied_tables) {
|
||||||
|
bitmap_free(iommu->copied_tables);
|
||||||
|
iommu->copied_tables = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
g_iommus[iommu->seq_id] = NULL;
|
g_iommus[iommu->seq_id] = NULL;
|
||||||
|
|
||||||
/* free context mapping */
|
/* free context mapping */
|
||||||
@@ -2107,7 +2107,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (context_present(context))
|
if (context_present(context) && !context_copied(iommu, bus, devfn))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2119,7 +2119,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
|
|||||||
* in-flight DMA will exist, and we don't need to worry anymore
|
* in-flight DMA will exist, and we don't need to worry anymore
|
||||||
* hereafter.
|
* hereafter.
|
||||||
*/
|
*/
|
||||||
if (context_copied(context)) {
|
if (context_copied(iommu, bus, devfn)) {
|
||||||
u16 did_old = context_domain_id(context);
|
u16 did_old = context_domain_id(context);
|
||||||
|
|
||||||
if (did_old < cap_ndoms(iommu->cap)) {
|
if (did_old < cap_ndoms(iommu->cap)) {
|
||||||
@@ -2130,6 +2130,8 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
|
|||||||
iommu->flush.flush_iotlb(iommu, did_old, 0, 0,
|
iommu->flush.flush_iotlb(iommu, did_old, 0, 0,
|
||||||
DMA_TLB_DSI_FLUSH);
|
DMA_TLB_DSI_FLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_context_copied(iommu, bus, devfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
context_clear_entry(context);
|
context_clear_entry(context);
|
||||||
@@ -3024,32 +3026,14 @@ static int copy_context_table(struct intel_iommu *iommu,
|
|||||||
/* Now copy the context entry */
|
/* Now copy the context entry */
|
||||||
memcpy(&ce, old_ce + idx, sizeof(ce));
|
memcpy(&ce, old_ce + idx, sizeof(ce));
|
||||||
|
|
||||||
if (!__context_present(&ce))
|
if (!context_present(&ce))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
did = context_domain_id(&ce);
|
did = context_domain_id(&ce);
|
||||||
if (did >= 0 && did < cap_ndoms(iommu->cap))
|
if (did >= 0 && did < cap_ndoms(iommu->cap))
|
||||||
set_bit(did, iommu->domain_ids);
|
set_bit(did, iommu->domain_ids);
|
||||||
|
|
||||||
/*
|
set_context_copied(iommu, bus, devfn);
|
||||||
* We need a marker for copied context entries. This
|
|
||||||
* marker needs to work for the old format as well as
|
|
||||||
* for extended context entries.
|
|
||||||
*
|
|
||||||
* Bit 67 of the context entry is used. In the old
|
|
||||||
* format this bit is available to software, in the
|
|
||||||
* extended format it is the PGE bit, but PGE is ignored
|
|
||||||
* by HW if PASIDs are disabled (and thus still
|
|
||||||
* available).
|
|
||||||
*
|
|
||||||
* So disable PASIDs first and then mark the entry
|
|
||||||
* copied. This means that we don't copy PASID
|
|
||||||
* translations from the old kernel, but this is fine as
|
|
||||||
* faults there are not fatal.
|
|
||||||
*/
|
|
||||||
context_clear_pasid_enable(&ce);
|
|
||||||
context_set_copied(&ce);
|
|
||||||
|
|
||||||
new_ce[idx] = ce;
|
new_ce[idx] = ce;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3076,8 +3060,8 @@ static int copy_translation_tables(struct intel_iommu *iommu)
|
|||||||
bool new_ext, ext;
|
bool new_ext, ext;
|
||||||
|
|
||||||
rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG);
|
rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG);
|
||||||
ext = !!(rtaddr_reg & DMA_RTADDR_RTT);
|
ext = !!(rtaddr_reg & DMA_RTADDR_SMT);
|
||||||
new_ext = !!ecap_ecs(iommu->ecap);
|
new_ext = !!sm_supported(iommu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The RTT bit can only be changed when translation is disabled,
|
* The RTT bit can only be changed when translation is disabled,
|
||||||
@@ -3088,6 +3072,10 @@ static int copy_translation_tables(struct intel_iommu *iommu)
|
|||||||
if (new_ext != ext)
|
if (new_ext != ext)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
iommu->copied_tables = bitmap_zalloc(BIT_ULL(16), GFP_KERNEL);
|
||||||
|
if (!iommu->copied_tables)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
old_rt_phys = rtaddr_reg & VTD_PAGE_MASK;
|
old_rt_phys = rtaddr_reg & VTD_PAGE_MASK;
|
||||||
if (!old_rt_phys)
|
if (!old_rt_phys)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -18078,16 +18078,20 @@ static void tg3_shutdown(struct pci_dev *pdev)
|
|||||||
struct net_device *dev = pci_get_drvdata(pdev);
|
struct net_device *dev = pci_get_drvdata(pdev);
|
||||||
struct tg3 *tp = netdev_priv(dev);
|
struct tg3 *tp = netdev_priv(dev);
|
||||||
|
|
||||||
|
tg3_reset_task_cancel(tp);
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
netif_device_detach(dev);
|
netif_device_detach(dev);
|
||||||
|
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
dev_close(dev);
|
dev_close(dev);
|
||||||
|
|
||||||
if (system_state == SYSTEM_POWER_OFF)
|
tg3_power_down(tp);
|
||||||
tg3_power_down(tp);
|
|
||||||
|
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
||||||
|
pci_disable_device(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -504,6 +504,7 @@ cc2520_tx(struct ieee802154_hw *hw, struct sk_buff *skb)
|
|||||||
goto err_tx;
|
goto err_tx;
|
||||||
|
|
||||||
if (status & CC2520_STATUS_TX_UNDERFLOW) {
|
if (status & CC2520_STATUS_TX_UNDERFLOW) {
|
||||||
|
rc = -EINVAL;
|
||||||
dev_err(&priv->spi->dev, "cc2520 tx underflow exception\n");
|
dev_err(&priv->spi->dev, "cc2520 tx underflow exception\n");
|
||||||
goto err_tx;
|
goto err_tx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1085,6 +1085,7 @@ static const struct usb_device_id products[] = {
|
|||||||
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */
|
||||||
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */
|
||||||
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */
|
||||||
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)}, /* Quectel RM520N */
|
||||||
|
|
||||||
/* 3. Combined interface devices matching on interface number */
|
/* 3. Combined interface devices matching on interface number */
|
||||||
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
||||||
|
|||||||
@@ -4278,6 +4278,10 @@ static int hwsim_virtio_handle_cmd(struct sk_buff *skb)
|
|||||||
|
|
||||||
nlh = nlmsg_hdr(skb);
|
nlh = nlmsg_hdr(skb);
|
||||||
gnlh = nlmsg_data(nlh);
|
gnlh = nlmsg_data(nlh);
|
||||||
|
|
||||||
|
if (skb->len < nlh->nlmsg_len)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
err = genlmsg_parse(nlh, &hwsim_genl_family, tb, HWSIM_ATTR_MAX,
|
err = genlmsg_parse(nlh, &hwsim_genl_family, tb, HWSIM_ATTR_MAX,
|
||||||
hwsim_genl_policy, NULL);
|
hwsim_genl_policy, NULL);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -4320,7 +4324,8 @@ static void hwsim_virtio_rx_work(struct work_struct *work)
|
|||||||
spin_unlock_irqrestore(&hwsim_virtio_lock, flags);
|
spin_unlock_irqrestore(&hwsim_virtio_lock, flags);
|
||||||
|
|
||||||
skb->data = skb->head;
|
skb->data = skb->head;
|
||||||
skb_set_tail_pointer(skb, len);
|
skb_reset_tail_pointer(skb);
|
||||||
|
skb_put(skb, len);
|
||||||
hwsim_virtio_handle_cmd(skb);
|
hwsim_virtio_handle_cmd(skb);
|
||||||
|
|
||||||
spin_lock_irqsave(&hwsim_virtio_lock, flags);
|
spin_lock_irqsave(&hwsim_virtio_lock, flags);
|
||||||
|
|||||||
@@ -1501,6 +1501,9 @@ static void nvmet_tcp_state_change(struct sock *sk)
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
switch (sk->sk_state) {
|
switch (sk->sk_state) {
|
||||||
|
case TCP_FIN_WAIT2:
|
||||||
|
case TCP_LAST_ACK:
|
||||||
|
break;
|
||||||
case TCP_FIN_WAIT1:
|
case TCP_FIN_WAIT1:
|
||||||
case TCP_CLOSE_WAIT:
|
case TCP_CLOSE_WAIT:
|
||||||
case TCP_CLOSE:
|
case TCP_CLOSE:
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ static int unflatten_dt_nodes(const void *blob,
|
|||||||
for (offset = 0;
|
for (offset = 0;
|
||||||
offset >= 0 && depth >= initial_depth;
|
offset >= 0 && depth >= initial_depth;
|
||||||
offset = fdt_next_node(blob, offset, &depth)) {
|
offset = fdt_next_node(blob, offset, &depth)) {
|
||||||
if (WARN_ON_ONCE(depth >= FDT_MAX_DEPTH))
|
if (WARN_ON_ONCE(depth >= FDT_MAX_DEPTH - 1))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_OF_KOBJ) &&
|
if (!IS_ENABLED(CONFIG_OF_KOBJ) &&
|
||||||
|
|||||||
@@ -1546,6 +1546,7 @@ static int __init ccio_probe(struct parisc_device *dev)
|
|||||||
}
|
}
|
||||||
ccio_ioc_init(ioc);
|
ccio_ioc_init(ioc);
|
||||||
if (ccio_init_resources(ioc)) {
|
if (ccio_init_resources(ioc)) {
|
||||||
|
iounmap(ioc->ioc_regs);
|
||||||
kfree(ioc);
|
kfree(ioc);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ static int pmu_parse_irqs(struct arm_pmu *pmu)
|
|||||||
|
|
||||||
if (num_irqs == 1) {
|
if (num_irqs == 1) {
|
||||||
int irq = platform_get_irq(pdev, 0);
|
int irq = platform_get_irq(pdev, 0);
|
||||||
if (irq && irq_is_percpu_devid(irq))
|
if ((irq > 0) && irq_is_percpu_devid(irq))
|
||||||
return pmu_parse_percpu_irq(pmu, irq);
|
return pmu_parse_percpu_irq(pmu, irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -530,10 +530,10 @@ DECLARE_MSM_GPIO_PINS(187);
|
|||||||
DECLARE_MSM_GPIO_PINS(188);
|
DECLARE_MSM_GPIO_PINS(188);
|
||||||
DECLARE_MSM_GPIO_PINS(189);
|
DECLARE_MSM_GPIO_PINS(189);
|
||||||
|
|
||||||
static const unsigned int sdc2_clk_pins[] = { 190 };
|
static const unsigned int ufs_reset_pins[] = { 190 };
|
||||||
static const unsigned int sdc2_cmd_pins[] = { 191 };
|
static const unsigned int sdc2_clk_pins[] = { 191 };
|
||||||
static const unsigned int sdc2_data_pins[] = { 192 };
|
static const unsigned int sdc2_cmd_pins[] = { 192 };
|
||||||
static const unsigned int ufs_reset_pins[] = { 193 };
|
static const unsigned int sdc2_data_pins[] = { 193 };
|
||||||
|
|
||||||
enum sc8180x_functions {
|
enum sc8180x_functions {
|
||||||
msm_mux_adsp_ext,
|
msm_mux_adsp_ext,
|
||||||
@@ -1582,7 +1582,7 @@ static const int sc8180x_acpi_reserved_gpios[] = {
|
|||||||
static const struct msm_gpio_wakeirq_map sc8180x_pdc_map[] = {
|
static const struct msm_gpio_wakeirq_map sc8180x_pdc_map[] = {
|
||||||
{ 3, 31 }, { 5, 32 }, { 8, 33 }, { 9, 34 }, { 10, 100 }, { 12, 104 },
|
{ 3, 31 }, { 5, 32 }, { 8, 33 }, { 9, 34 }, { 10, 100 }, { 12, 104 },
|
||||||
{ 24, 37 }, { 26, 38 }, { 27, 41 }, { 28, 42 }, { 30, 39 }, { 36, 43 },
|
{ 24, 37 }, { 26, 38 }, { 27, 41 }, { 28, 42 }, { 30, 39 }, { 36, 43 },
|
||||||
{ 37, 43 }, { 38, 45 }, { 39, 118 }, { 39, 125 }, { 41, 47 },
|
{ 37, 44 }, { 38, 45 }, { 39, 118 }, { 39, 125 }, { 41, 47 },
|
||||||
{ 42, 48 }, { 46, 50 }, { 47, 49 }, { 48, 51 }, { 49, 53 }, { 50, 52 },
|
{ 42, 48 }, { 46, 50 }, { 47, 49 }, { 48, 51 }, { 49, 53 }, { 50, 52 },
|
||||||
{ 51, 116 }, { 51, 123 }, { 53, 54 }, { 54, 55 }, { 55, 56 },
|
{ 51, 116 }, { 51, 123 }, { 53, 54 }, { 54, 55 }, { 55, 56 },
|
||||||
{ 56, 57 }, { 58, 58 }, { 60, 60 }, { 68, 62 }, { 70, 63 }, { 76, 86 },
|
{ 56, 57 }, { 58, 58 }, { 60, 60 }, { 68, 62 }, { 70, 63 }, { 76, 86 },
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ MODULE_DEVICE_TABLE(of, a100_r_pinctrl_match);
|
|||||||
static struct platform_driver a100_r_pinctrl_driver = {
|
static struct platform_driver a100_r_pinctrl_driver = {
|
||||||
.probe = a100_r_pinctrl_probe,
|
.probe = a100_r_pinctrl_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "sun50iw10p1-r-pinctrl",
|
.name = "sun50i-a100-r-pinctrl",
|
||||||
.of_match_table = a100_r_pinctrl_match,
|
.of_match_table = a100_r_pinctrl_match,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -558,6 +558,9 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
|
|||||||
/* Surface Laptop Go 1 */
|
/* Surface Laptop Go 1 */
|
||||||
{ "MSHW0118", (unsigned long)ssam_node_group_slg1 },
|
{ "MSHW0118", (unsigned long)ssam_node_group_slg1 },
|
||||||
|
|
||||||
|
/* Surface Laptop Go 2 */
|
||||||
|
{ "MSHW0290", (unsigned long)ssam_node_group_slg1 },
|
||||||
|
|
||||||
/* Surface Laptop Studio */
|
/* Surface Laptop Studio */
|
||||||
{ "MSHW0123", (unsigned long)ssam_node_group_sls },
|
{ "MSHW0123", (unsigned long)ssam_node_group_sls },
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ static const struct key_entry acer_wmi_keymap[] __initconst = {
|
|||||||
{KE_KEY, 0x22, {KEY_PROG2} }, /* Arcade */
|
{KE_KEY, 0x22, {KEY_PROG2} }, /* Arcade */
|
||||||
{KE_KEY, 0x23, {KEY_PROG3} }, /* P_Key */
|
{KE_KEY, 0x23, {KEY_PROG3} }, /* P_Key */
|
||||||
{KE_KEY, 0x24, {KEY_PROG4} }, /* Social networking_Key */
|
{KE_KEY, 0x24, {KEY_PROG4} }, /* Social networking_Key */
|
||||||
|
{KE_KEY, 0x27, {KEY_HELP} },
|
||||||
{KE_KEY, 0x29, {KEY_PROG3} }, /* P_Key for TM8372 */
|
{KE_KEY, 0x29, {KEY_PROG3} }, /* P_Key for TM8372 */
|
||||||
{KE_IGNORE, 0x41, {KEY_MUTE} },
|
{KE_IGNORE, 0x41, {KEY_MUTE} },
|
||||||
{KE_IGNORE, 0x42, {KEY_PREVIOUSSONG} },
|
{KE_IGNORE, 0x42, {KEY_PREVIOUSSONG} },
|
||||||
@@ -112,7 +113,13 @@ static const struct key_entry acer_wmi_keymap[] __initconst = {
|
|||||||
{KE_IGNORE, 0x48, {KEY_VOLUMEUP} },
|
{KE_IGNORE, 0x48, {KEY_VOLUMEUP} },
|
||||||
{KE_IGNORE, 0x49, {KEY_VOLUMEDOWN} },
|
{KE_IGNORE, 0x49, {KEY_VOLUMEDOWN} },
|
||||||
{KE_IGNORE, 0x4a, {KEY_VOLUMEDOWN} },
|
{KE_IGNORE, 0x4a, {KEY_VOLUMEDOWN} },
|
||||||
{KE_IGNORE, 0x61, {KEY_SWITCHVIDEOMODE} },
|
/*
|
||||||
|
* 0x61 is KEY_SWITCHVIDEOMODE. Usually this is a duplicate input event
|
||||||
|
* with the "Video Bus" input device events. But sometimes it is not
|
||||||
|
* a dup. Map it to KEY_UNKNOWN instead of using KE_IGNORE so that
|
||||||
|
* udev/hwdb can override it on systems where it is not a dup.
|
||||||
|
*/
|
||||||
|
{KE_KEY, 0x61, {KEY_UNKNOWN} },
|
||||||
{KE_IGNORE, 0x62, {KEY_BRIGHTNESSUP} },
|
{KE_IGNORE, 0x62, {KEY_BRIGHTNESSUP} },
|
||||||
{KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} },
|
{KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} },
|
||||||
{KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */
|
{KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */
|
||||||
|
|||||||
@@ -763,7 +763,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
|
|||||||
((pfuze_chip->chip_id == PFUZE3000) ? "3000" : "3001"))));
|
((pfuze_chip->chip_id == PFUZE3000) ? "3000" : "3001"))));
|
||||||
|
|
||||||
memcpy(pfuze_chip->regulator_descs, pfuze_chip->pfuze_regulators,
|
memcpy(pfuze_chip->regulator_descs, pfuze_chip->pfuze_regulators,
|
||||||
sizeof(pfuze_chip->regulator_descs));
|
regulator_num * sizeof(struct pfuze_regulator));
|
||||||
|
|
||||||
ret = pfuze_parse_regulators_dt(pfuze_chip);
|
ret = pfuze_parse_regulators_dt(pfuze_chip);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|||||||
@@ -4278,7 +4278,7 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
|
|||||||
lpfc_cmd->result == IOERR_NO_RESOURCES ||
|
lpfc_cmd->result == IOERR_NO_RESOURCES ||
|
||||||
lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
|
lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
|
||||||
lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
|
lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
|
||||||
cmd->result = DID_REQUEUE << 16;
|
cmd->result = DID_TRANSPORT_DISRUPTED << 16;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
|
if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
|
||||||
@@ -4567,7 +4567,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
|||||||
lpfc_cmd->result == IOERR_NO_RESOURCES ||
|
lpfc_cmd->result == IOERR_NO_RESOURCES ||
|
||||||
lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
|
lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
|
||||||
lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
|
lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
|
||||||
cmd->result = DID_REQUEUE << 16;
|
cmd->result = DID_TRANSPORT_DISRUPTED << 16;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
|
if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ config FSL_MC_DPIO
|
|||||||
tristate "QorIQ DPAA2 DPIO driver"
|
tristate "QorIQ DPAA2 DPIO driver"
|
||||||
depends on FSL_MC_BUS
|
depends on FSL_MC_BUS
|
||||||
select SOC_BUS
|
select SOC_BUS
|
||||||
|
select FSL_GUTS
|
||||||
help
|
help
|
||||||
Driver for the DPAA2 DPIO object. A DPIO provides queue and
|
Driver for the DPAA2 DPIO object. A DPIO provides queue and
|
||||||
buffer management facilities for software to interact with
|
buffer management facilities for software to interact with
|
||||||
|
|||||||
@@ -295,20 +295,16 @@ static int atmel_config_rs485(struct uart_port *port,
|
|||||||
|
|
||||||
mode = atmel_uart_readl(port, ATMEL_US_MR);
|
mode = atmel_uart_readl(port, ATMEL_US_MR);
|
||||||
|
|
||||||
/* Resetting serial mode to RS232 (0x0) */
|
|
||||||
mode &= ~ATMEL_US_USMODE;
|
|
||||||
|
|
||||||
port->rs485 = *rs485conf;
|
|
||||||
|
|
||||||
if (rs485conf->flags & SER_RS485_ENABLED) {
|
if (rs485conf->flags & SER_RS485_ENABLED) {
|
||||||
dev_dbg(port->dev, "Setting UART to RS485\n");
|
dev_dbg(port->dev, "Setting UART to RS485\n");
|
||||||
if (port->rs485.flags & SER_RS485_RX_DURING_TX)
|
if (rs485conf->flags & SER_RS485_RX_DURING_TX)
|
||||||
atmel_port->tx_done_mask = ATMEL_US_TXRDY;
|
atmel_port->tx_done_mask = ATMEL_US_TXRDY;
|
||||||
else
|
else
|
||||||
atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
|
atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
|
||||||
|
|
||||||
atmel_uart_writel(port, ATMEL_US_TTGR,
|
atmel_uart_writel(port, ATMEL_US_TTGR,
|
||||||
rs485conf->delay_rts_after_send);
|
rs485conf->delay_rts_after_send);
|
||||||
|
mode &= ~ATMEL_US_USMODE;
|
||||||
mode |= ATMEL_US_USMODE_RS485;
|
mode |= ATMEL_US_USMODE_RS485;
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(port->dev, "Setting UART to RS232\n");
|
dev_dbg(port->dev, "Setting UART to RS232\n");
|
||||||
|
|||||||
@@ -281,6 +281,12 @@ static struct usb_endpoint_descriptor ss_ep_int_desc = {
|
|||||||
.bInterval = 4,
|
.bInterval = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct usb_ss_ep_comp_descriptor ss_ep_int_desc_comp = {
|
||||||
|
.bLength = sizeof(ss_ep_int_desc_comp),
|
||||||
|
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
||||||
|
.wBytesPerInterval = cpu_to_le16(6),
|
||||||
|
};
|
||||||
|
|
||||||
/* Audio Streaming OUT Interface - Alt0 */
|
/* Audio Streaming OUT Interface - Alt0 */
|
||||||
static struct usb_interface_descriptor std_as_out_if0_desc = {
|
static struct usb_interface_descriptor std_as_out_if0_desc = {
|
||||||
.bLength = sizeof std_as_out_if0_desc,
|
.bLength = sizeof std_as_out_if0_desc,
|
||||||
@@ -594,7 +600,8 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
|
|||||||
(struct usb_descriptor_header *)&in_feature_unit_desc,
|
(struct usb_descriptor_header *)&in_feature_unit_desc,
|
||||||
(struct usb_descriptor_header *)&io_out_ot_desc,
|
(struct usb_descriptor_header *)&io_out_ot_desc,
|
||||||
|
|
||||||
(struct usb_descriptor_header *)&ss_ep_int_desc,
|
(struct usb_descriptor_header *)&ss_ep_int_desc,
|
||||||
|
(struct usb_descriptor_header *)&ss_ep_int_desc_comp,
|
||||||
|
|
||||||
(struct usb_descriptor_header *)&std_as_out_if0_desc,
|
(struct usb_descriptor_header *)&std_as_out_if0_desc,
|
||||||
(struct usb_descriptor_header *)&std_as_out_if1_desc,
|
(struct usb_descriptor_header *)&std_as_out_if1_desc,
|
||||||
@@ -721,6 +728,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||||||
struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
|
struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
|
||||||
struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
|
struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
|
||||||
struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL;
|
struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL;
|
||||||
|
struct usb_ss_ep_comp_descriptor *ep_int_desc_comp = NULL;
|
||||||
struct usb_endpoint_descriptor *epout_desc;
|
struct usb_endpoint_descriptor *epout_desc;
|
||||||
struct usb_endpoint_descriptor *epin_desc;
|
struct usb_endpoint_descriptor *epin_desc;
|
||||||
struct usb_endpoint_descriptor *epin_fback_desc;
|
struct usb_endpoint_descriptor *epin_fback_desc;
|
||||||
@@ -748,6 +756,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||||||
epin_fback_desc = &ss_epin_fback_desc;
|
epin_fback_desc = &ss_epin_fback_desc;
|
||||||
epin_fback_desc_comp = &ss_epin_fback_desc_comp;
|
epin_fback_desc_comp = &ss_epin_fback_desc_comp;
|
||||||
ep_int_desc = &ss_ep_int_desc;
|
ep_int_desc = &ss_ep_int_desc;
|
||||||
|
ep_int_desc_comp = &ss_ep_int_desc_comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
@@ -760,15 +769,15 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||||||
headers[i++] = USBDHDR(&out_clk_src_desc);
|
headers[i++] = USBDHDR(&out_clk_src_desc);
|
||||||
headers[i++] = USBDHDR(&usb_out_it_desc);
|
headers[i++] = USBDHDR(&usb_out_it_desc);
|
||||||
|
|
||||||
if (FUOUT_EN(opts))
|
if (FUOUT_EN(opts))
|
||||||
headers[i++] = USBDHDR(out_feature_unit_desc);
|
headers[i++] = USBDHDR(out_feature_unit_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EPIN_EN(opts)) {
|
if (EPIN_EN(opts)) {
|
||||||
headers[i++] = USBDHDR(&io_in_it_desc);
|
headers[i++] = USBDHDR(&io_in_it_desc);
|
||||||
|
|
||||||
if (FUIN_EN(opts))
|
if (FUIN_EN(opts))
|
||||||
headers[i++] = USBDHDR(in_feature_unit_desc);
|
headers[i++] = USBDHDR(in_feature_unit_desc);
|
||||||
|
|
||||||
headers[i++] = USBDHDR(&usb_in_ot_desc);
|
headers[i++] = USBDHDR(&usb_in_ot_desc);
|
||||||
}
|
}
|
||||||
@@ -776,10 +785,13 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||||||
if (EPOUT_EN(opts))
|
if (EPOUT_EN(opts))
|
||||||
headers[i++] = USBDHDR(&io_out_ot_desc);
|
headers[i++] = USBDHDR(&io_out_ot_desc);
|
||||||
|
|
||||||
if (FUOUT_EN(opts) || FUIN_EN(opts))
|
if (FUOUT_EN(opts) || FUIN_EN(opts)) {
|
||||||
headers[i++] = USBDHDR(ep_int_desc);
|
headers[i++] = USBDHDR(ep_int_desc);
|
||||||
|
if (ep_int_desc_comp)
|
||||||
|
headers[i++] = USBDHDR(ep_int_desc_comp);
|
||||||
|
}
|
||||||
|
|
||||||
if (EPOUT_EN(opts)) {
|
if (EPOUT_EN(opts)) {
|
||||||
headers[i++] = USBDHDR(&std_as_out_if0_desc);
|
headers[i++] = USBDHDR(&std_as_out_if0_desc);
|
||||||
headers[i++] = USBDHDR(&std_as_out_if1_desc);
|
headers[i++] = USBDHDR(&std_as_out_if1_desc);
|
||||||
headers[i++] = USBDHDR(&as_out_hdr_desc);
|
headers[i++] = USBDHDR(&as_out_hdr_desc);
|
||||||
|
|||||||
@@ -62,6 +62,13 @@ UNUSUAL_DEV(0x0984, 0x0301, 0x0128, 0x0128,
|
|||||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||||
US_FL_IGNORE_UAS),
|
US_FL_IGNORE_UAS),
|
||||||
|
|
||||||
|
/* Reported-by: Tom Hu <huxiaoying@kylinos.cn> */
|
||||||
|
UNUSUAL_DEV(0x0b05, 0x1932, 0x0000, 0x9999,
|
||||||
|
"ASUS",
|
||||||
|
"External HDD",
|
||||||
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||||
|
US_FL_IGNORE_UAS),
|
||||||
|
|
||||||
/* Reported-by: David Webb <djw@noc.ac.uk> */
|
/* Reported-by: David Webb <djw@noc.ac.uk> */
|
||||||
UNUSUAL_DEV(0x0bc2, 0x331a, 0x0000, 0x9999,
|
UNUSUAL_DEV(0x0bc2, 0x331a, 0x0000, 0x9999,
|
||||||
"Seagate",
|
"Seagate",
|
||||||
|
|||||||
@@ -662,6 +662,9 @@ static int i740fb_decode_var(const struct fb_var_screeninfo *var,
|
|||||||
|
|
||||||
static int i740fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
static int i740fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||||
{
|
{
|
||||||
|
if (!var->pixclock)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
switch (var->bits_per_pixel) {
|
switch (var->bits_per_pixel) {
|
||||||
case 8:
|
case 8:
|
||||||
var->red.offset = var->green.offset = var->blue.offset = 0;
|
var->red.offset = var->green.offset = var->blue.offset = 0;
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ pxa3xx_gcu_write(struct file *file, const char *buff,
|
|||||||
struct pxa3xx_gcu_batch *buffer;
|
struct pxa3xx_gcu_batch *buffer;
|
||||||
struct pxa3xx_gcu_priv *priv = to_pxa3xx_gcu_priv(file);
|
struct pxa3xx_gcu_priv *priv = to_pxa3xx_gcu_priv(file);
|
||||||
|
|
||||||
int words = count / 4;
|
size_t words = count / 4;
|
||||||
|
|
||||||
/* Does not need to be atomic. There's a lock in user space,
|
/* Does not need to be atomic. There's a lock in user space,
|
||||||
* but anyhow, this is just for statistics. */
|
* but anyhow, this is just for statistics. */
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ int afs_abort_to_error(u32 abort_code)
|
|||||||
/* Unified AFS error table */
|
/* Unified AFS error table */
|
||||||
case UAEPERM: return -EPERM;
|
case UAEPERM: return -EPERM;
|
||||||
case UAENOENT: return -ENOENT;
|
case UAENOENT: return -ENOENT;
|
||||||
|
case UAEAGAIN: return -EAGAIN;
|
||||||
case UAEACCES: return -EACCES;
|
case UAEACCES: return -EACCES;
|
||||||
case UAEBUSY: return -EBUSY;
|
case UAEBUSY: return -EBUSY;
|
||||||
case UAEEXIST: return -EEXIST;
|
case UAEEXIST: return -EEXIST;
|
||||||
|
|||||||
@@ -519,9 +519,6 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
|
|||||||
int length = 0;
|
int length = 0;
|
||||||
int total_read;
|
int total_read;
|
||||||
|
|
||||||
smb_msg->msg_control = NULL;
|
|
||||||
smb_msg->msg_controllen = 0;
|
|
||||||
|
|
||||||
for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
|
for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
|
||||||
try_to_freeze();
|
try_to_freeze();
|
||||||
|
|
||||||
@@ -572,7 +569,7 @@ int
|
|||||||
cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
||||||
unsigned int to_read)
|
unsigned int to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
struct kvec iov = {.iov_base = buf, .iov_len = to_read};
|
struct kvec iov = {.iov_base = buf, .iov_len = to_read};
|
||||||
iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
|
iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
|
||||||
|
|
||||||
@@ -582,15 +579,13 @@ cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
|
|||||||
ssize_t
|
ssize_t
|
||||||
cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
|
cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iov_iter_discard already sets smb_msg.type and count and iov_offset
|
* iov_iter_discard already sets smb_msg.type and count and iov_offset
|
||||||
* and cifs_readv_from_socket sets msg_control and msg_controllen
|
* and cifs_readv_from_socket sets msg_control and msg_controllen
|
||||||
* so little to initialize in struct msghdr
|
* so little to initialize in struct msghdr
|
||||||
*/
|
*/
|
||||||
smb_msg.msg_name = NULL;
|
|
||||||
smb_msg.msg_namelen = 0;
|
|
||||||
iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
|
iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
|
||||||
|
|
||||||
return cifs_readv_from_socket(server, &smb_msg);
|
return cifs_readv_from_socket(server, &smb_msg);
|
||||||
@@ -600,7 +595,7 @@ int
|
|||||||
cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
|
cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
|
||||||
unsigned int page_offset, unsigned int to_read)
|
unsigned int page_offset, unsigned int to_read)
|
||||||
{
|
{
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
struct bio_vec bv = {
|
struct bio_vec bv = {
|
||||||
.bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
|
.bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
|
||||||
iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
|
iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
|
||||||
|
|||||||
@@ -3318,6 +3318,9 @@ static ssize_t __cifs_writev(
|
|||||||
|
|
||||||
ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from)
|
ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from)
|
||||||
{
|
{
|
||||||
|
struct file *file = iocb->ki_filp;
|
||||||
|
|
||||||
|
cifs_revalidate_mapping(file->f_inode);
|
||||||
return __cifs_writev(iocb, from, true);
|
return __cifs_writev(iocb, from, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -196,10 +196,6 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
|
|||||||
|
|
||||||
*sent = 0;
|
*sent = 0;
|
||||||
|
|
||||||
smb_msg->msg_name = (struct sockaddr *) &server->dstaddr;
|
|
||||||
smb_msg->msg_namelen = sizeof(struct sockaddr);
|
|
||||||
smb_msg->msg_control = NULL;
|
|
||||||
smb_msg->msg_controllen = 0;
|
|
||||||
if (server->noblocksnd)
|
if (server->noblocksnd)
|
||||||
smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
||||||
else
|
else
|
||||||
@@ -311,7 +307,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
|
|||||||
sigset_t mask, oldmask;
|
sigset_t mask, oldmask;
|
||||||
size_t total_len = 0, sent, size;
|
size_t total_len = 0, sent, size;
|
||||||
struct socket *ssocket = server->ssocket;
|
struct socket *ssocket = server->ssocket;
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg = {};
|
||||||
__be32 rfc1002_marker;
|
__be32 rfc1002_marker;
|
||||||
|
|
||||||
if (cifs_rdma_enabled(server)) {
|
if (cifs_rdma_enabled(server)) {
|
||||||
|
|||||||
@@ -1046,22 +1046,31 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx)
|
|||||||
if (ctx->bsize)
|
if (ctx->bsize)
|
||||||
sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits);
|
sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits);
|
||||||
|
|
||||||
if (server->nfs_client->rpc_ops->version != 2) {
|
switch (server->nfs_client->rpc_ops->version) {
|
||||||
/* The VFS shouldn't apply the umask to mode bits. We will do
|
case 2:
|
||||||
* so ourselves when necessary.
|
sb->s_time_gran = 1000;
|
||||||
|
sb->s_time_min = 0;
|
||||||
|
sb->s_time_max = U32_MAX;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
/*
|
||||||
|
* The VFS shouldn't apply the umask to mode bits.
|
||||||
|
* We will do so ourselves when necessary.
|
||||||
*/
|
*/
|
||||||
sb->s_flags |= SB_POSIXACL;
|
sb->s_flags |= SB_POSIXACL;
|
||||||
sb->s_time_gran = 1;
|
sb->s_time_gran = 1;
|
||||||
sb->s_export_op = &nfs_export_ops;
|
|
||||||
} else
|
|
||||||
sb->s_time_gran = 1000;
|
|
||||||
|
|
||||||
if (server->nfs_client->rpc_ops->version != 4) {
|
|
||||||
sb->s_time_min = 0;
|
sb->s_time_min = 0;
|
||||||
sb->s_time_max = U32_MAX;
|
sb->s_time_max = U32_MAX;
|
||||||
} else {
|
sb->s_export_op = &nfs_export_ops;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
sb->s_flags |= SB_POSIXACL;
|
||||||
|
sb->s_time_gran = 1;
|
||||||
sb->s_time_min = S64_MIN;
|
sb->s_time_min = S64_MIN;
|
||||||
sb->s_time_max = S64_MAX;
|
sb->s_time_max = S64_MAX;
|
||||||
|
if (server->caps & NFS_CAP_ATOMIC_OPEN_V1)
|
||||||
|
sb->s_export_op = &nfs_export_ops;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sb->s_magic = NFS_SUPER_MAGIC;
|
sb->s_magic = NFS_SUPER_MAGIC;
|
||||||
|
|||||||
@@ -141,6 +141,8 @@ struct tracefs_mount_opts {
|
|||||||
kuid_t uid;
|
kuid_t uid;
|
||||||
kgid_t gid;
|
kgid_t gid;
|
||||||
umode_t mode;
|
umode_t mode;
|
||||||
|
/* Opt_* bitfield. */
|
||||||
|
unsigned int opts;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -241,6 +243,7 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts)
|
|||||||
kgid_t gid;
|
kgid_t gid;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
|
opts->opts = 0;
|
||||||
opts->mode = TRACEFS_DEFAULT_MODE;
|
opts->mode = TRACEFS_DEFAULT_MODE;
|
||||||
|
|
||||||
while ((p = strsep(&data, ",")) != NULL) {
|
while ((p = strsep(&data, ",")) != NULL) {
|
||||||
@@ -275,24 +278,36 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts)
|
|||||||
* but traditionally tracefs has ignored all mount options
|
* but traditionally tracefs has ignored all mount options
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opts->opts |= BIT(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tracefs_apply_options(struct super_block *sb)
|
static int tracefs_apply_options(struct super_block *sb, bool remount)
|
||||||
{
|
{
|
||||||
struct tracefs_fs_info *fsi = sb->s_fs_info;
|
struct tracefs_fs_info *fsi = sb->s_fs_info;
|
||||||
struct inode *inode = sb->s_root->d_inode;
|
struct inode *inode = sb->s_root->d_inode;
|
||||||
struct tracefs_mount_opts *opts = &fsi->mount_opts;
|
struct tracefs_mount_opts *opts = &fsi->mount_opts;
|
||||||
|
|
||||||
inode->i_mode &= ~S_IALLUGO;
|
/*
|
||||||
inode->i_mode |= opts->mode;
|
* On remount, only reset mode/uid/gid if they were provided as mount
|
||||||
|
* options.
|
||||||
|
*/
|
||||||
|
|
||||||
inode->i_uid = opts->uid;
|
if (!remount || opts->opts & BIT(Opt_mode)) {
|
||||||
|
inode->i_mode &= ~S_IALLUGO;
|
||||||
|
inode->i_mode |= opts->mode;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set all the group ids to the mount option */
|
if (!remount || opts->opts & BIT(Opt_uid))
|
||||||
set_gid(sb->s_root, opts->gid);
|
inode->i_uid = opts->uid;
|
||||||
|
|
||||||
|
if (!remount || opts->opts & BIT(Opt_gid)) {
|
||||||
|
/* Set all the group ids to the mount option */
|
||||||
|
set_gid(sb->s_root, opts->gid);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -307,7 +322,7 @@ static int tracefs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
tracefs_apply_options(sb);
|
tracefs_apply_options(sb, true);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
return err;
|
return err;
|
||||||
@@ -359,7 +374,7 @@ static int trace_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
|
|
||||||
sb->s_op = &tracefs_super_operations;
|
sb->s_op = &tracefs_super_operations;
|
||||||
|
|
||||||
tracefs_apply_options(sb);
|
tracefs_apply_options(sb, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user