mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 13:25:20 +02:00
Merge tag 'v5.2.47' into v5.2/standard/base
This is the 5.2.47 stable release
This commit is contained in:
commit
ea5ea4dc89
|
@ -121,12 +121,6 @@ Proportional weight policy files
|
|||
dev weight
|
||||
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
|
||||
- disk time allocated to cgroup per device in milliseconds. First
|
||||
two fields specify the major and minor number of the device and
|
||||
|
|
|
@ -25,6 +25,7 @@ Core utilities
|
|||
librs
|
||||
genalloc
|
||||
errseq
|
||||
packing
|
||||
printk-formats
|
||||
circular-buffers
|
||||
generic-radix-tree
|
||||
|
|
|
@ -30,6 +30,7 @@ The solution
|
|||
------------
|
||||
|
||||
This API deals with 2 basic operations:
|
||||
|
||||
- Packing a CPU-usable number into a memory buffer (with 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:
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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:
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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:
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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:
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
|
@ -63,7 +63,11 @@ properties:
|
|||
description:
|
||||
Set this flag to force EHCI reset after resume.
|
||||
|
||||
phys: true
|
||||
phys:
|
||||
description: PHY specifier for the USB PHY
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -74,7 +78,7 @@ additionalProperties: false
|
|||
|
||||
examples:
|
||||
- |
|
||||
ehci@e0000300 {
|
||||
usb@e0000300 {
|
||||
compatible = "ibm,usb-ehci-440epx", "generic-ehci";
|
||||
interrupt-parent = <&UIC0>;
|
||||
interrupts = <0x1a 4>;
|
||||
|
|
|
@ -67,7 +67,11 @@ properties:
|
|||
description:
|
||||
Overrides the detected port count
|
||||
|
||||
phys: true
|
||||
phys:
|
||||
description: PHY specifier for the USB PHY
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -84,6 +88,7 @@ examples:
|
|||
interrupts = <64>;
|
||||
clocks = <&usb_clk 6>, <&ahb_gates 2>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
};
|
||||
|
||||
...
|
||||
|
|
|
@ -32,7 +32,7 @@ Required properties:
|
|||
"mcu_ck": mcu_bus clock for register access,
|
||||
"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:
|
||||
- wakeup-source : enable USB remote wakeup;
|
||||
|
@ -52,7 +52,7 @@ Optional properties:
|
|||
See: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
|
||||
- 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.
|
||||
|
||||
Example:
|
||||
|
|
|
@ -17,7 +17,7 @@ Required properties:
|
|||
- clock-names : must contain "sys_ck" for clock of controller,
|
||||
the following clocks are optional:
|
||||
"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",
|
||||
refer to usb/generic.txt
|
||||
|
||||
|
@ -53,7 +53,7 @@ Optional properties:
|
|||
- mediatek,u3p-dis-msk : mask to disable u3ports, bit0 for u3port0,
|
||||
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.
|
||||
|
||||
Sub-nodes:
|
||||
|
|
|
@ -18,8 +18,13 @@ properties:
|
|||
description:
|
||||
List of all the USB PHYs on this HCD
|
||||
|
||||
phy-names:
|
||||
description:
|
||||
Name specifier for the USB PHY
|
||||
|
||||
examples:
|
||||
- |
|
||||
usb {
|
||||
phys = <&usb2_phy1>, <&usb3_phy1>;
|
||||
phy-names = "usb";
|
||||
};
|
||||
|
|
|
@ -6,7 +6,7 @@ Required properties:
|
|||
- reg : Should contain 1 register ranges(address and length)
|
||||
- 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.
|
||||
|
||||
Example:
|
||||
|
|
|
@ -41,9 +41,9 @@ Optional properties:
|
|||
- usb3-lpm-capable: determines if platform is USB3 LPM capable
|
||||
- quirk-broken-port-ped: set if the controller has broken port disable mechanism
|
||||
- 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.
|
||||
|
||||
|
||||
|
|
|
@ -159,11 +159,15 @@ Byte sequences
|
|||
distance = 16384 + (H << 14) + D
|
||||
state = S (copy S literals after this block)
|
||||
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
|
||||
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.
|
||||
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)
|
||||
Copy of small block within 16kB distance (preferably less than 34B)
|
||||
|
|
|
@ -216,8 +216,6 @@ alc298-dell-aio
|
|||
ALC298 fixups on Dell AIO machines
|
||||
alc275-dell-xps
|
||||
ALC275 fixups on Dell XPS models
|
||||
alc256-dell-xps13
|
||||
ALC256 fixups on Dell XPS13
|
||||
lenovo-spk-noise
|
||||
Workaround for speaker noise on Lenovo machines
|
||||
lenovo-hotkey
|
||||
|
|
14
MAINTAINERS
14
MAINTAINERS
|
@ -715,7 +715,7 @@ ALTERA SYSTEM MANAGER DRIVER
|
|||
M: Thor Thayer <thor.thayer@linux.intel.com>
|
||||
S: Maintained
|
||||
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
|
||||
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>
|
||||
L: netdev@vger.kernel.org
|
||||
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/networking/phy.rst
|
||||
F: drivers/net/phy/
|
||||
|
@ -11884,7 +11884,7 @@ L: netdev@vger.kernel.org
|
|||
S: Supported
|
||||
F: lib/packing.c
|
||||
F: include/linux/packing.h
|
||||
F: Documentation/packing.txt
|
||||
F: Documentation/core-api/packing.rst
|
||||
|
||||
PADATA PARALLEL EXECUTION MECHANISM
|
||||
M: Steffen Klassert <steffen.klassert@secunet.com>
|
||||
|
@ -17517,14 +17517,6 @@ S: Maintained
|
|||
F: mm/zpool.c
|
||||
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
|
||||
M: Minchan Kim <minchan@kernel.org>
|
||||
M: Nitin Gupta <ngupta@vflare.org>
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 46
|
||||
SUBLEVEL = 47
|
||||
EXTRAVERSION =
|
||||
NAME = Bobtail Squid
|
||||
|
||||
|
|
|
@ -125,8 +125,6 @@
|
|||
bus-width = <8>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sdmmc0_default>;
|
||||
non-removable;
|
||||
mmc-ddr-1_8v;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -520,6 +520,7 @@
|
|||
interrupts = <39>;
|
||||
clocks = <&ccu CLK_AHB_EHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -529,6 +530,7 @@
|
|||
interrupts = <64>;
|
||||
clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -608,6 +610,7 @@
|
|||
interrupts = <40>;
|
||||
clocks = <&ccu CLK_AHB_EHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -617,6 +620,7 @@
|
|||
interrupts = <65>;
|
||||
clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -391,6 +391,7 @@
|
|||
interrupts = <39>;
|
||||
clocks = <&ccu CLK_AHB_EHCI>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -400,6 +401,7 @@
|
|||
interrupts = <40>;
|
||||
clocks = <&ccu CLK_USB_OHCI>, <&ccu CLK_AHB_OHCI>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -543,6 +543,7 @@
|
|||
clocks = <&ccu CLK_AHB1_EHCI0>;
|
||||
resets = <&ccu RST_AHB1_EHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -553,6 +554,7 @@
|
|||
clocks = <&ccu CLK_AHB1_OHCI0>, <&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_AHB1_OHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -563,6 +565,7 @@
|
|||
clocks = <&ccu CLK_AHB1_EHCI1>;
|
||||
resets = <&ccu RST_AHB1_EHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -573,6 +576,7 @@
|
|||
clocks = <&ccu CLK_AHB1_OHCI1>, <&ccu CLK_USB_OHCI1>;
|
||||
resets = <&ccu RST_AHB1_OHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -612,6 +612,7 @@
|
|||
interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_AHB_EHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -621,6 +622,7 @@
|
|||
interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_USB_OHCI0>, <&ccu CLK_AHB_OHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -703,6 +705,7 @@
|
|||
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_AHB_EHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -712,6 +715,7 @@
|
|||
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&ccu CLK_USB_OHCI1>, <&ccu CLK_AHB_OHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -307,6 +307,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI>;
|
||||
resets = <&ccu RST_BUS_EHCI>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -317,6 +318,7 @@
|
|||
clocks = <&ccu CLK_BUS_OHCI>, <&ccu CLK_USB_OHCI>;
|
||||
resets = <&ccu RST_BUS_OHCI>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -632,6 +632,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI0>;
|
||||
resets = <&ccu RST_BUS_EHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -643,6 +644,7 @@
|
|||
clocks = <&ccu CLK_BUS_OHCI0>, <&ccu CLK_USB_OHCI0>;
|
||||
resets = <&ccu RST_BUS_OHCI0>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -654,6 +656,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI1>;
|
||||
resets = <&ccu RST_BUS_EHCI1>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -283,6 +283,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI1>;
|
||||
resets = <&ccu RST_BUS_EHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -294,6 +295,7 @@
|
|||
<&ccu CLK_USB_OHCI1>;
|
||||
resets = <&ccu RST_BUS_OHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -304,6 +306,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI2>;
|
||||
resets = <&ccu RST_BUS_EHCI2>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -315,6 +318,7 @@
|
|||
<&ccu CLK_USB_OHCI2>;
|
||||
resets = <&ccu RST_BUS_OHCI2>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -342,6 +342,7 @@
|
|||
clocks = <&usb_clocks CLK_BUS_HCI0>;
|
||||
resets = <&usb_clocks RST_USB0_HCI>;
|
||||
phys = <&usbphy1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -353,6 +354,7 @@
|
|||
<&usb_clocks CLK_USB_OHCI0>;
|
||||
resets = <&usb_clocks RST_USB0_HCI>;
|
||||
phys = <&usbphy1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -374,6 +376,7 @@
|
|||
clocks = <&usb_clocks CLK_BUS_HCI1>;
|
||||
resets = <&usb_clocks RST_USB1_HCI>;
|
||||
phys = <&usbphy2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -403,6 +406,7 @@
|
|||
clocks = <&usb_clocks CLK_BUS_HCI2>;
|
||||
resets = <&usb_clocks RST_USB2_HCI>;
|
||||
phys = <&usbphy3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -414,6 +418,7 @@
|
|||
<&usb_clocks CLK_USB_OHCI2>;
|
||||
resets = <&usb_clocks RST_USB2_HCI>;
|
||||
phys = <&usbphy3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -304,6 +304,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI1>, <&ccu CLK_BUS_OHCI1>;
|
||||
resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -315,6 +316,7 @@
|
|||
<&ccu CLK_USB_OHCI1>;
|
||||
resets = <&ccu RST_BUS_EHCI1>, <&ccu RST_BUS_OHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -325,6 +327,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI2>, <&ccu CLK_BUS_OHCI2>;
|
||||
resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -336,6 +339,7 @@
|
|||
<&ccu CLK_USB_OHCI2>;
|
||||
resets = <&ccu RST_BUS_EHCI2>, <&ccu RST_BUS_OHCI2>;
|
||||
phys = <&usbphy 2>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -346,6 +350,7 @@
|
|||
clocks = <&ccu CLK_BUS_EHCI3>, <&ccu CLK_BUS_OHCI3>;
|
||||
resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>;
|
||||
phys = <&usbphy 3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -357,6 +362,7 @@
|
|||
<&ccu CLK_USB_OHCI3>;
|
||||
resets = <&ccu RST_BUS_EHCI3>, <&ccu RST_BUS_OHCI3>;
|
||||
phys = <&usbphy 3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -364,6 +364,7 @@ CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m
|
|||
CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m
|
||||
CONFIG_DRM_TILCDC=m
|
||||
CONFIG_DRM_PANEL_SIMPLE=m
|
||||
CONFIG_DRM_TI_TFP410=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
|
|
|
@ -219,8 +219,8 @@ static struct undef_hook arm_break_hook = {
|
|||
};
|
||||
|
||||
static struct undef_hook thumb_break_hook = {
|
||||
.instr_mask = 0xffff,
|
||||
.instr_val = 0xde01,
|
||||
.instr_mask = 0xffffffff,
|
||||
.instr_val = 0x0000de01,
|
||||
.cpsr_mask = PSR_T_BIT,
|
||||
.cpsr_val = PSR_T_BIT,
|
||||
.fn = break_trap,
|
||||
|
|
|
@ -104,6 +104,7 @@
|
|||
|
||||
&ehci0 {
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -150,6 +151,7 @@
|
|||
|
||||
&ohci0 {
|
||||
phys = <&usbphy 0>;
|
||||
phy-names = "usb";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -553,6 +553,7 @@
|
|||
resets = <&ccu RST_BUS_OHCI1>,
|
||||
<&ccu RST_BUS_EHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -564,6 +565,7 @@
|
|||
<&ccu CLK_USB_OHCI1>;
|
||||
resets = <&ccu RST_BUS_OHCI1>;
|
||||
phys = <&usbphy 1>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -465,6 +465,7 @@
|
|||
resets = <&ccu RST_BUS_OHCI3>,
|
||||
<&ccu RST_BUS_EHCI3>;
|
||||
phys = <&usb2phy 3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -476,6 +477,7 @@
|
|||
<&ccu CLK_USB_OHCI3>;
|
||||
resets = <&ccu RST_BUS_OHCI3>;
|
||||
phys = <&usb2phy 3>;
|
||||
phy-names = "usb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -883,6 +883,8 @@
|
|||
<&cpg CPG_CORE R8A774A1_CLK_CANFD>,
|
||||
<&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>;
|
||||
resets = <&cpg 916>;
|
||||
status = "disabled";
|
||||
|
@ -897,6 +899,8 @@
|
|||
<&cpg CPG_CORE R8A774A1_CLK_CANFD>,
|
||||
<&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>;
|
||||
resets = <&cpg 915>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -973,6 +973,8 @@
|
|||
<&cpg CPG_CORE R8A774C0_CLK_CANFD>,
|
||||
<&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>;
|
||||
resets = <&cpg 916>;
|
||||
status = "disabled";
|
||||
|
@ -987,6 +989,8 @@
|
|||
<&cpg CPG_CORE R8A774C0_CLK_CANFD>,
|
||||
<&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>;
|
||||
resets = <&cpg 915>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -97,12 +97,6 @@ static inline void vcpu_ptrauth_disable(struct kvm_vcpu *vcpu)
|
|||
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)
|
||||
{
|
||||
return vcpu->arch.vsesr_el2;
|
||||
|
|
|
@ -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
|
||||
* same system registers.
|
||||
*/
|
||||
#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r)])
|
||||
#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r)])
|
||||
#define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
|
||||
|
||||
#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 {
|
||||
ulong remote_tlb_flush;
|
||||
|
|
|
@ -173,11 +173,16 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
|
|||
};
|
||||
|
||||
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, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SHA3_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_BITPERM_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_AES_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_SM4_SHIFT, 4, 0),
|
||||
ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SVE),
|
||||
FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ZFR0_SHA3_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,
|
||||
};
|
||||
|
||||
|
|
|
@ -162,31 +162,16 @@ static int handle_sve(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||
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
|
||||
* ptrauth register.
|
||||
*/
|
||||
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);
|
||||
ctxt = vcpu->arch.host_cpu_context;
|
||||
__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 {
|
||||
else
|
||||
kvm_inject_undefined(vcpu);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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,
|
||||
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)
|
||||
vcpu_write_sys_reg(vcpu, p->regval, r->reg);
|
||||
vcpu_write_sys_reg(vcpu, p->regval, reg);
|
||||
else
|
||||
p->regval = vcpu_read_sys_reg(vcpu, r->reg);
|
||||
p->regval = vcpu_read_sys_reg(vcpu, reg);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#define LSAVE_A1 28
|
||||
#define LSAVE_A2 32
|
||||
#define LSAVE_A3 36
|
||||
#define LSAVE_A4 40
|
||||
#define LSAVE_A5 44
|
||||
|
||||
#define KSPTOUSP
|
||||
#define USPTOKSP
|
||||
|
|
|
@ -162,8 +162,10 @@ csky_syscall_trace:
|
|||
ldw a3, (sp, LSAVE_A3)
|
||||
#if defined(__CSKYABIV2__)
|
||||
subi sp, 8
|
||||
stw r5, (sp, 0x4)
|
||||
stw r4, (sp, 0x0)
|
||||
ldw r9, (sp, LSAVE_A4)
|
||||
stw r9, (sp, 0x0)
|
||||
ldw r9, (sp, LSAVE_A5)
|
||||
stw r9, (sp, 0x4)
|
||||
#else
|
||||
ldw r6, (sp, LSAVE_A4)
|
||||
ldw r7, (sp, LSAVE_A5)
|
||||
|
|
|
@ -274,8 +274,12 @@ enum emulation_result {
|
|||
#define MIPS3_PG_SHIFT 6
|
||||
#define MIPS3_PG_FRAME 0x3fffffc0
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
#define VPN2_MASK GENMASK(cpu_vmbits - 1, 13)
|
||||
#else
|
||||
#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_VPN2(x) ((x).tlb_hi & VPN2_MASK)
|
||||
#define TLB_ASID(x) ((x).tlb_hi & KVM_ENTRYHI_ASID)
|
||||
|
|
|
@ -126,6 +126,7 @@ config PPC
|
|||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_KCOV
|
||||
select ARCH_HAS_HUGEPD if HUGETLB_PAGE
|
||||
select ARCH_HAS_MMIOWB if PPC64
|
||||
select ARCH_HAS_PHYS_TO_DMA
|
||||
select ARCH_HAS_PMEM_API if PPC64
|
||||
|
|
|
@ -530,13 +530,6 @@ retry:
|
|||
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
|
||||
unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ struct pg_state {
|
|||
unsigned long start_address;
|
||||
unsigned long start_pa;
|
||||
unsigned long last_pa;
|
||||
unsigned long page_size;
|
||||
unsigned int level;
|
||||
u64 current_flags;
|
||||
bool check_wx;
|
||||
|
@ -163,9 +164,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)
|
|||
#endif
|
||||
|
||||
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);
|
||||
delta = PAGE_SIZE >> 10;
|
||||
delta = st->page_size >> 10;
|
||||
} else {
|
||||
pt_dump_seq_printf(st->seq, " " REG " ", st->start_pa);
|
||||
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,
|
||||
unsigned int level, u64 val)
|
||||
unsigned int level, u64 val, unsigned long page_size)
|
||||
{
|
||||
u64 flag = val & pg_level[level].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_pa = pa;
|
||||
st->last_pa = pa;
|
||||
st->page_size = page_size;
|
||||
pt_dump_seq_printf(st->seq, "---[ %s ]---\n", st->marker->name);
|
||||
/*
|
||||
* 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 ||
|
||||
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))) {
|
||||
|
||||
/* 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_pa = pa;
|
||||
st->last_pa = pa;
|
||||
st->page_size = page_size;
|
||||
st->current_flags = flag;
|
||||
st->level = level;
|
||||
} 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++) {
|
||||
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 */
|
||||
walk_pte(st, pmd, addr);
|
||||
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 */
|
||||
walk_pmd(st, pud, addr);
|
||||
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 */
|
||||
walk_pud(st, pgd, addr);
|
||||
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 */
|
||||
walk_pagetables(&st);
|
||||
note_page(&st, 0, 0, 0);
|
||||
note_page(&st, 0, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1891,8 +1891,8 @@ static __initconst const u64 tnt_hw_cache_extra_regs
|
|||
|
||||
static struct extra_reg intel_tnt_extra_regs[] __read_mostly = {
|
||||
/* 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(0x02b7, MSR_OFFCORE_RSP_1, 0xffffff9fffull, RSP_1),
|
||||
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x800ff0ffffff9fffull, RSP_0),
|
||||
INTEL_UEVENT_EXTRA_REG(0x02b7, MSR_OFFCORE_RSP_1, 0xff0ffffff9fffull, RSP_1),
|
||||
EVENT_EXTRA_END
|
||||
};
|
||||
|
||||
|
|
|
@ -93,28 +93,35 @@ void set_kernel_text_rw(void);
|
|||
void set_kernel_text_ro(void);
|
||||
|
||||
#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;
|
||||
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:
|
||||
* 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
|
||||
* speculative access to the poison page because we'd have
|
||||
* the virtual address of the kernel 1:1 mapping sitting
|
||||
* around in registers.
|
||||
* Instead we get tricky. We create a non-canonical address
|
||||
* 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.
|
||||
*/
|
||||
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)
|
||||
pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn);
|
||||
return rc;
|
||||
|
|
|
@ -581,7 +581,9 @@ early_param("nospectre_v1", nospectre_v1_cmdline);
|
|||
static enum spectre_v2_mitigation spectre_v2_enabled __ro_after_init =
|
||||
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;
|
||||
|
||||
#ifdef CONFIG_RETPOLINE
|
||||
|
@ -727,15 +729,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
|
|||
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 */
|
||||
if (boot_cpu_has(X86_FEATURE_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",
|
||||
static_key_enabled(&switch_mm_always_ibpb) ?
|
||||
"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;
|
||||
|
||||
/*
|
||||
* If SMT is not possible or STIBP is not available clear the STIBP
|
||||
* mode.
|
||||
* 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 (!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;
|
||||
|
||||
spectre_v2_user_stibp = mode;
|
||||
|
||||
set_mode:
|
||||
spectre_v2_user = mode;
|
||||
/* Only print the STIBP mode when SMT possible */
|
||||
if (smt_possible)
|
||||
pr_info("%s\n", spectre_v2_user_strings[mode]);
|
||||
pr_info("%s\n", spectre_v2_user_strings[mode]);
|
||||
}
|
||||
|
||||
static const char * const spectre_v2_strings[] = {
|
||||
|
@ -1007,7 +1013,7 @@ void cpu_bugs_smt_update(void)
|
|||
{
|
||||
mutex_lock(&spec_ctrl_mutex);
|
||||
|
||||
switch (spectre_v2_user) {
|
||||
switch (spectre_v2_user_stibp) {
|
||||
case SPECTRE_V2_USER_NONE:
|
||||
break;
|
||||
case SPECTRE_V2_USER_STRICT:
|
||||
|
@ -1250,14 +1256,19 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
|
|||
{
|
||||
switch (ctrl) {
|
||||
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;
|
||||
/*
|
||||
* 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 ||
|
||||
spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED)
|
||||
if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
|
||||
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;
|
||||
task_clear_spec_ib_disable(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
|
||||
* 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;
|
||||
if (spectre_v2_user == SPECTRE_V2_USER_STRICT ||
|
||||
spectre_v2_user == SPECTRE_V2_USER_STRICT_PREFERRED)
|
||||
if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
|
||||
spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT ||
|
||||
spectre_v2_user_stibp == SPECTRE_V2_USER_STRICT_PREFERRED)
|
||||
return 0;
|
||||
task_set_spec_ib_disable(task);
|
||||
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)
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
@ -1333,22 +1347,24 @@ static int ib_prctl_get(struct task_struct *task)
|
|||
if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
|
||||
return PR_SPEC_NOT_AFFECTED;
|
||||
|
||||
switch (spectre_v2_user) {
|
||||
case SPECTRE_V2_USER_NONE:
|
||||
if (spectre_v2_user_ibpb == SPECTRE_V2_USER_NONE &&
|
||||
spectre_v2_user_stibp == SPECTRE_V2_USER_NONE)
|
||||
return PR_SPEC_ENABLE;
|
||||
case SPECTRE_V2_USER_PRCTL:
|
||||
case SPECTRE_V2_USER_SECCOMP:
|
||||
else if (spectre_v2_user_ibpb == SPECTRE_V2_USER_STRICT ||
|
||||
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))
|
||||
return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE;
|
||||
if (task_spec_ib_disable(task))
|
||||
return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
|
||||
return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
|
||||
case SPECTRE_V2_USER_STRICT:
|
||||
case SPECTRE_V2_USER_STRICT_PREFERRED:
|
||||
return PR_SPEC_DISABLE;
|
||||
default:
|
||||
} else
|
||||
return PR_SPEC_NOT_AFFECTED;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
return "";
|
||||
|
||||
switch (spectre_v2_user) {
|
||||
switch (spectre_v2_user_stibp) {
|
||||
case SPECTRE_V2_USER_NONE:
|
||||
return ", STIBP: disabled";
|
||||
case SPECTRE_V2_USER_STRICT:
|
||||
|
|
|
@ -517,6 +517,13 @@ bool mce_is_memory_error(struct mce *m)
|
|||
}
|
||||
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)
|
||||
{
|
||||
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)) {
|
||||
pfn = mce->addr >> PAGE_SHIFT;
|
||||
if (!memory_failure(pfn, 0))
|
||||
set_mce_nospec(pfn);
|
||||
set_mce_nospec(pfn, whole_page(mce));
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
|
@ -1086,7 +1093,7 @@ static int do_memory_failure(struct mce *m)
|
|||
if (ret)
|
||||
pr_err("Memory error not recovered");
|
||||
else
|
||||
set_mce_nospec(m->addr >> PAGE_SHIFT);
|
||||
set_mce_nospec(m->addr >> PAGE_SHIFT, whole_page(m));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -428,28 +428,20 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp,
|
|||
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
/*
|
||||
* If TIF_SSBD is different, select the proper mitigation
|
||||
* method. Note that if SSBD mitigation is disabled or permanentely
|
||||
* 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)) {
|
||||
/* Handle change of TIF_SSBD depending on the mitigation method. */
|
||||
if (static_cpu_has(X86_FEATURE_VIRT_SSBD)) {
|
||||
if (tif_diff & _TIF_SSBD)
|
||||
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);
|
||||
} else if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
|
||||
static_cpu_has(X86_FEATURE_AMD_SSBD)) {
|
||||
msr |= ssbd_tif_to_spec_ctrl(tifn);
|
||||
updmsr = true;
|
||||
}
|
||||
} else if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
|
||||
static_cpu_has(X86_FEATURE_AMD_SSBD)) {
|
||||
updmsr |= !!(tif_diff & _TIF_SSBD);
|
||||
msr |= ssbd_tif_to_spec_ctrl(tifn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled,
|
||||
* otherwise avoid the MSR write.
|
||||
*/
|
||||
/* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled. */
|
||||
if (IS_ENABLED(CONFIG_SMP) &&
|
||||
static_branch_unlikely(&switch_to_cond_stibp)) {
|
||||
updmsr |= !!(tif_diff & _TIF_SPEC_IB);
|
||||
|
|
|
@ -197,6 +197,14 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
|
|||
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 */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Apple MacBookPro5",
|
||||
|
|
|
@ -25,10 +25,6 @@
|
|||
#include <asm/hpet.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 pc = instruction_pointer(regs);
|
||||
|
|
|
@ -36,13 +36,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT)
|
|||
#ifdef CONFIG_X86_32
|
||||
OUTPUT_ARCH(i386)
|
||||
ENTRY(phys_startup_32)
|
||||
jiffies = jiffies_64;
|
||||
#else
|
||||
OUTPUT_ARCH(i386:x86-64)
|
||||
ENTRY(phys_startup_64)
|
||||
jiffies_64 = jiffies;
|
||||
#endif
|
||||
|
||||
jiffies = jiffies_64;
|
||||
|
||||
#if defined(CONFIG_X86_64)
|
||||
/*
|
||||
* On 64-bit, align RODATA to 2MB so we retain large page mappings for
|
||||
|
|
|
@ -3228,8 +3228,8 @@ static int nested_svm_exit_special(struct vcpu_svm *svm)
|
|||
return NESTED_EXIT_HOST;
|
||||
break;
|
||||
case SVM_EXIT_EXCP_BASE + PF_VECTOR:
|
||||
/* When we're shadowing, trap PFs, but not async PF */
|
||||
if (!npt_enabled && svm->vcpu.arch.apf.host_apf_reason == 0)
|
||||
/* Trap async PF even if not shadowing */
|
||||
if (!npt_enabled || svm->vcpu.arch.apf.host_apf_reason)
|
||||
return NESTED_EXIT_HOST;
|
||||
break;
|
||||
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->msrpm_base_pa = from->msrpm_base_pa;
|
||||
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->int_ctl = from->int_ctl;
|
||||
dst->int_vector = from->int_vector;
|
||||
|
|
|
@ -5125,7 +5125,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
|
|||
vmcs_read32(VM_EXIT_INTR_ERROR_CODE),
|
||||
KVM_ISA_VMX);
|
||||
|
||||
switch (exit_reason) {
|
||||
switch ((u16)exit_reason) {
|
||||
case EXIT_REASON_EXCEPTION_NMI:
|
||||
if (is_nmi(intr_info))
|
||||
return false;
|
||||
|
|
|
@ -256,8 +256,6 @@ struct vcpu_vmx {
|
|||
|
||||
u64 current_tsc_ratio;
|
||||
|
||||
u32 host_pkru;
|
||||
|
||||
unsigned long host_debugctlmsr;
|
||||
|
||||
u64 msr_ia32_power_ctl;
|
||||
|
|
|
@ -6683,7 +6683,7 @@ restart:
|
|||
if (!ctxt->have_exception ||
|
||||
exception_type(ctxt->exception.vector) == EXCPT_TRAP) {
|
||||
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_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);
|
||||
}
|
||||
|
||||
int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
|
||||
unsigned long start, unsigned long end,
|
||||
bool blockable)
|
||||
void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
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);
|
||||
if (start <= apic_address && apic_address < end)
|
||||
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu)
|
||||
|
|
|
@ -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, 0x6fa0, 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]
|
||||
|
|
|
@ -128,21 +128,15 @@ EXPORT_SYMBOL_GPL(af_alg_release);
|
|||
void af_alg_release_parent(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
unsigned int nokey = ask->nokey_refcnt;
|
||||
bool last = nokey && !ask->refcnt;
|
||||
unsigned int nokey = atomic_read(&ask->nokey_refcnt);
|
||||
|
||||
sk = ask->parent;
|
||||
ask = alg_sk(sk);
|
||||
|
||||
local_bh_disable();
|
||||
bh_lock_sock(sk);
|
||||
ask->nokey_refcnt -= nokey;
|
||||
if (!last)
|
||||
last = !--ask->refcnt;
|
||||
bh_unlock_sock(sk);
|
||||
local_bh_enable();
|
||||
if (nokey)
|
||||
atomic_dec(&ask->nokey_refcnt);
|
||||
|
||||
if (last)
|
||||
if (atomic_dec_and_test(&ask->refcnt))
|
||||
sock_put(sk);
|
||||
}
|
||||
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;
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt | ask->nokey_refcnt)
|
||||
if (atomic_read(&ask->refcnt))
|
||||
goto unlock;
|
||||
|
||||
swap(ask->type, type);
|
||||
|
@ -236,7 +230,7 @@ static int alg_setsockopt(struct socket *sock, int level, int optname,
|
|||
int err = -EBUSY;
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (atomic_read(&ask->refcnt) != atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock;
|
||||
|
||||
type = ask->type;
|
||||
|
@ -301,12 +295,14 @@ int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
|
|||
if (err)
|
||||
goto unlock;
|
||||
|
||||
if (nokey || !ask->refcnt++)
|
||||
if (atomic_inc_return_relaxed(&ask->refcnt) == 1)
|
||||
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)->type = type;
|
||||
alg_sk(sk2)->nokey_refcnt = nokey;
|
||||
|
||||
newsock->ops = type->ops;
|
||||
newsock->state = SS_CONNECTED;
|
||||
|
|
|
@ -390,7 +390,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval)
|
|||
err = wait_for_completion_killable(&larval->completion);
|
||||
WARN_ON(err);
|
||||
if (!err)
|
||||
crypto_probing_notify(CRYPTO_MSG_ALG_LOADED, larval);
|
||||
crypto_notify(CRYPTO_MSG_ALG_LOADED, larval);
|
||||
|
||||
out:
|
||||
crypto_larval_kill(&larval->alg);
|
||||
|
|
|
@ -384,7 +384,7 @@ static int aead_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
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)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -301,7 +301,7 @@ static int hash_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
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)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@ static int skcipher_check_key(struct socket *sock)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
if (ask->refcnt)
|
||||
if (!atomic_read(&ask->nokey_refcnt))
|
||||
goto unlock_child;
|
||||
|
||||
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)
|
||||
goto unlock;
|
||||
|
||||
if (!pask->refcnt++)
|
||||
sock_hold(psk);
|
||||
|
||||
ask->refcnt = 1;
|
||||
sock_put(psk);
|
||||
atomic_dec(&pask->nokey_refcnt);
|
||||
atomic_set(&ask->nokey_refcnt, 0);
|
||||
|
||||
err = 0;
|
||||
|
||||
|
|
|
@ -865,6 +865,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
|
|||
"acpi_cppc");
|
||||
if (ret) {
|
||||
per_cpu(cpc_desc_ptr, pr->id) = NULL;
|
||||
kobject_put(&cpc_ptr->kobj);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
|
|
@ -165,7 +165,7 @@ int acpi_device_set_power(struct acpi_device *device, int state)
|
|||
* possibly drop references to the power resources in use.
|
||||
*/
|
||||
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)
|
||||
target_state = state;
|
||||
} else if (!device->power.states[state].flags.valid) {
|
||||
|
|
|
@ -79,6 +79,8 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
|||
struct resource r;
|
||||
struct acpi_resource_irq *p = &ares->data.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)
|
||||
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");
|
||||
return AE_ERROR;
|
||||
}
|
||||
if (ares->type == ACPI_RESOURCE_TYPE_IRQ)
|
||||
if (ares->type == ACPI_RESOURCE_TYPE_IRQ) {
|
||||
gsi = p->interrupts[0];
|
||||
else
|
||||
trigger = p->triggering;
|
||||
} else {
|
||||
gsi = pext->interrupts[0];
|
||||
trigger = pext->triggering;
|
||||
}
|
||||
|
||||
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");
|
||||
return AE_ERROR;
|
||||
}
|
||||
|
|
|
@ -919,12 +919,9 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
|
|||
|
||||
if (buffer.length && package
|
||||
&& package->type == ACPI_TYPE_PACKAGE
|
||||
&& package->package.count) {
|
||||
int err = acpi_extract_power_resources(package, 0,
|
||||
&ps->resources);
|
||||
if (!err)
|
||||
device->power.flags.power_resources = 1;
|
||||
}
|
||||
&& package->package.count)
|
||||
acpi_extract_power_resources(package, 0, &ps->resources);
|
||||
|
||||
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);
|
||||
|
||||
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].power = 100;
|
||||
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))
|
||||
device->flags.power_manageable = 0;
|
||||
}
|
||||
|
|
|
@ -993,8 +993,10 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
|
|||
|
||||
error = kobject_init_and_add(&hotplug->kobj,
|
||||
&acpi_hotplug_profile_ktype, hotplug_kobj, "%s", name);
|
||||
if (error)
|
||||
if (error) {
|
||||
kobject_put(&hotplug->kobj);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
kobject_uevent(&hotplug->kobj, KOBJ_ADD);
|
||||
return;
|
||||
|
|
|
@ -2902,17 +2902,17 @@ static blk_status_t floppy_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||
(unsigned long long) current_req->cmd_flags))
|
||||
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)) {
|
||||
/* fdc busy, this new request will be treated when the
|
||||
current one is done */
|
||||
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;
|
||||
__reschedule_timeout(MAXTIMEOUT, "fd_request");
|
||||
set_fdc(0);
|
||||
|
|
|
@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr,
|
|||
unsigned int flags)
|
||||
{
|
||||
intel_private.driver->write_entry(addr, pg, flags);
|
||||
readl(intel_private.gtt + pg);
|
||||
if (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++;
|
||||
}
|
||||
}
|
||||
wmb();
|
||||
readl(intel_private.gtt + j - 1);
|
||||
if (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)
|
||||
{
|
||||
wmb();
|
||||
if (intel_private.i9xx_flush_page)
|
||||
writel(1, intel_private.i9xx_flush_page);
|
||||
}
|
||||
|
|
|
@ -189,15 +189,6 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf,
|
|||
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_read = false;
|
||||
*off = 0;
|
||||
|
@ -211,11 +202,19 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf,
|
|||
if (file->f_flags & O_NONBLOCK) {
|
||||
priv->command_enqueued = true;
|
||||
queue_work(tpm_dev_wq, &priv->async_work);
|
||||
tpm_put_ops(priv->chip);
|
||||
mutex_unlock(&priv->buffer_mutex);
|
||||
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,
|
||||
sizeof(priv->data_buffer));
|
||||
tpm_put_ops(priv->chip);
|
||||
|
|
|
@ -108,7 +108,11 @@ static int clk_pm_runtime_get(struct clk_core *core)
|
|||
return 0;
|
||||
|
||||
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)
|
||||
|
|
|
@ -96,7 +96,7 @@ static const struct regmap_config turingcc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x30000,
|
||||
.max_register = 0x23004,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
|
|
|
@ -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 *ndev = NULL;
|
||||
struct nitrox_device *ndev;
|
||||
|
||||
mutex_lock(&devlist_lock);
|
||||
list_for_each_entry(ndev, &ndevlist, list) {
|
||||
|
@ -199,7 +199,7 @@ struct nitrox_device *nitrox_get_first_device(void)
|
|||
break;
|
||||
}
|
||||
mutex_unlock(&devlist_lock);
|
||||
if (!ndev)
|
||||
if (&ndev->list == &ndevlist)
|
||||
return NULL;
|
||||
|
||||
refcount_inc(&ndev->refcnt);
|
||||
|
|
|
@ -355,13 +355,18 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,
|
|||
int err;
|
||||
unsigned long flags;
|
||||
struct scatterlist outhdr, iv_sg, status_sg, **sgs;
|
||||
int i;
|
||||
u64 dst_len;
|
||||
unsigned int num_out = 0, num_in = 0;
|
||||
int sg_total;
|
||||
uint8_t *iv;
|
||||
struct scatterlist *sg;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
|
||||
/* Source data */
|
||||
for (i = 0; i < src_nents; i++)
|
||||
sgs[num_out++] = &req->src[i];
|
||||
for (sg = req->src; src_nents; sg = sg_next(sg), src_nents--)
|
||||
sgs[num_out++] = sg;
|
||||
|
||||
/* Destination data */
|
||||
for (i = 0; i < dst_nents; i++)
|
||||
sgs[num_out + num_in++] = &req->dst[i];
|
||||
for (sg = req->dst; sg; sg = sg_next(sg))
|
||||
sgs[num_out + num_in++] = sg;
|
||||
|
||||
/* 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,
|
||||
req->nbytes - AES_BLOCK_SIZE,
|
||||
AES_BLOCK_SIZE, 0);
|
||||
crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine,
|
||||
req, err);
|
||||
kzfree(vc_sym_req->iv);
|
||||
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[] = { {
|
||||
|
|
|
@ -178,8 +178,30 @@ static bool dma_fence_chain_signaled(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 *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_free(fence);
|
||||
}
|
||||
|
|
|
@ -160,7 +160,7 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci)
|
|||
mtr, mcddrtcfg, imc->mc, i, j);
|
||||
|
||||
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);
|
||||
else if (IS_NVDIMM_PRESENT(mcddrtcfg, j))
|
||||
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
|
||||
|
|
|
@ -151,27 +151,23 @@ static const struct x86_cpu_id skx_cpuids[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(x86cpu, skx_cpuids);
|
||||
|
||||
#define SKX_GET_MTMTR(dev, reg) \
|
||||
pci_read_config_dword((dev), 0x87c, &(reg))
|
||||
|
||||
static bool skx_check_ecc(struct pci_dev *pdev)
|
||||
static bool skx_check_ecc(u32 mcmtr)
|
||||
{
|
||||
u32 mtmtr;
|
||||
|
||||
SKX_GET_MTMTR(pdev, mtmtr);
|
||||
|
||||
return !!GET_BITFIELD(mtmtr, 2, 2);
|
||||
return !!GET_BITFIELD(mcmtr, 2, 2);
|
||||
}
|
||||
|
||||
static int skx_get_dimm_config(struct mem_ctl_info *mci)
|
||||
{
|
||||
struct skx_pvt *pvt = mci->pvt_info;
|
||||
u32 mtr, mcmtr, amap, mcddrtcfg;
|
||||
struct skx_imc *imc = pvt->imc;
|
||||
u32 mtr, amap, mcddrtcfg;
|
||||
struct dimm_info *dimm;
|
||||
int i, j;
|
||||
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++) {
|
||||
ndimms = 0;
|
||||
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,
|
||||
0x80 + 4 * j, &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)) {
|
||||
ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
|
||||
EDAC_MOD_STR);
|
||||
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);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -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 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)
|
||||
{
|
||||
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,
|
||||
banks, 1 << ranks, rows, cols);
|
||||
|
||||
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mtr, 0, 0);
|
||||
imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mtr, 9, 9);
|
||||
imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mcmtr, 0, 0);
|
||||
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].rowbits = rows;
|
||||
imc->chan[chan].dimms[dimmno].colbits = cols;
|
||||
|
|
|
@ -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_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);
|
||||
|
||||
int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,
|
||||
|
|
|
@ -522,8 +522,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var)
|
|||
ret = kobject_init_and_add(&new_var->kobj, &efivar_ktype,
|
||||
NULL, "%s", short_name);
|
||||
kfree(short_name);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kobject_put(&new_var->kobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
kobject_uevent(&new_var->kobj, KOBJ_ADD);
|
||||
if (efivar_entry_add(new_var, &efivar_sysfs_list)) {
|
||||
|
|
|
@ -38,6 +38,7 @@ struct imx_sc_ipc {
|
|||
struct device *dev;
|
||||
struct mutex lock;
|
||||
struct completion done;
|
||||
bool fast_ipc;
|
||||
|
||||
/* temporarily store the SCU 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_rpc_msg *hdr;
|
||||
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) {
|
||||
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)
|
||||
{
|
||||
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;
|
||||
u32 *data = msg;
|
||||
int ret;
|
||||
int size;
|
||||
int i;
|
||||
|
||||
/* Check size */
|
||||
if (hdr->size > IMX_SC_RPC_MAX_MSG)
|
||||
if (hdr.size > IMX_SC_RPC_MAX_MSG)
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr->svc,
|
||||
hdr->func, hdr->size);
|
||||
dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr.svc,
|
||||
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];
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
* queueing happens at the mailbox channel level.
|
||||
*/
|
||||
wait_for_completion(&sc_chan->tx_done);
|
||||
reinit_completion(&sc_chan->tx_done);
|
||||
if (!sc_ipc->fast_ipc) {
|
||||
wait_for_completion(&sc_chan->tx_done);
|
||||
reinit_completion(&sc_chan->tx_done);
|
||||
}
|
||||
|
||||
ret = mbox_send_message(sc_chan->ch, &data[i]);
|
||||
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);
|
||||
reinit_completion(&sc_ipc->done);
|
||||
|
||||
sc_ipc->msg = msg;
|
||||
if (have_resp)
|
||||
sc_ipc->msg = msg;
|
||||
sc_ipc->count = 0;
|
||||
ret = imx_scu_ipc_write(sc_ipc, msg);
|
||||
if (ret < 0) {
|
||||
|
@ -209,6 +235,7 @@ int imx_scu_call_rpc(struct imx_sc_ipc *sc_ipc, void *msg, bool have_resp)
|
|||
}
|
||||
|
||||
out:
|
||||
sc_ipc->msg = NULL;
|
||||
mutex_unlock(&sc_ipc->lock);
|
||||
|
||||
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 mbox_client *cl;
|
||||
char *chan_name;
|
||||
struct of_phandle_args args;
|
||||
int num_channel;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
|
@ -231,11 +260,20 @@ static int imx_scu_probe(struct platform_device *pdev)
|
|||
if (!sc_ipc)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < SCU_MU_CHAN_NUM; i++) {
|
||||
if (i < 4)
|
||||
ret = of_parse_phandle_with_args(pdev->dev.of_node, "mboxes",
|
||||
"#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);
|
||||
else
|
||||
chan_name = kasprintf(GFP_KERNEL, "rx%d", i - 4);
|
||||
chan_name = kasprintf(GFP_KERNEL, "rx%d",
|
||||
i - num_channel / 2);
|
||||
|
||||
if (!chan_name)
|
||||
return -ENOMEM;
|
||||
|
@ -247,13 +285,15 @@ static int imx_scu_probe(struct platform_device *pdev)
|
|||
cl->knows_txdone = true;
|
||||
cl->rx_callback = imx_scu_rx_callback;
|
||||
|
||||
/* Initial tx_done completion as "done" */
|
||||
cl->tx_done = imx_scu_tx_done;
|
||||
init_completion(&sc_chan->tx_done);
|
||||
complete(&sc_chan->tx_done);
|
||||
if (!sc_ipc->fast_ipc) {
|
||||
/* Initial tx_done completion as "done" */
|
||||
cl->tx_done = imx_scu_tx_done;
|
||||
init_completion(&sc_chan->tx_done);
|
||||
complete(&sc_chan->tx_done);
|
||||
}
|
||||
|
||||
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);
|
||||
if (IS_ERR(sc_chan->ch)) {
|
||||
ret = PTR_ERR(sc_chan->ch);
|
||||
|
|
|
@ -1292,14 +1292,14 @@ int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
|
|||
struct dma_fence *iter, *last_signaled = NULL;
|
||||
|
||||
dma_fence_chain_for_each(iter, fence) {
|
||||
if (!iter)
|
||||
break;
|
||||
dma_fence_put(last_signaled);
|
||||
last_signaled = dma_fence_get(iter);
|
||||
if (!to_dma_fence_chain(last_signaled)->prev_seqno)
|
||||
if (iter->context != fence->context) {
|
||||
dma_fence_put(iter);
|
||||
/* It is most likely that timeline has
|
||||
* unorder points. */
|
||||
break;
|
||||
}
|
||||
dma_fence_put(last_signaled);
|
||||
last_signaled = dma_fence_get(iter);
|
||||
}
|
||||
point = dma_fence_is_signaled(last_signaled) ?
|
||||
last_signaled->seqno :
|
||||
|
|
|
@ -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));
|
||||
return PCH_CNP;
|
||||
case INTEL_PCH_CMP_DEVICE_ID_TYPE:
|
||||
case INTEL_PCH_CMP2_DEVICE_ID_TYPE:
|
||||
DRM_DEBUG_KMS("Found Comet Lake PCH (CMP)\n");
|
||||
WARN_ON(!IS_COFFEELAKE(dev_priv));
|
||||
/* CometPoint is CNP Compatible */
|
||||
|
|
|
@ -2627,6 +2627,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
#define INTEL_PCH_CNP_DEVICE_ID_TYPE 0xA300
|
||||
#define INTEL_PCH_CNP_LP_DEVICE_ID_TYPE 0x9D80
|
||||
#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_P2X_DEVICE_ID_TYPE 0x7100
|
||||
#define INTEL_PCH_P3X_DEVICE_ID_TYPE 0x7000
|
||||
|
|
|
@ -80,7 +80,6 @@ const char *lima_ip_name(struct lima_ip *ip)
|
|||
static int lima_clk_init(struct lima_device *dev)
|
||||
{
|
||||
int err;
|
||||
unsigned long bus_rate, gpu_rate;
|
||||
|
||||
dev->clk_bus = devm_clk_get(dev->dev, "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);
|
||||
}
|
||||
|
||||
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);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -145,7 +138,8 @@ static int lima_regulator_init(struct lima_device *dev)
|
|||
dev->regulator = NULL;
|
||||
if (ret == -ENODEV)
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -297,10 +291,8 @@ int lima_device_init(struct lima_device *ldev)
|
|||
}
|
||||
|
||||
err = lima_regulator_init(ldev);
|
||||
if (err) {
|
||||
dev_err(ldev->dev, "regulator init fail %d\n", err);
|
||||
if (err)
|
||||
goto err_out0;
|
||||
}
|
||||
|
||||
ldev->empty_vm = lima_vm_create(ldev);
|
||||
if (!ldev->empty_vm) {
|
||||
|
@ -343,6 +335,9 @@ int lima_device_init(struct lima_device *ldev)
|
|||
if (err)
|
||||
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;
|
||||
|
||||
err_out5:
|
||||
|
|
|
@ -307,10 +307,8 @@ static int lima_pdev_probe(struct platform_device *pdev)
|
|||
ldev->ddev = ddev;
|
||||
|
||||
err = lima_device_init(ldev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Fatal error during GPU init\n");
|
||||
if (err)
|
||||
goto err_out1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register the DRM device with the core and the connectors with
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
#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_VA_RESERVE_START 0xFFF00000
|
||||
#define LIMA_VA_RESERVE_START 0x0FFF00000ULL
|
||||
#define LIMA_VA_RESERVE_DLBU LIMA_VA_RESERVE_START
|
||||
#define LIMA_VA_RESERVE_END 0x100000000
|
||||
#define LIMA_VA_RESERVE_END 0x100000000ULL
|
||||
|
||||
struct lima_device;
|
||||
|
||||
|
|
|
@ -121,11 +121,6 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
|
|||
enum drm_plane_type type, int index);
|
||||
|
||||
/* 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);
|
||||
|
||||
int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
|
||||
|
|
|
@ -94,10 +94,10 @@ vm_fault_t vkms_gem_fault(struct vm_fault *vmf)
|
|||
return ret;
|
||||
}
|
||||
|
||||
struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
u32 *handle,
|
||||
u64 size)
|
||||
static struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
u32 *handle,
|
||||
u64 size)
|
||||
{
|
||||
struct vkms_gem_object *obj;
|
||||
int ret;
|
||||
|
@ -110,7 +110,6 @@ struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
|
|||
return ERR_CAST(obj);
|
||||
|
||||
ret = drm_gem_handle_create(file, &obj->gem, handle);
|
||||
drm_gem_object_put_unlocked(&obj->gem);
|
||||
if (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->pitch = pitch;
|
||||
|
||||
drm_gem_object_put_unlocked(gem_obj);
|
||||
|
||||
DRM_DEBUG_DRIVER("Created object of size %lld\n", size);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1476,7 +1476,7 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (WARN_ON(drvdata->perf_data != etr_perf)) {
|
||||
if (WARN_ON(drvdata->perf_buf != etr_buf)) {
|
||||
lost = true;
|
||||
spin_unlock_irqrestore(&drvdata->spinlock, flags);
|
||||
goto out;
|
||||
|
@ -1488,8 +1488,6 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
|
|||
tmc_sync_etr_buf(drvdata);
|
||||
|
||||
CS_LOCK(drvdata->base);
|
||||
/* Reset perf specific data */
|
||||
drvdata->perf_data = NULL;
|
||||
spin_unlock_irqrestore(&drvdata->spinlock, flags);
|
||||
|
||||
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);
|
||||
drvdata->perf_data = etr_perf;
|
||||
|
||||
/*
|
||||
* 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. */
|
||||
drvdata->pid = pid;
|
||||
drvdata->mode = CS_MODE_PERF;
|
||||
drvdata->perf_buf = etr_perf->etr_buf;
|
||||
atomic_inc(csdev->refcnt);
|
||||
}
|
||||
|
||||
|
@ -1604,6 +1602,8 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev)
|
|||
/* Dissociate from monitored process. */
|
||||
drvdata->pid = -1;
|
||||
drvdata->mode = CS_MODE_DISABLED;
|
||||
/* Reset perf specific data */
|
||||
drvdata->perf_buf = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&drvdata->spinlock, flags);
|
||||
|
||||
|
|
|
@ -179,8 +179,8 @@ struct etr_buf {
|
|||
* device configuration register (DEVID)
|
||||
* @idr: Holds etr_bufs allocated for this ETR.
|
||||
* @idr_mutex: Access serialisation for idr.
|
||||
* @perf_data: PERF buffer for ETR.
|
||||
* @sysfs_data: SYSFS buffer for ETR.
|
||||
* @sysfs_buf: SYSFS buffer for ETR.
|
||||
* @perf_buf: PERF buffer for ETR.
|
||||
*/
|
||||
struct tmc_drvdata {
|
||||
void __iomem *base;
|
||||
|
@ -204,7 +204,7 @@ struct tmc_drvdata {
|
|||
struct idr idr;
|
||||
struct mutex idr_mutex;
|
||||
struct etr_buf *sysfs_buf;
|
||||
void *perf_data;
|
||||
struct etr_buf *perf_buf;
|
||||
};
|
||||
|
||||
struct etr_buf_operations {
|
||||
|
|
|
@ -346,8 +346,10 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
|||
|
||||
/* Optional interface clock */
|
||||
dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
|
||||
if (IS_ERR(dev->pclk))
|
||||
return PTR_ERR(dev->pclk);
|
||||
if (IS_ERR(dev->pclk)) {
|
||||
ret = PTR_ERR(dev->pclk);
|
||||
goto exit_reset;
|
||||
}
|
||||
|
||||
dev->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (!i2c_dw_prepare_clk(dev, true)) {
|
||||
|
|
|
@ -398,19 +398,23 @@ static int vcnl4000_probe(struct i2c_client *client,
|
|||
static const struct of_device_id vcnl_4000_of_match[] = {
|
||||
{
|
||||
.compatible = "vishay,vcnl4000",
|
||||
.data = "VCNL4000",
|
||||
.data = (void *)VCNL4000,
|
||||
},
|
||||
{
|
||||
.compatible = "vishay,vcnl4010",
|
||||
.data = "VCNL4010",
|
||||
.data = (void *)VCNL4010,
|
||||
},
|
||||
{
|
||||
.compatible = "vishay,vcnl4010",
|
||||
.data = "VCNL4020",
|
||||
.compatible = "vishay,vcnl4020",
|
||||
.data = (void *)VCNL4010,
|
||||
},
|
||||
{
|
||||
.compatible = "vishay,vcnl4040",
|
||||
.data = (void *)VCNL4040,
|
||||
},
|
||||
{
|
||||
.compatible = "vishay,vcnl4200",
|
||||
.data = "VCNL4200",
|
||||
.data = (void *)VCNL4200,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
|
|
@ -110,12 +110,6 @@ enum pkt_q_sdma_state {
|
|||
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_DBG(req, fmt, ...) \
|
||||
|
|
|
@ -1205,7 +1205,7 @@ static void mlx5_ib_mr_wqe_pfault_handler(struct mlx5_ib_dev *dev,
|
|||
{
|
||||
bool sq = pfault->type & MLX5_PFAULT_REQUESTOR;
|
||||
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;
|
||||
struct mlx5_core_rsc_common *res;
|
||||
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;
|
||||
}
|
||||
|
||||
wqe = (void *)__get_free_page(GFP_KERNEL);
|
||||
if (!wqe) {
|
||||
wqe_start = (void *)__get_free_page(GFP_KERNEL);
|
||||
if (!wqe_start) {
|
||||
mlx5_ib_err(dev, "Error allocating memory for IO page fault handling.\n");
|
||||
goto resolve_page_fault;
|
||||
}
|
||||
|
||||
wqe = wqe_start;
|
||||
qp = (res->res == MLX5_RES_QP) ? res_to_qp(res) : NULL;
|
||||
if (qp && sq) {
|
||||
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->type);
|
||||
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)
|
||||
|
|
|
@ -170,6 +170,7 @@ static const char * const smbus_pnp_ids[] = {
|
|||
"LEN005b", /* P50 */
|
||||
"LEN005e", /* T560 */
|
||||
"LEN006c", /* T470s */
|
||||
"LEN007a", /* T470s */
|
||||
"LEN0071", /* T480 */
|
||||
"LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
|
||||
"LEN0073", /* X1 Carbon G5 (Elantech) */
|
||||
|
|
|
@ -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)
|
||||
BUG();
|
||||
|
||||
/* Write register: use repeated start */
|
||||
/* Write register */
|
||||
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].buf = &buf;
|
||||
|
||||
/* Read data */
|
||||
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].buf = val;
|
||||
|
||||
|
@ -428,10 +428,8 @@ static int mms114_probe(struct i2c_client *client,
|
|||
const void *match_data;
|
||||
int error;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_PROTOCOL_MANGLING)) {
|
||||
dev_err(&client->dev,
|
||||
"Need i2c bus that supports protocol mangling\n");
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||
dev_err(&client->dev, "Not supported I2C adapter\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
@ -165,6 +165,9 @@
|
|||
#define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2)
|
||||
#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 */
|
||||
#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 *
|
||||
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;
|
||||
|
||||
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 */
|
||||
mair = cfg->arm_lpae_s1_cfg.mair[0];
|
||||
ttbr = cfg->arm_lpae_s1_cfg.ttbr[0];
|
||||
data = arm_lpae_alloc_pgtable(cfg);
|
||||
if (!data)
|
||||
return NULL;
|
||||
|
||||
cfg->arm_mali_lpae_cfg.memattr = mair;
|
||||
cfg->arm_mali_lpae_cfg.transtab = ttbr |
|
||||
ARM_MALI_LPAE_TTBR_READ_INNER |
|
||||
ARM_MALI_LPAE_TTBR_ADRMODE_TABLE;
|
||||
/* Mali seems to need a full 4-level table regardless of IAS */
|
||||
if (data->levels < ARM_LPAE_MAX_LEVELS) {
|
||||
data->levels = ARM_LPAE_MAX_LEVELS;
|
||||
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 = {
|
||||
|
|
|
@ -38,6 +38,9 @@
|
|||
#define LM3532_REG_ZN_2_LO 0x65
|
||||
#define LM3532_REG_ZN_3_HI 0x66
|
||||
#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
|
||||
|
||||
/* Control Enable */
|
||||
|
@ -116,6 +119,7 @@ struct lm3532_als_data {
|
|||
* @priv - Pointer the device data structure
|
||||
* @control_bank - Control bank the LED is associated to
|
||||
* @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
|
||||
* @led_strings - The LED strings supported in this array
|
||||
* @label - LED label
|
||||
|
@ -126,6 +130,7 @@ struct lm3532_led {
|
|||
|
||||
int control_bank;
|
||||
int mode;
|
||||
int ctrl_brt_pointer;
|
||||
int num_leds;
|
||||
u32 led_strings[LM3532_MAX_CONTROL_BANKS];
|
||||
char label[LED_MAX_NAME_SIZE];
|
||||
|
@ -339,8 +344,8 @@ static int lm3532_brightness_set(struct led_classdev *led_cdev,
|
|||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
brightness_reg = LM3532_REG_CTRL_A_BRT + led->control_bank * 2;
|
||||
brt_val = brt_val / LM3532_BRT_VAL_ADJUST;
|
||||
brightness_reg = LM3532_REG_ZONE_TRGT_A + led->control_bank * 5 +
|
||||
(led->ctrl_brt_pointer >> 2);
|
||||
|
||||
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_shift = 0;
|
||||
unsigned int output_cfg_mask = 0;
|
||||
unsigned int brightness_config_reg;
|
||||
unsigned int brightness_config_val;
|
||||
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++) {
|
||||
output_cfg_shift = led->led_strings[i] * 2;
|
||||
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;
|
||||
u32 als_vmin, als_vmax, als_vstep;
|
||||
int zone_reg = LM3532_REG_ZN_0_HI;
|
||||
int brightnes_config_reg;
|
||||
int ret;
|
||||
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->als_input_mode << LM3532_ALS_SEL_SHIFT));
|
||||
|
||||
ret = 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);
|
||||
return regmap_write(priv->regmap, LM3532_ALS_CONFIG, als->config);
|
||||
}
|
||||
|
||||
static int lm3532_parse_als(struct lm3532_data *priv)
|
||||
|
@ -646,9 +665,6 @@ static int lm3532_probe(struct i2c_client *client,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (drvdata->enable_gpio)
|
||||
gpiod_direction_output(drvdata->enable_gpio, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1438,7 +1438,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||
if (__set_blocks(n1, n1->keys + n2->keys,
|
||||
block_bytes(b->c)) >
|
||||
btree_blocks(new_nodes[i]))
|
||||
goto out_nocoalesce;
|
||||
goto out_unlock_nocoalesce;
|
||||
|
||||
keys = n2->keys;
|
||||
/* Take the key of the node we're getting rid of */
|
||||
|
@ -1467,7 +1467,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||
|
||||
if (__bch_keylist_realloc(&keylist,
|
||||
bkey_u64s(&new_nodes[i]->key)))
|
||||
goto out_nocoalesce;
|
||||
goto out_unlock_nocoalesce;
|
||||
|
||||
bch_btree_node_write(new_nodes[i], &cl);
|
||||
bch_keylist_add(&keylist, &new_nodes[i]->key);
|
||||
|
@ -1513,6 +1513,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||
/* Invalidated our iterator */
|
||||
return -EINTR;
|
||||
|
||||
out_unlock_nocoalesce:
|
||||
for (i = 0; i < nodes; i++)
|
||||
mutex_unlock(&new_nodes[i]->write_lock);
|
||||
|
||||
out_nocoalesce:
|
||||
closure_sync(&cl);
|
||||
|
||||
|
|
|
@ -720,9 +720,8 @@ try_again:
|
|||
/* Retry init sequence, but without R4_18V_PRESENT. */
|
||||
retries = 0;
|
||||
goto try_again;
|
||||
} else {
|
||||
goto remove;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user