Merge tag 'v5.2.47' into v5.2/standard/base

This is the 5.2.47 stable release
This commit is contained in:
Bruce Ashfield 2020-07-12 15:00:24 -04:00
commit ea5ea4dc89
216 changed files with 1567 additions and 903 deletions

View File

@ -121,12 +121,6 @@ Proportional weight policy files
dev weight dev weight
8:16 300 8:16 300
- blkio.leaf_weight[_device]
- Equivalents of blkio.weight[_device] for the purpose of
deciding how much weight tasks in the given cgroup has while
competing with the cgroup's child cgroups. For details,
please refer to Documentation/block/cfq-iosched.txt.
- blkio.time - blkio.time
- disk time allocated to cgroup per device in milliseconds. First - disk time allocated to cgroup per device in milliseconds. First
two fields specify the major and minor number of the device and two fields specify the major and minor number of the device and

View File

@ -25,6 +25,7 @@ Core utilities
librs librs
genalloc genalloc
errseq errseq
packing
printk-formats printk-formats
circular-buffers circular-buffers
generic-radix-tree generic-radix-tree

View File

@ -30,6 +30,7 @@ The solution
------------ ------------
This API deals with 2 basic operations: This API deals with 2 basic operations:
- Packing a CPU-usable number into a memory buffer (with hardware - Packing a CPU-usable number into a memory buffer (with hardware
constraints/quirks) constraints/quirks)
- Unpacking a memory buffer (which has hardware constraints/quirks) - Unpacking a memory buffer (which has hardware constraints/quirks)
@ -49,10 +50,12 @@ What the examples show is where the logical bytes and bits sit.
1. Normally (no quirks), we would do it like this: 1. Normally (no quirks), we would do it like this:
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 ::
7 6 5 4
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
3 2 1 0 7 6 5 4
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
3 2 1 0
That is, the MSByte (7) of the CPU-usable u64 sits at memory offset 0, and the That is, the MSByte (7) of the CPU-usable u64 sits at memory offset 0, and the
LSByte (0) of the u64 sits at memory offset 7. LSByte (0) of the u64 sits at memory offset 7.
@ -63,10 +66,12 @@ comments as "logical" notation.
2. If QUIRK_MSB_ON_THE_RIGHT is set, we do it like this: 2. If QUIRK_MSB_ON_THE_RIGHT is set, we do it like this:
56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39 ::
7 6 5 4
24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39
3 2 1 0 7 6 5 4
24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7
3 2 1 0
That is, QUIRK_MSB_ON_THE_RIGHT does not affect byte positioning, but That is, QUIRK_MSB_ON_THE_RIGHT does not affect byte positioning, but
inverts bit offsets inside a byte. inverts bit offsets inside a byte.
@ -74,10 +79,12 @@ inverts bit offsets inside a byte.
3. If QUIRK_LITTLE_ENDIAN is set, we do it like this: 3. If QUIRK_LITTLE_ENDIAN is set, we do it like this:
39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56 ::
4 5 6 7
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56
0 1 2 3 4 5 6 7
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
0 1 2 3
Therefore, QUIRK_LITTLE_ENDIAN means that inside the memory region, every Therefore, QUIRK_LITTLE_ENDIAN means that inside the memory region, every
byte from each 4-byte word is placed at its mirrored position compared to byte from each 4-byte word is placed at its mirrored position compared to
@ -86,18 +93,22 @@ the boundary of that word.
4. If QUIRK_MSB_ON_THE_RIGHT and QUIRK_LITTLE_ENDIAN are both set, we do it 4. If QUIRK_MSB_ON_THE_RIGHT and QUIRK_LITTLE_ENDIAN are both set, we do it
like this: like this:
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ::
4 5 6 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 1 2 3
5. If just QUIRK_LSW32_IS_FIRST is set, we do it like this: 5. If just QUIRK_LSW32_IS_FIRST is set, we do it like this:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ::
3 2 1 0
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
7 6 5 4
In this case the 8 byte memory region is interpreted as follows: first In this case the 8 byte memory region is interpreted as follows: first
4 bytes correspond to the least significant 4-byte word, next 4 bytes to 4 bytes correspond to the least significant 4-byte word, next 4 bytes to
@ -107,28 +118,34 @@ the more significant 4-byte word.
6. If QUIRK_LSW32_IS_FIRST and QUIRK_MSB_ON_THE_RIGHT are set, we do it like 6. If QUIRK_LSW32_IS_FIRST and QUIRK_MSB_ON_THE_RIGHT are set, we do it like
this: this:
24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 ::
3 2 1 0
56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39 24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7
7 6 5 4 3 2 1 0
56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39
7 6 5 4
7. If QUIRK_LSW32_IS_FIRST and QUIRK_LITTLE_ENDIAN are set, it looks like 7. If QUIRK_LSW32_IS_FIRST and QUIRK_LITTLE_ENDIAN are set, it looks like
this: this:
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 ::
0 1 2 3
39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
4 5 6 7 0 1 2 3
39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56
4 5 6 7
8. If QUIRK_LSW32_IS_FIRST, QUIRK_LITTLE_ENDIAN and QUIRK_MSB_ON_THE_RIGHT 8. If QUIRK_LSW32_IS_FIRST, QUIRK_LITTLE_ENDIAN and QUIRK_MSB_ON_THE_RIGHT
are set, it looks like this: are set, it looks like this:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ::
0 1 2 3
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
4 5 6 7 0 1 2 3
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
4 5 6 7
We always think of our offsets as if there were no quirk, and we translate We always think of our offsets as if there were no quirk, and we translate

View File

@ -63,7 +63,11 @@ properties:
description: description:
Set this flag to force EHCI reset after resume. Set this flag to force EHCI reset after resume.
phys: true phys:
description: PHY specifier for the USB PHY
phy-names:
const: usb
required: required:
- compatible - compatible
@ -74,7 +78,7 @@ additionalProperties: false
examples: examples:
- | - |
ehci@e0000300 { usb@e0000300 {
compatible = "ibm,usb-ehci-440epx", "generic-ehci"; compatible = "ibm,usb-ehci-440epx", "generic-ehci";
interrupt-parent = <&UIC0>; interrupt-parent = <&UIC0>;
interrupts = <0x1a 4>; interrupts = <0x1a 4>;

View File

@ -67,7 +67,11 @@ properties:
description: description:
Overrides the detected port count Overrides the detected port count
phys: true phys:
description: PHY specifier for the USB PHY
phy-names:
const: usb
required: required:
- compatible - compatible
@ -84,6 +88,7 @@ examples:
interrupts = <64>; interrupts = <64>;
clocks = <&usb_clk 6>, <&ahb_gates 2>; clocks = <&usb_clk 6>, <&ahb_gates 2>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
}; };
... ...

View File

@ -32,7 +32,7 @@ Required properties:
"mcu_ck": mcu_bus clock for register access, "mcu_ck": mcu_bus clock for register access,
"dma_ck": dma_bus clock for data transfer by DMA "dma_ck": dma_bus clock for data transfer by DMA
- phys : see usb-hcd.txt in the current directory - phys : see usb-hcd.yaml in the current directory
Optional properties: Optional properties:
- wakeup-source : enable USB remote wakeup; - wakeup-source : enable USB remote wakeup;
@ -52,7 +52,7 @@ Optional properties:
See: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt See: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
- imod-interval-ns: default interrupt moderation interval is 5000ns - imod-interval-ns: default interrupt moderation interval is 5000ns
additionally the properties from usb-hcd.txt (in the current directory) are additionally the properties from usb-hcd.yaml (in the current directory) are
supported. supported.
Example: Example:

View File

@ -17,7 +17,7 @@ Required properties:
- clock-names : must contain "sys_ck" for clock of controller, - clock-names : must contain "sys_ck" for clock of controller,
the following clocks are optional: the following clocks are optional:
"ref_ck", "mcu_ck" and "dam_ck"; "ref_ck", "mcu_ck" and "dam_ck";
- phys : see usb-hcd.txt in the current directory - phys : see usb-hcd.yaml in the current directory
- dr_mode : should be one of "host", "peripheral" or "otg", - dr_mode : should be one of "host", "peripheral" or "otg",
refer to usb/generic.txt refer to usb/generic.txt
@ -53,7 +53,7 @@ Optional properties:
- mediatek,u3p-dis-msk : mask to disable u3ports, bit0 for u3port0, - mediatek,u3p-dis-msk : mask to disable u3ports, bit0 for u3port0,
bit1 for u3port1, ... etc; bit1 for u3port1, ... etc;
additionally the properties from usb-hcd.txt (in the current directory) are additionally the properties from usb-hcd.yaml (in the current directory) are
supported. supported.
Sub-nodes: Sub-nodes:

View File

@ -18,8 +18,13 @@ properties:
description: description:
List of all the USB PHYs on this HCD List of all the USB PHYs on this HCD
phy-names:
description:
Name specifier for the USB PHY
examples: examples:
- | - |
usb { usb {
phys = <&usb2_phy1>, <&usb3_phy1>; phys = <&usb2_phy1>, <&usb3_phy1>;
phy-names = "usb";
}; };

View File

@ -6,7 +6,7 @@ Required properties:
- reg : Should contain 1 register ranges(address and length) - reg : Should contain 1 register ranges(address and length)
- interrupts : UHCI controller interrupt - interrupts : UHCI controller interrupt
additionally the properties from usb-hcd.txt (in the current directory) are additionally the properties from usb-hcd.yaml (in the current directory) are
supported. supported.
Example: Example:

View File

@ -41,9 +41,9 @@ Optional properties:
- usb3-lpm-capable: determines if platform is USB3 LPM capable - usb3-lpm-capable: determines if platform is USB3 LPM capable
- quirk-broken-port-ped: set if the controller has broken port disable mechanism - quirk-broken-port-ped: set if the controller has broken port disable mechanism
- imod-interval-ns: default interrupt moderation interval is 5000ns - imod-interval-ns: default interrupt moderation interval is 5000ns
- phys : see usb-hcd.txt in the current directory - phys : see usb-hcd.yaml in the current directory
additionally the properties from usb-hcd.txt (in the current directory) are additionally the properties from usb-hcd.yaml (in the current directory) are
supported. supported.

View File

@ -159,11 +159,15 @@ Byte sequences
distance = 16384 + (H << 14) + D distance = 16384 + (H << 14) + D
state = S (copy S literals after this block) state = S (copy S literals after this block)
End of stream is reached if distance == 16384 End of stream is reached if distance == 16384
In version 1 only, to prevent ambiguity with the RLE case when
((distance & 0x803f) == 0x803f) && (261 <= length <= 264), the
compressor must not emit block copies where distance and length
meet these conditions.
In version 1 only, this instruction is also used to encode a run of In version 1 only, this instruction is also used to encode a run of
zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1. zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1.
In this case, it is followed by a fourth byte, X. In this case, it is followed by a fourth byte, X.
run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4. run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4
0 0 1 L L L L L (32..63) 0 0 1 L L L L L (32..63)
Copy of small block within 16kB distance (preferably less than 34B) Copy of small block within 16kB distance (preferably less than 34B)

View File

@ -216,8 +216,6 @@ alc298-dell-aio
ALC298 fixups on Dell AIO machines ALC298 fixups on Dell AIO machines
alc275-dell-xps alc275-dell-xps
ALC275 fixups on Dell XPS models ALC275 fixups on Dell XPS models
alc256-dell-xps13
ALC256 fixups on Dell XPS13
lenovo-spk-noise lenovo-spk-noise
Workaround for speaker noise on Lenovo machines Workaround for speaker noise on Lenovo machines
lenovo-hotkey lenovo-hotkey

View File

@ -715,7 +715,7 @@ ALTERA SYSTEM MANAGER DRIVER
M: Thor Thayer <thor.thayer@linux.intel.com> M: Thor Thayer <thor.thayer@linux.intel.com>
S: Maintained S: Maintained
F: drivers/mfd/altera-sysmgr.c F: drivers/mfd/altera-sysmgr.c
F: include/linux/mfd/altera-sysgmr.h F: include/linux/mfd/altera-sysmgr.h
ALTERA SYSTEM RESOURCE DRIVER FOR ARRIA10 DEVKIT ALTERA SYSTEM RESOURCE DRIVER FOR ARRIA10 DEVKIT
M: Thor Thayer <thor.thayer@linux.intel.com> M: Thor Thayer <thor.thayer@linux.intel.com>
@ -5991,7 +5991,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
M: Heiner Kallweit <hkallweit1@gmail.com> M: Heiner Kallweit <hkallweit1@gmail.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/ABI/testing/sysfs-bus-mdio F: Documentation/ABI/testing/sysfs-class-net-phydev
F: Documentation/devicetree/bindings/net/mdio* F: Documentation/devicetree/bindings/net/mdio*
F: Documentation/networking/phy.rst F: Documentation/networking/phy.rst
F: drivers/net/phy/ F: drivers/net/phy/
@ -11884,7 +11884,7 @@ L: netdev@vger.kernel.org
S: Supported S: Supported
F: lib/packing.c F: lib/packing.c
F: include/linux/packing.h F: include/linux/packing.h
F: Documentation/packing.txt F: Documentation/core-api/packing.rst
PADATA PARALLEL EXECUTION MECHANISM PADATA PARALLEL EXECUTION MECHANISM
M: Steffen Klassert <steffen.klassert@secunet.com> M: Steffen Klassert <steffen.klassert@secunet.com>
@ -17517,14 +17517,6 @@ S: Maintained
F: mm/zpool.c F: mm/zpool.c
F: include/linux/zpool.h F: include/linux/zpool.h
ZR36067 VIDEO FOR LINUX DRIVER
L: mjpeg-users@lists.sourceforge.net
L: linux-media@vger.kernel.org
W: http://mjpeg.sourceforge.net/driver-zoran/
T: hg https://linuxtv.org/hg/v4l-dvb
S: Odd Fixes
F: drivers/staging/media/zoran/
ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
M: Minchan Kim <minchan@kernel.org> M: Minchan Kim <minchan@kernel.org>
M: Nitin Gupta <ngupta@vflare.org> M: Nitin Gupta <ngupta@vflare.org>

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 2 PATCHLEVEL = 2
SUBLEVEL = 46 SUBLEVEL = 47
EXTRAVERSION = EXTRAVERSION =
NAME = Bobtail Squid NAME = Bobtail Squid

View File

@ -125,8 +125,6 @@
bus-width = <8>; bus-width = <8>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdmmc0_default>; pinctrl-0 = <&pinctrl_sdmmc0_default>;
non-removable;
mmc-ddr-1_8v;
status = "okay"; status = "okay";
}; };

View File

@ -520,6 +520,7 @@
interrupts = <39>; interrupts = <39>;
clocks = <&ccu CLK_AHB_EHCI0>; clocks = <&ccu CLK_AHB_EHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -529,6 +530,7 @@
interrupts = <64>; interrupts = <64>;
clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>; clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -608,6 +610,7 @@
interrupts = <40>; interrupts = <40>;
clocks = <&ccu CLK_AHB_EHCI1>; clocks = <&ccu CLK_AHB_EHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -617,6 +620,7 @@
interrupts = <65>; interrupts = <65>;
clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>; clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -391,6 +391,7 @@
interrupts = <39>; interrupts = <39>;
clocks = <&ccu CLK_AHB_EHCI>; clocks = <&ccu CLK_AHB_EHCI>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -400,6 +401,7 @@
interrupts = <40>; interrupts = <40>;
clocks = <&ccu CLK_USB_OHCI>, <&ccu CLK_AHB_OHCI>; clocks = <&ccu CLK_USB_OHCI>, <&ccu CLK_AHB_OHCI>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -543,6 +543,7 @@
clocks = <&ccu CLK_AHB1_EHCI0>; clocks = <&ccu CLK_AHB1_EHCI0>;
resets = <&ccu RST_AHB1_EHCI0>; resets = <&ccu RST_AHB1_EHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -553,6 +554,7 @@
clocks = <&ccu CLK_AHB1_OHCI0>, <&ccu CLK_USB_OHCI0>; clocks = <&ccu CLK_AHB1_OHCI0>, <&ccu CLK_USB_OHCI0>;
resets = <&ccu RST_AHB1_OHCI0>; resets = <&ccu RST_AHB1_OHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -563,6 +565,7 @@
clocks = <&ccu CLK_AHB1_EHCI1>; clocks = <&ccu CLK_AHB1_EHCI1>;
resets = <&ccu RST_AHB1_EHCI1>; resets = <&ccu RST_AHB1_EHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -573,6 +576,7 @@
clocks = <&ccu CLK_AHB1_OHCI1>, <&ccu CLK_USB_OHCI1>; clocks = <&ccu CLK_AHB1_OHCI1>, <&ccu CLK_USB_OHCI1>;
resets = <&ccu RST_AHB1_OHCI1>; resets = <&ccu RST_AHB1_OHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -612,6 +612,7 @@
interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_AHB_EHCI0>; clocks = <&ccu CLK_AHB_EHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -621,6 +622,7 @@
interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>; clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -703,6 +705,7 @@
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_AHB_EHCI1>; clocks = <&ccu CLK_AHB_EHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -712,6 +715,7 @@
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>; clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -307,6 +307,7 @@
clocks = <&ccu CLK_BUS_EHCI>; clocks = <&ccu CLK_BUS_EHCI>;
resets = <&ccu RST_BUS_EHCI>; resets = <&ccu RST_BUS_EHCI>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -317,6 +318,7 @@
clocks = <&ccu CLK_BUS_OHCI>, <&ccu CLK_USB_OHCI>; clocks = <&ccu CLK_BUS_OHCI>, <&ccu CLK_USB_OHCI>;
resets = <&ccu RST_BUS_OHCI>; resets = <&ccu RST_BUS_OHCI>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -632,6 +632,7 @@
clocks = <&ccu CLK_BUS_EHCI0>; clocks = <&ccu CLK_BUS_EHCI0>;
resets = <&ccu RST_BUS_EHCI0>; resets = <&ccu RST_BUS_EHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -643,6 +644,7 @@
clocks = <&ccu CLK_BUS_OHCI0>, <&ccu CLK_USB_OHCI0>; clocks = <&ccu CLK_BUS_OHCI0>, <&ccu CLK_USB_OHCI0>;
resets = <&ccu RST_BUS_OHCI0>; resets = <&ccu RST_BUS_OHCI0>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -654,6 +656,7 @@
clocks = <&ccu CLK_BUS_EHCI1>; clocks = <&ccu CLK_BUS_EHCI1>;
resets = <&ccu RST_BUS_EHCI1>; resets = <&ccu RST_BUS_EHCI1>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -283,6 +283,7 @@
clocks = <&ccu CLK_BUS_EHCI1>; clocks = <&ccu CLK_BUS_EHCI1>;
resets = <&ccu RST_BUS_EHCI1>; resets = <&ccu RST_BUS_EHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -294,6 +295,7 @@
<&ccu CLK_USB_OHCI1>; <&ccu CLK_USB_OHCI1>;
resets = <&ccu RST_BUS_OHCI1>; resets = <&ccu RST_BUS_OHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -304,6 +306,7 @@
clocks = <&ccu CLK_BUS_EHCI2>; clocks = <&ccu CLK_BUS_EHCI2>;
resets = <&ccu RST_BUS_EHCI2>; resets = <&ccu RST_BUS_EHCI2>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -315,6 +318,7 @@
<&ccu CLK_USB_OHCI2>; <&ccu CLK_USB_OHCI2>;
resets = <&ccu RST_BUS_OHCI2>; resets = <&ccu RST_BUS_OHCI2>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -342,6 +342,7 @@
clocks = <&usb_clocks CLK_BUS_HCI0>; clocks = <&usb_clocks CLK_BUS_HCI0>;
resets = <&usb_clocks RST_USB0_HCI>; resets = <&usb_clocks RST_USB0_HCI>;
phys = <&usbphy1>; phys = <&usbphy1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -353,6 +354,7 @@
<&usb_clocks CLK_USB_OHCI0>; <&usb_clocks CLK_USB_OHCI0>;
resets = <&usb_clocks RST_USB0_HCI>; resets = <&usb_clocks RST_USB0_HCI>;
phys = <&usbphy1>; phys = <&usbphy1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -374,6 +376,7 @@
clocks = <&usb_clocks CLK_BUS_HCI1>; clocks = <&usb_clocks CLK_BUS_HCI1>;
resets = <&usb_clocks RST_USB1_HCI>; resets = <&usb_clocks RST_USB1_HCI>;
phys = <&usbphy2>; phys = <&usbphy2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -403,6 +406,7 @@
clocks = <&usb_clocks CLK_BUS_HCI2>; clocks = <&usb_clocks CLK_BUS_HCI2>;
resets = <&usb_clocks RST_USB2_HCI>; resets = <&usb_clocks RST_USB2_HCI>;
phys = <&usbphy3>; phys = <&usbphy3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -414,6 +418,7 @@
<&usb_clocks CLK_USB_OHCI2>; <&usb_clocks CLK_USB_OHCI2>;
resets = <&usb_clocks RST_USB2_HCI>; resets = <&usb_clocks RST_USB2_HCI>;
phys = <&usbphy3>; phys = <&usbphy3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -304,6 +304,7 @@
clocks = <&ccu CLK_BUS_EHCI1>, <&ccu CLK_BUS_OHCI1>; clocks = <&ccu CLK_BUS_EHCI1>, <&ccu CLK_BUS_OHCI1>;
resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>; resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -315,6 +316,7 @@
<&ccu CLK_USB_OHCI1>; <&ccu CLK_USB_OHCI1>;
resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>; resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -325,6 +327,7 @@
clocks = <&ccu CLK_BUS_EHCI2>, <&ccu CLK_BUS_OHCI2>; clocks = <&ccu CLK_BUS_EHCI2>, <&ccu CLK_BUS_OHCI2>;
resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>; resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -336,6 +339,7 @@
<&ccu CLK_USB_OHCI2>; <&ccu CLK_USB_OHCI2>;
resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>; resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>;
phys = <&usbphy 2>; phys = <&usbphy 2>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -346,6 +350,7 @@
clocks = <&ccu CLK_BUS_EHCI3>, <&ccu CLK_BUS_OHCI3>; clocks = <&ccu CLK_BUS_EHCI3>, <&ccu CLK_BUS_OHCI3>;
resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>; resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>;
phys = <&usbphy 3>; phys = <&usbphy 3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -357,6 +362,7 @@
<&ccu CLK_USB_OHCI3>; <&ccu CLK_USB_OHCI3>;
resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>; resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>;
phys = <&usbphy 3>; phys = <&usbphy 3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -364,6 +364,7 @@ CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m
CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m
CONFIG_DRM_TILCDC=m CONFIG_DRM_TILCDC=m
CONFIG_DRM_PANEL_SIMPLE=m CONFIG_DRM_PANEL_SIMPLE=m
CONFIG_DRM_TI_TFP410=m
CONFIG_FB=y CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y CONFIG_FIRMWARE_EDID=y
CONFIG_FB_MODE_HELPERS=y CONFIG_FB_MODE_HELPERS=y

View File

@ -219,8 +219,8 @@ static struct undef_hook arm_break_hook = {
}; };
static struct undef_hook thumb_break_hook = { static struct undef_hook thumb_break_hook = {
.instr_mask = 0xffff, .instr_mask = 0xffffffff,
.instr_val = 0xde01, .instr_val = 0x0000de01,
.cpsr_mask = PSR_T_BIT, .cpsr_mask = PSR_T_BIT,
.cpsr_val = PSR_T_BIT, .cpsr_val = PSR_T_BIT,
.fn = break_trap, .fn = break_trap,

View File

@ -104,6 +104,7 @@
&ehci0 { &ehci0 {
phys = <&usbphy 0>; phys = <&usbphy 0>;
phy-names = "usb";
status = "okay"; status = "okay";
}; };
@ -150,6 +151,7 @@
&ohci0 { &ohci0 {
phys = <&usbphy 0>; phys = <&usbphy 0>;
phy-names = "usb";
status = "okay"; status = "okay";
}; };

View File

@ -553,6 +553,7 @@
resets = <&ccu RST_BUS_OHCI1>, resets = <&ccu RST_BUS_OHCI1>,
<&ccu RST_BUS_EHCI1>; <&ccu RST_BUS_EHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -564,6 +565,7 @@
<&ccu CLK_USB_OHCI1>; <&ccu CLK_USB_OHCI1>;
resets = <&ccu RST_BUS_OHCI1>; resets = <&ccu RST_BUS_OHCI1>;
phys = <&usbphy 1>; phys = <&usbphy 1>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -465,6 +465,7 @@
resets = <&ccu RST_BUS_OHCI3>, resets = <&ccu RST_BUS_OHCI3>,
<&ccu RST_BUS_EHCI3>; <&ccu RST_BUS_EHCI3>;
phys = <&usb2phy 3>; phys = <&usb2phy 3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
@ -476,6 +477,7 @@
<&ccu CLK_USB_OHCI3>; <&ccu CLK_USB_OHCI3>;
resets = <&ccu RST_BUS_OHCI3>; resets = <&ccu RST_BUS_OHCI3>;
phys = <&usb2phy 3>; phys = <&usb2phy 3>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };

View File

@ -883,6 +883,8 @@
<&cpg CPG_CORE R8A774A1_CLK_CANFD>, <&cpg CPG_CORE R8A774A1_CLK_CANFD>,
<&can_clk>; <&can_clk>;
clock-names = "clkp1", "clkp2", "can_clk"; clock-names = "clkp1", "clkp2", "can_clk";
assigned-clocks = <&cpg CPG_CORE R8A774A1_CLK_CANFD>;
assigned-clock-rates = <40000000>;
power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>; power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
resets = <&cpg 916>; resets = <&cpg 916>;
status = "disabled"; status = "disabled";
@ -897,6 +899,8 @@
<&cpg CPG_CORE R8A774A1_CLK_CANFD>, <&cpg CPG_CORE R8A774A1_CLK_CANFD>,
<&can_clk>; <&can_clk>;
clock-names = "clkp1", "clkp2", "can_clk"; clock-names = "clkp1", "clkp2", "can_clk";
assigned-clocks = <&cpg CPG_CORE R8A774A1_CLK_CANFD>;
assigned-clock-rates = <40000000>;
power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>; power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
resets = <&cpg 915>; resets = <&cpg 915>;
status = "disabled"; status = "disabled";

View File

@ -973,6 +973,8 @@
<&cpg CPG_CORE R8A774C0_CLK_CANFD>, <&cpg CPG_CORE R8A774C0_CLK_CANFD>,
<&can_clk>; <&can_clk>;
clock-names = "clkp1", "clkp2", "can_clk"; clock-names = "clkp1", "clkp2", "can_clk";
assigned-clocks = <&cpg CPG_CORE R8A774C0_CLK_CANFD>;
assigned-clock-rates = <40000000>;
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>; power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
resets = <&cpg 916>; resets = <&cpg 916>;
status = "disabled"; status = "disabled";
@ -987,6 +989,8 @@
<&cpg CPG_CORE R8A774C0_CLK_CANFD>, <&cpg CPG_CORE R8A774C0_CLK_CANFD>,
<&can_clk>; <&can_clk>;
clock-names = "clkp1", "clkp2", "can_clk"; clock-names = "clkp1", "clkp2", "can_clk";
assigned-clocks = <&cpg CPG_CORE R8A774C0_CLK_CANFD>;
assigned-clock-rates = <40000000>;
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>; power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
resets = <&cpg 915>; resets = <&cpg 915>;
status = "disabled"; status = "disabled";

View File

@ -97,12 +97,6 @@ static inline void vcpu_ptrauth_disable(struct kvm_vcpu *vcpu)
vcpu->arch.hcr_el2 &= ~(HCR_API | HCR_APK); vcpu->arch.hcr_el2 &= ~(HCR_API | HCR_APK);
} }
static inline void vcpu_ptrauth_setup_lazy(struct kvm_vcpu *vcpu)
{
if (vcpu_has_ptrauth(vcpu))
vcpu_ptrauth_disable(vcpu);
}
static inline unsigned long vcpu_get_vsesr(struct kvm_vcpu *vcpu) static inline unsigned long vcpu_get_vsesr(struct kvm_vcpu *vcpu)
{ {
return vcpu->arch.vsesr_el2; return vcpu->arch.vsesr_el2;

View File

@ -392,8 +392,10 @@ void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg);
* CP14 and CP15 live in the same array, as they are backed by the * CP14 and CP15 live in the same array, as they are backed by the
* same system registers. * same system registers.
*/ */
#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r)]) #define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r)])
#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])
#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])
struct kvm_vm_stat { struct kvm_vm_stat {
ulong remote_tlb_flush; ulong remote_tlb_flush;

View File

@ -173,11 +173,16 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
}; };
static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = { static const struct arm64_ftr_bits ftr_id_aa64zfr0[] = {
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SM4_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SHA3_SHIFT, 4, 0), FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SM4_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_BITPERM_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_AES_SHIFT, 4, 0), FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SHA3_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SVEVER_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_BITPERM_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_AES_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SVEVER_SHIFT, 4, 0),
ARM64_FTR_END, ARM64_FTR_END,
}; };

View File

@ -162,31 +162,16 @@ static int handle_sve(struct kvm_vcpu *vcpu, struct kvm_run *run)
return 1; return 1;
} }
#define __ptrauth_save_key(regs, key) \
({ \
regs[key ## KEYLO_EL1] = read_sysreg_s(SYS_ ## key ## KEYLO_EL1); \
regs[key ## KEYHI_EL1] = read_sysreg_s(SYS_ ## key ## KEYHI_EL1); \
})
/* /*
* Handle the guest trying to use a ptrauth instruction, or trying to access a * Handle the guest trying to use a ptrauth instruction, or trying to access a
* ptrauth register. * ptrauth register.
*/ */
void kvm_arm_vcpu_ptrauth_trap(struct kvm_vcpu *vcpu) void kvm_arm_vcpu_ptrauth_trap(struct kvm_vcpu *vcpu)
{ {
struct kvm_cpu_context *ctxt; if (vcpu_has_ptrauth(vcpu))
if (vcpu_has_ptrauth(vcpu)) {
vcpu_ptrauth_enable(vcpu); vcpu_ptrauth_enable(vcpu);
ctxt = vcpu->arch.host_cpu_context; else
__ptrauth_save_key(ctxt->sys_regs, APIA);
__ptrauth_save_key(ctxt->sys_regs, APIB);
__ptrauth_save_key(ctxt->sys_regs, APDA);
__ptrauth_save_key(ctxt->sys_regs, APDB);
__ptrauth_save_key(ctxt->sys_regs, APGA);
} else {
kvm_inject_undefined(vcpu); kvm_inject_undefined(vcpu);
}
} }
/* /*

View File

@ -1276,10 +1276,16 @@ static bool access_clidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
static bool access_csselr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, static bool access_csselr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
const struct sys_reg_desc *r) const struct sys_reg_desc *r)
{ {
int reg = r->reg;
/* See the 32bit mapping in kvm_host.h */
if (p->is_aarch32)
reg = r->reg / 2;
if (p->is_write) if (p->is_write)
vcpu_write_sys_reg(vcpu, p->regval, r->reg); vcpu_write_sys_reg(vcpu, p->regval, reg);
else else
p->regval = vcpu_read_sys_reg(vcpu, r->reg); p->regval = vcpu_read_sys_reg(vcpu, reg);
return true; return true;
} }

View File

@ -13,6 +13,8 @@
#define LSAVE_A1 28 #define LSAVE_A1 28
#define LSAVE_A2 32 #define LSAVE_A2 32
#define LSAVE_A3 36 #define LSAVE_A3 36
#define LSAVE_A4 40
#define LSAVE_A5 44
#define KSPTOUSP #define KSPTOUSP
#define USPTOKSP #define USPTOKSP

View File

@ -162,8 +162,10 @@ csky_syscall_trace:
ldw a3, (sp, LSAVE_A3) ldw a3, (sp, LSAVE_A3)
#if defined(__CSKYABIV2__) #if defined(__CSKYABIV2__)
subi sp, 8 subi sp, 8
stw r5, (sp, 0x4) ldw r9, (sp, LSAVE_A4)
stw r4, (sp, 0x0) stw r9, (sp, 0x0)
ldw r9, (sp, LSAVE_A5)
stw r9, (sp, 0x4)
#else #else
ldw r6, (sp, LSAVE_A4) ldw r6, (sp, LSAVE_A4)
ldw r7, (sp, LSAVE_A5) ldw r7, (sp, LSAVE_A5)

View File

@ -274,8 +274,12 @@ enum emulation_result {
#define MIPS3_PG_SHIFT 6 #define MIPS3_PG_SHIFT 6
#define MIPS3_PG_FRAME 0x3fffffc0 #define MIPS3_PG_FRAME 0x3fffffc0
#if defined(CONFIG_64BIT)
#define VPN2_MASK GENMASK(cpu_vmbits - 1, 13)
#else
#define VPN2_MASK 0xffffe000 #define VPN2_MASK 0xffffe000
#define KVM_ENTRYHI_ASID MIPS_ENTRYHI_ASID #endif
#define KVM_ENTRYHI_ASID cpu_asid_mask(&boot_cpu_data)
#define TLB_IS_GLOBAL(x) ((x).tlb_lo[0] & (x).tlb_lo[1] & ENTRYLO_G) #define TLB_IS_GLOBAL(x) ((x).tlb_lo[0] & (x).tlb_lo[1] & ENTRYLO_G)
#define TLB_VPN2(x) ((x).tlb_hi & VPN2_MASK) #define TLB_VPN2(x) ((x).tlb_hi & VPN2_MASK)
#define TLB_ASID(x) ((x).tlb_hi & KVM_ENTRYHI_ASID) #define TLB_ASID(x) ((x).tlb_hi & KVM_ENTRYHI_ASID)

View File

@ -126,6 +126,7 @@ config PPC
select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_FORTIFY_SOURCE
select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_HAS_GCOV_PROFILE_ALL
select ARCH_HAS_KCOV select ARCH_HAS_KCOV
select ARCH_HAS_HUGEPD if HUGETLB_PAGE
select ARCH_HAS_MMIOWB if PPC64 select ARCH_HAS_MMIOWB if PPC64
select ARCH_HAS_PHYS_TO_DMA select ARCH_HAS_PHYS_TO_DMA
select ARCH_HAS_PMEM_API if PPC64 select ARCH_HAS_PMEM_API if PPC64

View File

@ -530,13 +530,6 @@ retry:
return page; return page;
} }
static unsigned long hugepte_addr_end(unsigned long addr, unsigned long end,
unsigned long sz)
{
unsigned long __boundary = (addr + sz) & ~(sz-1);
return (__boundary - 1 < end - 1) ? __boundary : end;
}
#ifdef CONFIG_PPC_MM_SLICES #ifdef CONFIG_PPC_MM_SLICES
unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
unsigned long len, unsigned long pgoff, unsigned long len, unsigned long pgoff,
@ -691,68 +684,3 @@ void flush_dcache_icache_hugepage(struct page *page)
} }
} }
} }
static int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
unsigned long end, int write, struct page **pages, int *nr)
{
unsigned long pte_end;
struct page *head, *page;
pte_t pte;
int refs;
pte_end = (addr + sz) & ~(sz-1);
if (pte_end < end)
end = pte_end;
pte = READ_ONCE(*ptep);
if (!pte_access_permitted(pte, write))
return 0;
/* hugepages are never "special" */
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
refs = 0;
head = pte_page(pte);
page = head + ((addr & (sz-1)) >> PAGE_SHIFT);
do {
VM_BUG_ON(compound_head(page) != head);
pages[*nr] = page;
(*nr)++;
page++;
refs++;
} while (addr += PAGE_SIZE, addr != end);
if (!page_cache_add_speculative(head, refs)) {
*nr -= refs;
return 0;
}
if (unlikely(pte_val(pte) != pte_val(*ptep))) {
/* Could be optimized better */
*nr -= refs;
while (refs--)
put_page(head);
return 0;
}
return 1;
}
int gup_huge_pd(hugepd_t hugepd, unsigned long addr, unsigned int pdshift,
unsigned long end, int write, struct page **pages, int *nr)
{
pte_t *ptep;
unsigned long sz = 1UL << hugepd_shift(hugepd);
unsigned long next;
ptep = hugepte_offset(hugepd, addr, pdshift);
do {
next = hugepte_addr_end(addr, end, sz);
if (!gup_hugepte(ptep, sz, addr, end, write, pages, nr))
return 0;
} while (ptep++, addr = next, addr != end);
return 1;
}

View File

@ -62,6 +62,7 @@ struct pg_state {
unsigned long start_address; unsigned long start_address;
unsigned long start_pa; unsigned long start_pa;
unsigned long last_pa; unsigned long last_pa;
unsigned long page_size;
unsigned int level; unsigned int level;
u64 current_flags; u64 current_flags;
bool check_wx; bool check_wx;
@ -163,9 +164,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)
#endif #endif
pt_dump_seq_printf(st->seq, REG "-" REG " ", st->start_address, addr - 1); pt_dump_seq_printf(st->seq, REG "-" REG " ", st->start_address, addr - 1);
if (st->start_pa == st->last_pa && st->start_address + PAGE_SIZE != addr) { if (st->start_pa == st->last_pa && st->start_address + st->page_size != addr) {
pt_dump_seq_printf(st->seq, "[" REG "]", st->start_pa); pt_dump_seq_printf(st->seq, "[" REG "]", st->start_pa);
delta = PAGE_SIZE >> 10; delta = st->page_size >> 10;
} else { } else {
pt_dump_seq_printf(st->seq, " " REG " ", st->start_pa); pt_dump_seq_printf(st->seq, " " REG " ", st->start_pa);
delta = (addr - st->start_address) >> 10; delta = (addr - st->start_address) >> 10;
@ -196,7 +197,7 @@ static void note_prot_wx(struct pg_state *st, unsigned long addr)
} }
static void note_page(struct pg_state *st, unsigned long addr, static void note_page(struct pg_state *st, unsigned long addr,
unsigned int level, u64 val) unsigned int level, u64 val, unsigned long page_size)
{ {
u64 flag = val & pg_level[level].mask; u64 flag = val & pg_level[level].mask;
u64 pa = val & PTE_RPN_MASK; u64 pa = val & PTE_RPN_MASK;
@ -208,6 +209,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
st->start_address = addr; st->start_address = addr;
st->start_pa = pa; st->start_pa = pa;
st->last_pa = pa; st->last_pa = pa;
st->page_size = page_size;
pt_dump_seq_printf(st->seq, "---[ %s ]---\n", st->marker->name); pt_dump_seq_printf(st->seq, "---[ %s ]---\n", st->marker->name);
/* /*
* Dump the section of virtual memory when: * Dump the section of virtual memory when:
@ -219,7 +221,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
*/ */
} else if (flag != st->current_flags || level != st->level || } else if (flag != st->current_flags || level != st->level ||
addr >= st->marker[1].start_address || addr >= st->marker[1].start_address ||
(pa != st->last_pa + PAGE_SIZE && (pa != st->last_pa + st->page_size &&
(pa != st->start_pa || st->start_pa != st->last_pa))) { (pa != st->start_pa || st->start_pa != st->last_pa))) {
/* Check the PTE flags */ /* Check the PTE flags */
@ -247,6 +249,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
st->start_address = addr; st->start_address = addr;
st->start_pa = pa; st->start_pa = pa;
st->last_pa = pa; st->last_pa = pa;
st->page_size = page_size;
st->current_flags = flag; st->current_flags = flag;
st->level = level; st->level = level;
} else { } else {
@ -262,7 +265,7 @@ static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)
for (i = 0; i < PTRS_PER_PTE; i++, pte++) { for (i = 0; i < PTRS_PER_PTE; i++, pte++) {
addr = start + i * PAGE_SIZE; addr = start + i * PAGE_SIZE;
note_page(st, addr, 4, pte_val(*pte)); note_page(st, addr, 4, pte_val(*pte), PAGE_SIZE);
} }
} }
@ -279,7 +282,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)
/* pmd exists */ /* pmd exists */
walk_pte(st, pmd, addr); walk_pte(st, pmd, addr);
else else
note_page(st, addr, 3, pmd_val(*pmd)); note_page(st, addr, 3, pmd_val(*pmd), PMD_SIZE);
} }
} }
@ -295,7 +298,7 @@ static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start)
/* pud exists */ /* pud exists */
walk_pmd(st, pud, addr); walk_pmd(st, pud, addr);
else else
note_page(st, addr, 2, pud_val(*pud)); note_page(st, addr, 2, pud_val(*pud), PUD_SIZE);
} }
} }
@ -316,7 +319,7 @@ static void walk_pagetables(struct pg_state *st)
/* pgd exists */ /* pgd exists */
walk_pud(st, pgd, addr); walk_pud(st, pgd, addr);
else else
note_page(st, addr, 1, pgd_val(*pgd)); note_page(st, addr, 1, pgd_val(*pgd), PGDIR_SIZE);
} }
} }
@ -375,7 +378,7 @@ static int ptdump_show(struct seq_file *m, void *v)
/* Traverse kernel page tables */ /* Traverse kernel page tables */
walk_pagetables(&st); walk_pagetables(&st);
note_page(&st, 0, 0, 0); note_page(&st, 0, 0, 0, 0);
return 0; return 0;
} }

View File

@ -1891,8 +1891,8 @@ static __initconst const u64 tnt_hw_cache_extra_regs
static struct extra_reg intel_tnt_extra_regs[] __read_mostly = { static struct extra_reg intel_tnt_extra_regs[] __read_mostly = {
/* must define OFFCORE_RSP_X first, see intel_fixup_er() */ /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0xffffff9fffull, RSP_0), INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x800ff0ffffff9fffull, RSP_0),
INTEL_UEVENT_EXTRA_REG(0x02b7, MSR_OFFCORE_RSP_1, 0xffffff9fffull, RSP_1), INTEL_UEVENT_EXTRA_REG(0x02b7, MSR_OFFCORE_RSP_1, 0xff0ffffff9fffull, RSP_1),
EVENT_EXTRA_END EVENT_EXTRA_END
}; };

View File

@ -93,28 +93,35 @@ void set_kernel_text_rw(void);
void set_kernel_text_ro(void); void set_kernel_text_ro(void);
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
static inline int set_mce_nospec(unsigned long pfn) /*
* Prevent speculative access to the page by either unmapping
* it (if we do not require access to any part of the page) or
* marking it uncacheable (if we want to try to retrieve data
* from non-poisoned lines in the page).
*/
static inline int set_mce_nospec(unsigned long pfn, bool unmap)
{ {
unsigned long decoy_addr; unsigned long decoy_addr;
int rc; int rc;
/* /*
* Mark the linear address as UC to make sure we don't log more
* errors because of speculative access to the page.
* We would like to just call: * We would like to just call:
* set_memory_uc((unsigned long)pfn_to_kaddr(pfn), 1); * set_memory_XX((unsigned long)pfn_to_kaddr(pfn), 1);
* but doing that would radically increase the odds of a * but doing that would radically increase the odds of a
* speculative access to the poison page because we'd have * speculative access to the poison page because we'd have
* the virtual address of the kernel 1:1 mapping sitting * the virtual address of the kernel 1:1 mapping sitting
* around in registers. * around in registers.
* Instead we get tricky. We create a non-canonical address * Instead we get tricky. We create a non-canonical address
* that looks just like the one we want, but has bit 63 flipped. * that looks just like the one we want, but has bit 63 flipped.
* This relies on set_memory_uc() properly sanitizing any __pa() * This relies on set_memory_XX() properly sanitizing any __pa()
* results with __PHYSICAL_MASK or PTE_PFN_MASK. * results with __PHYSICAL_MASK or PTE_PFN_MASK.
*/ */
decoy_addr = (pfn << PAGE_SHIFT) + (PAGE_OFFSET ^ BIT(63)); decoy_addr = (pfn << PAGE_SHIFT) + (PAGE_OFFSET ^ BIT(63));
rc = set_memory_uc(decoy_addr, 1); if (unmap)
rc = set_memory_np(decoy_addr, 1);
else
rc = set_memory_uc(decoy_addr, 1);
if (rc) if (rc)
pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn); pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn);
return rc; return rc;

View File

@ -581,7 +581,9 @@ early_param("nospectre_v1", nospectre_v1_cmdline);
static enum spectre_v2_mitigation spectre_v2_enabled __ro_after_init = static enum spectre_v2_mitigation spectre_v2_enabled __ro_after_init =
SPECTRE_V2_NONE; SPECTRE_V2_NONE;
static enum spectre_v2_user_mitigation spectre_v2_user __ro_after_init = static enum spectre_v2_user_mitigation spectre_v2_user_stibp __ro_after_init =
SPECTRE_V2_USER_NONE;
static enum spectre_v2_user_mitigation spectre_v2_user_ibpb __ro_after_init =
SPECTRE_V2_USER_NONE; SPECTRE_V2_USER_NONE;
#ifdef CONFIG_RETPOLINE #ifdef CONFIG_RETPOLINE
@ -727,15 +729,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
break; break;
} }
/*
* At this point, an STIBP mode other than "off" has been set.
* If STIBP support is not being forced, check if STIBP always-on
* is preferred.
*/
if (mode != SPECTRE_V2_USER_STRICT &&
boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
mode = SPECTRE_V2_USER_STRICT_PREFERRED;
/* Initialize Indirect Branch Prediction Barrier */ /* Initialize Indirect Branch Prediction Barrier */
if (boot_cpu_has(X86_FEATURE_IBPB)) { if (boot_cpu_has(X86_FEATURE_IBPB)) {
setup_force_cpu_cap(X86_FEATURE_USE_IBPB); setup_force_cpu_cap(X86_FEATURE_USE_IBPB);
@ -758,23 +751,36 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
pr_info("mitigation: Enabling %s Indirect Branch Prediction Barrier\n", pr_info("mitigation: Enabling %s Indirect Branch Prediction Barrier\n",
static_key_enabled(&switch_mm_always_ibpb) ? static_key_enabled(&switch_mm_always_ibpb) ?
"always-on" : "conditional"); "always-on" : "conditional");
spectre_v2_user_ibpb = mode;
} }
/* If enhanced IBRS is enabled no STIBP required */ /*
if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED) * If enhanced IBRS is enabled or SMT impossible, STIBP is not
* required.
*/
if (!smt_possible || spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
return; return;
/* /*
* If SMT is not possible or STIBP is not available clear the STIBP * At this point, an STIBP mode other than "off" has been set.
* mode. * If STIBP support is not being forced, check if STIBP always-on
* is preferred.
*/ */
if (!smt_possible || !boot_cpu_has(X86_FEATURE_STIBP)) if (mode != SPECTRE_V2_USER_STRICT &&
boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
mode = SPECTRE_V2_USER_STRICT_PREFERRED;
/*
* If STIBP is not available, clear the STIBP mode.
*/
if (!boot_cpu_has(X86_FEATURE_STIBP))
mode = SPECTRE_V2_USER_NONE; mode = SPECTRE_V2_USER_NONE;
spectre_v2_user_stibp = mode;
set_mode: set_mode:
spectre_v2_user = mode; pr_info("%s\n", spectre_v2_user_strings[mode]);
/* Only print the STIBP mode when SMT possible */
if (smt_possible)
pr_info("%s\n", spectre_v2_user_strings[mode]);
} }
static const char * const spectre_v2_strings[] = { static const char * const spectre_v2_strings[] = {
@ -1007,7 +1013,7 @@ void cpu_bugs_smt_update(void)
{ {
mutex_lock(&spec_ctrl_mutex); mutex_lock(&spec_ctrl_mutex);
switch (spectre_v2_user) { switch (spectre_v2_user_stibp) {
case SPECTRE_V2_USER_NONE: case SPECTRE_V2_USER_NONE:
break; break;
case SPECTRE_V2_USER_STRICT: case SPECTRE_V2_USER_STRICT:
@ -1250,14 +1256,19 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
{ {
switch (ctrl) { switch (ctrl) {
case PR_SPEC_ENABLE: case PR_SPEC_ENABLE:
if (spectre_v2_user == SPECTRE_V2_USER_NONE) if (spectre_v2_user_ibpb == SPECTRE_V2_USER_NONE &&
spectre_v2_user_stibp == SPECTRE_V2_USER_NONE)
return 0; return 0;
/* /*
* Indirect branch speculation is always disabled in strict * Indirect branch speculation is always disabled in strict
* mode. * mode. It can neither be enabled if it was force-disabled
* by a previous prctl call.
*/ */
if (spectre_v2_user == SPECTRE_V2_USER_STRICT || if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED) spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT ||
spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT_PREFERRED ||
task_spec_ib_force_disable(task))
return -EPERM; return -EPERM;
task_clear_spec_ib_disable(task); task_clear_spec_ib_disable(task);
task_update_spec_tif(task); task_update_spec_tif(task);
@ -1268,10 +1279,12 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
* Indirect branch speculation is always allowed when * Indirect branch speculation is always allowed when
* mitigation is force disabled. * mitigation is force disabled.
*/ */
if (spectre_v2_user == SPECTRE_V2_USER_NONE) if (spectre_v2_user_ibpb == SPECTRE_V2_USER_NONE &&
spectre_v2_user_stibp == SPECTRE_V2_USER_NONE)
return -EPERM; return -EPERM;
if (spectre_v2_user == SPECTRE_V2_USER_STRICT || if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED) spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT ||
spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT_PREFERRED)
return 0; return 0;
task_set_spec_ib_disable(task); task_set_spec_ib_disable(task);
if (ctrl == PR_SPEC_FORCE_DISABLE) if (ctrl == PR_SPEC_FORCE_DISABLE)
@ -1302,7 +1315,8 @@ void arch_seccomp_spec_mitigate(struct task_struct *task)
{ {
if (ssb_mode == SPEC_STORE_BYPASS_SECCOMP) if (ssb_mode == SPEC_STORE_BYPASS_SECCOMP)
ssb_prctl_set(task, PR_SPEC_FORCE_DISABLE); ssb_prctl_set(task, PR_SPEC_FORCE_DISABLE);
if (spectre_v2_user == SPECTRE_V2_USER_SECCOMP) if (spectre_v2_user_ibpb == SPECTRE_V2_USER_SECCOMP ||
spectre_v2_user_stibp == SPECTRE_V2_USER_SECCOMP)
ib_prctl_set(task, PR_SPEC_FORCE_DISABLE); ib_prctl_set(task, PR_SPEC_FORCE_DISABLE);
} }
#endif #endif
@ -1333,22 +1347,24 @@ static int ib_prctl_get(struct task_struct *task)
if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2)) if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
return PR_SPEC_NOT_AFFECTED; return PR_SPEC_NOT_AFFECTED;
switch (spectre_v2_user) { if (spectre_v2_user_ibpb == SPECTRE_V2_USER_NONE &&
case SPECTRE_V2_USER_NONE: spectre_v2_user_stibp == SPECTRE_V2_USER_NONE)
return PR_SPEC_ENABLE; return PR_SPEC_ENABLE;
case SPECTRE_V2_USER_PRCTL: else if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
case SPECTRE_V2_USER_SECCOMP: spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT ||
spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT_PREFERRED)
return PR_SPEC_DISABLE;
else if (spectre_v2_user_ibpb == SPECTRE_V2_USER_PRCTL ||
spectre_v2_user_ibpb == SPECTRE_V2_USER_SECCOMP ||
spectre_v2_user_stibp == SPECTRE_V2_USER_PRCTL ||
spectre_v2_user_stibp == SPECTRE_V2_USER_SECCOMP) {
if (task_spec_ib_force_disable(task)) if (task_spec_ib_force_disable(task))
return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE; return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE;
if (task_spec_ib_disable(task)) if (task_spec_ib_disable(task))
return PR_SPEC_PRCTL | PR_SPEC_DISABLE; return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
return PR_SPEC_PRCTL | PR_SPEC_ENABLE; return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
case SPECTRE_V2_USER_STRICT: } else
case SPECTRE_V2_USER_STRICT_PREFERRED:
return PR_SPEC_DISABLE;
default:
return PR_SPEC_NOT_AFFECTED; return PR_SPEC_NOT_AFFECTED;
}
} }
int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which) int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which)
@ -1587,7 +1603,7 @@ static char *stibp_state(void)
if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED) if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
return ""; return "";
switch (spectre_v2_user) { switch (spectre_v2_user_stibp) {
case SPECTRE_V2_USER_NONE: case SPECTRE_V2_USER_NONE:
return ", STIBP: disabled"; return ", STIBP: disabled";
case SPECTRE_V2_USER_STRICT: case SPECTRE_V2_USER_STRICT:

View File

@ -517,6 +517,13 @@ bool mce_is_memory_error(struct mce *m)
} }
EXPORT_SYMBOL_GPL(mce_is_memory_error); EXPORT_SYMBOL_GPL(mce_is_memory_error);
static bool whole_page(struct mce *m)
{
if (!mca_cfg.ser || !(m->status & MCI_STATUS_MISCV))
return true;
return MCI_MISC_ADDR_LSB(m->misc) >= PAGE_SHIFT;
}
bool mce_is_correctable(struct mce *m) bool mce_is_correctable(struct mce *m)
{ {
if (m->cpuvendor == X86_VENDOR_AMD && m->status & MCI_STATUS_DEFERRED) if (m->cpuvendor == X86_VENDOR_AMD && m->status & MCI_STATUS_DEFERRED)
@ -585,7 +592,7 @@ static int srao_decode_notifier(struct notifier_block *nb, unsigned long val,
if (mce_usable_address(mce) && (mce->severity == MCE_AO_SEVERITY)) { if (mce_usable_address(mce) && (mce->severity == MCE_AO_SEVERITY)) {
pfn = mce->addr >> PAGE_SHIFT; pfn = mce->addr >> PAGE_SHIFT;
if (!memory_failure(pfn, 0)) if (!memory_failure(pfn, 0))
set_mce_nospec(pfn); set_mce_nospec(pfn, whole_page(mce));
} }
return NOTIFY_OK; return NOTIFY_OK;
@ -1086,7 +1093,7 @@ static int do_memory_failure(struct mce *m)
if (ret) if (ret)
pr_err("Memory error not recovered"); pr_err("Memory error not recovered");
else else
set_mce_nospec(m->addr >> PAGE_SHIFT); set_mce_nospec(m->addr >> PAGE_SHIFT, whole_page(m));
return ret; return ret;
} }

View File

@ -428,28 +428,20 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp,
lockdep_assert_irqs_disabled(); lockdep_assert_irqs_disabled();
/* /* Handle change of TIF_SSBD depending on the mitigation method. */
* If TIF_SSBD is different, select the proper mitigation if (static_cpu_has(X86_FEATURE_VIRT_SSBD)) {
* method. Note that if SSBD mitigation is disabled or permanentely if (tif_diff & _TIF_SSBD)
* enabled this branch can't be taken because nothing can set
* TIF_SSBD.
*/
if (tif_diff & _TIF_SSBD) {
if (static_cpu_has(X86_FEATURE_VIRT_SSBD)) {
amd_set_ssb_virt_state(tifn); amd_set_ssb_virt_state(tifn);
} else if (static_cpu_has(X86_FEATURE_LS_CFG_SSBD)) { } else if (static_cpu_has(X86_FEATURE_LS_CFG_SSBD)) {
if (tif_diff & _TIF_SSBD)
amd_set_core_ssb_state(tifn); amd_set_core_ssb_state(tifn);
} else if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) || } else if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
static_cpu_has(X86_FEATURE_AMD_SSBD)) { static_cpu_has(X86_FEATURE_AMD_SSBD)) {
msr |= ssbd_tif_to_spec_ctrl(tifn); updmsr |= !!(tif_diff & _TIF_SSBD);
updmsr = true; msr |= ssbd_tif_to_spec_ctrl(tifn);
}
} }
/* /* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled. */
* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled,
* otherwise avoid the MSR write.
*/
if (IS_ENABLED(CONFIG_SMP) && if (IS_ENABLED(CONFIG_SMP) &&
static_branch_unlikely(&switch_to_cond_stibp)) { static_branch_unlikely(&switch_to_cond_stibp)) {
updmsr |= !!(tif_diff & _TIF_SPEC_IB); updmsr |= !!(tif_diff & _TIF_SPEC_IB);

View File

@ -197,6 +197,14 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"), DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"),
}, },
}, },
{ /* Handle problems with rebooting on Apple MacBook6,1 */
.callback = set_pci_reboot,
.ident = "Apple MacBook6,1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"),
},
},
{ /* Handle problems with rebooting on Apple MacBookPro5 */ { /* Handle problems with rebooting on Apple MacBookPro5 */
.callback = set_pci_reboot, .callback = set_pci_reboot,
.ident = "Apple MacBookPro5", .ident = "Apple MacBookPro5",

View File

@ -25,10 +25,6 @@
#include <asm/hpet.h> #include <asm/hpet.h>
#include <asm/time.h> #include <asm/time.h>
#ifdef CONFIG_X86_64
__visible volatile unsigned long jiffies __cacheline_aligned_in_smp = INITIAL_JIFFIES;
#endif
unsigned long profile_pc(struct pt_regs *regs) unsigned long profile_pc(struct pt_regs *regs)
{ {
unsigned long pc = instruction_pointer(regs); unsigned long pc = instruction_pointer(regs);

View File

@ -36,13 +36,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT)
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
OUTPUT_ARCH(i386) OUTPUT_ARCH(i386)
ENTRY(phys_startup_32) ENTRY(phys_startup_32)
jiffies = jiffies_64;
#else #else
OUTPUT_ARCH(i386:x86-64) OUTPUT_ARCH(i386:x86-64)
ENTRY(phys_startup_64) ENTRY(phys_startup_64)
jiffies_64 = jiffies;
#endif #endif
jiffies = jiffies_64;
#if defined(CONFIG_X86_64) #if defined(CONFIG_X86_64)
/* /*
* On 64-bit, align RODATA to 2MB so we retain large page mappings for * On 64-bit, align RODATA to 2MB so we retain large page mappings for

View File

@ -3228,8 +3228,8 @@ static int nested_svm_exit_special(struct vcpu_svm *svm)
return NESTED_EXIT_HOST; return NESTED_EXIT_HOST;
break; break;
case SVM_EXIT_EXCP_BASE + PF_VECTOR: case SVM_EXIT_EXCP_BASE + PF_VECTOR:
/* When we're shadowing, trap PFs, but not async PF */ /* Trap async PF even if not shadowing */
if (!npt_enabled && svm->vcpu.arch.apf.host_apf_reason == 0) if (!npt_enabled || svm->vcpu.arch.apf.host_apf_reason)
return NESTED_EXIT_HOST; return NESTED_EXIT_HOST;
break; break;
default: default:
@ -3318,7 +3318,7 @@ static inline void copy_vmcb_control_area(struct vmcb *dst_vmcb, struct vmcb *fr
dst->iopm_base_pa = from->iopm_base_pa; dst->iopm_base_pa = from->iopm_base_pa;
dst->msrpm_base_pa = from->msrpm_base_pa; dst->msrpm_base_pa = from->msrpm_base_pa;
dst->tsc_offset = from->tsc_offset; dst->tsc_offset = from->tsc_offset;
dst->asid = from->asid; /* asid not copied, it is handled manually for svm->vmcb. */
dst->tlb_ctl = from->tlb_ctl; dst->tlb_ctl = from->tlb_ctl;
dst->int_ctl = from->int_ctl; dst->int_ctl = from->int_ctl;
dst->int_vector = from->int_vector; dst->int_vector = from->int_vector;

View File

@ -5125,7 +5125,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
vmcs_read32(VM_EXIT_INTR_ERROR_CODE), vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
KVM_ISA_VMX); KVM_ISA_VMX);
switch (exit_reason) { switch ((u16)exit_reason) {
case EXIT_REASON_EXCEPTION_NMI: case EXIT_REASON_EXCEPTION_NMI:
if (is_nmi(intr_info)) if (is_nmi(intr_info))
return false; return false;

View File

@ -256,8 +256,6 @@ struct vcpu_vmx {
u64 current_tsc_ratio; u64 current_tsc_ratio;
u32 host_pkru;
unsigned long host_debugctlmsr; unsigned long host_debugctlmsr;
u64 msr_ia32_power_ctl; u64 msr_ia32_power_ctl;

View File

@ -6683,7 +6683,7 @@ restart:
if (!ctxt->have_exception || if (!ctxt->have_exception ||
exception_type(ctxt->exception.vector) == EXCPT_TRAP) { exception_type(ctxt->exception.vector) == EXCPT_TRAP) {
kvm_rip_write(vcpu, ctxt->eip); kvm_rip_write(vcpu, ctxt->eip);
if (r == EMULATE_DONE && ctxt->tf) if (r == EMULATE_DONE && (ctxt->tf || (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)))
kvm_vcpu_do_singlestep(vcpu, &r); kvm_vcpu_do_singlestep(vcpu, &r);
__kvm_set_rflags(vcpu, ctxt->eflags); __kvm_set_rflags(vcpu, ctxt->eflags);
} }
@ -7828,9 +7828,8 @@ static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu)
kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap); kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap);
} }
int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
unsigned long start, unsigned long end, unsigned long start, unsigned long end)
bool blockable)
{ {
unsigned long apic_address; unsigned long apic_address;
@ -7841,8 +7840,6 @@ int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
apic_address = gfn_to_hva(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT); apic_address = gfn_to_hva(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT);
if (start <= apic_address && apic_address < end) if (start <= apic_address && apic_address < end)
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD); kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
return 0;
} }
void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu) void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu)

View File

@ -572,6 +572,10 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2fc0, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6f60, pci_invalid_bar); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6f60, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_invalid_bar); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_invalid_bar); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0xa1ec, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0xa1ed, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0xa26c, pci_invalid_bar);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0xa26d, pci_invalid_bar);
/* /*
* Device [1022:7808] * Device [1022:7808]

View File

@ -128,21 +128,15 @@ EXPORT_SYMBOL_GPL(af_alg_release);
void af_alg_release_parent(struct sock *sk) void af_alg_release_parent(struct sock *sk)
{ {
struct alg_sock *ask = alg_sk(sk); struct alg_sock *ask = alg_sk(sk);
unsigned int nokey = ask->nokey_refcnt; unsigned int nokey = atomic_read(&ask->nokey_refcnt);
bool last = nokey && !ask->refcnt;
sk = ask->parent; sk = ask->parent;
ask = alg_sk(sk); ask = alg_sk(sk);
local_bh_disable(); if (nokey)
bh_lock_sock(sk); atomic_dec(&ask->nokey_refcnt);
ask->nokey_refcnt -= nokey;
if (!last)
last = !--ask->refcnt;
bh_unlock_sock(sk);
local_bh_enable();
if (last) if (atomic_dec_and_test(&ask->refcnt))
sock_put(sk); sock_put(sk);
} }
EXPORT_SYMBOL_GPL(af_alg_release_parent); EXPORT_SYMBOL_GPL(af_alg_release_parent);
@ -187,7 +181,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
err = -EBUSY; err = -EBUSY;
lock_sock(sk); lock_sock(sk);
if (ask->refcnt | ask->nokey_refcnt) if (atomic_read(&ask->refcnt))
goto unlock; goto unlock;
swap(ask->type, type); swap(ask->type, type);
@ -236,7 +230,7 @@ static int alg_setsockopt(struct socket *sock, int level, int optname,
int err = -EBUSY; int err = -EBUSY;
lock_sock(sk); lock_sock(sk);
if (ask->refcnt) if (atomic_read(&ask->refcnt) != atomic_read(&ask->nokey_refcnt))
goto unlock; goto unlock;
type = ask->type; type = ask->type;
@ -301,12 +295,14 @@ int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
if (err) if (err)
goto unlock; goto unlock;
if (nokey || !ask->refcnt++) if (atomic_inc_return_relaxed(&ask->refcnt) == 1)
sock_hold(sk); sock_hold(sk);
ask->nokey_refcnt += nokey; if (nokey) {
atomic_inc(&ask->nokey_refcnt);
atomic_set(&alg_sk(sk2)->nokey_refcnt, 1);
}
alg_sk(sk2)->parent = sk; alg_sk(sk2)->parent = sk;
alg_sk(sk2)->type = type; alg_sk(sk2)->type = type;
alg_sk(sk2)->nokey_refcnt = nokey;
newsock->ops = type->ops; newsock->ops = type->ops;
newsock->state = SS_CONNECTED; newsock->state = SS_CONNECTED;

View File

@ -390,7 +390,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval)
err = wait_for_completion_killable(&larval->completion); err = wait_for_completion_killable(&larval->completion);
WARN_ON(err); WARN_ON(err);
if (!err) if (!err)
crypto_probing_notify(CRYPTO_MSG_ALG_LOADED, larval); crypto_notify(CRYPTO_MSG_ALG_LOADED, larval);
out: out:
crypto_larval_kill(&larval->alg); crypto_larval_kill(&larval->alg);

View File

@ -384,7 +384,7 @@ static int aead_check_key(struct socket *sock)
struct alg_sock *ask = alg_sk(sk); struct alg_sock *ask = alg_sk(sk);
lock_sock(sk); lock_sock(sk);
if (ask->refcnt) if (!atomic_read(&ask->nokey_refcnt))
goto unlock_child; goto unlock_child;
psk = ask->parent; psk = ask->parent;
@ -396,11 +396,8 @@ static int aead_check_key(struct socket *sock)
if (crypto_aead_get_flags(tfm->aead) & CRYPTO_TFM_NEED_KEY) if (crypto_aead_get_flags(tfm->aead) & CRYPTO_TFM_NEED_KEY)
goto unlock; goto unlock;
if (!pask->refcnt++) atomic_dec(&pask->nokey_refcnt);
sock_hold(psk); atomic_set(&ask->nokey_refcnt, 0);
ask->refcnt = 1;
sock_put(psk);
err = 0; err = 0;

View File

@ -301,7 +301,7 @@ static int hash_check_key(struct socket *sock)
struct alg_sock *ask = alg_sk(sk); struct alg_sock *ask = alg_sk(sk);
lock_sock(sk); lock_sock(sk);
if (ask->refcnt) if (!atomic_read(&ask->nokey_refcnt))
goto unlock_child; goto unlock_child;
psk = ask->parent; psk = ask->parent;
@ -313,11 +313,8 @@ static int hash_check_key(struct socket *sock)
if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) if (crypto_ahash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
goto unlock; goto unlock;
if (!pask->refcnt++) atomic_dec(&pask->nokey_refcnt);
sock_hold(psk); atomic_set(&ask->nokey_refcnt, 0);
ask->refcnt = 1;
sock_put(psk);
err = 0; err = 0;

View File

@ -215,7 +215,7 @@ static int skcipher_check_key(struct socket *sock)
struct alg_sock *ask = alg_sk(sk); struct alg_sock *ask = alg_sk(sk);
lock_sock(sk); lock_sock(sk);
if (ask->refcnt) if (!atomic_read(&ask->nokey_refcnt))
goto unlock_child; goto unlock_child;
psk = ask->parent; psk = ask->parent;
@ -227,11 +227,8 @@ static int skcipher_check_key(struct socket *sock)
if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY)
goto unlock; goto unlock;
if (!pask->refcnt++) atomic_dec(&pask->nokey_refcnt);
sock_hold(psk); atomic_set(&ask->nokey_refcnt, 0);
ask->refcnt = 1;
sock_put(psk);
err = 0; err = 0;

View File

@ -865,6 +865,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
"acpi_cppc"); "acpi_cppc");
if (ret) { if (ret) {
per_cpu(cpc_desc_ptr, pr->id) = NULL; per_cpu(cpc_desc_ptr, pr->id) = NULL;
kobject_put(&cpc_ptr->kobj);
goto out_free; goto out_free;
} }

View File

@ -165,7 +165,7 @@ int acpi_device_set_power(struct acpi_device *device, int state)
* possibly drop references to the power resources in use. * possibly drop references to the power resources in use.
*/ */
state = ACPI_STATE_D3_HOT; state = ACPI_STATE_D3_HOT;
/* If _PR3 is not available, use D3hot as the target state. */ /* If D3cold is not supported, use D3hot as the target state. */
if (!device->power.states[ACPI_STATE_D3_COLD].flags.valid) if (!device->power.states[ACPI_STATE_D3_COLD].flags.valid)
target_state = state; target_state = state;
} else if (!device->power.states[state].flags.valid) { } else if (!device->power.states[state].flags.valid) {

View File

@ -79,6 +79,8 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
struct resource r; struct resource r;
struct acpi_resource_irq *p = &ares->data.irq; struct acpi_resource_irq *p = &ares->data.irq;
struct acpi_resource_extended_irq *pext = &ares->data.extended_irq; struct acpi_resource_extended_irq *pext = &ares->data.extended_irq;
char ev_name[5];
u8 trigger;
if (ares->type == ACPI_RESOURCE_TYPE_END_TAG) if (ares->type == ACPI_RESOURCE_TYPE_END_TAG)
return AE_OK; return AE_OK;
@ -87,14 +89,28 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
dev_err(dev, "unable to parse IRQ resource\n"); dev_err(dev, "unable to parse IRQ resource\n");
return AE_ERROR; return AE_ERROR;
} }
if (ares->type == ACPI_RESOURCE_TYPE_IRQ) if (ares->type == ACPI_RESOURCE_TYPE_IRQ) {
gsi = p->interrupts[0]; gsi = p->interrupts[0];
else trigger = p->triggering;
} else {
gsi = pext->interrupts[0]; gsi = pext->interrupts[0];
trigger = pext->triggering;
}
irq = r.start; irq = r.start;
if (ACPI_FAILURE(acpi_get_handle(handle, "_EVT", &evt_handle))) { switch (gsi) {
case 0 ... 255:
sprintf(ev_name, "_%c%02hhX",
trigger == ACPI_EDGE_SENSITIVE ? 'E' : 'L', gsi);
if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
break;
/* fall through */
default:
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
break;
dev_err(dev, "cannot locate _EVT method\n"); dev_err(dev, "cannot locate _EVT method\n");
return AE_ERROR; return AE_ERROR;
} }

View File

@ -919,12 +919,9 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
if (buffer.length && package if (buffer.length && package
&& package->type == ACPI_TYPE_PACKAGE && package->type == ACPI_TYPE_PACKAGE
&& package->package.count) { && package->package.count)
int err = acpi_extract_power_resources(package, 0, acpi_extract_power_resources(package, 0, &ps->resources);
&ps->resources);
if (!err)
device->power.flags.power_resources = 1;
}
ACPI_FREE(buffer.pointer); ACPI_FREE(buffer.pointer);
} }
@ -971,14 +968,27 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)
acpi_bus_init_power_state(device, i); acpi_bus_init_power_state(device, i);
INIT_LIST_HEAD(&device->power.states[ACPI_STATE_D3_COLD].resources); INIT_LIST_HEAD(&device->power.states[ACPI_STATE_D3_COLD].resources);
if (!list_empty(&device->power.states[ACPI_STATE_D3_HOT].resources))
device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
/* Set defaults for D0 and D3hot states (always valid) */ /* Set the defaults for D0 and D3hot (always supported). */
device->power.states[ACPI_STATE_D0].flags.valid = 1; device->power.states[ACPI_STATE_D0].flags.valid = 1;
device->power.states[ACPI_STATE_D0].power = 100; device->power.states[ACPI_STATE_D0].power = 100;
device->power.states[ACPI_STATE_D3_HOT].flags.valid = 1; device->power.states[ACPI_STATE_D3_HOT].flags.valid = 1;
/*
* Use power resources only if the D0 list of them is populated, because
* some platforms may provide _PR3 only to indicate D3cold support and
* in those cases the power resources list returned by it may be bogus.
*/
if (!list_empty(&device->power.states[ACPI_STATE_D0].resources)) {
device->power.flags.power_resources = 1;
/*
* D3cold is supported if the D3hot list of power resources is
* not empty.
*/
if (!list_empty(&device->power.states[ACPI_STATE_D3_HOT].resources))
device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
}
if (acpi_bus_init_power(device)) if (acpi_bus_init_power(device))
device->flags.power_manageable = 0; device->flags.power_manageable = 0;
} }

View File

@ -993,8 +993,10 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
error = kobject_init_and_add(&hotplug->kobj, error = kobject_init_and_add(&hotplug->kobj,
&acpi_hotplug_profile_ktype, hotplug_kobj, "%s", name); &acpi_hotplug_profile_ktype, hotplug_kobj, "%s", name);
if (error) if (error) {
kobject_put(&hotplug->kobj);
goto err_out; goto err_out;
}
kobject_uevent(&hotplug->kobj, KOBJ_ADD); kobject_uevent(&hotplug->kobj, KOBJ_ADD);
return; return;

View File

@ -2902,17 +2902,17 @@ static blk_status_t floppy_queue_rq(struct blk_mq_hw_ctx *hctx,
(unsigned long long) current_req->cmd_flags)) (unsigned long long) current_req->cmd_flags))
return BLK_STS_IOERR; return BLK_STS_IOERR;
spin_lock_irq(&floppy_lock);
list_add_tail(&bd->rq->queuelist, &floppy_reqs);
spin_unlock_irq(&floppy_lock);
if (test_and_set_bit(0, &fdc_busy)) { if (test_and_set_bit(0, &fdc_busy)) {
/* fdc busy, this new request will be treated when the /* fdc busy, this new request will be treated when the
current one is done */ current one is done */
is_alive(__func__, "old request running"); is_alive(__func__, "old request running");
return BLK_STS_OK; return BLK_STS_RESOURCE;
} }
spin_lock_irq(&floppy_lock);
list_add_tail(&bd->rq->queuelist, &floppy_reqs);
spin_unlock_irq(&floppy_lock);
command_status = FD_COMMAND_NONE; command_status = FD_COMMAND_NONE;
__reschedule_timeout(MAXTIMEOUT, "fd_request"); __reschedule_timeout(MAXTIMEOUT, "fd_request");
set_fdc(0); set_fdc(0);

View File

@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr,
unsigned int flags) unsigned int flags)
{ {
intel_private.driver->write_entry(addr, pg, flags); intel_private.driver->write_entry(addr, pg, flags);
readl(intel_private.gtt + pg);
if (intel_private.driver->chipset_flush) if (intel_private.driver->chipset_flush)
intel_private.driver->chipset_flush(); intel_private.driver->chipset_flush();
} }
@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
j++; j++;
} }
} }
wmb(); readl(intel_private.gtt + j - 1);
if (intel_private.driver->chipset_flush) if (intel_private.driver->chipset_flush)
intel_private.driver->chipset_flush(); intel_private.driver->chipset_flush();
} }
@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void)
static void i9xx_chipset_flush(void) static void i9xx_chipset_flush(void)
{ {
wmb();
if (intel_private.i9xx_flush_page) if (intel_private.i9xx_flush_page)
writel(1, intel_private.i9xx_flush_page); writel(1, intel_private.i9xx_flush_page);
} }

View File

@ -189,15 +189,6 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf,
goto out; goto out;
} }
/* atomic tpm command send and result receive. We only hold the ops
* lock during this period so that the tpm can be unregistered even if
* the char dev is held open.
*/
if (tpm_try_get_ops(priv->chip)) {
ret = -EPIPE;
goto out;
}
priv->response_length = 0; priv->response_length = 0;
priv->response_read = false; priv->response_read = false;
*off = 0; *off = 0;
@ -211,11 +202,19 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf,
if (file->f_flags & O_NONBLOCK) { if (file->f_flags & O_NONBLOCK) {
priv->command_enqueued = true; priv->command_enqueued = true;
queue_work(tpm_dev_wq, &priv->async_work); queue_work(tpm_dev_wq, &priv->async_work);
tpm_put_ops(priv->chip);
mutex_unlock(&priv->buffer_mutex); mutex_unlock(&priv->buffer_mutex);
return size; return size;
} }
/* atomic tpm command send and result receive. We only hold the ops
* lock during this period so that the tpm can be unregistered even if
* the char dev is held open.
*/
if (tpm_try_get_ops(priv->chip)) {
ret = -EPIPE;
goto out;
}
ret = tpm_dev_transmit(priv->chip, priv->space, priv->data_buffer, ret = tpm_dev_transmit(priv->chip, priv->space, priv->data_buffer,
sizeof(priv->data_buffer)); sizeof(priv->data_buffer));
tpm_put_ops(priv->chip); tpm_put_ops(priv->chip);

View File

@ -108,7 +108,11 @@ static int clk_pm_runtime_get(struct clk_core *core)
return 0; return 0;
ret = pm_runtime_get_sync(core->dev); ret = pm_runtime_get_sync(core->dev);
return ret < 0 ? ret : 0; if (ret < 0) {
pm_runtime_put_noidle(core->dev);
return ret;
}
return 0;
} }
static void clk_pm_runtime_put(struct clk_core *core) static void clk_pm_runtime_put(struct clk_core *core)

View File

@ -96,7 +96,7 @@ static const struct regmap_config turingcc_regmap_config = {
.reg_bits = 32, .reg_bits = 32,
.reg_stride = 4, .reg_stride = 4,
.val_bits = 32, .val_bits = 32,
.max_register = 0x30000, .max_register = 0x23004,
.fast_io = true, .fast_io = true,
}; };

View File

@ -191,7 +191,7 @@ static void nitrox_remove_from_devlist(struct nitrox_device *ndev)
struct nitrox_device *nitrox_get_first_device(void) struct nitrox_device *nitrox_get_first_device(void)
{ {
struct nitrox_device *ndev = NULL; struct nitrox_device *ndev;
mutex_lock(&devlist_lock); mutex_lock(&devlist_lock);
list_for_each_entry(ndev, &ndevlist, list) { list_for_each_entry(ndev, &ndevlist, list) {
@ -199,7 +199,7 @@ struct nitrox_device *nitrox_get_first_device(void)
break; break;
} }
mutex_unlock(&devlist_lock); mutex_unlock(&devlist_lock);
if (!ndev) if (&ndev->list == &ndevlist)
return NULL; return NULL;
refcount_inc(&ndev->refcnt); refcount_inc(&ndev->refcnt);

View File

@ -355,13 +355,18 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,
int err; int err;
unsigned long flags; unsigned long flags;
struct scatterlist outhdr, iv_sg, status_sg, **sgs; struct scatterlist outhdr, iv_sg, status_sg, **sgs;
int i;
u64 dst_len; u64 dst_len;
unsigned int num_out = 0, num_in = 0; unsigned int num_out = 0, num_in = 0;
int sg_total; int sg_total;
uint8_t *iv; uint8_t *iv;
struct scatterlist *sg;
src_nents = sg_nents_for_len(req->src, req->nbytes); src_nents = sg_nents_for_len(req->src, req->nbytes);
if (src_nents < 0) {
pr_err("Invalid number of src SG.\n");
return src_nents;
}
dst_nents = sg_nents(req->dst); dst_nents = sg_nents(req->dst);
pr_debug("virtio_crypto: Number of sgs (src_nents: %d, dst_nents: %d)\n", pr_debug("virtio_crypto: Number of sgs (src_nents: %d, dst_nents: %d)\n",
@ -447,12 +452,12 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,
vc_sym_req->iv = iv; vc_sym_req->iv = iv;
/* Source data */ /* Source data */
for (i = 0; i < src_nents; i++) for (sg = req->src; src_nents; sg = sg_next(sg), src_nents--)
sgs[num_out++] = &req->src[i]; sgs[num_out++] = sg;
/* Destination data */ /* Destination data */
for (i = 0; i < dst_nents; i++) for (sg = req->dst; sg; sg = sg_next(sg))
sgs[num_out + num_in++] = &req->dst[i]; sgs[num_out + num_in++] = sg;
/* Status */ /* Status */
sg_init_one(&status_sg, &vc_req->status, sizeof(vc_req->status)); sg_init_one(&status_sg, &vc_req->status, sizeof(vc_req->status));
@ -582,10 +587,11 @@ static void virtio_crypto_ablkcipher_finalize_req(
scatterwalk_map_and_copy(req->info, req->dst, scatterwalk_map_and_copy(req->info, req->dst,
req->nbytes - AES_BLOCK_SIZE, req->nbytes - AES_BLOCK_SIZE,
AES_BLOCK_SIZE, 0); AES_BLOCK_SIZE, 0);
crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine,
req, err);
kzfree(vc_sym_req->iv); kzfree(vc_sym_req->iv);
virtcrypto_clear_request(&vc_sym_req->base); virtcrypto_clear_request(&vc_sym_req->base);
crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine,
req, err);
} }
static struct virtio_crypto_algo virtio_crypto_algs[] = { { static struct virtio_crypto_algo virtio_crypto_algs[] = { {

View File

@ -178,8 +178,30 @@ static bool dma_fence_chain_signaled(struct dma_fence *fence)
static void dma_fence_chain_release(struct dma_fence *fence) static void dma_fence_chain_release(struct dma_fence *fence)
{ {
struct dma_fence_chain *chain = to_dma_fence_chain(fence); struct dma_fence_chain *chain = to_dma_fence_chain(fence);
struct dma_fence *prev;
/* Manually unlink the chain as much as possible to avoid recursion
* and potential stack overflow.
*/
while ((prev = rcu_dereference_protected(chain->prev, true))) {
struct dma_fence_chain *prev_chain;
if (kref_read(&prev->refcount) > 1)
break;
prev_chain = to_dma_fence_chain(prev);
if (!prev_chain)
break;
/* No need for atomic operations since we hold the last
* reference to prev_chain.
*/
chain->prev = prev_chain->prev;
RCU_INIT_POINTER(prev_chain->prev, NULL);
dma_fence_put(prev);
}
dma_fence_put(prev);
dma_fence_put(rcu_dereference_protected(chain->prev, true));
dma_fence_put(chain->fence); dma_fence_put(chain->fence);
dma_fence_free(fence); dma_fence_free(fence);
} }

View File

@ -160,7 +160,7 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci)
mtr, mcddrtcfg, imc->mc, i, j); mtr, mcddrtcfg, imc->mc, i, j);
if (IS_DIMM_PRESENT(mtr)) if (IS_DIMM_PRESENT(mtr))
ndimms += skx_get_dimm_info(mtr, 0, dimm, ndimms += skx_get_dimm_info(mtr, 0, 0, dimm,
imc, i, j); imc, i, j);
else if (IS_NVDIMM_PRESENT(mcddrtcfg, j)) else if (IS_NVDIMM_PRESENT(mcddrtcfg, j))
ndimms += skx_get_nvdimm_info(dimm, imc, i, j, ndimms += skx_get_nvdimm_info(dimm, imc, i, j,

View File

@ -151,27 +151,23 @@ static const struct x86_cpu_id skx_cpuids[] = {
}; };
MODULE_DEVICE_TABLE(x86cpu, skx_cpuids); MODULE_DEVICE_TABLE(x86cpu, skx_cpuids);
#define SKX_GET_MTMTR(dev, reg) \ static bool skx_check_ecc(u32 mcmtr)
pci_read_config_dword((dev), 0x87c, &(reg))
static bool skx_check_ecc(struct pci_dev *pdev)
{ {
u32 mtmtr; return !!GET_BITFIELD(mcmtr, 2, 2);
SKX_GET_MTMTR(pdev, mtmtr);
return !!GET_BITFIELD(mtmtr, 2, 2);
} }
static int skx_get_dimm_config(struct mem_ctl_info *mci) static int skx_get_dimm_config(struct mem_ctl_info *mci)
{ {
struct skx_pvt *pvt = mci->pvt_info; struct skx_pvt *pvt = mci->pvt_info;
u32 mtr, mcmtr, amap, mcddrtcfg;
struct skx_imc *imc = pvt->imc; struct skx_imc *imc = pvt->imc;
u32 mtr, amap, mcddrtcfg;
struct dimm_info *dimm; struct dimm_info *dimm;
int i, j; int i, j;
int ndimms; int ndimms;
/* Only the mcmtr on the first channel is effective */
pci_read_config_dword(imc->chan[0].cdev, 0x87c, &mcmtr);
for (i = 0; i < SKX_NUM_CHANNELS; i++) { for (i = 0; i < SKX_NUM_CHANNELS; i++) {
ndimms = 0; ndimms = 0;
pci_read_config_dword(imc->chan[i].cdev, 0x8C, &amap); pci_read_config_dword(imc->chan[i].cdev, 0x8C, &amap);
@ -182,14 +178,14 @@ static int skx_get_dimm_config(struct mem_ctl_info *mci)
pci_read_config_dword(imc->chan[i].cdev, pci_read_config_dword(imc->chan[i].cdev,
0x80 + 4 * j, &mtr); 0x80 + 4 * j, &mtr);
if (IS_DIMM_PRESENT(mtr)) { if (IS_DIMM_PRESENT(mtr)) {
ndimms += skx_get_dimm_info(mtr, amap, dimm, imc, i, j); ndimms += skx_get_dimm_info(mtr, mcmtr, amap, dimm, imc, i, j);
} else if (IS_NVDIMM_PRESENT(mcddrtcfg, j)) { } else if (IS_NVDIMM_PRESENT(mcddrtcfg, j)) {
ndimms += skx_get_nvdimm_info(dimm, imc, i, j, ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
EDAC_MOD_STR); EDAC_MOD_STR);
nvdimm_count++; nvdimm_count++;
} }
} }
if (ndimms && !skx_check_ecc(imc->chan[0].cdev)) { if (ndimms && !skx_check_ecc(mcmtr)) {
skx_printk(KERN_ERR, "ECC is disabled on imc %d\n", imc->mc); skx_printk(KERN_ERR, "ECC is disabled on imc %d\n", imc->mc);
return -ENODEV; return -ENODEV;
} }

View File

@ -283,7 +283,7 @@ static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add,
#define numrow(reg) skx_get_dimm_attr(reg, 2, 4, 12, 1, 6, "rows") #define numrow(reg) skx_get_dimm_attr(reg, 2, 4, 12, 1, 6, "rows")
#define numcol(reg) skx_get_dimm_attr(reg, 0, 1, 10, 0, 2, "cols") #define numcol(reg) skx_get_dimm_attr(reg, 0, 1, 10, 0, 2, "cols")
int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm, int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
struct skx_imc *imc, int chan, int dimmno) struct skx_imc *imc, int chan, int dimmno)
{ {
int banks = 16, ranks, rows, cols, npages; int banks = 16, ranks, rows, cols, npages;
@ -303,8 +303,8 @@ int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm,
imc->mc, chan, dimmno, size, npages, imc->mc, chan, dimmno, size, npages,
banks, 1 << ranks, rows, cols); banks, 1 << ranks, rows, cols);
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mtr, 0, 0); imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mcmtr, 0, 0);
imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mtr, 9, 9); imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mcmtr, 9, 9);
imc->chan[chan].dimms[dimmno].fine_grain_bank = GET_BITFIELD(amap, 0, 0); imc->chan[chan].dimms[dimmno].fine_grain_bank = GET_BITFIELD(amap, 0, 0);
imc->chan[chan].dimms[dimmno].rowbits = rows; imc->chan[chan].dimms[dimmno].rowbits = rows;
imc->chan[chan].dimms[dimmno].colbits = cols; imc->chan[chan].dimms[dimmno].colbits = cols;

View File

@ -126,7 +126,7 @@ int skx_get_all_bus_mappings(unsigned int did, int off, enum type,
int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm); int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm);
int skx_get_dimm_info(u32 mtr, u32 amap, struct dimm_info *dimm, int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
struct skx_imc *imc, int chan, int dimmno); struct skx_imc *imc, int chan, int dimmno);
int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc, int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,

View File

@ -522,8 +522,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var)
ret = kobject_init_and_add(&new_var->kobj, &efivar_ktype, ret = kobject_init_and_add(&new_var->kobj, &efivar_ktype,
NULL, "%s", short_name); NULL, "%s", short_name);
kfree(short_name); kfree(short_name);
if (ret) if (ret) {
kobject_put(&new_var->kobj);
return ret; return ret;
}
kobject_uevent(&new_var->kobj, KOBJ_ADD); kobject_uevent(&new_var->kobj, KOBJ_ADD);
if (efivar_entry_add(new_var, &efivar_sysfs_list)) { if (efivar_entry_add(new_var, &efivar_sysfs_list)) {

View File

@ -38,6 +38,7 @@ struct imx_sc_ipc {
struct device *dev; struct device *dev;
struct mutex lock; struct mutex lock;
struct completion done; struct completion done;
bool fast_ipc;
/* temporarily store the SCU msg */ /* temporarily store the SCU msg */
u32 *msg; u32 *msg;
@ -115,6 +116,26 @@ static void imx_scu_rx_callback(struct mbox_client *c, void *msg)
struct imx_sc_ipc *sc_ipc = sc_chan->sc_ipc; struct imx_sc_ipc *sc_ipc = sc_chan->sc_ipc;
struct imx_sc_rpc_msg *hdr; struct imx_sc_rpc_msg *hdr;
u32 *data = msg; u32 *data = msg;
int i;
if (!sc_ipc->msg) {
dev_warn(sc_ipc->dev, "unexpected rx idx %d 0x%08x, ignore!\n",
sc_chan->idx, *data);
return;
}
if (sc_ipc->fast_ipc) {
hdr = msg;
sc_ipc->rx_size = hdr->size;
sc_ipc->msg[0] = *data++;
for (i = 1; i < sc_ipc->rx_size; i++)
sc_ipc->msg[i] = *data++;
complete(&sc_ipc->done);
return;
}
if (sc_chan->idx == 0) { if (sc_chan->idx == 0) {
hdr = msg; hdr = msg;
@ -137,20 +158,22 @@ static void imx_scu_rx_callback(struct mbox_client *c, void *msg)
static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg) static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg)
{ {
struct imx_sc_rpc_msg *hdr = msg; struct imx_sc_rpc_msg hdr = *(struct imx_sc_rpc_msg *)msg;
struct imx_sc_chan *sc_chan; struct imx_sc_chan *sc_chan;
u32 *data = msg; u32 *data = msg;
int ret; int ret;
int size;
int i; int i;
/* Check size */ /* Check size */
if (hdr->size > IMX_SC_RPC_MAX_MSG) if (hdr.size > IMX_SC_RPC_MAX_MSG)
return -EINVAL; return -EINVAL;
dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr->svc, dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr.svc,
hdr->func, hdr->size); hdr.func, hdr.size);
for (i = 0; i < hdr->size; i++) { size = sc_ipc->fast_ipc ? 1 : hdr.size;
for (i = 0; i < size; i++) {
sc_chan = &sc_ipc->chans[i % 4]; sc_chan = &sc_ipc->chans[i % 4];
/* /*
@ -162,8 +185,10 @@ static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg)
* Wait for tx_done before every send to ensure that no * Wait for tx_done before every send to ensure that no
* queueing happens at the mailbox channel level. * queueing happens at the mailbox channel level.
*/ */
wait_for_completion(&sc_chan->tx_done); if (!sc_ipc->fast_ipc) {
reinit_completion(&sc_chan->tx_done); wait_for_completion(&sc_chan->tx_done);
reinit_completion(&sc_chan->tx_done);
}
ret = mbox_send_message(sc_chan->ch, &data[i]); ret = mbox_send_message(sc_chan->ch, &data[i]);
if (ret < 0) if (ret < 0)
@ -187,7 +212,8 @@ int imx_scu_call_rpc(struct imx_sc_ipc *sc_ipc, void *msg, bool have_resp)
mutex_lock(&sc_ipc->lock); mutex_lock(&sc_ipc->lock);
reinit_completion(&sc_ipc->done); reinit_completion(&sc_ipc->done);
sc_ipc->msg = msg; if (have_resp)
sc_ipc->msg = msg;
sc_ipc->count = 0; sc_ipc->count = 0;
ret = imx_scu_ipc_write(sc_ipc, msg); ret = imx_scu_ipc_write(sc_ipc, msg);
if (ret < 0) { if (ret < 0) {
@ -209,6 +235,7 @@ int imx_scu_call_rpc(struct imx_sc_ipc *sc_ipc, void *msg, bool have_resp)
} }
out: out:
sc_ipc->msg = NULL;
mutex_unlock(&sc_ipc->lock); mutex_unlock(&sc_ipc->lock);
dev_dbg(sc_ipc->dev, "RPC SVC done\n"); dev_dbg(sc_ipc->dev, "RPC SVC done\n");
@ -224,6 +251,8 @@ static int imx_scu_probe(struct platform_device *pdev)
struct imx_sc_chan *sc_chan; struct imx_sc_chan *sc_chan;
struct mbox_client *cl; struct mbox_client *cl;
char *chan_name; char *chan_name;
struct of_phandle_args args;
int num_channel;
int ret; int ret;
int i; int i;
@ -231,11 +260,20 @@ static int imx_scu_probe(struct platform_device *pdev)
if (!sc_ipc) if (!sc_ipc)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < SCU_MU_CHAN_NUM; i++) { ret = of_parse_phandle_with_args(pdev->dev.of_node, "mboxes",
if (i < 4) "#mbox-cells", 0, &args);
if (ret)
return ret;
sc_ipc->fast_ipc = of_device_is_compatible(args.np, "fsl,imx8-mu-scu");
num_channel = sc_ipc->fast_ipc ? 2 : SCU_MU_CHAN_NUM;
for (i = 0; i < num_channel; i++) {
if (i < num_channel / 2)
chan_name = kasprintf(GFP_KERNEL, "tx%d", i); chan_name = kasprintf(GFP_KERNEL, "tx%d", i);
else else
chan_name = kasprintf(GFP_KERNEL, "rx%d", i - 4); chan_name = kasprintf(GFP_KERNEL, "rx%d",
i - num_channel / 2);
if (!chan_name) if (!chan_name)
return -ENOMEM; return -ENOMEM;
@ -247,13 +285,15 @@ static int imx_scu_probe(struct platform_device *pdev)
cl->knows_txdone = true; cl->knows_txdone = true;
cl->rx_callback = imx_scu_rx_callback; cl->rx_callback = imx_scu_rx_callback;
/* Initial tx_done completion as "done" */ if (!sc_ipc->fast_ipc) {
cl->tx_done = imx_scu_tx_done; /* Initial tx_done completion as "done" */
init_completion(&sc_chan->tx_done); cl->tx_done = imx_scu_tx_done;
complete(&sc_chan->tx_done); init_completion(&sc_chan->tx_done);
complete(&sc_chan->tx_done);
}
sc_chan->sc_ipc = sc_ipc; sc_chan->sc_ipc = sc_ipc;
sc_chan->idx = i % 4; sc_chan->idx = i % (num_channel / 2);
sc_chan->ch = mbox_request_channel_byname(cl, chan_name); sc_chan->ch = mbox_request_channel_byname(cl, chan_name);
if (IS_ERR(sc_chan->ch)) { if (IS_ERR(sc_chan->ch)) {
ret = PTR_ERR(sc_chan->ch); ret = PTR_ERR(sc_chan->ch);

View File

@ -1292,14 +1292,14 @@ int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
struct dma_fence *iter, *last_signaled = NULL; struct dma_fence *iter, *last_signaled = NULL;
dma_fence_chain_for_each(iter, fence) { dma_fence_chain_for_each(iter, fence) {
if (!iter) if (iter->context != fence->context) {
break; dma_fence_put(iter);
dma_fence_put(last_signaled);
last_signaled = dma_fence_get(iter);
if (!to_dma_fence_chain(last_signaled)->prev_seqno)
/* It is most likely that timeline has /* It is most likely that timeline has
* unorder points. */ * unorder points. */
break; break;
}
dma_fence_put(last_signaled);
last_signaled = dma_fence_get(iter);
} }
point = dma_fence_is_signaled(last_signaled) ? point = dma_fence_is_signaled(last_signaled) ?
last_signaled->seqno : last_signaled->seqno :

View File

@ -196,6 +196,7 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id)
WARN_ON(!IS_CANNONLAKE(dev_priv) && !IS_COFFEELAKE(dev_priv)); WARN_ON(!IS_CANNONLAKE(dev_priv) && !IS_COFFEELAKE(dev_priv));
return PCH_CNP; return PCH_CNP;
case INTEL_PCH_CMP_DEVICE_ID_TYPE: case INTEL_PCH_CMP_DEVICE_ID_TYPE:
case INTEL_PCH_CMP2_DEVICE_ID_TYPE:
DRM_DEBUG_KMS("Found Comet Lake PCH (CMP)\n"); DRM_DEBUG_KMS("Found Comet Lake PCH (CMP)\n");
WARN_ON(!IS_COFFEELAKE(dev_priv)); WARN_ON(!IS_COFFEELAKE(dev_priv));
/* CometPoint is CNP Compatible */ /* CometPoint is CNP Compatible */

View File

@ -2627,6 +2627,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
#define INTEL_PCH_CNP_DEVICE_ID_TYPE 0xA300 #define INTEL_PCH_CNP_DEVICE_ID_TYPE 0xA300
#define INTEL_PCH_CNP_LP_DEVICE_ID_TYPE 0x9D80 #define INTEL_PCH_CNP_LP_DEVICE_ID_TYPE 0x9D80
#define INTEL_PCH_CMP_DEVICE_ID_TYPE 0x0280 #define INTEL_PCH_CMP_DEVICE_ID_TYPE 0x0280
#define INTEL_PCH_CMP2_DEVICE_ID_TYPE 0x0680
#define INTEL_PCH_ICP_DEVICE_ID_TYPE 0x3480 #define INTEL_PCH_ICP_DEVICE_ID_TYPE 0x3480
#define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 #define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100
#define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000 #define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000

View File

@ -80,7 +80,6 @@ const char *lima_ip_name(struct lima_ip *ip)
static int lima_clk_init(struct lima_device *dev) static int lima_clk_init(struct lima_device *dev)
{ {
int err; int err;
unsigned long bus_rate, gpu_rate;
dev->clk_bus = devm_clk_get(dev->dev, "bus"); dev->clk_bus = devm_clk_get(dev->dev, "bus");
if (IS_ERR(dev->clk_bus)) { if (IS_ERR(dev->clk_bus)) {
@ -94,12 +93,6 @@ static int lima_clk_init(struct lima_device *dev)
return PTR_ERR(dev->clk_gpu); return PTR_ERR(dev->clk_gpu);
} }
bus_rate = clk_get_rate(dev->clk_bus);
dev_info(dev->dev, "bus rate = %lu\n", bus_rate);
gpu_rate = clk_get_rate(dev->clk_gpu);
dev_info(dev->dev, "mod rate = %lu", gpu_rate);
err = clk_prepare_enable(dev->clk_bus); err = clk_prepare_enable(dev->clk_bus);
if (err) if (err)
return err; return err;
@ -145,7 +138,8 @@ static int lima_regulator_init(struct lima_device *dev)
dev->regulator = NULL; dev->regulator = NULL;
if (ret == -ENODEV) if (ret == -ENODEV)
return 0; return 0;
dev_err(dev->dev, "failed to get regulator: %d\n", ret); if (ret != -EPROBE_DEFER)
dev_err(dev->dev, "failed to get regulator: %d\n", ret);
return ret; return ret;
} }
@ -297,10 +291,8 @@ int lima_device_init(struct lima_device *ldev)
} }
err = lima_regulator_init(ldev); err = lima_regulator_init(ldev);
if (err) { if (err)
dev_err(ldev->dev, "regulator init fail %d\n", err);
goto err_out0; goto err_out0;
}
ldev->empty_vm = lima_vm_create(ldev); ldev->empty_vm = lima_vm_create(ldev);
if (!ldev->empty_vm) { if (!ldev->empty_vm) {
@ -343,6 +335,9 @@ int lima_device_init(struct lima_device *ldev)
if (err) if (err)
goto err_out5; goto err_out5;
dev_info(ldev->dev, "bus rate = %lu\n", clk_get_rate(ldev->clk_bus));
dev_info(ldev->dev, "mod rate = %lu", clk_get_rate(ldev->clk_gpu));
return 0; return 0;
err_out5: err_out5:

View File

@ -307,10 +307,8 @@ static int lima_pdev_probe(struct platform_device *pdev)
ldev->ddev = ddev; ldev->ddev = ddev;
err = lima_device_init(ldev); err = lima_device_init(ldev);
if (err) { if (err)
dev_err(&pdev->dev, "Fatal error during GPU init\n");
goto err_out1; goto err_out1;
}
/* /*
* Register the DRM device with the core and the connectors with * Register the DRM device with the core and the connectors with

View File

@ -15,9 +15,9 @@
#define LIMA_VM_NUM_PT_PER_BT (1 << LIMA_VM_NUM_PT_PER_BT_SHIFT) #define LIMA_VM_NUM_PT_PER_BT (1 << LIMA_VM_NUM_PT_PER_BT_SHIFT)
#define LIMA_VM_NUM_BT (LIMA_PAGE_ENT_NUM >> LIMA_VM_NUM_PT_PER_BT_SHIFT) #define LIMA_VM_NUM_BT (LIMA_PAGE_ENT_NUM >> LIMA_VM_NUM_PT_PER_BT_SHIFT)
#define LIMA_VA_RESERVE_START 0xFFF00000 #define LIMA_VA_RESERVE_START 0x0FFF00000ULL
#define LIMA_VA_RESERVE_DLBU LIMA_VA_RESERVE_START #define LIMA_VA_RESERVE_DLBU LIMA_VA_RESERVE_START
#define LIMA_VA_RESERVE_END 0x100000000 #define LIMA_VA_RESERVE_END 0x100000000ULL
struct lima_device; struct lima_device;

View File

@ -121,11 +121,6 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
enum drm_plane_type type, int index); enum drm_plane_type type, int index);
/* Gem stuff */ /* Gem stuff */
struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
struct drm_file *file,
u32 *handle,
u64 size);
vm_fault_t vkms_gem_fault(struct vm_fault *vmf); vm_fault_t vkms_gem_fault(struct vm_fault *vmf);
int vkms_dumb_create(struct drm_file *file, struct drm_device *dev, int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,

View File

@ -94,10 +94,10 @@ vm_fault_t vkms_gem_fault(struct vm_fault *vmf)
return ret; return ret;
} }
struct drm_gem_object *vkms_gem_create(struct drm_device *dev, static struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
struct drm_file *file, struct drm_file *file,
u32 *handle, u32 *handle,
u64 size) u64 size)
{ {
struct vkms_gem_object *obj; struct vkms_gem_object *obj;
int ret; int ret;
@ -110,7 +110,6 @@ struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
return ERR_CAST(obj); return ERR_CAST(obj);
ret = drm_gem_handle_create(file, &obj->gem, handle); ret = drm_gem_handle_create(file, &obj->gem, handle);
drm_gem_object_put_unlocked(&obj->gem);
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
@ -139,6 +138,8 @@ int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
args->size = gem_obj->size; args->size = gem_obj->size;
args->pitch = pitch; args->pitch = pitch;
drm_gem_object_put_unlocked(gem_obj);
DRM_DEBUG_DRIVER("Created object of size %lld\n", size); DRM_DEBUG_DRIVER("Created object of size %lld\n", size);
return 0; return 0;

View File

@ -1476,7 +1476,7 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
goto out; goto out;
} }
if (WARN_ON(drvdata->perf_data != etr_perf)) { if (WARN_ON(drvdata->perf_buf != etr_buf)) {
lost = true; lost = true;
spin_unlock_irqrestore(&drvdata->spinlock, flags); spin_unlock_irqrestore(&drvdata->spinlock, flags);
goto out; goto out;
@ -1488,8 +1488,6 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
tmc_sync_etr_buf(drvdata); tmc_sync_etr_buf(drvdata);
CS_LOCK(drvdata->base); CS_LOCK(drvdata->base);
/* Reset perf specific data */
drvdata->perf_data = NULL;
spin_unlock_irqrestore(&drvdata->spinlock, flags); spin_unlock_irqrestore(&drvdata->spinlock, flags);
size = etr_buf->len; size = etr_buf->len;
@ -1543,7 +1541,6 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
} }
etr_perf->head = PERF_IDX2OFF(handle->head, etr_perf); etr_perf->head = PERF_IDX2OFF(handle->head, etr_perf);
drvdata->perf_data = etr_perf;
/* /*
* No HW configuration is needed if the sink is already in * No HW configuration is needed if the sink is already in
@ -1559,6 +1556,7 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
/* Associate with monitored process. */ /* Associate with monitored process. */
drvdata->pid = pid; drvdata->pid = pid;
drvdata->mode = CS_MODE_PERF; drvdata->mode = CS_MODE_PERF;
drvdata->perf_buf = etr_perf->etr_buf;
atomic_inc(csdev->refcnt); atomic_inc(csdev->refcnt);
} }
@ -1604,6 +1602,8 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
/* Dissociate from monitored process. */ /* Dissociate from monitored process. */
drvdata->pid = -1; drvdata->pid = -1;
drvdata->mode = CS_MODE_DISABLED; drvdata->mode = CS_MODE_DISABLED;
/* Reset perf specific data */
drvdata->perf_buf = NULL;
spin_unlock_irqrestore(&drvdata->spinlock, flags); spin_unlock_irqrestore(&drvdata->spinlock, flags);

View File

@ -179,8 +179,8 @@ struct etr_buf {
* device configuration register (DEVID) * device configuration register (DEVID)
* @idr: Holds etr_bufs allocated for this ETR. * @idr: Holds etr_bufs allocated for this ETR.
* @idr_mutex: Access serialisation for idr. * @idr_mutex: Access serialisation for idr.
* @perf_data: PERF buffer for ETR. * @sysfs_buf: SYSFS buffer for ETR.
* @sysfs_data: SYSFS buffer for ETR. * @perf_buf: PERF buffer for ETR.
*/ */
struct tmc_drvdata { struct tmc_drvdata {
void __iomem *base; void __iomem *base;
@ -204,7 +204,7 @@ struct tmc_drvdata {
struct idr idr; struct idr idr;
struct mutex idr_mutex; struct mutex idr_mutex;
struct etr_buf *sysfs_buf; struct etr_buf *sysfs_buf;
void *perf_data; struct etr_buf *perf_buf;
}; };
struct etr_buf_operations { struct etr_buf_operations {

View File

@ -346,8 +346,10 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
/* Optional interface clock */ /* Optional interface clock */
dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
if (IS_ERR(dev->pclk)) if (IS_ERR(dev->pclk)) {
return PTR_ERR(dev->pclk); ret = PTR_ERR(dev->pclk);
goto exit_reset;
}
dev->clk = devm_clk_get(&pdev->dev, NULL); dev->clk = devm_clk_get(&pdev->dev, NULL);
if (!i2c_dw_prepare_clk(dev, true)) { if (!i2c_dw_prepare_clk(dev, true)) {

View File

@ -398,19 +398,23 @@ static int vcnl4000_probe(struct i2c_client *client,
static const struct of_device_id vcnl_4000_of_match[] = { static const struct of_device_id vcnl_4000_of_match[] = {
{ {
.compatible = "vishay,vcnl4000", .compatible = "vishay,vcnl4000",
.data = "VCNL4000", .data = (void *)VCNL4000,
}, },
{ {
.compatible = "vishay,vcnl4010", .compatible = "vishay,vcnl4010",
.data = "VCNL4010", .data = (void *)VCNL4010,
}, },
{ {
.compatible = "vishay,vcnl4010", .compatible = "vishay,vcnl4020",
.data = "VCNL4020", .data = (void *)VCNL4010,
},
{
.compatible = "vishay,vcnl4040",
.data = (void *)VCNL4040,
}, },
{ {
.compatible = "vishay,vcnl4200", .compatible = "vishay,vcnl4200",
.data = "VCNL4200", .data = (void *)VCNL4200,
}, },
{}, {},
}; };

View File

@ -110,12 +110,6 @@ enum pkt_q_sdma_state {
SDMA_PKT_Q_DEFERRED, SDMA_PKT_Q_DEFERRED,
}; };
/*
* Maximum retry attempts to submit a TX request
* before putting the process to sleep.
*/
#define MAX_DEFER_RETRY_COUNT 1
#define SDMA_IOWAIT_TIMEOUT 1000 /* in milliseconds */ #define SDMA_IOWAIT_TIMEOUT 1000 /* in milliseconds */
#define SDMA_DBG(req, fmt, ...) \ #define SDMA_DBG(req, fmt, ...) \

View File

@ -1205,7 +1205,7 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_dev *dev,
{ {
bool sq = pfault->type & MLX5_PFAULT_REQUESTOR; bool sq = pfault->type & MLX5_PFAULT_REQUESTOR;
u16 wqe_index = pfault->wqe.wqe_index; u16 wqe_index = pfault->wqe.wqe_index;
void *wqe = NULL, *wqe_end = NULL; void *wqe, *wqe_start = NULL, *wqe_end = NULL;
u32 bytes_mapped, total_wqe_bytes; u32 bytes_mapped, total_wqe_bytes;
struct mlx5_core_rsc_common *res; struct mlx5_core_rsc_common *res;
int resume_with_error = 1; int resume_with_error = 1;
@ -1226,12 +1226,13 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_dev *dev,
goto resolve_page_fault; goto resolve_page_fault;
} }
wqe = (void *)__get_free_page(GFP_KERNEL); wqe_start = (void *)__get_free_page(GFP_KERNEL);
if (!wqe) { if (!wqe_start) {
mlx5_ib_err(dev, "Error allocating memory for IO page fault handling.\n"); mlx5_ib_err(dev, "Error allocating memory for IO page fault handling.\n");
goto resolve_page_fault; goto resolve_page_fault;
} }
wqe = wqe_start;
qp = (res->res == MLX5_RES_QP) ? res_to_qp(res) : NULL; qp = (res->res == MLX5_RES_QP) ? res_to_qp(res) : NULL;
if (qp && sq) { if (qp && sq) {
ret = mlx5_ib_read_user_wqe_sq(qp, wqe_index, wqe, PAGE_SIZE, ret = mlx5_ib_read_user_wqe_sq(qp, wqe_index, wqe, PAGE_SIZE,
@ -1286,7 +1287,7 @@ resolve_page_fault:
pfault->wqe.wq_num, resume_with_error, pfault->wqe.wq_num, resume_with_error,
pfault->type); pfault->type);
mlx5_core_res_put(res); mlx5_core_res_put(res);
free_page((unsigned long)wqe); free_page((unsigned long)wqe_start);
} }
static int pages_in_range(u64 address, u32 length) static int pages_in_range(u64 address, u32 length)

View File

@ -170,6 +170,7 @@ static const char * const smbus_pnp_ids[] = {
"LEN005b", /* P50 */ "LEN005b", /* P50 */
"LEN005e", /* T560 */ "LEN005e", /* T560 */
"LEN006c", /* T470s */ "LEN006c", /* T470s */
"LEN007a", /* T470s */
"LEN0071", /* T480 */ "LEN0071", /* T480 */
"LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
"LEN0073", /* X1 Carbon G5 (Elantech) */ "LEN0073", /* X1 Carbon G5 (Elantech) */

View File

@ -91,15 +91,15 @@ static int __mms114_read_reg(struct mms114_data *data, unsigned int reg,
if (reg <= MMS114_MODE_CONTROL && reg + len > MMS114_MODE_CONTROL) if (reg <= MMS114_MODE_CONTROL && reg + len > MMS114_MODE_CONTROL)
BUG(); BUG();
/* Write register: use repeated start */ /* Write register */
xfer[0].addr = client->addr; xfer[0].addr = client->addr;
xfer[0].flags = I2C_M_TEN | I2C_M_NOSTART; xfer[0].flags = client->flags & I2C_M_TEN;
xfer[0].len = 1; xfer[0].len = 1;
xfer[0].buf = &buf; xfer[0].buf = &buf;
/* Read data */ /* Read data */
xfer[1].addr = client->addr; xfer[1].addr = client->addr;
xfer[1].flags = I2C_M_RD; xfer[1].flags = (client->flags & I2C_M_TEN) | I2C_M_RD;
xfer[1].len = len; xfer[1].len = len;
xfer[1].buf = val; xfer[1].buf = val;
@ -428,10 +428,8 @@ static int mms114_probe(struct i2c_client *client,
const void *match_data; const void *match_data;
int error; int error;
if (!i2c_check_functionality(client->adapter, if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
I2C_FUNC_PROTOCOL_MANGLING)) { dev_err(&client->dev, "Not supported I2C adapter\n");
dev_err(&client->dev,
"Need i2c bus that supports protocol mangling\n");
return -ENODEV; return -ENODEV;
} }

View File

@ -165,6 +165,9 @@
#define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2) #define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2)
#define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4) #define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4)
#define ARM_MALI_LPAE_MEMATTR_IMP_DEF 0x88ULL
#define ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC 0x8DULL
/* IOPTE accessors */ /* IOPTE accessors */
#define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d)) #define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d))
@ -1003,27 +1006,56 @@ arm_32_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
static struct io_pgtable * static struct io_pgtable *
arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
{ {
struct io_pgtable *iop; struct arm_lpae_io_pgtable *data;
if (cfg->ias != 48 || cfg->oas > 40) /* No quirks for Mali (hopefully) */
if (cfg->quirks)
return NULL;
if (cfg->ias > 48 || cfg->oas > 40)
return NULL; return NULL;
cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G); cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
iop = arm_64_lpae_alloc_pgtable_s1(cfg, cookie);
if (iop) {
u64 mair, ttbr;
/* Copy values as union fields overlap */ data = arm_lpae_alloc_pgtable(cfg);
mair = cfg->arm_lpae_s1_cfg.mair[0]; if (!data)
ttbr = cfg->arm_lpae_s1_cfg.ttbr[0]; return NULL;
cfg->arm_mali_lpae_cfg.memattr = mair; /* Mali seems to need a full 4-level table regardless of IAS */
cfg->arm_mali_lpae_cfg.transtab = ttbr | if (data->levels < ARM_LPAE_MAX_LEVELS) {
ARM_MALI_LPAE_TTBR_READ_INNER | data->levels = ARM_LPAE_MAX_LEVELS;
ARM_MALI_LPAE_TTBR_ADRMODE_TABLE; data->pgd_size = sizeof(arm_lpae_iopte);
} }
/*
* MEMATTR: Mali has no actual notion of a non-cacheable type, so the
* best we can do is mimic the out-of-tree driver and hope that the
* "implementation-defined caching policy" is good enough. Similarly,
* we'll use it for the sake of a valid attribute for our 'device'
* index, although callers should never request that in practice.
*/
cfg->arm_mali_lpae_cfg.memattr =
(ARM_MALI_LPAE_MEMATTR_IMP_DEF
<< ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_NC)) |
(ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC
<< ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_CACHE)) |
(ARM_MALI_LPAE_MEMATTR_IMP_DEF
<< ARM_LPAE_MAIR_ATTR_SHIFT(ARM_LPAE_MAIR_ATTR_IDX_DEV));
return iop; data->pgd = __arm_lpae_alloc_pages(data->pgd_size, GFP_KERNEL, cfg);
if (!data->pgd)
goto out_free_data;
/* Ensure the empty pgd is visible before TRANSTAB can be written */
wmb();
cfg->arm_mali_lpae_cfg.transtab = virt_to_phys(data->pgd) |
ARM_MALI_LPAE_TTBR_READ_INNER |
ARM_MALI_LPAE_TTBR_ADRMODE_TABLE;
return &data->iop;
out_free_data:
kfree(data);
return NULL;
} }
struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = { struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = {

View File

@ -38,6 +38,9 @@
#define LM3532_REG_ZN_2_LO 0x65 #define LM3532_REG_ZN_2_LO 0x65
#define LM3532_REG_ZN_3_HI 0x66 #define LM3532_REG_ZN_3_HI 0x66
#define LM3532_REG_ZN_3_LO 0x67 #define LM3532_REG_ZN_3_LO 0x67
#define LM3532_REG_ZONE_TRGT_A 0x70
#define LM3532_REG_ZONE_TRGT_B 0x75
#define LM3532_REG_ZONE_TRGT_C 0x7a
#define LM3532_REG_MAX 0x7e #define LM3532_REG_MAX 0x7e
/* Control Enable */ /* Control Enable */
@ -116,6 +119,7 @@ struct lm3532_als_data {
* @priv - Pointer the device data structure * @priv - Pointer the device data structure
* @control_bank - Control bank the LED is associated to * @control_bank - Control bank the LED is associated to
* @mode - Mode of the LED string * @mode - Mode of the LED string
* @ctrl_brt_pointer - Zone target register that controls the sink
* @num_leds - Number of LED strings are supported in this array * @num_leds - Number of LED strings are supported in this array
* @led_strings - The LED strings supported in this array * @led_strings - The LED strings supported in this array
* @label - LED label * @label - LED label
@ -126,6 +130,7 @@ struct lm3532_led {
int control_bank; int control_bank;
int mode; int mode;
int ctrl_brt_pointer;
int num_leds; int num_leds;
u32 led_strings[LM3532_MAX_CONTROL_BANKS]; u32 led_strings[LM3532_MAX_CONTROL_BANKS];
char label[LED_MAX_NAME_SIZE]; char label[LED_MAX_NAME_SIZE];
@ -339,8 +344,8 @@ static int lm3532_brightness_set(struct led_classdev *led_cdev,
if (ret) if (ret)
goto unlock; goto unlock;
brightness_reg = LM3532_REG_CTRL_A_BRT + led->control_bank * 2; brightness_reg = LM3532_REG_ZONE_TRGT_A + led->control_bank * 5 +
brt_val = brt_val / LM3532_BRT_VAL_ADJUST; (led->ctrl_brt_pointer >> 2);
ret = regmap_write(led->priv->regmap, brightness_reg, brt_val); ret = regmap_write(led->priv->regmap, brightness_reg, brt_val);
@ -356,8 +361,30 @@ static int lm3532_init_registers(struct lm3532_led *led)
unsigned int output_cfg_val = 0; unsigned int output_cfg_val = 0;
unsigned int output_cfg_shift = 0; unsigned int output_cfg_shift = 0;
unsigned int output_cfg_mask = 0; unsigned int output_cfg_mask = 0;
unsigned int brightness_config_reg;
unsigned int brightness_config_val;
int ret, i; int ret, i;
if (drvdata->enable_gpio)
gpiod_direction_output(drvdata->enable_gpio, 1);
brightness_config_reg = LM3532_REG_ZONE_CFG_A + led->control_bank * 2;
/*
* This could be hard coded to the default value but the control
* brightness register may have changed during boot.
*/
ret = regmap_read(drvdata->regmap, brightness_config_reg,
&led->ctrl_brt_pointer);
if (ret)
return ret;
led->ctrl_brt_pointer &= LM3532_ZONE_MASK;
brightness_config_val = led->ctrl_brt_pointer | led->mode;
ret = regmap_write(drvdata->regmap, brightness_config_reg,
brightness_config_val);
if (ret)
return ret;
for (i = 0; i < led->num_leds; i++) { for (i = 0; i < led->num_leds; i++) {
output_cfg_shift = led->led_strings[i] * 2; output_cfg_shift = led->led_strings[i] * 2;
output_cfg_val |= (led->control_bank << output_cfg_shift); output_cfg_val |= (led->control_bank << output_cfg_shift);
@ -382,7 +409,6 @@ static int lm3532_als_configure(struct lm3532_data *priv,
struct lm3532_als_data *als = priv->als_data; struct lm3532_als_data *als = priv->als_data;
u32 als_vmin, als_vmax, als_vstep; u32 als_vmin, als_vmax, als_vstep;
int zone_reg = LM3532_REG_ZN_0_HI; int zone_reg = LM3532_REG_ZN_0_HI;
int brightnes_config_reg;
int ret; int ret;
int i; int i;
@ -411,14 +437,7 @@ static int lm3532_als_configure(struct lm3532_data *priv,
als->config = (als->als_avrg_time | (LM3532_ENABLE_ALS) | als->config = (als->als_avrg_time | (LM3532_ENABLE_ALS) |
(als->als_input_mode << LM3532_ALS_SEL_SHIFT)); (als->als_input_mode << LM3532_ALS_SEL_SHIFT));
ret = regmap_write(priv->regmap, LM3532_ALS_CONFIG, als->config); return regmap_write(priv->regmap, LM3532_ALS_CONFIG, als->config);
if (ret)
return ret;
brightnes_config_reg = LM3532_REG_ZONE_CFG_A + led->control_bank * 2;
return regmap_update_bits(priv->regmap, brightnes_config_reg,
LM3532_I2C_CTRL, LM3532_ALS_CTRL);
} }
static int lm3532_parse_als(struct lm3532_data *priv) static int lm3532_parse_als(struct lm3532_data *priv)
@ -646,9 +665,6 @@ static int lm3532_probe(struct i2c_client *client,
return ret; return ret;
} }
if (drvdata->enable_gpio)
gpiod_direction_output(drvdata->enable_gpio, 1);
return ret; return ret;
} }

View File

@ -1438,7 +1438,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__set_blocks(n1, n1->keys + n2->keys, if (__set_blocks(n1, n1->keys + n2->keys,
block_bytes(b->c)) > block_bytes(b->c)) >
btree_blocks(new_nodes[i])) btree_blocks(new_nodes[i]))
goto out_nocoalesce; goto out_unlock_nocoalesce;
keys = n2->keys; keys = n2->keys;
/* Take the key of the node we're getting rid of */ /* Take the key of the node we're getting rid of */
@ -1467,7 +1467,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__bch_keylist_realloc(&keylist, if (__bch_keylist_realloc(&keylist,
bkey_u64s(&new_nodes[i]->key))) bkey_u64s(&new_nodes[i]->key)))
goto out_nocoalesce; goto out_unlock_nocoalesce;
bch_btree_node_write(new_nodes[i], &cl); bch_btree_node_write(new_nodes[i], &cl);
bch_keylist_add(&keylist, &new_nodes[i]->key); bch_keylist_add(&keylist, &new_nodes[i]->key);
@ -1513,6 +1513,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
/* Invalidated our iterator */ /* Invalidated our iterator */
return -EINTR; return -EINTR;
out_unlock_nocoalesce:
for (i = 0; i < nodes; i++)
mutex_unlock(&new_nodes[i]->write_lock);
out_nocoalesce: out_nocoalesce:
closure_sync(&cl); closure_sync(&cl);

View File

@ -720,9 +720,8 @@ try_again:
/* Retry init sequence, but without R4_18V_PRESENT. */ /* Retry init sequence, but without R4_18V_PRESENT. */
retries = 0; retries = 0;
goto try_again; goto try_again;
} else {
goto remove;
} }
return err;
} }
/* /*

View File

@ -162,6 +162,9 @@ static int sdmmc_idma_start(struct mmci_host *host, unsigned int *datactrl)
static void sdmmc_idma_finalize(struct mmci_host *host, struct mmc_data *data) static void sdmmc_idma_finalize(struct mmci_host *host, struct mmc_data *data)
{ {
writel_relaxed(0, host->base + MMCI_STM32_IDMACTRLR); writel_relaxed(0, host->base + MMCI_STM32_IDMACTRLR);
if (!data->host_cookie)
sdmmc_idma_unprep_data(host, data, 0);
} }
static void mmci_sdmmc_set_clkreg(struct mmci_host *host, unsigned int desired) static void mmci_sdmmc_set_clkreg(struct mmci_host *host, unsigned int desired)

Some files were not shown because too many files have changed in this diff Show More