Merge remote-tracking branch 'stable/linux-5.15.y' into rpi-5.15.y

This commit is contained in:
Dom Cobley
2022-09-26 12:49:52 +01:00
125 changed files with 509 additions and 300 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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";

View File

@@ -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";

View File

@@ -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";

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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";

View File

@@ -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";

View File

@@ -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>;
}; };

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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";

View File

@@ -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>;

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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";

View File

@@ -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";

View File

@@ -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";

View File

@@ -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>;

View File

@@ -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";

View File

@@ -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";

View File

@@ -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();

View File

@@ -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);
} }

View File

@@ -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"

View File

@@ -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;
} }

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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,

View File

@@ -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);

View File

@@ -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))

View File

@@ -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();

View File

@@ -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;
} }
/* /*

View File

@@ -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];

View File

@@ -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;

View File

@@ -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[] = {

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 &&

View File

@@ -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)

View File

@@ -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 = {

View File

@@ -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 = {

View File

@@ -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);

View File

@@ -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;
} }

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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 +

View File

@@ -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),

View File

@@ -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.
*/ */

View File

@@ -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);
/* /*

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;
} }

View File

@@ -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;
} }

View File

@@ -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 },

View File

@@ -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 = &gt1x_chip_data }, { .id = "1151", .data = &gt1x_chip_data },
{ .id = "1158", .data = &gt1x_chip_data },
{ .id = "5663", .data = &gt1x_chip_data }, { .id = "5663", .data = &gt1x_chip_data },
{ .id = "5688", .data = &gt1x_chip_data }, { .id = "5688", .data = &gt1x_chip_data },
{ .id = "917S", .data = &gt1x_chip_data }, { .id = "917S", .data = &gt1x_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" },

View File

@@ -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;

View File

@@ -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);
} }
/** /**

View File

@@ -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;
} }

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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:

View File

@@ -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) &&

View File

@@ -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;
} }

View File

@@ -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);
} }

View File

@@ -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 },

View File

@@ -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,
}, },
}; };

View File

@@ -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 },

View File

@@ -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 */

View File

@@ -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)

View File

@@ -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 ||

View File

@@ -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

View File

@@ -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");

View File

@@ -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);

View File

@@ -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",

View File

@@ -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;

View File

@@ -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. */

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
} }

View File

@@ -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)) {

View File

@@ -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;

View File

@@ -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