Merge 5.18-rc7 into usb-next
We need the tty fixes in here as well, as we need to revert one of them :( Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
d6da35e0c6
3
.mailmap
3
.mailmap
@ -45,6 +45,7 @@ Andrey Konovalov <andreyknvl@gmail.com> <andreyknvl@google.com>
|
|||||||
Andrey Ryabinin <ryabinin.a.a@gmail.com> <a.ryabinin@samsung.com>
|
Andrey Ryabinin <ryabinin.a.a@gmail.com> <a.ryabinin@samsung.com>
|
||||||
Andrey Ryabinin <ryabinin.a.a@gmail.com> <aryabinin@virtuozzo.com>
|
Andrey Ryabinin <ryabinin.a.a@gmail.com> <aryabinin@virtuozzo.com>
|
||||||
Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com>
|
Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com>
|
||||||
|
André Almeida <andrealmeid@igalia.com> <andrealmeid@collabora.com>
|
||||||
Andy Adamson <andros@citi.umich.edu>
|
Andy Adamson <andros@citi.umich.edu>
|
||||||
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
|
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
|
||||||
Antoine Tenart <atenart@kernel.org> <antoine.tenart@free-electrons.com>
|
Antoine Tenart <atenart@kernel.org> <antoine.tenart@free-electrons.com>
|
||||||
@ -204,6 +205,7 @@ Juha Yrjola <at solidboot.com>
|
|||||||
Juha Yrjola <juha.yrjola@nokia.com>
|
Juha Yrjola <juha.yrjola@nokia.com>
|
||||||
Juha Yrjola <juha.yrjola@solidboot.com>
|
Juha Yrjola <juha.yrjola@solidboot.com>
|
||||||
Julien Thierry <julien.thierry.kdev@gmail.com> <julien.thierry@arm.com>
|
Julien Thierry <julien.thierry.kdev@gmail.com> <julien.thierry@arm.com>
|
||||||
|
Kalle Valo <kvalo@kernel.org> <kvalo@codeaurora.org>
|
||||||
Kalyan Thota <quic_kalyant@quicinc.com> <kalyan_t@codeaurora.org>
|
Kalyan Thota <quic_kalyant@quicinc.com> <kalyan_t@codeaurora.org>
|
||||||
Kay Sievers <kay.sievers@vrfy.org>
|
Kay Sievers <kay.sievers@vrfy.org>
|
||||||
Kees Cook <keescook@chromium.org> <kees.cook@canonical.com>
|
Kees Cook <keescook@chromium.org> <kees.cook@canonical.com>
|
||||||
@ -249,6 +251,7 @@ Mark Yao <markyao0591@gmail.com> <mark.yao@rock-chips.com>
|
|||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com>
|
||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@puri.sm>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@puri.sm>
|
||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
||||||
|
Martyna Szapar-Mudlaw <martyna.szapar-mudlaw@linux.intel.com> <martyna.szapar-mudlaw@intel.com>
|
||||||
Mathieu Othacehe <m.othacehe@gmail.com>
|
Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
Matthew Wilcox <willy@infradead.org> <matthew.r.wilcox@intel.com>
|
Matthew Wilcox <willy@infradead.org> <matthew.r.wilcox@intel.com>
|
||||||
Matthew Wilcox <willy@infradead.org> <matthew@wil.cx>
|
Matthew Wilcox <willy@infradead.org> <matthew@wil.cx>
|
||||||
|
@ -189,6 +189,9 @@ stable kernels.
|
|||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Qualcomm Tech. | Kryo4xx Silver | N/A | ARM64_ERRATUM_1024718 |
|
| Qualcomm Tech. | Kryo4xx Silver | N/A | ARM64_ERRATUM_1024718 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
| Qualcomm Tech. | Kryo4xx Gold | N/A | ARM64_ERRATUM_1286807 |
|
||||||
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
| Fujitsu | A64FX | E#010001 | FUJITSU_ERRATUM_010001 |
|
| Fujitsu | A64FX | E#010001 | FUJITSU_ERRATUM_010001 |
|
||||||
+----------------+-----------------+-----------------+-----------------------------+
|
+----------------+-----------------+-----------------+-----------------------------+
|
||||||
|
@ -55,8 +55,6 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 7
|
|
||||||
maxItems: 7
|
|
||||||
items:
|
items:
|
||||||
- description: 32k osc
|
- description: 32k osc
|
||||||
- description: 25m osc
|
- description: 25m osc
|
||||||
@ -66,8 +64,6 @@ allOf:
|
|||||||
- description: ext3 clock input
|
- description: ext3 clock input
|
||||||
- description: ext4 clock input
|
- description: ext4 clock input
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 7
|
|
||||||
maxItems: 7
|
|
||||||
items:
|
items:
|
||||||
- const: ckil
|
- const: ckil
|
||||||
- const: osc_25m
|
- const: osc_25m
|
||||||
|
@ -95,7 +95,6 @@ then:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock
|
- description: Functional clock
|
||||||
- description: EXTAL input clock
|
- description: EXTAL input clock
|
||||||
@ -104,7 +103,6 @@ then:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: fck
|
- const: fck
|
||||||
# The LVDS encoder can use the EXTAL or DU_DOTCLKINx clocks.
|
# The LVDS encoder can use the EXTAL or DU_DOTCLKINx clocks.
|
||||||
@ -128,12 +126,10 @@ then:
|
|||||||
else:
|
else:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock
|
- description: Functional clock
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- const: fck
|
- const: fck
|
||||||
|
|
||||||
|
@ -109,7 +109,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock
|
- description: Functional clock
|
||||||
- description: DU_DOTCLKIN0 input clock
|
- description: DU_DOTCLKIN0 input clock
|
||||||
@ -117,7 +116,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- pattern: '^dclkin\.[01]$'
|
- pattern: '^dclkin\.[01]$'
|
||||||
@ -159,7 +157,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -168,7 +165,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -216,7 +212,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -225,7 +220,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -271,7 +265,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -280,7 +273,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -327,7 +319,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -336,7 +327,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -386,7 +376,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -397,7 +386,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -448,7 +436,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 4
|
minItems: 4
|
||||||
maxItems: 8
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -461,7 +448,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 4
|
minItems: 4
|
||||||
maxItems: 8
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -525,7 +511,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -536,7 +521,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -596,7 +580,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -607,7 +590,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -666,14 +648,12 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: DU_DOTCLKIN0 input clock
|
- description: DU_DOTCLKIN0 input clock
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: dclkin.0
|
- const: dclkin.0
|
||||||
@ -723,7 +703,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Functional clock for DU0
|
- description: Functional clock for DU0
|
||||||
- description: Functional clock for DU1
|
- description: Functional clock for DU1
|
||||||
@ -732,7 +711,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
- const: du.1
|
- const: du.1
|
||||||
@ -791,7 +769,6 @@ allOf:
|
|||||||
- description: Functional clock
|
- description: Functional clock
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- const: du.0
|
- const: du.0
|
||||||
|
|
||||||
|
@ -58,10 +58,9 @@ patternProperties:
|
|||||||
description: |
|
description: |
|
||||||
The value (two's complement) to be programmed in the channel specific N correction register.
|
The value (two's complement) to be programmed in the channel specific N correction register.
|
||||||
For remote channels only.
|
For remote channels only.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/int32
|
||||||
items:
|
minimum: -128
|
||||||
minimum: 0
|
maximum: 127
|
||||||
maximum: 255
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- reg
|
- reg
|
||||||
|
@ -138,7 +138,6 @@ allOf:
|
|||||||
- const: bus
|
- const: bus
|
||||||
- const: adc
|
- const: adc
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
|
||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
items:
|
items:
|
||||||
@ -170,7 +169,6 @@ allOf:
|
|||||||
- const: bus
|
- const: bus
|
||||||
- const: adc
|
- const: adc
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
|
||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
items:
|
items:
|
||||||
|
@ -43,8 +43,6 @@ patternProperties:
|
|||||||
- 4 # LED output FLASH1
|
- 4 # LED output FLASH1
|
||||||
- 5 # LED output FLASH2
|
- 5 # LED output FLASH2
|
||||||
|
|
||||||
unevaluatedProperties: false
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- "#address-cells"
|
- "#address-cells"
|
||||||
|
@ -202,22 +202,17 @@ allOf:
|
|||||||
clocks:
|
clocks:
|
||||||
items:
|
items:
|
||||||
- description: module clock
|
- description: module clock
|
||||||
minItems: 1
|
|
||||||
maxItems: 1
|
|
||||||
else:
|
else:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
items:
|
items:
|
||||||
- description: module clock
|
- description: module clock
|
||||||
- description: timeout clock
|
- description: timeout clock
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
|
||||||
clock-names:
|
clock-names:
|
||||||
items:
|
items:
|
||||||
- const: sdhci
|
- const: sdhci
|
||||||
- const: tmclk
|
- const: tmclk
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
|
||||||
required:
|
required:
|
||||||
- clock-names
|
- clock-names
|
||||||
|
|
||||||
|
@ -147,8 +147,6 @@ allOf:
|
|||||||
- description: SoC gpmi io clock
|
- description: SoC gpmi io clock
|
||||||
- description: SoC gpmi bch apb clock
|
- description: SoC gpmi bch apb clock
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
|
||||||
items:
|
items:
|
||||||
- const: gpmi_io
|
- const: gpmi_io
|
||||||
- const: gpmi_bch_apb
|
- const: gpmi_bch_apb
|
||||||
|
@ -80,8 +80,6 @@ if:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
minItems: 4
|
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Error and status IRQ
|
- description: Error and status IRQ
|
||||||
- description: Message object IRQ
|
- description: Message object IRQ
|
||||||
@ -91,7 +89,6 @@ then:
|
|||||||
else:
|
else:
|
||||||
properties:
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- description: Error and status IRQ
|
- description: Error and status IRQ
|
||||||
|
|
||||||
|
@ -142,7 +142,6 @@ examples:
|
|||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
reg = <0x0 0x0 0x0 0x0 0x0>;
|
reg = <0x0 0x0 0x0 0x0 0x0>;
|
||||||
reset-gpios = <&pinctrl_ap 152 0>;
|
reset-gpios = <&pinctrl_ap 152 0>;
|
||||||
max-link-speed = <2>;
|
|
||||||
|
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -153,7 +152,6 @@ examples:
|
|||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
reg = <0x800 0x0 0x0 0x0 0x0>;
|
reg = <0x800 0x0 0x0 0x0 0x0>;
|
||||||
reset-gpios = <&pinctrl_ap 153 0>;
|
reset-gpios = <&pinctrl_ap 153 0>;
|
||||||
max-link-speed = <2>;
|
|
||||||
|
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -164,7 +162,6 @@ examples:
|
|||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
reg = <0x1000 0x0 0x0 0x0 0x0>;
|
reg = <0x1000 0x0 0x0 0x0 0x0>;
|
||||||
reset-gpios = <&pinctrl_ap 33 0>;
|
reset-gpios = <&pinctrl_ap 33 0>;
|
||||||
max-link-speed = <1>;
|
|
||||||
|
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -102,19 +102,17 @@ if:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
maxItems: 2
|
minItems: 2
|
||||||
|
|
||||||
reg-names:
|
reg-names:
|
||||||
items:
|
minItems: 2
|
||||||
- const: "phy"
|
|
||||||
- const: "phy-ctrl"
|
|
||||||
else:
|
else:
|
||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
reg-names:
|
reg-names:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
items:
|
|
||||||
- const: "phy"
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
@ -52,11 +52,19 @@ properties:
|
|||||||
hardware supporting it the pull strength in Ohm.
|
hardware supporting it the pull strength in Ohm.
|
||||||
|
|
||||||
drive-push-pull:
|
drive-push-pull:
|
||||||
type: boolean
|
oneOf:
|
||||||
|
- type: boolean
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1 ]
|
||||||
|
deprecated: true
|
||||||
description: drive actively high and low
|
description: drive actively high and low
|
||||||
|
|
||||||
drive-open-drain:
|
drive-open-drain:
|
||||||
type: boolean
|
oneOf:
|
||||||
|
- type: boolean
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
const: 1 # No known cases of 0
|
||||||
|
deprecated: true
|
||||||
description: drive with open drain
|
description: drive with open drain
|
||||||
|
|
||||||
drive-open-source:
|
drive-open-source:
|
||||||
|
@ -71,7 +71,6 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clock-output-names:
|
clock-output-names:
|
||||||
minItems: 1
|
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
- if:
|
- if:
|
||||||
@ -102,7 +101,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clock-output-names:
|
clock-output-names:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 3
|
|
||||||
|
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
@ -113,16 +111,12 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- description: Bus clock for register access
|
- description: Bus clock for register access
|
||||||
- description: 24 MHz oscillator
|
- description: 24 MHz oscillator
|
||||||
- description: 32 kHz clock from the CCU
|
- description: 32 kHz clock from the CCU
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 3
|
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- const: bus
|
- const: bus
|
||||||
- const: hosc
|
- const: hosc
|
||||||
@ -142,7 +136,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: Bus clock for register access
|
- description: Bus clock for register access
|
||||||
- description: 24 MHz oscillator
|
- description: 24 MHz oscillator
|
||||||
@ -151,7 +144,6 @@ allOf:
|
|||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- const: bus
|
- const: bus
|
||||||
- const: hosc
|
- const: hosc
|
||||||
@ -174,14 +166,12 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
minItems: 1
|
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
else:
|
else:
|
||||||
properties:
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 2
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- "#clock-cells"
|
- "#clock-cells"
|
||||||
|
@ -100,7 +100,6 @@ allOf:
|
|||||||
maxItems: 3
|
maxItems: 3
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- const: uart
|
- const: uart
|
||||||
- pattern: '^clk_uart_baud[0-1]$'
|
- pattern: '^clk_uart_baud[0-1]$'
|
||||||
@ -118,11 +117,8 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
clock-names:
|
clock-names:
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
|
||||||
items:
|
items:
|
||||||
- const: uart
|
- const: uart
|
||||||
- const: clk_uart_baud0
|
- const: clk_uart_baud0
|
||||||
|
@ -89,7 +89,6 @@ allOf:
|
|||||||
properties:
|
properties:
|
||||||
dmas:
|
dmas:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
|
||||||
items:
|
items:
|
||||||
- description: RX DMA Channel
|
- description: RX DMA Channel
|
||||||
- description: TX DMA Channel
|
- description: TX DMA Channel
|
||||||
|
@ -80,7 +80,6 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
minItems: 6
|
|
||||||
items:
|
items:
|
||||||
- description: AUXCLK clock for McASP used by CPB audio
|
- description: AUXCLK clock for McASP used by CPB audio
|
||||||
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
||||||
@ -107,7 +106,6 @@ allOf:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
maxItems: 4
|
|
||||||
items:
|
items:
|
||||||
- description: AUXCLK clock for McASP used by CPB audio
|
- description: AUXCLK clock for McASP used by CPB audio
|
||||||
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
- description: Parent for CPB_McASP auxclk (for 48KHz)
|
||||||
|
@ -67,7 +67,6 @@ then:
|
|||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
minItems: 2
|
minItems: 2
|
||||||
maxItems: 3
|
|
||||||
items:
|
items:
|
||||||
- description: TSC1 registers
|
- description: TSC1 registers
|
||||||
- description: TSC2 registers
|
- description: TSC2 registers
|
||||||
|
@ -43,6 +43,9 @@ properties:
|
|||||||
- const: phy_clk
|
- const: phy_clk
|
||||||
- const: ref_clk
|
- const: ref_clk
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
@ -244,10 +244,11 @@ disclosure of a particular issue, unless requested by a response team or by
|
|||||||
an involved disclosed party. The current ambassadors list:
|
an involved disclosed party. The current ambassadors list:
|
||||||
|
|
||||||
============= ========================================================
|
============= ========================================================
|
||||||
ARM Grant Likely <grant.likely@arm.com>
|
|
||||||
AMD Tom Lendacky <tom.lendacky@amd.com>
|
AMD Tom Lendacky <tom.lendacky@amd.com>
|
||||||
IBM Z Christian Borntraeger <borntraeger@de.ibm.com>
|
Ampere Darren Hart <darren@os.amperecomputing.com>
|
||||||
IBM Power Anton Blanchard <anton@linux.ibm.com>
|
ARM Catalin Marinas <catalin.marinas@arm.com>
|
||||||
|
IBM Power Anton Blanchard <anton@linux.ibm.com>
|
||||||
|
IBM Z Christian Borntraeger <borntraeger@de.ibm.com>
|
||||||
Intel Tony Luck <tony.luck@intel.com>
|
Intel Tony Luck <tony.luck@intel.com>
|
||||||
Qualcomm Trilok Soni <tsoni@codeaurora.org>
|
Qualcomm Trilok Soni <tsoni@codeaurora.org>
|
||||||
|
|
||||||
|
31
MAINTAINERS
31
MAINTAINERS
@ -3571,8 +3571,9 @@ M: Andy Gospodarek <andy@greyhouse.net>
|
|||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://sourceforge.net/projects/bonding/
|
W: http://sourceforge.net/projects/bonding/
|
||||||
|
F: Documentation/networking/bonding.rst
|
||||||
F: drivers/net/bonding/
|
F: drivers/net/bonding/
|
||||||
F: include/net/bonding.h
|
F: include/net/bond*
|
||||||
F: include/uapi/linux/if_bonding.h
|
F: include/uapi/linux/if_bonding.h
|
||||||
|
|
||||||
BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
|
BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
|
||||||
@ -5439,6 +5440,7 @@ F: net/ax25/sysctl_net_ax25.c
|
|||||||
|
|
||||||
DATA ACCESS MONITOR
|
DATA ACCESS MONITOR
|
||||||
M: SeongJae Park <sj@kernel.org>
|
M: SeongJae Park <sj@kernel.org>
|
||||||
|
L: damon@lists.linux.dev
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/ABI/testing/sysfs-kernel-mm-damon
|
F: Documentation/ABI/testing/sysfs-kernel-mm-damon
|
||||||
@ -5917,7 +5919,7 @@ R: Benjamin Gaignard <benjamin.gaignard@collabora.com>
|
|||||||
R: Liam Mark <lmark@codeaurora.org>
|
R: Liam Mark <lmark@codeaurora.org>
|
||||||
R: Laura Abbott <labbott@redhat.com>
|
R: Laura Abbott <labbott@redhat.com>
|
||||||
R: Brian Starkey <Brian.Starkey@arm.com>
|
R: Brian Starkey <Brian.Starkey@arm.com>
|
||||||
R: John Stultz <john.stultz@linaro.org>
|
R: John Stultz <jstultz@google.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
L: linaro-mm-sig@lists.linaro.org (moderated for non-subscribers)
|
L: linaro-mm-sig@lists.linaro.org (moderated for non-subscribers)
|
||||||
@ -6587,7 +6589,7 @@ F: drivers/gpu/drm/gma500/
|
|||||||
DRM DRIVERS FOR HISILICON
|
DRM DRIVERS FOR HISILICON
|
||||||
M: Xinliang Liu <xinliang.liu@linaro.org>
|
M: Xinliang Liu <xinliang.liu@linaro.org>
|
||||||
M: Tian Tao <tiantao6@hisilicon.com>
|
M: Tian Tao <tiantao6@hisilicon.com>
|
||||||
R: John Stultz <john.stultz@linaro.org>
|
R: John Stultz <jstultz@google.com>
|
||||||
R: Xinwei Kong <kong.kongxinwei@hisilicon.com>
|
R: Xinwei Kong <kong.kongxinwei@hisilicon.com>
|
||||||
R: Chen Feng <puck.chen@hisilicon.com>
|
R: Chen Feng <puck.chen@hisilicon.com>
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
@ -7499,7 +7501,7 @@ F: Documentation/hwmon/f71805f.rst
|
|||||||
F: drivers/hwmon/f71805f.c
|
F: drivers/hwmon/f71805f.c
|
||||||
|
|
||||||
FADDR2LINE
|
FADDR2LINE
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: scripts/faddr2line
|
F: scripts/faddr2line
|
||||||
|
|
||||||
@ -8112,7 +8114,7 @@ M: Ingo Molnar <mingo@redhat.com>
|
|||||||
R: Peter Zijlstra <peterz@infradead.org>
|
R: Peter Zijlstra <peterz@infradead.org>
|
||||||
R: Darren Hart <dvhart@infradead.org>
|
R: Darren Hart <dvhart@infradead.org>
|
||||||
R: Davidlohr Bueso <dave@stgolabs.net>
|
R: Davidlohr Bueso <dave@stgolabs.net>
|
||||||
R: André Almeida <andrealmeid@collabora.com>
|
R: André Almeida <andrealmeid@igalia.com>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
|
||||||
@ -8385,7 +8387,7 @@ M: Linus Walleij <linus.walleij@linaro.org>
|
|||||||
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
|
||||||
F: Documentation/ABI/obsolete/sysfs-gpio
|
F: Documentation/ABI/obsolete/sysfs-gpio
|
||||||
F: Documentation/ABI/testing/gpio-cdev
|
F: Documentation/ABI/testing/gpio-cdev
|
||||||
F: Documentation/admin-guide/gpio/
|
F: Documentation/admin-guide/gpio/
|
||||||
@ -8848,7 +8850,7 @@ F: Documentation/devicetree/bindings/net/hisilicon*.txt
|
|||||||
F: drivers/net/ethernet/hisilicon/
|
F: drivers/net/ethernet/hisilicon/
|
||||||
|
|
||||||
HIKEY960 ONBOARD USB GPIO HUB DRIVER
|
HIKEY960 ONBOARD USB GPIO HUB DRIVER
|
||||||
M: John Stultz <john.stultz@linaro.org>
|
M: John Stultz <jstultz@google.com>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/misc/hisi_hikey_usb.c
|
F: drivers/misc/hisi_hikey_usb.c
|
||||||
@ -10131,7 +10133,7 @@ S: Supported
|
|||||||
F: drivers/net/wireless/intel/iwlegacy/
|
F: drivers/net/wireless/intel/iwlegacy/
|
||||||
|
|
||||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||||
M: Luca Coelho <luciano.coelho@intel.com>
|
M: Gregory Greenman <gregory.greenman@intel.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
|
W: https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
|
||||||
@ -11348,7 +11350,7 @@ F: drivers/mmc/host/litex_mmc.c
|
|||||||
N: litex
|
N: litex
|
||||||
|
|
||||||
LIVE PATCHING
|
LIVE PATCHING
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||||
M: Jiri Kosina <jikos@kernel.org>
|
M: Jiri Kosina <jikos@kernel.org>
|
||||||
M: Miroslav Benes <mbenes@suse.cz>
|
M: Miroslav Benes <mbenes@suse.cz>
|
||||||
M: Petr Mladek <pmladek@suse.com>
|
M: Petr Mladek <pmladek@suse.com>
|
||||||
@ -14224,7 +14226,7 @@ F: lib/objagg.c
|
|||||||
F: lib/test_objagg.c
|
F: lib/test_objagg.c
|
||||||
|
|
||||||
OBJTOOL
|
OBJTOOL
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||||
M: Peter Zijlstra <peterz@infradead.org>
|
M: Peter Zijlstra <peterz@infradead.org>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: tools/objtool/
|
F: tools/objtool/
|
||||||
@ -15475,7 +15477,8 @@ F: tools/perf/
|
|||||||
PERFORMANCE EVENTS TOOLING ARM64
|
PERFORMANCE EVENTS TOOLING ARM64
|
||||||
R: John Garry <john.garry@huawei.com>
|
R: John Garry <john.garry@huawei.com>
|
||||||
R: Will Deacon <will@kernel.org>
|
R: Will Deacon <will@kernel.org>
|
||||||
R: Mathieu Poirier <mathieu.poirier@linaro.org>
|
R: James Clark <james.clark@arm.com>
|
||||||
|
R: Mike Leach <mike.leach@linaro.org>
|
||||||
R: Leo Yan <leo.yan@linaro.org>
|
R: Leo Yan <leo.yan@linaro.org>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
@ -18792,7 +18795,7 @@ F: include/dt-bindings/reset/starfive-jh7100.h
|
|||||||
|
|
||||||
STATIC BRANCH/CALL
|
STATIC BRANCH/CALL
|
||||||
M: Peter Zijlstra <peterz@infradead.org>
|
M: Peter Zijlstra <peterz@infradead.org>
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||||
M: Jason Baron <jbaron@akamai.com>
|
M: Jason Baron <jbaron@akamai.com>
|
||||||
R: Steven Rostedt <rostedt@goodmis.org>
|
R: Steven Rostedt <rostedt@goodmis.org>
|
||||||
R: Ard Biesheuvel <ardb@kernel.org>
|
R: Ard Biesheuvel <ardb@kernel.org>
|
||||||
@ -19793,7 +19796,7 @@ F: drivers/net/wireless/ti/
|
|||||||
F: include/linux/wl12xx.h
|
F: include/linux/wl12xx.h
|
||||||
|
|
||||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
||||||
M: John Stultz <john.stultz@linaro.org>
|
M: John Stultz <jstultz@google.com>
|
||||||
M: Thomas Gleixner <tglx@linutronix.de>
|
M: Thomas Gleixner <tglx@linutronix.de>
|
||||||
R: Stephen Boyd <sboyd@kernel.org>
|
R: Stephen Boyd <sboyd@kernel.org>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
@ -21444,7 +21447,7 @@ F: arch/x86/kernel/apic/x2apic_uv_x.c
|
|||||||
F: arch/x86/platform/uv/
|
F: arch/x86/platform/uv/
|
||||||
|
|
||||||
X86 STACK UNWINDING
|
X86 STACK UNWINDING
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||||
M: Peter Zijlstra <peterz@infradead.org>
|
M: Peter Zijlstra <peterz@infradead.org>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/include/asm/unwind*.h
|
F: arch/x86/include/asm/unwind*.h
|
||||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 18
|
PATCHLEVEL = 18
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc7
|
||||||
NAME = Superb Owl
|
NAME = Superb Owl
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -440,6 +440,9 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
|
|||||||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||||
|
extern bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
|
||||||
|
unsigned long flags);
|
||||||
|
#define arch_memremap_can_ram_remap arch_memremap_can_ram_remap
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -493,3 +493,11 @@ void __init early_ioremap_init(void)
|
|||||||
{
|
{
|
||||||
early_ioremap_setup();
|
early_ioremap_setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
|
||||||
|
unsigned long flags)
|
||||||
|
{
|
||||||
|
unsigned long pfn = PHYS_PFN(offset);
|
||||||
|
|
||||||
|
return memblock_is_map_memory(pfn);
|
||||||
|
}
|
||||||
|
@ -192,4 +192,8 @@ extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
|
|||||||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||||
|
|
||||||
|
extern bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
|
||||||
|
unsigned long flags);
|
||||||
|
#define arch_memremap_can_ram_remap arch_memremap_can_ram_remap
|
||||||
|
|
||||||
#endif /* __ASM_IO_H */
|
#endif /* __ASM_IO_H */
|
||||||
|
@ -75,6 +75,10 @@ obj-$(CONFIG_ARM64_MTE) += mte.o
|
|||||||
obj-y += vdso-wrap.o
|
obj-y += vdso-wrap.o
|
||||||
obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o
|
obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o
|
||||||
|
|
||||||
|
# Force dependency (vdso*-wrap.S includes vdso.so through incbin)
|
||||||
|
$(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so
|
||||||
|
$(obj)/vdso32-wrap.o: $(obj)/vdso32/vdso.so
|
||||||
|
|
||||||
obj-y += probes/
|
obj-y += probes/
|
||||||
head-y := head.o
|
head-y := head.o
|
||||||
extra-y += $(head-y) vmlinux.lds
|
extra-y += $(head-y) vmlinux.lds
|
||||||
|
@ -208,6 +208,8 @@ static const struct arm64_cpu_capabilities arm64_repeat_tlbi_list[] = {
|
|||||||
#ifdef CONFIG_ARM64_ERRATUM_1286807
|
#ifdef CONFIG_ARM64_ERRATUM_1286807
|
||||||
{
|
{
|
||||||
ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
|
ERRATA_MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 0),
|
||||||
|
/* Kryo4xx Gold (rcpe to rfpe) => (r0p0 to r3p0) */
|
||||||
|
ERRATA_MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xe),
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{},
|
{},
|
||||||
|
@ -654,7 +654,6 @@ static const struct __ftr_reg_entry {
|
|||||||
ARM64_FTR_REG(SYS_ID_AA64ISAR0_EL1, ftr_id_aa64isar0),
|
ARM64_FTR_REG(SYS_ID_AA64ISAR0_EL1, ftr_id_aa64isar0),
|
||||||
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR1_EL1, ftr_id_aa64isar1,
|
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR1_EL1, ftr_id_aa64isar1,
|
||||||
&id_aa64isar1_override),
|
&id_aa64isar1_override),
|
||||||
ARM64_FTR_REG(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2),
|
|
||||||
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2,
|
ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2,
|
||||||
&id_aa64isar2_override),
|
&id_aa64isar2_override),
|
||||||
|
|
||||||
@ -810,7 +809,7 @@ static void __init sort_ftr_regs(void)
|
|||||||
* to sys_id for subsequent binary search in get_arm64_ftr_reg()
|
* to sys_id for subsequent binary search in get_arm64_ftr_reg()
|
||||||
* to work correctly.
|
* to work correctly.
|
||||||
*/
|
*/
|
||||||
BUG_ON(arm64_ftr_regs[i].sys_id < arm64_ftr_regs[i - 1].sys_id);
|
BUG_ON(arm64_ftr_regs[i].sys_id <= arm64_ftr_regs[i - 1].sys_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,9 +52,6 @@ GCOV_PROFILE := n
|
|||||||
targets += vdso.lds
|
targets += vdso.lds
|
||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency (incbin is bad)
|
|
||||||
$(obj)/vdso.o : $(obj)/vdso.so
|
|
||||||
|
|
||||||
# Link rule for the .so file, .lds has to be first
|
# Link rule for the .so file, .lds has to be first
|
||||||
$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE
|
$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE
|
||||||
$(call if_changed,vdsold_and_vdso_check)
|
$(call if_changed,vdsold_and_vdso_check)
|
||||||
|
@ -131,9 +131,6 @@ obj-vdso := $(c-obj-vdso) $(c-obj-vdso-gettimeofday) $(asm-obj-vdso)
|
|||||||
targets += vdso.lds
|
targets += vdso.lds
|
||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency (vdso.s includes vdso.so through incbin)
|
|
||||||
$(obj)/vdso.o: $(obj)/vdso.so
|
|
||||||
|
|
||||||
include/generated/vdso32-offsets.h: $(obj)/vdso.so.dbg FORCE
|
include/generated/vdso32-offsets.h: $(obj)/vdso.so.dbg FORCE
|
||||||
$(call if_changed,vdsosym)
|
$(call if_changed,vdsosym)
|
||||||
|
|
||||||
|
@ -99,3 +99,11 @@ void __init early_ioremap_init(void)
|
|||||||
{
|
{
|
||||||
early_ioremap_setup();
|
early_ioremap_setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
|
||||||
|
unsigned long flags)
|
||||||
|
{
|
||||||
|
unsigned long pfn = PHYS_PFN(offset);
|
||||||
|
|
||||||
|
return pfn_is_map_memory(pfn);
|
||||||
|
}
|
||||||
|
@ -40,9 +40,9 @@
|
|||||||
typedef unsigned int cycles_t;
|
typedef unsigned int cycles_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On R4000/R4400 before version 5.0 an erratum exists such that if the
|
* On R4000/R4400 an erratum exists such that if the cycle counter is
|
||||||
* cycle counter is read in the exact moment that it is matching the
|
* read in the exact moment that it is matching the compare register,
|
||||||
* compare register, no interrupt will be generated.
|
* no interrupt will be generated.
|
||||||
*
|
*
|
||||||
* There is a suggested workaround and also the erratum can't strike if
|
* There is a suggested workaround and also the erratum can't strike if
|
||||||
* the compare interrupt isn't being used as the clock source device.
|
* the compare interrupt isn't being used as the clock source device.
|
||||||
@ -63,7 +63,7 @@ static inline int can_use_mips_counter(unsigned int prid)
|
|||||||
if (!__builtin_constant_p(cpu_has_counter))
|
if (!__builtin_constant_p(cpu_has_counter))
|
||||||
asm volatile("" : "=m" (cpu_data[0].options));
|
asm volatile("" : "=m" (cpu_data[0].options));
|
||||||
if (likely(cpu_has_counter &&
|
if (likely(cpu_has_counter &&
|
||||||
prid >= (PRID_IMP_R4000 | PRID_REV_ENCODE_44(5, 0))))
|
prid > (PRID_IMP_R4000 | PRID_REV_ENCODE_44(15, 15))))
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -141,15 +141,10 @@ static __init int cpu_has_mfc0_count_bug(void)
|
|||||||
case CPU_R4400MC:
|
case CPU_R4400MC:
|
||||||
/*
|
/*
|
||||||
* The published errata for the R4400 up to 3.0 say the CPU
|
* The published errata for the R4400 up to 3.0 say the CPU
|
||||||
* has the mfc0 from count bug.
|
* has the mfc0 from count bug. This seems the last version
|
||||||
|
* produced.
|
||||||
*/
|
*/
|
||||||
if ((current_cpu_data.processor_id & 0xff) <= 0x30)
|
return 1;
|
||||||
return 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* we assume newer revisions are ok
|
|
||||||
*/
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -38,6 +38,7 @@ config PARISC
|
|||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select GENERIC_ARCH_TOPOLOGY if SMP
|
select GENERIC_ARCH_TOPOLOGY if SMP
|
||||||
|
select GENERIC_CPU_DEVICES if !SMP
|
||||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||||
select SYSCTL_ARCH_UNALIGN_ALLOW
|
select SYSCTL_ARCH_UNALIGN_ALLOW
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
|
@ -6,6 +6,9 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
CONFIG_IKCONFIG_PROC=y
|
CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
CONFIG_CGROUPS=y
|
||||||
|
CONFIG_NAMESPACES=y
|
||||||
|
CONFIG_USER_NS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
@ -47,7 +50,6 @@ CONFIG_PARPORT=y
|
|||||||
CONFIG_PARPORT_PC=m
|
CONFIG_PARPORT_PC=m
|
||||||
CONFIG_PARPORT_1284=y
|
CONFIG_PARPORT_1284=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=6144
|
CONFIG_BLK_DEV_RAM_SIZE=6144
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
@ -16,6 +16,7 @@ CONFIG_CGROUPS=y
|
|||||||
CONFIG_MEMCG=y
|
CONFIG_MEMCG=y
|
||||||
CONFIG_CGROUP_PIDS=y
|
CONFIG_CGROUP_PIDS=y
|
||||||
CONFIG_CPUSETS=y
|
CONFIG_CPUSETS=y
|
||||||
|
CONFIG_USER_NS=y
|
||||||
CONFIG_RELAY=y
|
CONFIG_RELAY=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
@ -267,9 +268,9 @@ CONFIG_CRYPTO_DEFLATE=m
|
|||||||
CONFIG_CRC_CCITT=m
|
CONFIG_CRC_CCITT=m
|
||||||
CONFIG_LIBCRC32C=y
|
CONFIG_LIBCRC32C=y
|
||||||
CONFIG_PRINTK_TIME=y
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_FS=y
|
CONFIG_DEBUG_FS=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
|
||||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
|
@ -160,7 +160,7 @@ extern void __update_cache(pte_t pte);
|
|||||||
#define SPACEID_SHIFT (MAX_ADDRBITS - 32)
|
#define SPACEID_SHIFT (MAX_ADDRBITS - 32)
|
||||||
#else
|
#else
|
||||||
#define MAX_ADDRBITS (BITS_PER_LONG)
|
#define MAX_ADDRBITS (BITS_PER_LONG)
|
||||||
#define MAX_ADDRESS (1UL << MAX_ADDRBITS)
|
#define MAX_ADDRESS (1ULL << MAX_ADDRBITS)
|
||||||
#define SPACEID_SHIFT 0
|
#define SPACEID_SHIFT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ void __init parisc_setup_cache_timing(void)
|
|||||||
{
|
{
|
||||||
unsigned long rangetime, alltime;
|
unsigned long rangetime, alltime;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
unsigned long threshold, threshold2;
|
unsigned long threshold;
|
||||||
|
|
||||||
alltime = mfctl(16);
|
alltime = mfctl(16);
|
||||||
flush_data_cache();
|
flush_data_cache();
|
||||||
@ -418,20 +418,8 @@ void __init parisc_setup_cache_timing(void)
|
|||||||
alltime, size, rangetime);
|
alltime, size, rangetime);
|
||||||
|
|
||||||
threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
|
threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
|
||||||
|
if (threshold > cache_info.dc_size)
|
||||||
/*
|
threshold = cache_info.dc_size;
|
||||||
* The threshold computed above isn't very reliable since the
|
|
||||||
* flush times depend greatly on the percentage of dirty lines
|
|
||||||
* in the flush range. Further, the whole cache time doesn't
|
|
||||||
* include the time to refill lines that aren't in the mm/vma
|
|
||||||
* being flushed. By timing glibc build and checks on mako cpus,
|
|
||||||
* the following formula seems to work reasonably well. The
|
|
||||||
* value from the timing calculation is too small, and increases
|
|
||||||
* build and check times by almost a factor two.
|
|
||||||
*/
|
|
||||||
threshold2 = cache_info.dc_size * num_online_cpus();
|
|
||||||
if (threshold2 > threshold)
|
|
||||||
threshold = threshold2;
|
|
||||||
if (threshold)
|
if (threshold)
|
||||||
parisc_cache_flush_threshold = threshold;
|
parisc_cache_flush_threshold = threshold;
|
||||||
printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
|
printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
|
||||||
|
@ -152,7 +152,7 @@ int __kprobes parisc_kprobe_ss_handler(struct pt_regs *regs)
|
|||||||
/* for absolute branch instructions we can copy iaoq_b. for relative
|
/* for absolute branch instructions we can copy iaoq_b. for relative
|
||||||
* branch instructions we need to calculate the new address based on the
|
* branch instructions we need to calculate the new address based on the
|
||||||
* difference between iaoq_f and iaoq_b. We cannot use iaoq_b without
|
* difference between iaoq_f and iaoq_b. We cannot use iaoq_b without
|
||||||
* modificationt because it's based on our ainsn.insn address.
|
* modifications because it's based on our ainsn.insn address.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (p->post_handler)
|
if (p->post_handler)
|
||||||
|
@ -40,7 +40,10 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags,
|
|||||||
|
|
||||||
*need_unmap = 1;
|
*need_unmap = 1;
|
||||||
set_fixmap(fixmap, page_to_phys(page));
|
set_fixmap(fixmap, page_to_phys(page));
|
||||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
if (flags)
|
||||||
|
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||||
|
else
|
||||||
|
__acquire(&patch_lock);
|
||||||
|
|
||||||
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
||||||
}
|
}
|
||||||
@ -49,7 +52,10 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
|||||||
{
|
{
|
||||||
clear_fixmap(fixmap);
|
clear_fixmap(fixmap);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
if (flags)
|
||||||
|
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||||
|
else
|
||||||
|
__release(&patch_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||||
@ -61,9 +67,8 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
int mapped;
|
int mapped;
|
||||||
|
|
||||||
/* Make sure we don't have any aliases in cache */
|
/* Make sure we don't have any aliases in cache */
|
||||||
flush_kernel_dcache_range_asm(start, end);
|
flush_kernel_vmap_range(addr, len);
|
||||||
flush_kernel_icache_range_asm(start, end);
|
flush_icache_range(start, end);
|
||||||
flush_tlb_kernel_range(start, end);
|
|
||||||
|
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
||||||
|
|
||||||
@ -76,10 +81,8 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
* We're crossing a page boundary, so
|
* We're crossing a page boundary, so
|
||||||
* need to remap
|
* need to remap
|
||||||
*/
|
*/
|
||||||
flush_kernel_dcache_range_asm((unsigned long)fixmap,
|
flush_kernel_vmap_range((void *)fixmap,
|
||||||
(unsigned long)p);
|
(p-fixmap) * sizeof(*p));
|
||||||
flush_tlb_kernel_range((unsigned long)fixmap,
|
|
||||||
(unsigned long)p);
|
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
||||||
@ -87,10 +90,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_kernel_dcache_range_asm((unsigned long)fixmap, (unsigned long)p);
|
flush_kernel_vmap_range((void *)fixmap, (p-fixmap) * sizeof(*p));
|
||||||
flush_tlb_kernel_range((unsigned long)fixmap, (unsigned long)p);
|
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
|
flush_icache_range(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text(void *addr, u32 insn)
|
void __kprobes __patch_text(void *addr, u32 insn)
|
||||||
|
@ -171,6 +171,7 @@ static int __init processor_probe(struct parisc_device *dev)
|
|||||||
p->cpu_num = cpu_info.cpu_num;
|
p->cpu_num = cpu_info.cpu_num;
|
||||||
p->cpu_loc = cpu_info.cpu_loc;
|
p->cpu_loc = cpu_info.cpu_loc;
|
||||||
|
|
||||||
|
set_cpu_possible(cpuid, true);
|
||||||
store_cpu_topology(cpuid);
|
store_cpu_topology(cpuid);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
@ -419,8 +420,7 @@ show_cpuinfo (struct seq_file *m, void *v)
|
|||||||
}
|
}
|
||||||
seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
|
seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
|
||||||
|
|
||||||
seq_printf(m, "model\t\t: %s\n"
|
seq_printf(m, "model\t\t: %s - %s\n",
|
||||||
"model name\t: %s\n",
|
|
||||||
boot_cpu_data.pdc.sys_model_name,
|
boot_cpu_data.pdc.sys_model_name,
|
||||||
cpuinfo->dev ?
|
cpuinfo->dev ?
|
||||||
cpuinfo->dev->name : "Unknown");
|
cpuinfo->dev->name : "Unknown");
|
||||||
@ -461,6 +461,13 @@ static struct parisc_driver cpu_driver __refdata = {
|
|||||||
*/
|
*/
|
||||||
void __init processor_init(void)
|
void __init processor_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned int cpu;
|
||||||
|
|
||||||
reset_cpu_topology();
|
reset_cpu_topology();
|
||||||
|
|
||||||
|
/* reset possible mask. We will mark those which are possible. */
|
||||||
|
for_each_possible_cpu(cpu)
|
||||||
|
set_cpu_possible(cpu, false);
|
||||||
|
|
||||||
register_parisc_driver(&cpu_driver);
|
register_parisc_driver(&cpu_driver);
|
||||||
}
|
}
|
||||||
|
@ -161,6 +161,8 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
#ifdef CONFIG_PA11
|
#ifdef CONFIG_PA11
|
||||||
dma_ops_init();
|
dma_ops_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
clear_sched_clock_stable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -251,13 +251,9 @@ void __init time_init(void)
|
|||||||
static int __init init_cr16_clocksource(void)
|
static int __init init_cr16_clocksource(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The cr16 interval timers are not syncronized across CPUs, even if
|
* The cr16 interval timers are not synchronized across CPUs.
|
||||||
* they share the same socket.
|
|
||||||
*/
|
*/
|
||||||
if (num_online_cpus() > 1 && !running_on_qemu) {
|
if (num_online_cpus() > 1 && !running_on_qemu) {
|
||||||
/* mark sched_clock unstable */
|
|
||||||
clear_sched_clock_stable();
|
|
||||||
|
|
||||||
clocksource_cr16.name = "cr16_unstable";
|
clocksource_cr16.name = "cr16_unstable";
|
||||||
clocksource_cr16.flags = CLOCK_SOURCE_UNSTABLE;
|
clocksource_cr16.flags = CLOCK_SOURCE_UNSTABLE;
|
||||||
clocksource_cr16.rating = 0;
|
clocksource_cr16.rating = 0;
|
||||||
|
@ -469,7 +469,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o
|
|||||||
* panic notifiers, and we should call panic
|
* panic notifiers, and we should call panic
|
||||||
* directly from the location that we wish.
|
* directly from the location that we wish.
|
||||||
* e.g. We should not call panic from
|
* e.g. We should not call panic from
|
||||||
* parisc_terminate, but rather the oter way around.
|
* parisc_terminate, but rather the other way around.
|
||||||
* This hack works, prints the panic message twice,
|
* This hack works, prints the panic message twice,
|
||||||
* and it enables reboot timers!
|
* and it enables reboot timers!
|
||||||
*/
|
*/
|
||||||
|
@ -253,7 +253,7 @@ dbl_fadd(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -256,7 +256,7 @@ dbl_fsub(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -249,7 +249,7 @@ sgl_fadd(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -252,7 +252,7 @@ sgl_fsub(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -22,12 +22,15 @@
|
|||||||
.macro cvdso_call funct call_time=0
|
.macro cvdso_call funct call_time=0
|
||||||
.cfi_startproc
|
.cfi_startproc
|
||||||
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
||||||
|
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
||||||
mflr r0
|
mflr r0
|
||||||
.cfi_register lr, r0
|
|
||||||
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
||||||
|
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
||||||
PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
||||||
|
.cfi_rel_offset lr, PPC_MIN_STKFRM + PPC_LR_STKOFF
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
PPC_STL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
PPC_STL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
||||||
|
.cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT
|
||||||
#endif
|
#endif
|
||||||
get_datapage r5
|
get_datapage r5
|
||||||
.ifeq \call_time
|
.ifeq \call_time
|
||||||
@ -39,13 +42,15 @@
|
|||||||
PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
PPC_LL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
PPC_LL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
||||||
|
.cfi_restore r2
|
||||||
#endif
|
#endif
|
||||||
.ifeq \call_time
|
.ifeq \call_time
|
||||||
cmpwi r3, 0
|
cmpwi r3, 0
|
||||||
.endif
|
.endif
|
||||||
mtlr r0
|
mtlr r0
|
||||||
.cfi_restore lr
|
|
||||||
addi r1, r1, 2 * PPC_MIN_STKFRM
|
addi r1, r1, 2 * PPC_MIN_STKFRM
|
||||||
|
.cfi_restore lr
|
||||||
|
.cfi_def_cfa_offset 0
|
||||||
crclr so
|
crclr so
|
||||||
.ifeq \call_time
|
.ifeq \call_time
|
||||||
beqlr+
|
beqlr+
|
||||||
|
@ -122,11 +122,27 @@
|
|||||||
|
|
||||||
/* 0x0 - 0xb */
|
/* 0x0 - 0xb */
|
||||||
|
|
||||||
/* 'current->mm' needs to be in r4 */
|
/* switch_mmu_context() needs paging, let's enable it */
|
||||||
tophys(r4, r2)
|
mfmsr r9
|
||||||
lwz r4, MM(r4)
|
ori r11, r9, MSR_DR
|
||||||
tophys(r4, r4)
|
mtmsr r11
|
||||||
/* This only clobbers r0, r3, r4 and r5 */
|
sync
|
||||||
|
|
||||||
|
/* switch_mmu_context() clobbers r12, rescue it */
|
||||||
|
SAVE_GPR(12, r1)
|
||||||
|
|
||||||
|
/* Calling switch_mmu_context(<inv>, current->mm, <inv>); */
|
||||||
|
lwz r4, MM(r2)
|
||||||
bl switch_mmu_context
|
bl switch_mmu_context
|
||||||
|
|
||||||
|
/* restore r12 */
|
||||||
|
REST_GPR(12, r1)
|
||||||
|
|
||||||
|
/* Disable paging again */
|
||||||
|
mfmsr r9
|
||||||
|
li r6, MSR_DR
|
||||||
|
andc r9, r9, r6
|
||||||
|
mtmsr r9
|
||||||
|
sync
|
||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
@ -462,7 +462,6 @@ static int papr_scm_pmu_check_events(struct papr_scm_priv *p, struct nvdimm_pmu
|
|||||||
{
|
{
|
||||||
struct papr_scm_perf_stat *stat;
|
struct papr_scm_perf_stat *stat;
|
||||||
struct papr_scm_perf_stats *stats;
|
struct papr_scm_perf_stats *stats;
|
||||||
char *statid;
|
|
||||||
int index, rc, count;
|
int index, rc, count;
|
||||||
u32 available_events;
|
u32 available_events;
|
||||||
|
|
||||||
@ -493,14 +492,12 @@ static int papr_scm_pmu_check_events(struct papr_scm_priv *p, struct nvdimm_pmu
|
|||||||
|
|
||||||
for (index = 0, stat = stats->scm_statistic, count = 0;
|
for (index = 0, stat = stats->scm_statistic, count = 0;
|
||||||
index < available_events; index++, ++stat) {
|
index < available_events; index++, ++stat) {
|
||||||
statid = kzalloc(strlen(stat->stat_id) + 1, GFP_KERNEL);
|
p->nvdimm_events_map[count] = kmemdup_nul(stat->stat_id, 8, GFP_KERNEL);
|
||||||
if (!statid) {
|
if (!p->nvdimm_events_map[count]) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto out_nvdimm_events_map;
|
goto out_nvdimm_events_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(statid, stat->stat_id);
|
|
||||||
p->nvdimm_events_map[count] = statid;
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
p->nvdimm_events_map[count] = NULL;
|
p->nvdimm_events_map[count] = NULL;
|
||||||
|
@ -27,22 +27,31 @@ struct vas_caps_entry {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is used to get the notification from the drmgr when
|
* This function is used to get the notification from the drmgr when
|
||||||
* QoS credits are changed. Though receiving the target total QoS
|
* QoS credits are changed.
|
||||||
* credits here, get the official QoS capabilities from the hypervisor.
|
|
||||||
*/
|
*/
|
||||||
static ssize_t update_total_credits_trigger(struct vas_cop_feat_caps *caps,
|
static ssize_t update_total_credits_store(struct vas_cop_feat_caps *caps,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
u16 creds;
|
u16 creds;
|
||||||
|
|
||||||
err = kstrtou16(buf, 0, &creds);
|
err = kstrtou16(buf, 0, &creds);
|
||||||
|
/*
|
||||||
|
* The user space interface from the management console
|
||||||
|
* notifies OS with the new QoS credits and then the
|
||||||
|
* hypervisor. So OS has to use this new credits value
|
||||||
|
* and reconfigure VAS windows (close or reopen depends
|
||||||
|
* on the credits available) instead of depending on VAS
|
||||||
|
* QoS capabilities from the hypervisor.
|
||||||
|
*/
|
||||||
if (!err)
|
if (!err)
|
||||||
err = vas_reconfig_capabilties(caps->win_type);
|
err = vas_reconfig_capabilties(caps->win_type, creds);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
pr_info("Set QoS total credits %u\n", creds);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +101,7 @@ VAS_ATTR_RO(nr_total_credits);
|
|||||||
VAS_ATTR_RO(nr_used_credits);
|
VAS_ATTR_RO(nr_used_credits);
|
||||||
|
|
||||||
static struct vas_sysfs_entry update_total_credits_attribute =
|
static struct vas_sysfs_entry update_total_credits_attribute =
|
||||||
__ATTR(update_total_credits, 0200, NULL, update_total_credits_trigger);
|
__ATTR(update_total_credits, 0200, NULL, update_total_credits_store);
|
||||||
|
|
||||||
static struct attribute *vas_def_capab_attrs[] = {
|
static struct attribute *vas_def_capab_attrs[] = {
|
||||||
&nr_total_credits_attribute.attr,
|
&nr_total_credits_attribute.attr,
|
||||||
|
@ -779,10 +779,10 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
|
|||||||
* changes. Reconfig window configurations based on the credits
|
* changes. Reconfig window configurations based on the credits
|
||||||
* availability from this new capabilities.
|
* availability from this new capabilities.
|
||||||
*/
|
*/
|
||||||
int vas_reconfig_capabilties(u8 type)
|
int vas_reconfig_capabilties(u8 type, int new_nr_creds)
|
||||||
{
|
{
|
||||||
struct vas_cop_feat_caps *caps;
|
struct vas_cop_feat_caps *caps;
|
||||||
int old_nr_creds, new_nr_creds;
|
int old_nr_creds;
|
||||||
struct vas_caps *vcaps;
|
struct vas_caps *vcaps;
|
||||||
int rc = 0, nr_active_wins;
|
int rc = 0, nr_active_wins;
|
||||||
|
|
||||||
@ -795,12 +795,6 @@ int vas_reconfig_capabilties(u8 type)
|
|||||||
caps = &vcaps->caps;
|
caps = &vcaps->caps;
|
||||||
|
|
||||||
mutex_lock(&vas_pseries_mutex);
|
mutex_lock(&vas_pseries_mutex);
|
||||||
rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, vcaps->feat,
|
|
||||||
(u64)virt_to_phys(&hv_cop_caps));
|
|
||||||
if (rc)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
new_nr_creds = be16_to_cpu(hv_cop_caps.target_lpar_creds);
|
|
||||||
|
|
||||||
old_nr_creds = atomic_read(&caps->nr_total_credits);
|
old_nr_creds = atomic_read(&caps->nr_total_credits);
|
||||||
|
|
||||||
@ -832,7 +826,6 @@ int vas_reconfig_capabilties(u8 type)
|
|||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
mutex_unlock(&vas_pseries_mutex);
|
mutex_unlock(&vas_pseries_mutex);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -850,7 +843,7 @@ static int pseries_vas_notifier(struct notifier_block *nb,
|
|||||||
struct of_reconfig_data *rd = data;
|
struct of_reconfig_data *rd = data;
|
||||||
struct device_node *dn = rd->dn;
|
struct device_node *dn = rd->dn;
|
||||||
const __be32 *intserv = NULL;
|
const __be32 *intserv = NULL;
|
||||||
int len, rc = 0;
|
int new_nr_creds, len, rc = 0;
|
||||||
|
|
||||||
if ((action == OF_RECONFIG_ATTACH_NODE) ||
|
if ((action == OF_RECONFIG_ATTACH_NODE) ||
|
||||||
(action == OF_RECONFIG_DETACH_NODE))
|
(action == OF_RECONFIG_DETACH_NODE))
|
||||||
@ -862,7 +855,15 @@ static int pseries_vas_notifier(struct notifier_block *nb,
|
|||||||
if (!intserv)
|
if (!intserv)
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
|
||||||
rc = vas_reconfig_capabilties(VAS_GZIP_DEF_FEAT_TYPE);
|
rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
|
||||||
|
vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
|
||||||
|
(u64)virt_to_phys(&hv_cop_caps));
|
||||||
|
if (!rc) {
|
||||||
|
new_nr_creds = be16_to_cpu(hv_cop_caps.target_lpar_creds);
|
||||||
|
rc = vas_reconfig_capabilties(VAS_GZIP_DEF_FEAT_TYPE,
|
||||||
|
new_nr_creds);
|
||||||
|
}
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
pr_err("Failed reconfig VAS capabilities with DLPAR\n");
|
pr_err("Failed reconfig VAS capabilities with DLPAR\n");
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ struct pseries_vas_window {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int sysfs_add_vas_caps(struct vas_cop_feat_caps *caps);
|
int sysfs_add_vas_caps(struct vas_cop_feat_caps *caps);
|
||||||
int vas_reconfig_capabilties(u8 type);
|
int vas_reconfig_capabilties(u8 type, int new_nr_creds);
|
||||||
int __init sysfs_pseries_vas_init(struct vas_all_caps *vas_caps);
|
int __init sysfs_pseries_vas_init(struct vas_all_caps *vas_caps);
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_VAS
|
#ifdef CONFIG_PPC_VAS
|
||||||
|
@ -208,8 +208,25 @@ static void __init setup_bootmem(void)
|
|||||||
* early_init_fdt_reserve_self() since __pa() does
|
* early_init_fdt_reserve_self() since __pa() does
|
||||||
* not work for DTB pointers that are fixmap addresses
|
* not work for DTB pointers that are fixmap addresses
|
||||||
*/
|
*/
|
||||||
if (!IS_ENABLED(CONFIG_BUILTIN_DTB))
|
if (!IS_ENABLED(CONFIG_BUILTIN_DTB)) {
|
||||||
memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
|
/*
|
||||||
|
* In case the DTB is not located in a memory region we won't
|
||||||
|
* be able to locate it later on via the linear mapping and
|
||||||
|
* get a segfault when accessing it via __va(dtb_early_pa).
|
||||||
|
* To avoid this situation copy DTB to a memory region.
|
||||||
|
* Note that memblock_phys_alloc will also reserve DTB region.
|
||||||
|
*/
|
||||||
|
if (!memblock_is_memory(dtb_early_pa)) {
|
||||||
|
size_t fdt_size = fdt_totalsize(dtb_early_va);
|
||||||
|
phys_addr_t new_dtb_early_pa = memblock_phys_alloc(fdt_size, PAGE_SIZE);
|
||||||
|
void *new_dtb_early_va = early_memremap(new_dtb_early_pa, fdt_size);
|
||||||
|
|
||||||
|
memcpy(new_dtb_early_va, dtb_early_va, fdt_size);
|
||||||
|
early_memunmap(new_dtb_early_va, fdt_size);
|
||||||
|
_dtb_early_pa = new_dtb_early_pa;
|
||||||
|
} else
|
||||||
|
memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
|
||||||
|
}
|
||||||
|
|
||||||
early_init_fdt_scan_reserved_mem();
|
early_init_fdt_scan_reserved_mem();
|
||||||
dma_contiguous_reserve(dma32_phys_limit);
|
dma_contiguous_reserve(dma32_phys_limit);
|
||||||
|
@ -30,6 +30,16 @@ KBUILD_CFLAGS_DECOMPRESSOR += -fno-stack-protector
|
|||||||
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, address-of-packed-member)
|
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, address-of-packed-member)
|
||||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
|
||||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
||||||
|
|
||||||
|
ifdef CONFIG_CC_IS_GCC
|
||||||
|
ifeq ($(call cc-ifversion, -ge, 1200, y), y)
|
||||||
|
ifeq ($(call cc-ifversion, -lt, 1300, y), y)
|
||||||
|
KBUILD_CFLAGS += $(call cc-disable-warning, array-bounds)
|
||||||
|
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, array-bounds)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
UTS_MACHINE := s390x
|
UTS_MACHINE := s390x
|
||||||
STACK_SIZE := $(if $(CONFIG_KASAN),65536,16384)
|
STACK_SIZE := $(if $(CONFIG_KASAN),65536,16384)
|
||||||
CHECKFLAGS += -D__s390__ -D__s390x__
|
CHECKFLAGS += -D__s390__ -D__s390x__
|
||||||
|
@ -2384,7 +2384,16 @@ static int kvm_s390_vm_mem_op(struct kvm *kvm, struct kvm_s390_mem_op *mop)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (mop->size > MEM_OP_MAX_SIZE)
|
if (mop->size > MEM_OP_MAX_SIZE)
|
||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
if (kvm_s390_pv_is_protected(kvm))
|
/*
|
||||||
|
* This is technically a heuristic only, if the kvm->lock is not
|
||||||
|
* taken, it is not guaranteed that the vm is/remains non-protected.
|
||||||
|
* This is ok from a kernel perspective, wrongdoing is detected
|
||||||
|
* on the access, -EFAULT is returned and the vm may crash the
|
||||||
|
* next time it accesses the memory in question.
|
||||||
|
* There is no sane usecase to do switching and a memop on two
|
||||||
|
* different CPUs at the same time.
|
||||||
|
*/
|
||||||
|
if (kvm_s390_pv_get_handle(kvm))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (mop->flags & KVM_S390_MEMOP_F_SKEY_PROTECTION) {
|
if (mop->flags & KVM_S390_MEMOP_F_SKEY_PROTECTION) {
|
||||||
if (access_key_invalid(mop->key))
|
if (access_key_invalid(mop->key))
|
||||||
|
@ -1183,6 +1183,7 @@ EXPORT_SYMBOL_GPL(gmap_read_table);
|
|||||||
static inline void gmap_insert_rmap(struct gmap *sg, unsigned long vmaddr,
|
static inline void gmap_insert_rmap(struct gmap *sg, unsigned long vmaddr,
|
||||||
struct gmap_rmap *rmap)
|
struct gmap_rmap *rmap)
|
||||||
{
|
{
|
||||||
|
struct gmap_rmap *temp;
|
||||||
void __rcu **slot;
|
void __rcu **slot;
|
||||||
|
|
||||||
BUG_ON(!gmap_is_shadow(sg));
|
BUG_ON(!gmap_is_shadow(sg));
|
||||||
@ -1190,6 +1191,12 @@ static inline void gmap_insert_rmap(struct gmap *sg, unsigned long vmaddr,
|
|||||||
if (slot) {
|
if (slot) {
|
||||||
rmap->next = radix_tree_deref_slot_protected(slot,
|
rmap->next = radix_tree_deref_slot_protected(slot,
|
||||||
&sg->guest_table_lock);
|
&sg->guest_table_lock);
|
||||||
|
for (temp = rmap->next; temp; temp = temp->next) {
|
||||||
|
if (temp->raddr == rmap->raddr) {
|
||||||
|
kfree(rmap);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
radix_tree_replace_slot(&sg->host_to_rmap, slot, rmap);
|
radix_tree_replace_slot(&sg->host_to_rmap, slot, rmap);
|
||||||
} else {
|
} else {
|
||||||
rmap->next = NULL;
|
rmap->next = NULL;
|
||||||
|
@ -41,17 +41,7 @@ struct fpu_state_config fpu_user_cfg __ro_after_init;
|
|||||||
*/
|
*/
|
||||||
struct fpstate init_fpstate __ro_after_init;
|
struct fpstate init_fpstate __ro_after_init;
|
||||||
|
|
||||||
/*
|
/* Track in-kernel FPU usage */
|
||||||
* Track whether the kernel is using the FPU state
|
|
||||||
* currently.
|
|
||||||
*
|
|
||||||
* This flag is used:
|
|
||||||
*
|
|
||||||
* - by IRQ context code to potentially use the FPU
|
|
||||||
* if it's unused.
|
|
||||||
*
|
|
||||||
* - to debug kernel_fpu_begin()/end() correctness
|
|
||||||
*/
|
|
||||||
static DEFINE_PER_CPU(bool, in_kernel_fpu);
|
static DEFINE_PER_CPU(bool, in_kernel_fpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -59,42 +49,37 @@ static DEFINE_PER_CPU(bool, in_kernel_fpu);
|
|||||||
*/
|
*/
|
||||||
DEFINE_PER_CPU(struct fpu *, fpu_fpregs_owner_ctx);
|
DEFINE_PER_CPU(struct fpu *, fpu_fpregs_owner_ctx);
|
||||||
|
|
||||||
static bool kernel_fpu_disabled(void)
|
|
||||||
{
|
|
||||||
return this_cpu_read(in_kernel_fpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool interrupted_kernel_fpu_idle(void)
|
|
||||||
{
|
|
||||||
return !kernel_fpu_disabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Were we in user mode (or vm86 mode) when we were
|
|
||||||
* interrupted?
|
|
||||||
*
|
|
||||||
* Doing kernel_fpu_begin/end() is ok if we are running
|
|
||||||
* in an interrupt context from user mode - we'll just
|
|
||||||
* save the FPU state as required.
|
|
||||||
*/
|
|
||||||
static bool interrupted_user_mode(void)
|
|
||||||
{
|
|
||||||
struct pt_regs *regs = get_irq_regs();
|
|
||||||
return regs && user_mode(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Can we use the FPU in kernel mode with the
|
* Can we use the FPU in kernel mode with the
|
||||||
* whole "kernel_fpu_begin/end()" sequence?
|
* whole "kernel_fpu_begin/end()" sequence?
|
||||||
*
|
|
||||||
* It's always ok in process context (ie "not interrupt")
|
|
||||||
* but it is sometimes ok even from an irq.
|
|
||||||
*/
|
*/
|
||||||
bool irq_fpu_usable(void)
|
bool irq_fpu_usable(void)
|
||||||
{
|
{
|
||||||
return !in_interrupt() ||
|
if (WARN_ON_ONCE(in_nmi()))
|
||||||
interrupted_user_mode() ||
|
return false;
|
||||||
interrupted_kernel_fpu_idle();
|
|
||||||
|
/* In kernel FPU usage already active? */
|
||||||
|
if (this_cpu_read(in_kernel_fpu))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When not in NMI or hard interrupt context, FPU can be used in:
|
||||||
|
*
|
||||||
|
* - Task context except from within fpregs_lock()'ed critical
|
||||||
|
* regions.
|
||||||
|
*
|
||||||
|
* - Soft interrupt processing context which cannot happen
|
||||||
|
* while in a fpregs_lock()'ed critical region.
|
||||||
|
*/
|
||||||
|
if (!in_hardirq())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In hard interrupt context it's safe when soft interrupts
|
||||||
|
* are enabled, which means the interrupt did not hit in
|
||||||
|
* a fpregs_lock()'ed critical region.
|
||||||
|
*/
|
||||||
|
return !softirq_count();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(irq_fpu_usable);
|
EXPORT_SYMBOL(irq_fpu_usable);
|
||||||
|
|
||||||
|
@ -887,6 +887,11 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
|
|||||||
union cpuid10_eax eax;
|
union cpuid10_eax eax;
|
||||||
union cpuid10_edx edx;
|
union cpuid10_edx edx;
|
||||||
|
|
||||||
|
if (!static_cpu_has(X86_FEATURE_ARCH_PERFMON)) {
|
||||||
|
entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
perf_get_x86_pmu_capability(&cap);
|
perf_get_x86_pmu_capability(&cap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -473,30 +473,6 @@ retry:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool spte_has_volatile_bits(u64 spte)
|
|
||||||
{
|
|
||||||
if (!is_shadow_present_pte(spte))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Always atomically update spte if it can be updated
|
|
||||||
* out of mmu-lock, it can ensure dirty bit is not lost,
|
|
||||||
* also, it can help us to get a stable is_writable_pte()
|
|
||||||
* to ensure tlb flush is not missed.
|
|
||||||
*/
|
|
||||||
if (spte_can_locklessly_be_made_writable(spte) ||
|
|
||||||
is_access_track_spte(spte))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (spte_ad_enabled(spte)) {
|
|
||||||
if ((spte & shadow_accessed_mask) == 0 ||
|
|
||||||
(is_writable_pte(spte) && (spte & shadow_dirty_mask) == 0))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Rules for using mmu_spte_set:
|
/* Rules for using mmu_spte_set:
|
||||||
* Set the sptep from nonpresent to present.
|
* Set the sptep from nonpresent to present.
|
||||||
* Note: the sptep being assigned *must* be either not present
|
* Note: the sptep being assigned *must* be either not present
|
||||||
@ -557,7 +533,7 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
|
|||||||
* we always atomically update it, see the comments in
|
* we always atomically update it, see the comments in
|
||||||
* spte_has_volatile_bits().
|
* spte_has_volatile_bits().
|
||||||
*/
|
*/
|
||||||
if (spte_can_locklessly_be_made_writable(old_spte) &&
|
if (is_mmu_writable_spte(old_spte) &&
|
||||||
!is_writable_pte(new_spte))
|
!is_writable_pte(new_spte))
|
||||||
flush = true;
|
flush = true;
|
||||||
|
|
||||||
@ -591,7 +567,8 @@ static int mmu_spte_clear_track_bits(struct kvm *kvm, u64 *sptep)
|
|||||||
u64 old_spte = *sptep;
|
u64 old_spte = *sptep;
|
||||||
int level = sptep_to_sp(sptep)->role.level;
|
int level = sptep_to_sp(sptep)->role.level;
|
||||||
|
|
||||||
if (!spte_has_volatile_bits(old_spte))
|
if (!is_shadow_present_pte(old_spte) ||
|
||||||
|
!spte_has_volatile_bits(old_spte))
|
||||||
__update_clear_spte_fast(sptep, 0ull);
|
__update_clear_spte_fast(sptep, 0ull);
|
||||||
else
|
else
|
||||||
old_spte = __update_clear_spte_slow(sptep, 0ull);
|
old_spte = __update_clear_spte_slow(sptep, 0ull);
|
||||||
@ -1187,7 +1164,7 @@ static bool spte_write_protect(u64 *sptep, bool pt_protect)
|
|||||||
u64 spte = *sptep;
|
u64 spte = *sptep;
|
||||||
|
|
||||||
if (!is_writable_pte(spte) &&
|
if (!is_writable_pte(spte) &&
|
||||||
!(pt_protect && spte_can_locklessly_be_made_writable(spte)))
|
!(pt_protect && is_mmu_writable_spte(spte)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
rmap_printk("spte %p %llx\n", sptep, *sptep);
|
rmap_printk("spte %p %llx\n", sptep, *sptep);
|
||||||
@ -3196,8 +3173,7 @@ static int fast_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
|
|||||||
* be removed in the fast path only if the SPTE was
|
* be removed in the fast path only if the SPTE was
|
||||||
* write-protected for dirty-logging or access tracking.
|
* write-protected for dirty-logging or access tracking.
|
||||||
*/
|
*/
|
||||||
if (fault->write &&
|
if (fault->write && is_mmu_writable_spte(spte)) {
|
||||||
spte_can_locklessly_be_made_writable(spte)) {
|
|
||||||
new_spte |= PT_WRITABLE_MASK;
|
new_spte |= PT_WRITABLE_MASK;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -90,6 +90,34 @@ static bool kvm_is_mmio_pfn(kvm_pfn_t pfn)
|
|||||||
E820_TYPE_RAM);
|
E820_TYPE_RAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns true if the SPTE has bits that may be set without holding mmu_lock.
|
||||||
|
* The caller is responsible for checking if the SPTE is shadow-present, and
|
||||||
|
* for determining whether or not the caller cares about non-leaf SPTEs.
|
||||||
|
*/
|
||||||
|
bool spte_has_volatile_bits(u64 spte)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Always atomically update spte if it can be updated
|
||||||
|
* out of mmu-lock, it can ensure dirty bit is not lost,
|
||||||
|
* also, it can help us to get a stable is_writable_pte()
|
||||||
|
* to ensure tlb flush is not missed.
|
||||||
|
*/
|
||||||
|
if (!is_writable_pte(spte) && is_mmu_writable_spte(spte))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (is_access_track_spte(spte))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (spte_ad_enabled(spte)) {
|
||||||
|
if (!(spte & shadow_accessed_mask) ||
|
||||||
|
(is_writable_pte(spte) && !(spte & shadow_dirty_mask)))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||||
const struct kvm_memory_slot *slot,
|
const struct kvm_memory_slot *slot,
|
||||||
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
||||||
|
@ -390,7 +390,7 @@ static inline void check_spte_writable_invariants(u64 spte)
|
|||||||
"kvm: Writable SPTE is not MMU-writable: %llx", spte);
|
"kvm: Writable SPTE is not MMU-writable: %llx", spte);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool spte_can_locklessly_be_made_writable(u64 spte)
|
static inline bool is_mmu_writable_spte(u64 spte)
|
||||||
{
|
{
|
||||||
return spte & shadow_mmu_writable_mask;
|
return spte & shadow_mmu_writable_mask;
|
||||||
}
|
}
|
||||||
@ -404,6 +404,8 @@ static inline u64 get_mmio_spte_generation(u64 spte)
|
|||||||
return gen;
|
return gen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool spte_has_volatile_bits(u64 spte);
|
||||||
|
|
||||||
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||||
const struct kvm_memory_slot *slot,
|
const struct kvm_memory_slot *slot,
|
||||||
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
|
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
|
#include "spte.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TDP MMU SPTEs are RCU protected to allow paging structures (non-leaf SPTEs)
|
* TDP MMU SPTEs are RCU protected to allow paging structures (non-leaf SPTEs)
|
||||||
@ -17,9 +18,38 @@ static inline u64 kvm_tdp_mmu_read_spte(tdp_ptep_t sptep)
|
|||||||
{
|
{
|
||||||
return READ_ONCE(*rcu_dereference(sptep));
|
return READ_ONCE(*rcu_dereference(sptep));
|
||||||
}
|
}
|
||||||
static inline void kvm_tdp_mmu_write_spte(tdp_ptep_t sptep, u64 val)
|
|
||||||
|
static inline u64 kvm_tdp_mmu_write_spte_atomic(tdp_ptep_t sptep, u64 new_spte)
|
||||||
{
|
{
|
||||||
WRITE_ONCE(*rcu_dereference(sptep), val);
|
return xchg(rcu_dereference(sptep), new_spte);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __kvm_tdp_mmu_write_spte(tdp_ptep_t sptep, u64 new_spte)
|
||||||
|
{
|
||||||
|
WRITE_ONCE(*rcu_dereference(sptep), new_spte);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u64 kvm_tdp_mmu_write_spte(tdp_ptep_t sptep, u64 old_spte,
|
||||||
|
u64 new_spte, int level)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Atomically write the SPTE if it is a shadow-present, leaf SPTE with
|
||||||
|
* volatile bits, i.e. has bits that can be set outside of mmu_lock.
|
||||||
|
* The Writable bit can be set by KVM's fast page fault handler, and
|
||||||
|
* Accessed and Dirty bits can be set by the CPU.
|
||||||
|
*
|
||||||
|
* Note, non-leaf SPTEs do have Accessed bits and those bits are
|
||||||
|
* technically volatile, but KVM doesn't consume the Accessed bit of
|
||||||
|
* non-leaf SPTEs, i.e. KVM doesn't care if it clobbers the bit. This
|
||||||
|
* logic needs to be reassessed if KVM were to use non-leaf Accessed
|
||||||
|
* bits, e.g. to skip stepping down into child SPTEs when aging SPTEs.
|
||||||
|
*/
|
||||||
|
if (is_shadow_present_pte(old_spte) && is_last_spte(old_spte, level) &&
|
||||||
|
spte_has_volatile_bits(old_spte))
|
||||||
|
return kvm_tdp_mmu_write_spte_atomic(sptep, new_spte);
|
||||||
|
|
||||||
|
__kvm_tdp_mmu_write_spte(sptep, new_spte);
|
||||||
|
return old_spte;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -426,9 +426,9 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
|
|||||||
tdp_mmu_unlink_sp(kvm, sp, shared);
|
tdp_mmu_unlink_sp(kvm, sp, shared);
|
||||||
|
|
||||||
for (i = 0; i < PT64_ENT_PER_PAGE; i++) {
|
for (i = 0; i < PT64_ENT_PER_PAGE; i++) {
|
||||||
u64 *sptep = rcu_dereference(pt) + i;
|
tdp_ptep_t sptep = pt + i;
|
||||||
gfn_t gfn = base_gfn + i * KVM_PAGES_PER_HPAGE(level);
|
gfn_t gfn = base_gfn + i * KVM_PAGES_PER_HPAGE(level);
|
||||||
u64 old_child_spte;
|
u64 old_spte;
|
||||||
|
|
||||||
if (shared) {
|
if (shared) {
|
||||||
/*
|
/*
|
||||||
@ -440,8 +440,8 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
|
|||||||
* value to the removed SPTE value.
|
* value to the removed SPTE value.
|
||||||
*/
|
*/
|
||||||
for (;;) {
|
for (;;) {
|
||||||
old_child_spte = xchg(sptep, REMOVED_SPTE);
|
old_spte = kvm_tdp_mmu_write_spte_atomic(sptep, REMOVED_SPTE);
|
||||||
if (!is_removed_spte(old_child_spte))
|
if (!is_removed_spte(old_spte))
|
||||||
break;
|
break;
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
@ -455,23 +455,43 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
|
|||||||
* are guarded by the memslots generation, not by being
|
* are guarded by the memslots generation, not by being
|
||||||
* unreachable.
|
* unreachable.
|
||||||
*/
|
*/
|
||||||
old_child_spte = READ_ONCE(*sptep);
|
old_spte = kvm_tdp_mmu_read_spte(sptep);
|
||||||
if (!is_shadow_present_pte(old_child_spte))
|
if (!is_shadow_present_pte(old_spte))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Marking the SPTE as a removed SPTE is not
|
* Use the common helper instead of a raw WRITE_ONCE as
|
||||||
* strictly necessary here as the MMU lock will
|
* the SPTE needs to be updated atomically if it can be
|
||||||
* stop other threads from concurrently modifying
|
* modified by a different vCPU outside of mmu_lock.
|
||||||
* this SPTE. Using the removed SPTE value keeps
|
* Even though the parent SPTE is !PRESENT, the TLB
|
||||||
* the two branches consistent and simplifies
|
* hasn't yet been flushed, and both Intel and AMD
|
||||||
* the function.
|
* document that A/D assists can use upper-level PxE
|
||||||
|
* entries that are cached in the TLB, i.e. the CPU can
|
||||||
|
* still access the page and mark it dirty.
|
||||||
|
*
|
||||||
|
* No retry is needed in the atomic update path as the
|
||||||
|
* sole concern is dropping a Dirty bit, i.e. no other
|
||||||
|
* task can zap/remove the SPTE as mmu_lock is held for
|
||||||
|
* write. Marking the SPTE as a removed SPTE is not
|
||||||
|
* strictly necessary for the same reason, but using
|
||||||
|
* the remove SPTE value keeps the shared/exclusive
|
||||||
|
* paths consistent and allows the handle_changed_spte()
|
||||||
|
* call below to hardcode the new value to REMOVED_SPTE.
|
||||||
|
*
|
||||||
|
* Note, even though dropping a Dirty bit is the only
|
||||||
|
* scenario where a non-atomic update could result in a
|
||||||
|
* functional bug, simply checking the Dirty bit isn't
|
||||||
|
* sufficient as a fast page fault could read the upper
|
||||||
|
* level SPTE before it is zapped, and then make this
|
||||||
|
* target SPTE writable, resume the guest, and set the
|
||||||
|
* Dirty bit between reading the SPTE above and writing
|
||||||
|
* it here.
|
||||||
*/
|
*/
|
||||||
WRITE_ONCE(*sptep, REMOVED_SPTE);
|
old_spte = kvm_tdp_mmu_write_spte(sptep, old_spte,
|
||||||
|
REMOVED_SPTE, level);
|
||||||
}
|
}
|
||||||
handle_changed_spte(kvm, kvm_mmu_page_as_id(sp), gfn,
|
handle_changed_spte(kvm, kvm_mmu_page_as_id(sp), gfn,
|
||||||
old_child_spte, REMOVED_SPTE, level,
|
old_spte, REMOVED_SPTE, level, shared);
|
||||||
shared);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
call_rcu(&sp->rcu_head, tdp_mmu_free_sp_rcu_callback);
|
call_rcu(&sp->rcu_head, tdp_mmu_free_sp_rcu_callback);
|
||||||
@ -667,14 +687,13 @@ static inline int tdp_mmu_zap_spte_atomic(struct kvm *kvm,
|
|||||||
KVM_PAGES_PER_HPAGE(iter->level));
|
KVM_PAGES_PER_HPAGE(iter->level));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No other thread can overwrite the removed SPTE as they
|
* No other thread can overwrite the removed SPTE as they must either
|
||||||
* must either wait on the MMU lock or use
|
* wait on the MMU lock or use tdp_mmu_set_spte_atomic() which will not
|
||||||
* tdp_mmu_set_spte_atomic which will not overwrite the
|
* overwrite the special removed SPTE value. No bookkeeping is needed
|
||||||
* special removed SPTE value. No bookkeeping is needed
|
* here since the SPTE is going from non-present to non-present. Use
|
||||||
* here since the SPTE is going from non-present
|
* the raw write helper to avoid an unnecessary check on volatile bits.
|
||||||
* to non-present.
|
|
||||||
*/
|
*/
|
||||||
kvm_tdp_mmu_write_spte(iter->sptep, 0);
|
__kvm_tdp_mmu_write_spte(iter->sptep, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -699,10 +718,13 @@ static inline int tdp_mmu_zap_spte_atomic(struct kvm *kvm,
|
|||||||
* unless performing certain dirty logging operations.
|
* unless performing certain dirty logging operations.
|
||||||
* Leaving record_dirty_log unset in that case prevents page
|
* Leaving record_dirty_log unset in that case prevents page
|
||||||
* writes from being double counted.
|
* writes from being double counted.
|
||||||
|
*
|
||||||
|
* Returns the old SPTE value, which _may_ be different than @old_spte if the
|
||||||
|
* SPTE had voldatile bits.
|
||||||
*/
|
*/
|
||||||
static void __tdp_mmu_set_spte(struct kvm *kvm, int as_id, tdp_ptep_t sptep,
|
static u64 __tdp_mmu_set_spte(struct kvm *kvm, int as_id, tdp_ptep_t sptep,
|
||||||
u64 old_spte, u64 new_spte, gfn_t gfn, int level,
|
u64 old_spte, u64 new_spte, gfn_t gfn, int level,
|
||||||
bool record_acc_track, bool record_dirty_log)
|
bool record_acc_track, bool record_dirty_log)
|
||||||
{
|
{
|
||||||
lockdep_assert_held_write(&kvm->mmu_lock);
|
lockdep_assert_held_write(&kvm->mmu_lock);
|
||||||
|
|
||||||
@ -715,7 +737,7 @@ static void __tdp_mmu_set_spte(struct kvm *kvm, int as_id, tdp_ptep_t sptep,
|
|||||||
*/
|
*/
|
||||||
WARN_ON(is_removed_spte(old_spte) || is_removed_spte(new_spte));
|
WARN_ON(is_removed_spte(old_spte) || is_removed_spte(new_spte));
|
||||||
|
|
||||||
kvm_tdp_mmu_write_spte(sptep, new_spte);
|
old_spte = kvm_tdp_mmu_write_spte(sptep, old_spte, new_spte, level);
|
||||||
|
|
||||||
__handle_changed_spte(kvm, as_id, gfn, old_spte, new_spte, level, false);
|
__handle_changed_spte(kvm, as_id, gfn, old_spte, new_spte, level, false);
|
||||||
|
|
||||||
@ -724,6 +746,7 @@ static void __tdp_mmu_set_spte(struct kvm *kvm, int as_id, tdp_ptep_t sptep,
|
|||||||
if (record_dirty_log)
|
if (record_dirty_log)
|
||||||
handle_changed_spte_dirty_log(kvm, as_id, gfn, old_spte,
|
handle_changed_spte_dirty_log(kvm, as_id, gfn, old_spte,
|
||||||
new_spte, level);
|
new_spte, level);
|
||||||
|
return old_spte;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void _tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter,
|
static inline void _tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter,
|
||||||
@ -732,9 +755,10 @@ static inline void _tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter,
|
|||||||
{
|
{
|
||||||
WARN_ON_ONCE(iter->yielded);
|
WARN_ON_ONCE(iter->yielded);
|
||||||
|
|
||||||
__tdp_mmu_set_spte(kvm, iter->as_id, iter->sptep, iter->old_spte,
|
iter->old_spte = __tdp_mmu_set_spte(kvm, iter->as_id, iter->sptep,
|
||||||
new_spte, iter->gfn, iter->level,
|
iter->old_spte, new_spte,
|
||||||
record_acc_track, record_dirty_log);
|
iter->gfn, iter->level,
|
||||||
|
record_acc_track, record_dirty_log);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter,
|
static inline void tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter,
|
||||||
|
@ -45,6 +45,22 @@ static struct kvm_event_hw_type_mapping amd_event_mapping[] = {
|
|||||||
[7] = { 0xd1, 0x00, PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
|
[7] = { 0xd1, 0x00, PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* duplicated from amd_f17h_perfmon_event_map. */
|
||||||
|
static struct kvm_event_hw_type_mapping amd_f17h_event_mapping[] = {
|
||||||
|
[0] = { 0x76, 0x00, PERF_COUNT_HW_CPU_CYCLES },
|
||||||
|
[1] = { 0xc0, 0x00, PERF_COUNT_HW_INSTRUCTIONS },
|
||||||
|
[2] = { 0x60, 0xff, PERF_COUNT_HW_CACHE_REFERENCES },
|
||||||
|
[3] = { 0x64, 0x09, PERF_COUNT_HW_CACHE_MISSES },
|
||||||
|
[4] = { 0xc2, 0x00, PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
|
||||||
|
[5] = { 0xc3, 0x00, PERF_COUNT_HW_BRANCH_MISSES },
|
||||||
|
[6] = { 0x87, 0x02, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND },
|
||||||
|
[7] = { 0x87, 0x01, PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* amd_pmc_perf_hw_id depends on these being the same size */
|
||||||
|
static_assert(ARRAY_SIZE(amd_event_mapping) ==
|
||||||
|
ARRAY_SIZE(amd_f17h_event_mapping));
|
||||||
|
|
||||||
static unsigned int get_msr_base(struct kvm_pmu *pmu, enum pmu_type type)
|
static unsigned int get_msr_base(struct kvm_pmu *pmu, enum pmu_type type)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu = pmu_to_vcpu(pmu);
|
struct kvm_vcpu *vcpu = pmu_to_vcpu(pmu);
|
||||||
@ -140,6 +156,7 @@ static inline struct kvm_pmc *get_gp_pmc_amd(struct kvm_pmu *pmu, u32 msr,
|
|||||||
|
|
||||||
static unsigned int amd_pmc_perf_hw_id(struct kvm_pmc *pmc)
|
static unsigned int amd_pmc_perf_hw_id(struct kvm_pmc *pmc)
|
||||||
{
|
{
|
||||||
|
struct kvm_event_hw_type_mapping *event_mapping;
|
||||||
u8 event_select = pmc->eventsel & ARCH_PERFMON_EVENTSEL_EVENT;
|
u8 event_select = pmc->eventsel & ARCH_PERFMON_EVENTSEL_EVENT;
|
||||||
u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
|
u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
|
||||||
int i;
|
int i;
|
||||||
@ -148,15 +165,20 @@ static unsigned int amd_pmc_perf_hw_id(struct kvm_pmc *pmc)
|
|||||||
if (WARN_ON(pmc_is_fixed(pmc)))
|
if (WARN_ON(pmc_is_fixed(pmc)))
|
||||||
return PERF_COUNT_HW_MAX;
|
return PERF_COUNT_HW_MAX;
|
||||||
|
|
||||||
|
if (guest_cpuid_family(pmc->vcpu) >= 0x17)
|
||||||
|
event_mapping = amd_f17h_event_mapping;
|
||||||
|
else
|
||||||
|
event_mapping = amd_event_mapping;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(amd_event_mapping); i++)
|
for (i = 0; i < ARRAY_SIZE(amd_event_mapping); i++)
|
||||||
if (amd_event_mapping[i].eventsel == event_select
|
if (event_mapping[i].eventsel == event_select
|
||||||
&& amd_event_mapping[i].unit_mask == unit_mask)
|
&& event_mapping[i].unit_mask == unit_mask)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (i == ARRAY_SIZE(amd_event_mapping))
|
if (i == ARRAY_SIZE(amd_event_mapping))
|
||||||
return PERF_COUNT_HW_MAX;
|
return PERF_COUNT_HW_MAX;
|
||||||
|
|
||||||
return amd_event_mapping[i].event_type;
|
return event_mapping[i].event_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if a PMC is enabled by comparing it against global_ctrl bits. Because
|
/* check if a PMC is enabled by comparing it against global_ctrl bits. Because
|
||||||
|
@ -1594,24 +1594,51 @@ static void sev_unlock_two_vms(struct kvm *dst_kvm, struct kvm *src_kvm)
|
|||||||
atomic_set_release(&src_sev->migration_in_progress, 0);
|
atomic_set_release(&src_sev->migration_in_progress, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* vCPU mutex subclasses. */
|
||||||
|
enum sev_migration_role {
|
||||||
|
SEV_MIGRATION_SOURCE = 0,
|
||||||
|
SEV_MIGRATION_TARGET,
|
||||||
|
SEV_NR_MIGRATION_ROLES,
|
||||||
|
};
|
||||||
|
|
||||||
static int sev_lock_vcpus_for_migration(struct kvm *kvm)
|
static int sev_lock_vcpus_for_migration(struct kvm *kvm,
|
||||||
|
enum sev_migration_role role)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu;
|
struct kvm_vcpu *vcpu;
|
||||||
unsigned long i, j;
|
unsigned long i, j;
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
kvm_for_each_vcpu(i, vcpu, kvm) {
|
kvm_for_each_vcpu(i, vcpu, kvm) {
|
||||||
if (mutex_lock_killable(&vcpu->mutex))
|
if (mutex_lock_killable_nested(&vcpu->mutex, role))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
/*
|
||||||
|
* Reset the role to one that avoids colliding with
|
||||||
|
* the role used for the first vcpu mutex.
|
||||||
|
*/
|
||||||
|
role = SEV_NR_MIGRATION_ROLES;
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
mutex_release(&vcpu->mutex.dep_map, _THIS_IP_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
|
|
||||||
|
first = true;
|
||||||
kvm_for_each_vcpu(j, vcpu, kvm) {
|
kvm_for_each_vcpu(j, vcpu, kvm) {
|
||||||
if (i == j)
|
if (i == j)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (first)
|
||||||
|
first = false;
|
||||||
|
else
|
||||||
|
mutex_acquire(&vcpu->mutex.dep_map, role, 0, _THIS_IP_);
|
||||||
|
|
||||||
|
|
||||||
mutex_unlock(&vcpu->mutex);
|
mutex_unlock(&vcpu->mutex);
|
||||||
}
|
}
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
@ -1621,8 +1648,15 @@ static void sev_unlock_vcpus_for_migration(struct kvm *kvm)
|
|||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu;
|
struct kvm_vcpu *vcpu;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
kvm_for_each_vcpu(i, vcpu, kvm) {
|
kvm_for_each_vcpu(i, vcpu, kvm) {
|
||||||
|
if (first)
|
||||||
|
first = false;
|
||||||
|
else
|
||||||
|
mutex_acquire(&vcpu->mutex.dep_map,
|
||||||
|
SEV_NR_MIGRATION_ROLES, 0, _THIS_IP_);
|
||||||
|
|
||||||
mutex_unlock(&vcpu->mutex);
|
mutex_unlock(&vcpu->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1748,10 +1782,10 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd)
|
|||||||
charged = true;
|
charged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sev_lock_vcpus_for_migration(kvm);
|
ret = sev_lock_vcpus_for_migration(kvm, SEV_MIGRATION_SOURCE);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_dst_cgroup;
|
goto out_dst_cgroup;
|
||||||
ret = sev_lock_vcpus_for_migration(source_kvm);
|
ret = sev_lock_vcpus_for_migration(source_kvm, SEV_MIGRATION_TARGET);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_dst_vcpu;
|
goto out_dst_vcpu;
|
||||||
|
|
||||||
|
@ -5472,7 +5472,7 @@ static bool vmx_emulation_required_with_pending_exception(struct kvm_vcpu *vcpu)
|
|||||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||||
|
|
||||||
return vmx->emulation_required && !vmx->rmode.vm86_active &&
|
return vmx->emulation_required && !vmx->rmode.vm86_active &&
|
||||||
vcpu->arch.exception.pending;
|
(vcpu->arch.exception.pending || vcpu->arch.exception.injected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
|
static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
|
||||||
|
@ -902,6 +902,8 @@ static void __meminit vmemmap_use_sub_pmd(unsigned long start, unsigned long end
|
|||||||
|
|
||||||
static void __meminit vmemmap_use_new_sub_pmd(unsigned long start, unsigned long end)
|
static void __meminit vmemmap_use_new_sub_pmd(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
|
const unsigned long page = ALIGN_DOWN(start, PMD_SIZE);
|
||||||
|
|
||||||
vmemmap_flush_unused_pmd();
|
vmemmap_flush_unused_pmd();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -914,8 +916,7 @@ static void __meminit vmemmap_use_new_sub_pmd(unsigned long start, unsigned long
|
|||||||
* Mark with PAGE_UNUSED the unused parts of the new memmap range
|
* Mark with PAGE_UNUSED the unused parts of the new memmap range
|
||||||
*/
|
*/
|
||||||
if (!IS_ALIGNED(start, PMD_SIZE))
|
if (!IS_ALIGNED(start, PMD_SIZE))
|
||||||
memset((void *)start, PAGE_UNUSED,
|
memset((void *)page, PAGE_UNUSED, start - page);
|
||||||
start - ALIGN_DOWN(start, PMD_SIZE));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want to avoid memset(PAGE_UNUSED) when populating the vmemmap of
|
* We want to avoid memset(PAGE_UNUSED) when populating the vmemmap of
|
||||||
|
@ -50,7 +50,6 @@
|
|||||||
#include "blk-pm.h"
|
#include "blk-pm.h"
|
||||||
#include "blk-cgroup.h"
|
#include "blk-cgroup.h"
|
||||||
#include "blk-throttle.h"
|
#include "blk-throttle.h"
|
||||||
#include "blk-rq-qos.h"
|
|
||||||
|
|
||||||
struct dentry *blk_debugfs_root;
|
struct dentry *blk_debugfs_root;
|
||||||
|
|
||||||
@ -315,9 +314,6 @@ void blk_cleanup_queue(struct request_queue *q)
|
|||||||
*/
|
*/
|
||||||
blk_freeze_queue(q);
|
blk_freeze_queue(q);
|
||||||
|
|
||||||
/* cleanup rq qos structures for queue without disk */
|
|
||||||
rq_qos_exit(q);
|
|
||||||
|
|
||||||
blk_queue_flag_set(QUEUE_FLAG_DEAD, q);
|
blk_queue_flag_set(QUEUE_FLAG_DEAD, q);
|
||||||
|
|
||||||
blk_sync_queue(q);
|
blk_sync_queue(q);
|
||||||
|
@ -735,6 +735,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
|||||||
size_t offset, u32 opt_flags)
|
size_t offset, u32 opt_flags)
|
||||||
{
|
{
|
||||||
struct firmware *fw = NULL;
|
struct firmware *fw = NULL;
|
||||||
|
struct cred *kern_cred = NULL;
|
||||||
|
const struct cred *old_cred;
|
||||||
bool nondirect = false;
|
bool nondirect = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -751,6 +753,18 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
|||||||
if (ret <= 0) /* error or already assigned */
|
if (ret <= 0) /* error or already assigned */
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are about to try to access the firmware file. Because we may have been
|
||||||
|
* called by a driver when serving an unrelated request from userland, we use
|
||||||
|
* the kernel credentials to read the file.
|
||||||
|
*/
|
||||||
|
kern_cred = prepare_kernel_cred(NULL);
|
||||||
|
if (!kern_cred) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
old_cred = override_creds(kern_cred);
|
||||||
|
|
||||||
ret = fw_get_filesystem_firmware(device, fw->priv, "", NULL);
|
ret = fw_get_filesystem_firmware(device, fw->priv, "", NULL);
|
||||||
|
|
||||||
/* Only full reads can support decompression, platform, and sysfs. */
|
/* Only full reads can support decompression, platform, and sysfs. */
|
||||||
@ -776,6 +790,9 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
|||||||
} else
|
} else
|
||||||
ret = assign_fw(fw, device);
|
ret = assign_fw(fw, device);
|
||||||
|
|
||||||
|
revert_creds(old_cred);
|
||||||
|
put_cred(kern_cred);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fw_abort_batch_reqs(fw);
|
fw_abort_batch_reqs(fw);
|
||||||
|
@ -303,6 +303,7 @@ static struct atari_floppy_struct {
|
|||||||
int ref;
|
int ref;
|
||||||
int type;
|
int type;
|
||||||
struct blk_mq_tag_set tag_set;
|
struct blk_mq_tag_set tag_set;
|
||||||
|
int error_count;
|
||||||
} unit[FD_MAX_UNITS];
|
} unit[FD_MAX_UNITS];
|
||||||
|
|
||||||
#define UD unit[drive]
|
#define UD unit[drive]
|
||||||
@ -705,14 +706,14 @@ static void fd_error( void )
|
|||||||
if (!fd_request)
|
if (!fd_request)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fd_request->error_count++;
|
unit[SelectedDrive].error_count++;
|
||||||
if (fd_request->error_count >= MAX_ERRORS) {
|
if (unit[SelectedDrive].error_count >= MAX_ERRORS) {
|
||||||
printk(KERN_ERR "fd%d: too many errors.\n", SelectedDrive );
|
printk(KERN_ERR "fd%d: too many errors.\n", SelectedDrive );
|
||||||
fd_end_request_cur(BLK_STS_IOERR);
|
fd_end_request_cur(BLK_STS_IOERR);
|
||||||
finish_fdc();
|
finish_fdc();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (fd_request->error_count == RECALIBRATE_ERRORS) {
|
else if (unit[SelectedDrive].error_count == RECALIBRATE_ERRORS) {
|
||||||
printk(KERN_WARNING "fd%d: recalibrating\n", SelectedDrive );
|
printk(KERN_WARNING "fd%d: recalibrating\n", SelectedDrive );
|
||||||
if (SelectedDrive != -1)
|
if (SelectedDrive != -1)
|
||||||
SUD.track = -1;
|
SUD.track = -1;
|
||||||
@ -1491,7 +1492,7 @@ static void setup_req_params( int drive )
|
|||||||
ReqData = ReqBuffer + 512 * ReqCnt;
|
ReqData = ReqBuffer + 512 * ReqCnt;
|
||||||
|
|
||||||
if (UseTrackbuffer)
|
if (UseTrackbuffer)
|
||||||
read_track = (ReqCmd == READ && fd_request->error_count == 0);
|
read_track = (ReqCmd == READ && unit[drive].error_count == 0);
|
||||||
else
|
else
|
||||||
read_track = 0;
|
read_track = 0;
|
||||||
|
|
||||||
@ -1520,6 +1521,7 @@ static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||||||
return BLK_STS_RESOURCE;
|
return BLK_STS_RESOURCE;
|
||||||
}
|
}
|
||||||
fd_request = bd->rq;
|
fd_request = bd->rq;
|
||||||
|
unit[drive].error_count = 0;
|
||||||
blk_mq_start_request(fd_request);
|
blk_mq_start_request(fd_request);
|
||||||
|
|
||||||
atari_disable_irq( IRQ_MFP_FDC );
|
atari_disable_irq( IRQ_MFP_FDC );
|
||||||
|
@ -509,8 +509,8 @@ static unsigned long fdc_busy;
|
|||||||
static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
|
static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
|
||||||
static DECLARE_WAIT_QUEUE_HEAD(command_done);
|
static DECLARE_WAIT_QUEUE_HEAD(command_done);
|
||||||
|
|
||||||
/* Errors during formatting are counted here. */
|
/* errors encountered on the current (or last) request */
|
||||||
static int format_errors;
|
static int floppy_errors;
|
||||||
|
|
||||||
/* Format request descriptor. */
|
/* Format request descriptor. */
|
||||||
static struct format_descr format_req;
|
static struct format_descr format_req;
|
||||||
@ -530,7 +530,6 @@ static struct format_descr format_req;
|
|||||||
static char *floppy_track_buffer;
|
static char *floppy_track_buffer;
|
||||||
static int max_buffer_sectors;
|
static int max_buffer_sectors;
|
||||||
|
|
||||||
static int *errors;
|
|
||||||
typedef void (*done_f)(int);
|
typedef void (*done_f)(int);
|
||||||
static const struct cont_t {
|
static const struct cont_t {
|
||||||
void (*interrupt)(void);
|
void (*interrupt)(void);
|
||||||
@ -1455,7 +1454,7 @@ static int interpret_errors(void)
|
|||||||
if (drive_params[current_drive].flags & FTD_MSG)
|
if (drive_params[current_drive].flags & FTD_MSG)
|
||||||
DPRINT("Over/Underrun - retrying\n");
|
DPRINT("Over/Underrun - retrying\n");
|
||||||
bad = 0;
|
bad = 0;
|
||||||
} else if (*errors >= drive_params[current_drive].max_errors.reporting) {
|
} else if (floppy_errors >= drive_params[current_drive].max_errors.reporting) {
|
||||||
print_errors();
|
print_errors();
|
||||||
}
|
}
|
||||||
if (reply_buffer[ST2] & ST2_WC || reply_buffer[ST2] & ST2_BC)
|
if (reply_buffer[ST2] & ST2_WC || reply_buffer[ST2] & ST2_BC)
|
||||||
@ -2095,7 +2094,7 @@ static void bad_flp_intr(void)
|
|||||||
if (!next_valid_format(current_drive))
|
if (!next_valid_format(current_drive))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
err_count = ++(*errors);
|
err_count = ++floppy_errors;
|
||||||
INFBOUND(write_errors[current_drive].badness, err_count);
|
INFBOUND(write_errors[current_drive].badness, err_count);
|
||||||
if (err_count > drive_params[current_drive].max_errors.abort)
|
if (err_count > drive_params[current_drive].max_errors.abort)
|
||||||
cont->done(0);
|
cont->done(0);
|
||||||
@ -2241,9 +2240,8 @@ static int do_format(int drive, struct format_descr *tmp_format_req)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
format_req = *tmp_format_req;
|
format_req = *tmp_format_req;
|
||||||
format_errors = 0;
|
|
||||||
cont = &format_cont;
|
cont = &format_cont;
|
||||||
errors = &format_errors;
|
floppy_errors = 0;
|
||||||
ret = wait_til_done(redo_format, true);
|
ret = wait_til_done(redo_format, true);
|
||||||
if (ret == -EINTR)
|
if (ret == -EINTR)
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
@ -2759,10 +2757,11 @@ static int set_next_request(void)
|
|||||||
current_req = list_first_entry_or_null(&floppy_reqs, struct request,
|
current_req = list_first_entry_or_null(&floppy_reqs, struct request,
|
||||||
queuelist);
|
queuelist);
|
||||||
if (current_req) {
|
if (current_req) {
|
||||||
current_req->error_count = 0;
|
floppy_errors = 0;
|
||||||
list_del_init(¤t_req->queuelist);
|
list_del_init(¤t_req->queuelist);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return current_req != NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Starts or continues processing request. Will automatically unlock the
|
/* Starts or continues processing request. Will automatically unlock the
|
||||||
@ -2821,7 +2820,6 @@ do_request:
|
|||||||
_floppy = floppy_type + drive_params[current_drive].autodetect[drive_state[current_drive].probed_format];
|
_floppy = floppy_type + drive_params[current_drive].autodetect[drive_state[current_drive].probed_format];
|
||||||
} else
|
} else
|
||||||
probing = 0;
|
probing = 0;
|
||||||
errors = &(current_req->error_count);
|
|
||||||
tmp = make_raw_rw_request();
|
tmp = make_raw_rw_request();
|
||||||
if (tmp < 2) {
|
if (tmp < 2) {
|
||||||
request_done(tmp);
|
request_done(tmp);
|
||||||
|
@ -3677,8 +3677,11 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf)
|
|||||||
void ipmi_unregister_smi(struct ipmi_smi *intf)
|
void ipmi_unregister_smi(struct ipmi_smi *intf)
|
||||||
{
|
{
|
||||||
struct ipmi_smi_watcher *w;
|
struct ipmi_smi_watcher *w;
|
||||||
int intf_num = intf->intf_num, index;
|
int intf_num, index;
|
||||||
|
|
||||||
|
if (!intf)
|
||||||
|
return;
|
||||||
|
intf_num = intf->intf_num;
|
||||||
mutex_lock(&ipmi_interfaces_mutex);
|
mutex_lock(&ipmi_interfaces_mutex);
|
||||||
intf->intf_num = -1;
|
intf->intf_num = -1;
|
||||||
intf->in_shutdown = true;
|
intf->in_shutdown = true;
|
||||||
@ -4518,6 +4521,8 @@ return_unspecified:
|
|||||||
} else
|
} else
|
||||||
/* The message was sent, start the timer. */
|
/* The message was sent, start the timer. */
|
||||||
intf_start_seq_timer(intf, msg->msgid);
|
intf_start_seq_timer(intf, msg->msgid);
|
||||||
|
requeue = 0;
|
||||||
|
goto out;
|
||||||
} else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))
|
} else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))
|
||||||
|| (msg->rsp[1] != msg->data[1])) {
|
|| (msg->rsp[1] != msg->data[1])) {
|
||||||
/*
|
/*
|
||||||
|
@ -2220,10 +2220,7 @@ static void cleanup_one_si(struct smi_info *smi_info)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
list_del(&smi_info->link);
|
list_del(&smi_info->link);
|
||||||
|
ipmi_unregister_smi(smi_info->intf);
|
||||||
if (smi_info->intf)
|
|
||||||
ipmi_unregister_smi(smi_info->intf);
|
|
||||||
|
|
||||||
kfree(smi_info);
|
kfree(smi_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,10 +543,6 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
|||||||
file->f_mode |= FMODE_LSEEK;
|
file->f_mode |= FMODE_LSEEK;
|
||||||
dmabuf->file = file;
|
dmabuf->file = file;
|
||||||
|
|
||||||
ret = dma_buf_stats_setup(dmabuf);
|
|
||||||
if (ret)
|
|
||||||
goto err_sysfs;
|
|
||||||
|
|
||||||
mutex_init(&dmabuf->lock);
|
mutex_init(&dmabuf->lock);
|
||||||
INIT_LIST_HEAD(&dmabuf->attachments);
|
INIT_LIST_HEAD(&dmabuf->attachments);
|
||||||
|
|
||||||
@ -554,6 +550,10 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
|||||||
list_add(&dmabuf->list_node, &db_list.head);
|
list_add(&dmabuf->list_node, &db_list.head);
|
||||||
mutex_unlock(&db_list.lock);
|
mutex_unlock(&db_list.lock);
|
||||||
|
|
||||||
|
ret = dma_buf_stats_setup(dmabuf);
|
||||||
|
if (ret)
|
||||||
|
goto err_sysfs;
|
||||||
|
|
||||||
return dmabuf;
|
return dmabuf;
|
||||||
|
|
||||||
err_sysfs:
|
err_sysfs:
|
||||||
|
@ -668,6 +668,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);
|
|||||||
void fw_core_remove_card(struct fw_card *card)
|
void fw_core_remove_card(struct fw_card *card)
|
||||||
{
|
{
|
||||||
struct fw_card_driver dummy_driver = dummy_driver_template;
|
struct fw_card_driver dummy_driver = dummy_driver_template;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
card->driver->update_phy_reg(card, 4,
|
card->driver->update_phy_reg(card, 4,
|
||||||
PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
|
PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
|
||||||
@ -682,7 +683,9 @@ void fw_core_remove_card(struct fw_card *card)
|
|||||||
dummy_driver.stop_iso = card->driver->stop_iso;
|
dummy_driver.stop_iso = card->driver->stop_iso;
|
||||||
card->driver = &dummy_driver;
|
card->driver = &dummy_driver;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&card->lock, flags);
|
||||||
fw_destroy_nodes(card);
|
fw_destroy_nodes(card);
|
||||||
|
spin_unlock_irqrestore(&card->lock, flags);
|
||||||
|
|
||||||
/* Wait for all users, especially device workqueue jobs, to finish. */
|
/* Wait for all users, especially device workqueue jobs, to finish. */
|
||||||
fw_card_put(card);
|
fw_card_put(card);
|
||||||
|
@ -1500,6 +1500,7 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
|
|||||||
{
|
{
|
||||||
struct outbound_phy_packet_event *e =
|
struct outbound_phy_packet_event *e =
|
||||||
container_of(packet, struct outbound_phy_packet_event, p);
|
container_of(packet, struct outbound_phy_packet_event, p);
|
||||||
|
struct client *e_client;
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
/* expected: */
|
/* expected: */
|
||||||
@ -1516,9 +1517,10 @@ static void outbound_phy_packet_callback(struct fw_packet *packet,
|
|||||||
}
|
}
|
||||||
e->phy_packet.data[0] = packet->timestamp;
|
e->phy_packet.data[0] = packet->timestamp;
|
||||||
|
|
||||||
|
e_client = e->client;
|
||||||
queue_event(e->client, &e->event, &e->phy_packet,
|
queue_event(e->client, &e->event, &e->phy_packet,
|
||||||
sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0);
|
sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0);
|
||||||
client_put(e->client);
|
client_put(e_client);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
|
static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
|
||||||
|
@ -375,16 +375,13 @@ static void report_found_node(struct fw_card *card,
|
|||||||
card->bm_retries = 0;
|
card->bm_retries = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Must be called with card->lock held */
|
||||||
void fw_destroy_nodes(struct fw_card *card)
|
void fw_destroy_nodes(struct fw_card *card)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&card->lock, flags);
|
|
||||||
card->color++;
|
card->color++;
|
||||||
if (card->local_node != NULL)
|
if (card->local_node != NULL)
|
||||||
for_each_fw_node(card, card->local_node, report_lost_node);
|
for_each_fw_node(card, card->local_node, report_lost_node);
|
||||||
card->local_node = NULL;
|
card->local_node = NULL;
|
||||||
spin_unlock_irqrestore(&card->lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
|
static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
|
||||||
@ -510,6 +507,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
|
|||||||
struct fw_node *local_node;
|
struct fw_node *local_node;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&card->lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the selfID buffer is not the immediate successor of the
|
* If the selfID buffer is not the immediate successor of the
|
||||||
* previously processed one, we cannot reliably compare the
|
* previously processed one, we cannot reliably compare the
|
||||||
@ -521,8 +520,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
|
|||||||
card->bm_retries = 0;
|
card->bm_retries = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&card->lock, flags);
|
|
||||||
|
|
||||||
card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated;
|
card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated;
|
||||||
card->node_id = node_id;
|
card->node_id = node_id;
|
||||||
/*
|
/*
|
||||||
|
@ -73,24 +73,25 @@ static int try_cancel_split_timeout(struct fw_transaction *t)
|
|||||||
static int close_transaction(struct fw_transaction *transaction,
|
static int close_transaction(struct fw_transaction *transaction,
|
||||||
struct fw_card *card, int rcode)
|
struct fw_card *card, int rcode)
|
||||||
{
|
{
|
||||||
struct fw_transaction *t;
|
struct fw_transaction *t = NULL, *iter;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&card->lock, flags);
|
spin_lock_irqsave(&card->lock, flags);
|
||||||
list_for_each_entry(t, &card->transaction_list, link) {
|
list_for_each_entry(iter, &card->transaction_list, link) {
|
||||||
if (t == transaction) {
|
if (iter == transaction) {
|
||||||
if (!try_cancel_split_timeout(t)) {
|
if (!try_cancel_split_timeout(iter)) {
|
||||||
spin_unlock_irqrestore(&card->lock, flags);
|
spin_unlock_irqrestore(&card->lock, flags);
|
||||||
goto timed_out;
|
goto timed_out;
|
||||||
}
|
}
|
||||||
list_del_init(&t->link);
|
list_del_init(&iter->link);
|
||||||
card->tlabel_mask &= ~(1ULL << t->tlabel);
|
card->tlabel_mask &= ~(1ULL << iter->tlabel);
|
||||||
|
t = iter;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&card->lock, flags);
|
spin_unlock_irqrestore(&card->lock, flags);
|
||||||
|
|
||||||
if (&t->link != &card->transaction_list) {
|
if (t) {
|
||||||
t->callback(card, rcode, NULL, 0, t->callback_data);
|
t->callback(card, rcode, NULL, 0, t->callback_data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -935,7 +936,7 @@ EXPORT_SYMBOL(fw_core_handle_request);
|
|||||||
|
|
||||||
void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
|
void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
|
||||||
{
|
{
|
||||||
struct fw_transaction *t;
|
struct fw_transaction *t = NULL, *iter;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 *data;
|
u32 *data;
|
||||||
size_t data_length;
|
size_t data_length;
|
||||||
@ -947,20 +948,21 @@ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
|
|||||||
rcode = HEADER_GET_RCODE(p->header[1]);
|
rcode = HEADER_GET_RCODE(p->header[1]);
|
||||||
|
|
||||||
spin_lock_irqsave(&card->lock, flags);
|
spin_lock_irqsave(&card->lock, flags);
|
||||||
list_for_each_entry(t, &card->transaction_list, link) {
|
list_for_each_entry(iter, &card->transaction_list, link) {
|
||||||
if (t->node_id == source && t->tlabel == tlabel) {
|
if (iter->node_id == source && iter->tlabel == tlabel) {
|
||||||
if (!try_cancel_split_timeout(t)) {
|
if (!try_cancel_split_timeout(iter)) {
|
||||||
spin_unlock_irqrestore(&card->lock, flags);
|
spin_unlock_irqrestore(&card->lock, flags);
|
||||||
goto timed_out;
|
goto timed_out;
|
||||||
}
|
}
|
||||||
list_del_init(&t->link);
|
list_del_init(&iter->link);
|
||||||
card->tlabel_mask &= ~(1ULL << t->tlabel);
|
card->tlabel_mask &= ~(1ULL << iter->tlabel);
|
||||||
|
t = iter;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&card->lock, flags);
|
spin_unlock_irqrestore(&card->lock, flags);
|
||||||
|
|
||||||
if (&t->link == &card->transaction_list) {
|
if (!t) {
|
||||||
timed_out:
|
timed_out:
|
||||||
fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
|
fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
|
||||||
source, tlabel);
|
source, tlabel);
|
||||||
|
@ -408,7 +408,7 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
|
|||||||
void *payload, size_t length, void *callback_data)
|
void *payload, size_t length, void *callback_data)
|
||||||
{
|
{
|
||||||
struct sbp2_logical_unit *lu = callback_data;
|
struct sbp2_logical_unit *lu = callback_data;
|
||||||
struct sbp2_orb *orb;
|
struct sbp2_orb *orb = NULL, *iter;
|
||||||
struct sbp2_status status;
|
struct sbp2_status status;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
@ -433,17 +433,18 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
|
|||||||
|
|
||||||
/* Lookup the orb corresponding to this status write. */
|
/* Lookup the orb corresponding to this status write. */
|
||||||
spin_lock_irqsave(&lu->tgt->lock, flags);
|
spin_lock_irqsave(&lu->tgt->lock, flags);
|
||||||
list_for_each_entry(orb, &lu->orb_list, link) {
|
list_for_each_entry(iter, &lu->orb_list, link) {
|
||||||
if (STATUS_GET_ORB_HIGH(status) == 0 &&
|
if (STATUS_GET_ORB_HIGH(status) == 0 &&
|
||||||
STATUS_GET_ORB_LOW(status) == orb->request_bus) {
|
STATUS_GET_ORB_LOW(status) == iter->request_bus) {
|
||||||
orb->rcode = RCODE_COMPLETE;
|
iter->rcode = RCODE_COMPLETE;
|
||||||
list_del(&orb->link);
|
list_del(&iter->link);
|
||||||
|
orb = iter;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&lu->tgt->lock, flags);
|
spin_unlock_irqrestore(&lu->tgt->lock, flags);
|
||||||
|
|
||||||
if (&orb->link != &lu->orb_list) {
|
if (orb) {
|
||||||
orb->callback(orb, &status);
|
orb->callback(orb, &status);
|
||||||
kref_put(&orb->kref, free_orb); /* orb callback reference */
|
kref_put(&orb->kref, free_orb); /* orb callback reference */
|
||||||
} else {
|
} else {
|
||||||
|
@ -871,13 +871,6 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
|
|||||||
mvpwm->chip.dev = dev;
|
mvpwm->chip.dev = dev;
|
||||||
mvpwm->chip.ops = &mvebu_pwm_ops;
|
mvpwm->chip.ops = &mvebu_pwm_ops;
|
||||||
mvpwm->chip.npwm = mvchip->chip.ngpio;
|
mvpwm->chip.npwm = mvchip->chip.ngpio;
|
||||||
/*
|
|
||||||
* There may already be some PWM allocated, so we can't force
|
|
||||||
* mvpwm->chip.base to a fixed point like mvchip->chip.base.
|
|
||||||
* So, we let pwmchip_add() do the numbering and take the next free
|
|
||||||
* region.
|
|
||||||
*/
|
|
||||||
mvpwm->chip.base = -1;
|
|
||||||
|
|
||||||
spin_lock_init(&mvpwm->lock);
|
spin_lock_init(&mvpwm->lock);
|
||||||
|
|
||||||
|
@ -762,11 +762,11 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendin
|
|||||||
bitmap_xor(cur_stat, new_stat, old_stat, gc->ngpio);
|
bitmap_xor(cur_stat, new_stat, old_stat, gc->ngpio);
|
||||||
bitmap_and(trigger, cur_stat, chip->irq_mask, gc->ngpio);
|
bitmap_and(trigger, cur_stat, chip->irq_mask, gc->ngpio);
|
||||||
|
|
||||||
|
bitmap_copy(chip->irq_stat, new_stat, gc->ngpio);
|
||||||
|
|
||||||
if (bitmap_empty(trigger, gc->ngpio))
|
if (bitmap_empty(trigger, gc->ngpio))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bitmap_copy(chip->irq_stat, new_stat, gc->ngpio);
|
|
||||||
|
|
||||||
bitmap_and(cur_stat, chip->irq_trig_fall, old_stat, gc->ngpio);
|
bitmap_and(cur_stat, chip->irq_trig_fall, old_stat, gc->ngpio);
|
||||||
bitmap_and(old_stat, chip->irq_trig_raise, new_stat, gc->ngpio);
|
bitmap_and(old_stat, chip->irq_trig_raise, new_stat, gc->ngpio);
|
||||||
bitmap_or(new_stat, old_stat, cur_stat, gc->ngpio);
|
bitmap_or(new_stat, old_stat, cur_stat, gc->ngpio);
|
||||||
|
@ -130,7 +130,6 @@ static int visconti_gpio_probe(struct platform_device *pdev)
|
|||||||
struct gpio_irq_chip *girq;
|
struct gpio_irq_chip *girq;
|
||||||
struct irq_domain *parent;
|
struct irq_domain *parent;
|
||||||
struct device_node *irq_parent;
|
struct device_node *irq_parent;
|
||||||
struct fwnode_handle *fwnode;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||||
@ -150,14 +149,12 @@ static int visconti_gpio_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
parent = irq_find_host(irq_parent);
|
parent = irq_find_host(irq_parent);
|
||||||
|
of_node_put(irq_parent);
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
dev_err(dev, "No IRQ parent domain\n");
|
dev_err(dev, "No IRQ parent domain\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
fwnode = of_node_to_fwnode(irq_parent);
|
|
||||||
of_node_put(irq_parent);
|
|
||||||
|
|
||||||
ret = bgpio_init(&priv->gpio_chip, dev, 4,
|
ret = bgpio_init(&priv->gpio_chip, dev, 4,
|
||||||
priv->base + GPIO_IDATA,
|
priv->base + GPIO_IDATA,
|
||||||
priv->base + GPIO_OSET,
|
priv->base + GPIO_OSET,
|
||||||
@ -180,7 +177,7 @@ static int visconti_gpio_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
girq = &priv->gpio_chip.irq;
|
girq = &priv->gpio_chip.irq;
|
||||||
girq->chip = irq_chip;
|
girq->chip = irq_chip;
|
||||||
girq->fwnode = fwnode;
|
girq->fwnode = of_node_to_fwnode(dev->of_node);
|
||||||
girq->parent_domain = parent;
|
girq->parent_domain = parent;
|
||||||
girq->child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq;
|
girq->child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq;
|
||||||
girq->populate_parent_alloc_arg = visconti_gpio_populate_parent_fwspec;
|
girq->populate_parent_alloc_arg = visconti_gpio_populate_parent_fwspec;
|
||||||
|
@ -910,7 +910,7 @@ static void of_gpiochip_init_valid_mask(struct gpio_chip *chip)
|
|||||||
i, &start);
|
i, &start);
|
||||||
of_property_read_u32_index(np, "gpio-reserved-ranges",
|
of_property_read_u32_index(np, "gpio-reserved-ranges",
|
||||||
i + 1, &count);
|
i + 1, &count);
|
||||||
if (start >= chip->ngpio || start + count >= chip->ngpio)
|
if (start >= chip->ngpio || start + count > chip->ngpio)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bitmap_clear(chip->valid_mask, start, count);
|
bitmap_clear(chip->valid_mask, start, count);
|
||||||
|
@ -296,6 +296,7 @@ static int amdgpu_ctx_set_stable_pstate(struct amdgpu_ctx *ctx,
|
|||||||
{
|
{
|
||||||
struct amdgpu_device *adev = ctx->adev;
|
struct amdgpu_device *adev = ctx->adev;
|
||||||
enum amd_dpm_forced_level level;
|
enum amd_dpm_forced_level level;
|
||||||
|
u32 current_stable_pstate;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
mutex_lock(&adev->pm.stable_pstate_ctx_lock);
|
mutex_lock(&adev->pm.stable_pstate_ctx_lock);
|
||||||
@ -304,6 +305,10 @@ static int amdgpu_ctx_set_stable_pstate(struct amdgpu_ctx *ctx,
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = amdgpu_ctx_get_stable_pstate(ctx, ¤t_stable_pstate);
|
||||||
|
if (r || (stable_pstate == current_stable_pstate))
|
||||||
|
goto done;
|
||||||
|
|
||||||
switch (stable_pstate) {
|
switch (stable_pstate) {
|
||||||
case AMDGPU_CTX_STABLE_PSTATE_NONE:
|
case AMDGPU_CTX_STABLE_PSTATE_NONE:
|
||||||
level = AMD_DPM_FORCED_LEVEL_AUTO;
|
level = AMD_DPM_FORCED_LEVEL_AUTO;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <drm/drm_drv.h>
|
#include <drm/drm_drv.h>
|
||||||
|
#include <xen/xen.h>
|
||||||
|
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_ras.h"
|
#include "amdgpu_ras.h"
|
||||||
@ -710,7 +711,8 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev)
|
|||||||
adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
||||||
|
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
if (is_virtual_machine()) /* passthrough mode exclus sriov mod */
|
/* passthrough mode exclus sriov mod */
|
||||||
|
if (is_virtual_machine() && !xen_initial_domain())
|
||||||
adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
|
adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +81,10 @@
|
|||||||
#include "mxgpu_vi.h"
|
#include "mxgpu_vi.h"
|
||||||
#include "amdgpu_dm.h"
|
#include "amdgpu_dm.h"
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_X86)
|
||||||
|
#include <asm/intel-family.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ixPCIE_LC_L1_PM_SUBSTATE 0x100100C6
|
#define ixPCIE_LC_L1_PM_SUBSTATE 0x100100C6
|
||||||
#define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK 0x00000001L
|
#define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK 0x00000001L
|
||||||
#define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK 0x00000002L
|
#define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK 0x00000002L
|
||||||
@ -1134,13 +1138,24 @@ static void vi_enable_aspm(struct amdgpu_device *adev)
|
|||||||
WREG32_PCIE(ixPCIE_LC_CNTL, data);
|
WREG32_PCIE(ixPCIE_LC_CNTL, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool aspm_support_quirk_check(void)
|
||||||
|
{
|
||||||
|
#if IS_ENABLED(CONFIG_X86)
|
||||||
|
struct cpuinfo_x86 *c = &cpu_data(0);
|
||||||
|
|
||||||
|
return !(c->x86 == 6 && c->x86_model == INTEL_FAM6_ALDERLAKE);
|
||||||
|
#else
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void vi_program_aspm(struct amdgpu_device *adev)
|
static void vi_program_aspm(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
u32 data, data1, orig;
|
u32 data, data1, orig;
|
||||||
bool bL1SS = false;
|
bool bL1SS = false;
|
||||||
bool bClkReqSupport = true;
|
bool bClkReqSupport = true;
|
||||||
|
|
||||||
if (!amdgpu_device_should_use_aspm(adev))
|
if (!amdgpu_device_should_use_aspm(adev) || !aspm_support_quirk_check())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (adev->flags & AMD_IS_APU ||
|
if (adev->flags & AMD_IS_APU ||
|
||||||
|
@ -4440,7 +4440,7 @@ static void dp_test_get_audio_test_data(struct dc_link *link, bool disable_video
|
|||||||
&dpcd_pattern_type.value,
|
&dpcd_pattern_type.value,
|
||||||
sizeof(dpcd_pattern_type));
|
sizeof(dpcd_pattern_type));
|
||||||
|
|
||||||
channel_count = dpcd_test_mode.bits.channel_count + 1;
|
channel_count = min(dpcd_test_mode.bits.channel_count + 1, AUDIO_CHANNELS_COUNT);
|
||||||
|
|
||||||
// read pattern periods for requested channels when sawTooth pattern is requested
|
// read pattern periods for requested channels when sawTooth pattern is requested
|
||||||
if (dpcd_pattern_type.value == AUDIO_TEST_PATTERN_SAWTOOTH ||
|
if (dpcd_pattern_type.value == AUDIO_TEST_PATTERN_SAWTOOTH ||
|
||||||
|
@ -153,9 +153,4 @@ void dcn31_hw_sequencer_construct(struct dc *dc)
|
|||||||
dc->hwss.init_hw = dcn20_fpga_init_hw;
|
dc->hwss.init_hw = dcn20_fpga_init_hw;
|
||||||
dc->hwseq->funcs.init_pipes = NULL;
|
dc->hwseq->funcs.init_pipes = NULL;
|
||||||
}
|
}
|
||||||
if (dc->debug.disable_z10) {
|
|
||||||
/*hw not support z10 or sw disable it*/
|
|
||||||
dc->hwss.z10_restore = NULL;
|
|
||||||
dc->hwss.z10_save_init = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1351,14 +1351,8 @@ static int smu_disable_dpms(struct smu_context *smu)
|
|||||||
{
|
{
|
||||||
struct amdgpu_device *adev = smu->adev;
|
struct amdgpu_device *adev = smu->adev;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
/*
|
|
||||||
* TODO: (adev->in_suspend && !adev->in_s0ix) is added to pair
|
|
||||||
* the workaround which always reset the asic in suspend.
|
|
||||||
* It's likely that workaround will be dropped in the future.
|
|
||||||
* Then the change here should be dropped together.
|
|
||||||
*/
|
|
||||||
bool use_baco = !smu->is_apu &&
|
bool use_baco = !smu->is_apu &&
|
||||||
(((amdgpu_in_reset(adev) || (adev->in_suspend && !adev->in_s0ix)) &&
|
((amdgpu_in_reset(adev) &&
|
||||||
(amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO)) ||
|
(amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO)) ||
|
||||||
((adev->in_runpm || adev->in_s4) && amdgpu_asic_supports_baco(adev)));
|
((adev->in_runpm || adev->in_s4) && amdgpu_asic_supports_baco(adev)));
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ config DRM_ITE_IT6505
|
|||||||
tristate "ITE IT6505 DisplayPort bridge"
|
tristate "ITE IT6505 DisplayPort bridge"
|
||||||
depends on OF
|
depends on OF
|
||||||
select DRM_KMS_HELPER
|
select DRM_KMS_HELPER
|
||||||
|
select DRM_DP_HELPER
|
||||||
select EXTCON
|
select EXTCON
|
||||||
help
|
help
|
||||||
ITE IT6505 DisplayPort bridge chip driver.
|
ITE IT6505 DisplayPort bridge chip driver.
|
||||||
|
@ -1605,17 +1605,17 @@ void i915_vma_close(struct i915_vma *vma)
|
|||||||
|
|
||||||
static void __i915_vma_remove_closed(struct i915_vma *vma)
|
static void __i915_vma_remove_closed(struct i915_vma *vma)
|
||||||
{
|
{
|
||||||
struct intel_gt *gt = vma->vm->gt;
|
|
||||||
|
|
||||||
spin_lock_irq(>->closed_lock);
|
|
||||||
list_del_init(&vma->closed_link);
|
list_del_init(&vma->closed_link);
|
||||||
spin_unlock_irq(>->closed_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void i915_vma_reopen(struct i915_vma *vma)
|
void i915_vma_reopen(struct i915_vma *vma)
|
||||||
{
|
{
|
||||||
|
struct intel_gt *gt = vma->vm->gt;
|
||||||
|
|
||||||
|
spin_lock_irq(>->closed_lock);
|
||||||
if (i915_vma_is_closed(vma))
|
if (i915_vma_is_closed(vma))
|
||||||
__i915_vma_remove_closed(vma);
|
__i915_vma_remove_closed(vma);
|
||||||
|
spin_unlock_irq(>->closed_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i915_vma_release(struct kref *ref)
|
void i915_vma_release(struct kref *ref)
|
||||||
@ -1641,6 +1641,7 @@ static void force_unbind(struct i915_vma *vma)
|
|||||||
static void release_references(struct i915_vma *vma)
|
static void release_references(struct i915_vma *vma)
|
||||||
{
|
{
|
||||||
struct drm_i915_gem_object *obj = vma->obj;
|
struct drm_i915_gem_object *obj = vma->obj;
|
||||||
|
struct intel_gt *gt = vma->vm->gt;
|
||||||
|
|
||||||
GEM_BUG_ON(i915_vma_is_active(vma));
|
GEM_BUG_ON(i915_vma_is_active(vma));
|
||||||
|
|
||||||
@ -1650,7 +1651,9 @@ static void release_references(struct i915_vma *vma)
|
|||||||
rb_erase(&vma->obj_node, &obj->vma.tree);
|
rb_erase(&vma->obj_node, &obj->vma.tree);
|
||||||
spin_unlock(&obj->vma.lock);
|
spin_unlock(&obj->vma.lock);
|
||||||
|
|
||||||
|
spin_lock_irq(>->closed_lock);
|
||||||
__i915_vma_remove_closed(vma);
|
__i915_vma_remove_closed(vma);
|
||||||
|
spin_unlock_irq(>->closed_lock);
|
||||||
|
|
||||||
__i915_vma_put(vma);
|
__i915_vma_put(vma);
|
||||||
}
|
}
|
||||||
|
@ -580,12 +580,6 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
|
|||||||
dp->dp_display.connector_type, state);
|
dp->dp_display.connector_type, state);
|
||||||
mutex_unlock(&dp->event_mutex);
|
mutex_unlock(&dp->event_mutex);
|
||||||
|
|
||||||
/*
|
|
||||||
* add fail safe mode outside event_mutex scope
|
|
||||||
* to avoid potiential circular lock with drm thread
|
|
||||||
*/
|
|
||||||
dp_panel_add_fail_safe_mode(dp->dp_display.connector);
|
|
||||||
|
|
||||||
/* uevent will complete connection part */
|
/* uevent will complete connection part */
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
@ -151,15 +151,6 @@ static int dp_panel_update_modes(struct drm_connector *connector,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_panel_add_fail_safe_mode(struct drm_connector *connector)
|
|
||||||
{
|
|
||||||
/* fail safe edid */
|
|
||||||
mutex_lock(&connector->dev->mode_config.mutex);
|
|
||||||
if (drm_add_modes_noedid(connector, 640, 480))
|
|
||||||
drm_set_preferred_mode(connector, 640, 480);
|
|
||||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
||||||
struct drm_connector *connector)
|
struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
@ -215,8 +206,6 @@ int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
|||||||
rc = -ETIMEDOUT;
|
rc = -ETIMEDOUT;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
dp_panel_add_fail_safe_mode(connector);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (panel->aux_cfg_update_done) {
|
if (panel->aux_cfg_update_done) {
|
||||||
|
@ -59,7 +59,6 @@ int dp_panel_init_panel_info(struct dp_panel *dp_panel);
|
|||||||
int dp_panel_deinit(struct dp_panel *dp_panel);
|
int dp_panel_deinit(struct dp_panel *dp_panel);
|
||||||
int dp_panel_timing_cfg(struct dp_panel *dp_panel);
|
int dp_panel_timing_cfg(struct dp_panel *dp_panel);
|
||||||
void dp_panel_dump_regs(struct dp_panel *dp_panel);
|
void dp_panel_dump_regs(struct dp_panel *dp_panel);
|
||||||
void dp_panel_add_fail_safe_mode(struct drm_connector *connector);
|
|
||||||
int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
||||||
struct drm_connector *connector);
|
struct drm_connector *connector);
|
||||||
u32 dp_panel_get_mode_bpp(struct dp_panel *dp_panel, u32 mode_max_bpp,
|
u32 dp_panel_get_mode_bpp(struct dp_panel *dp_panel, u32 mode_max_bpp,
|
||||||
|
@ -46,8 +46,9 @@ static bool
|
|||||||
nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE],
|
nouveau_get_backlight_name(char backlight_name[BL_NAME_SIZE],
|
||||||
struct nouveau_backlight *bl)
|
struct nouveau_backlight *bl)
|
||||||
{
|
{
|
||||||
const int nb = ida_simple_get(&bl_ida, 0, 0, GFP_KERNEL);
|
const int nb = ida_alloc_max(&bl_ida, 99, GFP_KERNEL);
|
||||||
if (nb < 0 || nb >= 100)
|
|
||||||
|
if (nb < 0)
|
||||||
return false;
|
return false;
|
||||||
if (nb > 0)
|
if (nb > 0)
|
||||||
snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb);
|
snprintf(backlight_name, BL_NAME_SIZE, "nv_backlight%d", nb);
|
||||||
@ -414,7 +415,7 @@ nouveau_backlight_init(struct drm_connector *connector)
|
|||||||
nv_encoder, ops, &props);
|
nv_encoder, ops, &props);
|
||||||
if (IS_ERR(bl->dev)) {
|
if (IS_ERR(bl->dev)) {
|
||||||
if (bl->id >= 0)
|
if (bl->id >= 0)
|
||||||
ida_simple_remove(&bl_ida, bl->id);
|
ida_free(&bl_ida, bl->id);
|
||||||
ret = PTR_ERR(bl->dev);
|
ret = PTR_ERR(bl->dev);
|
||||||
goto fail_alloc;
|
goto fail_alloc;
|
||||||
}
|
}
|
||||||
@ -442,7 +443,7 @@ nouveau_backlight_fini(struct drm_connector *connector)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (bl->id >= 0)
|
if (bl->id >= 0)
|
||||||
ida_simple_remove(&bl_ida, bl->id);
|
ida_free(&bl_ida, bl->id);
|
||||||
|
|
||||||
backlight_device_unregister(bl->dev);
|
backlight_device_unregister(bl->dev);
|
||||||
nv_conn->backlight = NULL;
|
nv_conn->backlight = NULL;
|
||||||
|
@ -123,7 +123,7 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
|
|||||||
|
|
||||||
mutex_init(&tdev->iommu.mutex);
|
mutex_init(&tdev->iommu.mutex);
|
||||||
|
|
||||||
if (iommu_present(&platform_bus_type)) {
|
if (device_iommu_mapped(dev)) {
|
||||||
tdev->iommu.domain = iommu_domain_alloc(&platform_bus_type);
|
tdev->iommu.domain = iommu_domain_alloc(&platform_bus_type);
|
||||||
if (!tdev->iommu.domain)
|
if (!tdev->iommu.domain)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include <drm/drm_scdc_helper.h>
|
#include <drm/drm_scdc_helper.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/component.h>
|
#include <linux/component.h>
|
||||||
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user