overlayfs fixes for 5.19-rc7
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSQHSd0lITzzeNWNm3h3BK/laaZPAUCYs11GgAKCRDh3BK/laaZ PAD3APsHu08aHid5O/zPnD/90BNqAo3ruvu2WhI5wa8Dacd5SwEAgoSlH2Tx3iy9 4zWK4zZX98qAGyI+ij5aejc0TvONqAE= =4KjV -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCYtHI7gAKCRCRxhvAZXjc om98AP4mv9E1tosKU0J/Img5rcBnjMtpEinHTqiuwXsslBGK3AEAokeq3w/MDAGI ML1w4hqe1GCS5gi1UaXSnAFOqsP3LQY= =W/4m -----END PGP SIGNATURE----- Merge tag 'ovl-fixes-5.19-rc7' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs into fs.idmapped.overlay.acl Bring in Miklos' tree which contains the temporary fix for POSIX ACLs with overlayfs on top of idmapped layers. We will add a proper fix on top of it and then revert the temporary fix. Cc: Seth Forshee <sforshee@digitalocean.com> Cc: Miklos Szeredi <mszeredi@redhat.com> Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
This commit is contained in:
commit
45598fd4e2
4
.mailmap
4
.mailmap
@ -10,6 +10,8 @@
|
|||||||
# Please keep this list dictionary sorted.
|
# Please keep this list dictionary sorted.
|
||||||
#
|
#
|
||||||
Aaron Durbin <adurbin@google.com>
|
Aaron Durbin <adurbin@google.com>
|
||||||
|
Abel Vesa <abelvesa@kernel.org> <abel.vesa@nxp.com>
|
||||||
|
Abel Vesa <abelvesa@kernel.org> <abelvesa@gmail.com>
|
||||||
Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
||||||
Adam Oldham <oldhamca@gmail.com>
|
Adam Oldham <oldhamca@gmail.com>
|
||||||
Adam Radford <aradford@gmail.com>
|
Adam Radford <aradford@gmail.com>
|
||||||
@ -85,6 +87,7 @@ Christian Borntraeger <borntraeger@linux.ibm.com> <borntrae@de.ibm.com>
|
|||||||
Christian Brauner <brauner@kernel.org> <christian@brauner.io>
|
Christian Brauner <brauner@kernel.org> <christian@brauner.io>
|
||||||
Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
||||||
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||||
|
Christian Marangi <ansuelsmth@gmail.com>
|
||||||
Christophe Ricard <christophe.ricard@gmail.com>
|
Christophe Ricard <christophe.ricard@gmail.com>
|
||||||
Christoph Hellwig <hch@lst.de>
|
Christoph Hellwig <hch@lst.de>
|
||||||
Colin Ian King <colin.king@intel.com> <colin.king@canonical.com>
|
Colin Ian King <colin.king@intel.com> <colin.king@canonical.com>
|
||||||
@ -165,6 +168,7 @@ Jan Glauber <jan.glauber@gmail.com> <jang@de.ibm.com>
|
|||||||
Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
|
Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
|
||||||
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
||||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
||||||
|
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
|
||||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
What: /sys/bus/iio/devices/iio:deviceX/conversion_mode
|
What: /sys/bus/iio/devices/iio:deviceX/in_conversion_mode
|
||||||
KernelVersion: 4.2
|
KernelVersion: 4.2
|
||||||
Contact: linux-iio@vger.kernel.org
|
Contact: linux-iio@vger.kernel.org
|
||||||
Description:
|
Description:
|
||||||
|
@ -47,6 +47,5 @@ examples:
|
|||||||
clocks = <&clkcfg CLK_SPI0>;
|
clocks = <&clkcfg CLK_SPI0>;
|
||||||
interrupt-parent = <&plic>;
|
interrupt-parent = <&plic>;
|
||||||
interrupts = <54>;
|
interrupts = <54>;
|
||||||
spi-max-frequency = <25000000>;
|
|
||||||
};
|
};
|
||||||
...
|
...
|
||||||
|
@ -110,7 +110,6 @@ examples:
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&qup_spi1_default>;
|
pinctrl-0 = <&qup_spi1_default>;
|
||||||
interrupts = <GIC_SPI 602 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 602 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
spi-max-frequency = <50000000>;
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
};
|
};
|
||||||
|
@ -136,7 +136,8 @@ properties:
|
|||||||
Phandle of a companion.
|
Phandle of a companion.
|
||||||
|
|
||||||
phys:
|
phys:
|
||||||
maxItems: 1
|
minItems: 1
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
phy-names:
|
phy-names:
|
||||||
const: usb
|
const: usb
|
||||||
|
@ -103,7 +103,8 @@ properties:
|
|||||||
Overrides the detected port count
|
Overrides the detected port count
|
||||||
|
|
||||||
phys:
|
phys:
|
||||||
maxItems: 1
|
minItems: 1
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
phy-names:
|
phy-names:
|
||||||
const: usb
|
const: usb
|
||||||
|
@ -13,6 +13,12 @@ EDD Interfaces
|
|||||||
.. kernel-doc:: drivers/firmware/edd.c
|
.. kernel-doc:: drivers/firmware/edd.c
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
Generic System Framebuffers Interface
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/firmware/sysfb.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Intel Stratix10 SoC Service Layer
|
Intel Stratix10 SoC Service Layer
|
||||||
---------------------------------
|
---------------------------------
|
||||||
Some features of the Intel Stratix10 SoC require a level of privilege
|
Some features of the Intel Stratix10 SoC require a level of privilege
|
||||||
|
@ -6,7 +6,7 @@ This document explains how GPIOs can be assigned to given devices and functions.
|
|||||||
|
|
||||||
Note that it only applies to the new descriptor-based interface. For a
|
Note that it only applies to the new descriptor-based interface. For a
|
||||||
description of the deprecated integer-based GPIO interface please refer to
|
description of the deprecated integer-based GPIO interface please refer to
|
||||||
gpio-legacy.txt (actually, there is no real mapping possible with the old
|
legacy.rst (actually, there is no real mapping possible with the old
|
||||||
interface; you just fetch an integer from somewhere and request the
|
interface; you just fetch an integer from somewhere and request the
|
||||||
corresponding GPIO).
|
corresponding GPIO).
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ GPIO Descriptor Consumer Interface
|
|||||||
|
|
||||||
This document describes the consumer interface of the GPIO framework. Note that
|
This document describes the consumer interface of the GPIO framework. Note that
|
||||||
it describes the new descriptor-based interface. For a description of the
|
it describes the new descriptor-based interface. For a description of the
|
||||||
deprecated integer-based GPIO interface please refer to gpio-legacy.txt.
|
deprecated integer-based GPIO interface please refer to legacy.rst.
|
||||||
|
|
||||||
|
|
||||||
Guidelines for GPIOs consumers
|
Guidelines for GPIOs consumers
|
||||||
@ -78,7 +78,7 @@ whether the line is configured active high or active low (see
|
|||||||
|
|
||||||
The two last flags are used for use cases where open drain is mandatory, such
|
The two last flags are used for use cases where open drain is mandatory, such
|
||||||
as I2C: if the line is not already configured as open drain in the mappings
|
as I2C: if the line is not already configured as open drain in the mappings
|
||||||
(see board.txt), then open drain will be enforced anyway and a warning will be
|
(see board.rst), then open drain will be enforced anyway and a warning will be
|
||||||
printed that the board configuration needs to be updated to match the use case.
|
printed that the board configuration needs to be updated to match the use case.
|
||||||
|
|
||||||
Both functions return either a valid GPIO descriptor, or an error code checkable
|
Both functions return either a valid GPIO descriptor, or an error code checkable
|
||||||
@ -270,7 +270,7 @@ driven.
|
|||||||
The same is applicable for open drain or open source output lines: those do not
|
The same is applicable for open drain or open source output lines: those do not
|
||||||
actively drive their output high (open drain) or low (open source), they just
|
actively drive their output high (open drain) or low (open source), they just
|
||||||
switch their output to a high impedance value. The consumer should not need to
|
switch their output to a high impedance value. The consumer should not need to
|
||||||
care. (For details read about open drain in driver.txt.)
|
care. (For details read about open drain in driver.rst.)
|
||||||
|
|
||||||
With this, all the gpiod_set_(array)_value_xxx() functions interpret the
|
With this, all the gpiod_set_(array)_value_xxx() functions interpret the
|
||||||
parameter "value" as "asserted" ("1") or "de-asserted" ("0"). The physical line
|
parameter "value" as "asserted" ("1") or "de-asserted" ("0"). The physical line
|
||||||
|
@ -14,12 +14,12 @@ Due to the history of GPIO interfaces in the kernel, there are two different
|
|||||||
ways to obtain and use GPIOs:
|
ways to obtain and use GPIOs:
|
||||||
|
|
||||||
- The descriptor-based interface is the preferred way to manipulate GPIOs,
|
- The descriptor-based interface is the preferred way to manipulate GPIOs,
|
||||||
and is described by all the files in this directory excepted gpio-legacy.txt.
|
and is described by all the files in this directory excepted legacy.rst.
|
||||||
- The legacy integer-based interface which is considered deprecated (but still
|
- The legacy integer-based interface which is considered deprecated (but still
|
||||||
usable for compatibility reasons) is documented in gpio-legacy.txt.
|
usable for compatibility reasons) is documented in legacy.rst.
|
||||||
|
|
||||||
The remainder of this document applies to the new descriptor-based interface.
|
The remainder of this document applies to the new descriptor-based interface.
|
||||||
gpio-legacy.txt contains the same information applied to the legacy
|
legacy.rst contains the same information applied to the legacy
|
||||||
integer-based interface.
|
integer-based interface.
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,13 +19,23 @@ The main Btrfs features include:
|
|||||||
* Subvolumes (separate internal filesystem roots)
|
* Subvolumes (separate internal filesystem roots)
|
||||||
* Object level mirroring and striping
|
* Object level mirroring and striping
|
||||||
* Checksums on data and metadata (multiple algorithms available)
|
* Checksums on data and metadata (multiple algorithms available)
|
||||||
* Compression
|
* Compression (multiple algorithms available)
|
||||||
|
* Reflink, deduplication
|
||||||
|
* Scrub (on-line checksum verification)
|
||||||
|
* Hierarchical quota groups (subvolume and snapshot support)
|
||||||
* Integrated multiple device support, with several raid algorithms
|
* Integrated multiple device support, with several raid algorithms
|
||||||
* Offline filesystem check
|
* Offline filesystem check
|
||||||
* Efficient incremental backup and FS mirroring
|
* Efficient incremental backup and FS mirroring (send/receive)
|
||||||
|
* Trim/discard
|
||||||
* Online filesystem defragmentation
|
* Online filesystem defragmentation
|
||||||
|
* Swapfile support
|
||||||
|
* Zoned mode
|
||||||
|
* Read/write metadata verification
|
||||||
|
* Online resize (shrink, grow)
|
||||||
|
|
||||||
For more information please refer to the wiki
|
For more information please refer to the documentation site or wiki
|
||||||
|
|
||||||
|
https://btrfs.readthedocs.io
|
||||||
|
|
||||||
https://btrfs.wiki.kernel.org
|
https://btrfs.wiki.kernel.org
|
||||||
|
|
||||||
|
@ -466,6 +466,10 @@ overlay filesystem and the value of st_ino for filesystem objects may not be
|
|||||||
persistent and could change even while the overlay filesystem is mounted, as
|
persistent and could change even while the overlay filesystem is mounted, as
|
||||||
summarized in the `Inode properties`_ table above.
|
summarized in the `Inode properties`_ table above.
|
||||||
|
|
||||||
|
4) "idmapped mounts"
|
||||||
|
When the upper or lower layers are idmapped mounts overlayfs will be mounted
|
||||||
|
without support for POSIX Access Control Lists (ACLs). This limitation will
|
||||||
|
eventually be lifted.
|
||||||
|
|
||||||
Changes to underlying filesystems
|
Changes to underlying filesystems
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -129,18 +129,24 @@ yet. Bug reports are always welcome at the issue tracker below!
|
|||||||
* - arm64
|
* - arm64
|
||||||
- Supported
|
- Supported
|
||||||
- ``LLVM=1``
|
- ``LLVM=1``
|
||||||
|
* - hexagon
|
||||||
|
- Maintained
|
||||||
|
- ``LLVM=1``
|
||||||
* - mips
|
* - mips
|
||||||
- Maintained
|
- Maintained
|
||||||
- ``CC=clang``
|
- ``LLVM=1``
|
||||||
* - powerpc
|
* - powerpc
|
||||||
- Maintained
|
- Maintained
|
||||||
- ``CC=clang``
|
- ``CC=clang``
|
||||||
* - riscv
|
* - riscv
|
||||||
- Maintained
|
- Maintained
|
||||||
- ``CC=clang``
|
- ``LLVM=1``
|
||||||
* - s390
|
* - s390
|
||||||
- Maintained
|
- Maintained
|
||||||
- ``CC=clang``
|
- ``CC=clang``
|
||||||
|
* - um (User Mode)
|
||||||
|
- Maintained
|
||||||
|
- ``LLVM=1``
|
||||||
* - x86
|
* - x86
|
||||||
- Supported
|
- Supported
|
||||||
- ``LLVM=1``
|
- ``LLVM=1``
|
||||||
|
@ -120,7 +120,8 @@ Testing
|
|||||||
unpoison-pfn
|
unpoison-pfn
|
||||||
Software-unpoison page at PFN echoed into this file. This way
|
Software-unpoison page at PFN echoed into this file. This way
|
||||||
a page can be reused again. This only works for Linux
|
a page can be reused again. This only works for Linux
|
||||||
injected failures, not for real memory failures.
|
injected failures, not for real memory failures. Once any hardware
|
||||||
|
memory failure happens, this feature is disabled.
|
||||||
|
|
||||||
Note these injection interfaces are not stable and might change between
|
Note these injection interfaces are not stable and might change between
|
||||||
kernel versions
|
kernel versions
|
||||||
|
131
MAINTAINERS
131
MAINTAINERS
@ -427,6 +427,7 @@ ACPI VIOT DRIVER
|
|||||||
M: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
M: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/acpi/viot.c
|
F: drivers/acpi/viot.c
|
||||||
F: include/linux/acpi_viot.h
|
F: include/linux/acpi_viot.h
|
||||||
@ -960,6 +961,7 @@ AMD IOMMU (AMD-VI)
|
|||||||
M: Joerg Roedel <joro@8bytes.org>
|
M: Joerg Roedel <joro@8bytes.org>
|
||||||
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||||
F: drivers/iommu/amd/
|
F: drivers/iommu/amd/
|
||||||
@ -2467,6 +2469,7 @@ ARM/NXP S32G ARCHITECTURE
|
|||||||
M: Chester Lin <clin@suse.com>
|
M: Chester Lin <clin@suse.com>
|
||||||
R: Andreas Färber <afaerber@suse.de>
|
R: Andreas Färber <afaerber@suse.de>
|
||||||
R: Matthias Brugger <mbrugger@suse.com>
|
R: Matthias Brugger <mbrugger@suse.com>
|
||||||
|
R: NXP S32 Linux Team <s32@nxp.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm64/boot/dts/freescale/s32g*.dts*
|
F: arch/arm64/boot/dts/freescale/s32g*.dts*
|
||||||
@ -3662,7 +3665,7 @@ BPF JIT for ARM
|
|||||||
M: Shubham Bansal <illusionist.neo@gmail.com>
|
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: arch/arm/net/
|
F: arch/arm/net/
|
||||||
|
|
||||||
BPF JIT for ARM64
|
BPF JIT for ARM64
|
||||||
@ -3686,14 +3689,15 @@ BPF JIT for NFP NICs
|
|||||||
M: Jakub Kicinski <kuba@kernel.org>
|
M: Jakub Kicinski <kuba@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Odd Fixes
|
||||||
F: drivers/net/ethernet/netronome/nfp/bpf/
|
F: drivers/net/ethernet/netronome/nfp/bpf/
|
||||||
|
|
||||||
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
||||||
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
||||||
|
M: Michael Ellerman <mpe@ellerman.id.au>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Supported
|
||||||
F: arch/powerpc/net/
|
F: arch/powerpc/net/
|
||||||
|
|
||||||
BPF JIT for RISC-V (32-bit)
|
BPF JIT for RISC-V (32-bit)
|
||||||
@ -3719,7 +3723,7 @@ M: Heiko Carstens <hca@linux.ibm.com>
|
|||||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Supported
|
||||||
F: arch/s390/net/
|
F: arch/s390/net/
|
||||||
X: arch/s390/net/pnet.c
|
X: arch/s390/net/pnet.c
|
||||||
|
|
||||||
@ -3727,14 +3731,14 @@ BPF JIT for SPARC (32-BIT AND 64-BIT)
|
|||||||
M: David S. Miller <davem@davemloft.net>
|
M: David S. Miller <davem@davemloft.net>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: arch/sparc/net/
|
F: arch/sparc/net/
|
||||||
|
|
||||||
BPF JIT for X86 32-BIT
|
BPF JIT for X86 32-BIT
|
||||||
M: Wang YanQing <udknight@gmail.com>
|
M: Wang YanQing <udknight@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: arch/x86/net/bpf_jit_comp32.c
|
F: arch/x86/net/bpf_jit_comp32.c
|
||||||
|
|
||||||
BPF JIT for X86 64-BIT
|
BPF JIT for X86 64-BIT
|
||||||
@ -3757,6 +3761,19 @@ F: include/linux/bpf_lsm.h
|
|||||||
F: kernel/bpf/bpf_lsm.c
|
F: kernel/bpf/bpf_lsm.c
|
||||||
F: security/bpf/
|
F: security/bpf/
|
||||||
|
|
||||||
|
BPF L7 FRAMEWORK
|
||||||
|
M: John Fastabend <john.fastabend@gmail.com>
|
||||||
|
M: Jakub Sitnicki <jakub@cloudflare.com>
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
L: bpf@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: include/linux/skmsg.h
|
||||||
|
F: net/core/skmsg.c
|
||||||
|
F: net/core/sock_map.c
|
||||||
|
F: net/ipv4/tcp_bpf.c
|
||||||
|
F: net/ipv4/udp_bpf.c
|
||||||
|
F: net/unix/unix_bpf.c
|
||||||
|
|
||||||
BPFTOOL
|
BPFTOOL
|
||||||
M: Quentin Monnet <quentin@isovalent.com>
|
M: Quentin Monnet <quentin@isovalent.com>
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
@ -3796,12 +3813,12 @@ N: bcmbca
|
|||||||
N: bcm[9]?47622
|
N: bcm[9]?47622
|
||||||
|
|
||||||
BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
|
BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
|
||||||
M: Nicolas Saenz Julienne <nsaenz@kernel.org>
|
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsaenz/linux-rpi.git
|
T: git git://github.com/broadcom/stblinux.git
|
||||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||||
F: drivers/pci/controller/pcie-brcmstb.c
|
F: drivers/pci/controller/pcie-brcmstb.c
|
||||||
F: drivers/staging/vc04_services
|
F: drivers/staging/vc04_services
|
||||||
@ -4959,6 +4976,7 @@ Q: http://patchwork.kernel.org/project/linux-clk/list/
|
|||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
|
||||||
F: Documentation/devicetree/bindings/clock/
|
F: Documentation/devicetree/bindings/clock/
|
||||||
F: drivers/clk/
|
F: drivers/clk/
|
||||||
|
F: include/dt-bindings/clock/
|
||||||
F: include/linux/clk-pr*
|
F: include/linux/clk-pr*
|
||||||
F: include/linux/clk/
|
F: include/linux/clk/
|
||||||
F: include/linux/of_clk.h
|
F: include/linux/of_clk.h
|
||||||
@ -5962,6 +5980,7 @@ M: Christoph Hellwig <hch@lst.de>
|
|||||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||||
R: Robin Murphy <robin.murphy@arm.com>
|
R: Robin Murphy <robin.murphy@arm.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||||
@ -5974,6 +5993,7 @@ F: kernel/dma/
|
|||||||
DMA MAPPING BENCHMARK
|
DMA MAPPING BENCHMARK
|
||||||
M: Xiang Chen <chenxiang66@hisilicon.com>
|
M: Xiang Chen <chenxiang66@hisilicon.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
F: kernel/dma/map_benchmark.c
|
F: kernel/dma/map_benchmark.c
|
||||||
F: tools/testing/selftests/dma/
|
F: tools/testing/selftests/dma/
|
||||||
|
|
||||||
@ -7558,6 +7578,7 @@ F: drivers/gpu/drm/exynos/exynos_dp*
|
|||||||
EXYNOS SYSMMU (IOMMU) driver
|
EXYNOS SYSMMU (IOMMU) driver
|
||||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/iommu/exynos-iommu.c
|
F: drivers/iommu/exynos-iommu.c
|
||||||
|
|
||||||
@ -8479,6 +8500,7 @@ F: Documentation/devicetree/bindings/gpio/
|
|||||||
F: Documentation/driver-api/gpio/
|
F: Documentation/driver-api/gpio/
|
||||||
F: drivers/gpio/
|
F: drivers/gpio/
|
||||||
F: include/asm-generic/gpio.h
|
F: include/asm-generic/gpio.h
|
||||||
|
F: include/dt-bindings/gpio/
|
||||||
F: include/linux/gpio.h
|
F: include/linux/gpio.h
|
||||||
F: include/linux/gpio/
|
F: include/linux/gpio/
|
||||||
F: include/linux/of_gpio.h
|
F: include/linux/of_gpio.h
|
||||||
@ -9132,6 +9154,7 @@ F: drivers/media/platform/st/sti/hva
|
|||||||
|
|
||||||
HWPOISON MEMORY FAILURE HANDLING
|
HWPOISON MEMORY FAILURE HANDLING
|
||||||
M: Naoya Horiguchi <naoya.horiguchi@nec.com>
|
M: Naoya Horiguchi <naoya.horiguchi@nec.com>
|
||||||
|
R: Miaohe Lin <linmiaohe@huawei.com>
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: mm/hwpoison-inject.c
|
F: mm/hwpoison-inject.c
|
||||||
@ -9977,6 +10000,7 @@ INTEL IOMMU (VT-d)
|
|||||||
M: David Woodhouse <dwmw2@infradead.org>
|
M: David Woodhouse <dwmw2@infradead.org>
|
||||||
M: Lu Baolu <baolu.lu@linux.intel.com>
|
M: Lu Baolu <baolu.lu@linux.intel.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||||
F: drivers/iommu/intel/
|
F: drivers/iommu/intel/
|
||||||
@ -10356,6 +10380,7 @@ IOMMU DRIVERS
|
|||||||
M: Joerg Roedel <joro@8bytes.org>
|
M: Joerg Roedel <joro@8bytes.org>
|
||||||
M: Will Deacon <will@kernel.org>
|
M: Will Deacon <will@kernel.org>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||||
F: Documentation/devicetree/bindings/iommu/
|
F: Documentation/devicetree/bindings/iommu/
|
||||||
@ -10832,6 +10857,7 @@ M: Marc Zyngier <maz@kernel.org>
|
|||||||
R: James Morse <james.morse@arm.com>
|
R: James Morse <james.morse@arm.com>
|
||||||
R: Alexandru Elisei <alexandru.elisei@arm.com>
|
R: Alexandru Elisei <alexandru.elisei@arm.com>
|
||||||
R: Suzuki K Poulose <suzuki.poulose@arm.com>
|
R: Suzuki K Poulose <suzuki.poulose@arm.com>
|
||||||
|
R: Oliver Upton <oliver.upton@linux.dev>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: kvmarm@lists.cs.columbia.edu (moderated for non-subscribers)
|
L: kvmarm@lists.cs.columbia.edu (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -10898,28 +10924,51 @@ F: tools/testing/selftests/kvm/*/s390x/
|
|||||||
F: tools/testing/selftests/kvm/s390x/
|
F: tools/testing/selftests/kvm/s390x/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
|
KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
|
||||||
|
M: Sean Christopherson <seanjc@google.com>
|
||||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
R: Sean Christopherson <seanjc@google.com>
|
|
||||||
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
|
||||||
R: Wanpeng Li <wanpengli@tencent.com>
|
|
||||||
R: Jim Mattson <jmattson@google.com>
|
|
||||||
R: Joerg Roedel <joro@8bytes.org>
|
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.linux-kvm.org
|
|
||||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||||
F: arch/x86/include/asm/kvm*
|
F: arch/x86/include/asm/kvm*
|
||||||
F: arch/x86/include/asm/pvclock-abi.h
|
|
||||||
F: arch/x86/include/asm/svm.h
|
F: arch/x86/include/asm/svm.h
|
||||||
F: arch/x86/include/asm/vmx*.h
|
F: arch/x86/include/asm/vmx*.h
|
||||||
F: arch/x86/include/uapi/asm/kvm*
|
F: arch/x86/include/uapi/asm/kvm*
|
||||||
F: arch/x86/include/uapi/asm/svm.h
|
F: arch/x86/include/uapi/asm/svm.h
|
||||||
F: arch/x86/include/uapi/asm/vmx.h
|
F: arch/x86/include/uapi/asm/vmx.h
|
||||||
F: arch/x86/kernel/kvm.c
|
|
||||||
F: arch/x86/kernel/kvmclock.c
|
|
||||||
F: arch/x86/kvm/
|
F: arch/x86/kvm/
|
||||||
F: arch/x86/kvm/*/
|
F: arch/x86/kvm/*/
|
||||||
|
|
||||||
|
KVM PARAVIRT (KVM/paravirt)
|
||||||
|
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
R: Wanpeng Li <wanpengli@tencent.com>
|
||||||
|
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
|
L: kvm@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||||
|
F: arch/x86/kernel/kvm.c
|
||||||
|
F: arch/x86/kernel/kvmclock.c
|
||||||
|
F: arch/x86/include/asm/pvclock-abi.h
|
||||||
|
F: include/linux/kvm_para.h
|
||||||
|
F: include/uapi/linux/kvm_para.h
|
||||||
|
F: include/uapi/asm-generic/kvm_para.h
|
||||||
|
F: include/asm-generic/kvm_para.h
|
||||||
|
F: arch/um/include/asm/kvm_para.h
|
||||||
|
F: arch/x86/include/asm/kvm_para.h
|
||||||
|
F: arch/x86/include/uapi/asm/kvm_para.h
|
||||||
|
|
||||||
|
KVM X86 HYPER-V (KVM/hyper-v)
|
||||||
|
M: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||||
|
M: Sean Christopherson <seanjc@google.com>
|
||||||
|
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
L: kvm@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||||
|
F: arch/x86/kvm/hyperv.*
|
||||||
|
F: arch/x86/kvm/kvm_onhyperv.*
|
||||||
|
F: arch/x86/kvm/svm/hyperv.*
|
||||||
|
F: arch/x86/kvm/svm/svm_onhyperv.*
|
||||||
|
F: arch/x86/kvm/vmx/evmcs.*
|
||||||
|
|
||||||
KERNFS
|
KERNFS
|
||||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
M: Tejun Heo <tj@kernel.org>
|
M: Tejun Heo <tj@kernel.org>
|
||||||
@ -11098,20 +11147,6 @@ S: Maintained
|
|||||||
F: include/net/l3mdev.h
|
F: include/net/l3mdev.h
|
||||||
F: net/l3mdev
|
F: net/l3mdev
|
||||||
|
|
||||||
L7 BPF FRAMEWORK
|
|
||||||
M: John Fastabend <john.fastabend@gmail.com>
|
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
|
||||||
M: Jakub Sitnicki <jakub@cloudflare.com>
|
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: include/linux/skmsg.h
|
|
||||||
F: net/core/skmsg.c
|
|
||||||
F: net/core/sock_map.c
|
|
||||||
F: net/ipv4/tcp_bpf.c
|
|
||||||
F: net/ipv4/udp_bpf.c
|
|
||||||
F: net/unix/unix_bpf.c
|
|
||||||
|
|
||||||
LANDLOCK SECURITY MODULE
|
LANDLOCK SECURITY MODULE
|
||||||
M: Mickaël Salaün <mic@digikod.net>
|
M: Mickaël Salaün <mic@digikod.net>
|
||||||
L: linux-security-module@vger.kernel.org
|
L: linux-security-module@vger.kernel.org
|
||||||
@ -11591,6 +11626,7 @@ F: drivers/gpu/drm/bridge/lontium-lt8912b.c
|
|||||||
LOONGARCH
|
LOONGARCH
|
||||||
M: Huacai Chen <chenhuacai@kernel.org>
|
M: Huacai Chen <chenhuacai@kernel.org>
|
||||||
R: WANG Xuerui <kernel@xen0n.name>
|
R: WANG Xuerui <kernel@xen0n.name>
|
||||||
|
L: loongarch@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
|
||||||
F: arch/loongarch/
|
F: arch/loongarch/
|
||||||
@ -12504,6 +12540,7 @@ F: drivers/i2c/busses/i2c-mt65xx.c
|
|||||||
MEDIATEK IOMMU DRIVER
|
MEDIATEK IOMMU DRIVER
|
||||||
M: Yong Wu <yong.wu@mediatek.com>
|
M: Yong Wu <yong.wu@mediatek.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/devicetree/bindings/iommu/mediatek*
|
F: Documentation/devicetree/bindings/iommu/mediatek*
|
||||||
@ -12846,9 +12883,8 @@ M: Andrew Morton <akpm@linux-foundation.org>
|
|||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://www.linux-mm.org
|
W: http://www.linux-mm.org
|
||||||
T: quilt https://ozlabs.org/~akpm/mmotm/
|
T: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
|
||||||
T: quilt https://ozlabs.org/~akpm/mmots/
|
T: quilt git://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new
|
||||||
T: git git://github.com/hnaz/linux-mm.git
|
|
||||||
F: include/linux/gfp.h
|
F: include/linux/gfp.h
|
||||||
F: include/linux/memory_hotplug.h
|
F: include/linux/memory_hotplug.h
|
||||||
F: include/linux/mm.h
|
F: include/linux/mm.h
|
||||||
@ -12858,6 +12894,18 @@ F: include/linux/vmalloc.h
|
|||||||
F: mm/
|
F: mm/
|
||||||
F: tools/testing/selftests/vm/
|
F: tools/testing/selftests/vm/
|
||||||
|
|
||||||
|
MEMORY HOT(UN)PLUG
|
||||||
|
M: David Hildenbrand <david@redhat.com>
|
||||||
|
M: Oscar Salvador <osalvador@suse.de>
|
||||||
|
L: linux-mm@kvack.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/admin-guide/mm/memory-hotplug.rst
|
||||||
|
F: Documentation/core-api/memory-hotplug.rst
|
||||||
|
F: drivers/base/memory.c
|
||||||
|
F: include/linux/memory_hotplug.h
|
||||||
|
F: mm/memory_hotplug.c
|
||||||
|
F: tools/testing/selftests/memory-hotplug/
|
||||||
|
|
||||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||||
M: Miquel Raynal <miquel.raynal@bootlin.com>
|
M: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
M: Richard Weinberger <richard@nod.at>
|
M: Richard Weinberger <richard@nod.at>
|
||||||
@ -13954,7 +14002,6 @@ F: net/ipv6/tcp*.c
|
|||||||
NETWORKING [TLS]
|
NETWORKING [TLS]
|
||||||
M: Boris Pismenny <borisp@nvidia.com>
|
M: Boris Pismenny <borisp@nvidia.com>
|
||||||
M: John Fastabend <john.fastabend@gmail.com>
|
M: John Fastabend <john.fastabend@gmail.com>
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
|
||||||
M: Jakub Kicinski <kuba@kernel.org>
|
M: Jakub Kicinski <kuba@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -14263,7 +14310,7 @@ F: drivers/iio/gyro/fxas21002c_i2c.c
|
|||||||
F: drivers/iio/gyro/fxas21002c_spi.c
|
F: drivers/iio/gyro/fxas21002c_spi.c
|
||||||
|
|
||||||
NXP i.MX CLOCK DRIVERS
|
NXP i.MX CLOCK DRIVERS
|
||||||
M: Abel Vesa <abel.vesa@nxp.com>
|
M: Abel Vesa <abelvesa@kernel.org>
|
||||||
L: linux-clk@vger.kernel.org
|
L: linux-clk@vger.kernel.org
|
||||||
L: linux-imx@nxp.com
|
L: linux-imx@nxp.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -14351,9 +14398,8 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
|
|||||||
F: sound/soc/codecs/tfa989x.c
|
F: sound/soc/codecs/tfa989x.c
|
||||||
|
|
||||||
NXP-NCI NFC DRIVER
|
NXP-NCI NFC DRIVER
|
||||||
R: Charles Gorand <charles.gorand@effinnov.com>
|
|
||||||
L: linux-nfc@lists.01.org (subscribers-only)
|
L: linux-nfc@lists.01.org (subscribers-only)
|
||||||
S: Supported
|
S: Orphan
|
||||||
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
||||||
F: drivers/nfc/nxp-nci
|
F: drivers/nfc/nxp-nci
|
||||||
|
|
||||||
@ -14871,6 +14917,7 @@ F: include/dt-bindings/
|
|||||||
|
|
||||||
OPENCOMPUTE PTP CLOCK DRIVER
|
OPENCOMPUTE PTP CLOCK DRIVER
|
||||||
M: Jonathan Lemon <jonathan.lemon@gmail.com>
|
M: Jonathan Lemon <jonathan.lemon@gmail.com>
|
||||||
|
M: Vadim Fedorenko <vadfed@fb.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/ptp/ptp_ocp.c
|
F: drivers/ptp/ptp_ocp.c
|
||||||
@ -16490,7 +16537,7 @@ F: Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml
|
|||||||
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||||
|
|
||||||
QUALCOMM CRYPTO DRIVERS
|
QUALCOMM CRYPTO DRIVERS
|
||||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||||
L: linux-crypto@vger.kernel.org
|
L: linux-crypto@vger.kernel.org
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -16545,6 +16592,7 @@ F: drivers/i2c/busses/i2c-qcom-cci.c
|
|||||||
QUALCOMM IOMMU
|
QUALCOMM IOMMU
|
||||||
M: Rob Clark <robdclark@gmail.com>
|
M: Rob Clark <robdclark@gmail.com>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/iommu/arm/arm-smmu/qcom_iommu.c
|
F: drivers/iommu/arm/arm-smmu/qcom_iommu.c
|
||||||
@ -16600,7 +16648,7 @@ F: include/linux/if_rmnet.h
|
|||||||
|
|
||||||
QUALCOMM TSENS THERMAL DRIVER
|
QUALCOMM TSENS THERMAL DRIVER
|
||||||
M: Amit Kucheria <amitk@kernel.org>
|
M: Amit Kucheria <amitk@kernel.org>
|
||||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -19170,6 +19218,7 @@ F: arch/x86/boot/video*
|
|||||||
SWIOTLB SUBSYSTEM
|
SWIOTLB SUBSYSTEM
|
||||||
M: Christoph Hellwig <hch@infradead.org>
|
M: Christoph Hellwig <hch@infradead.org>
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||||
@ -20714,6 +20763,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
|
|||||||
F: Documentation/devicetree/bindings/usb/
|
F: Documentation/devicetree/bindings/usb/
|
||||||
F: Documentation/usb/
|
F: Documentation/usb/
|
||||||
F: drivers/usb/
|
F: drivers/usb/
|
||||||
|
F: include/dt-bindings/usb/
|
||||||
F: include/linux/usb.h
|
F: include/linux/usb.h
|
||||||
F: include/linux/usb/
|
F: include/linux/usb/
|
||||||
|
|
||||||
@ -21844,6 +21894,7 @@ M: Juergen Gross <jgross@suse.com>
|
|||||||
M: Stefano Stabellini <sstabellini@kernel.org>
|
M: Stefano Stabellini <sstabellini@kernel.org>
|
||||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||||
L: iommu@lists.linux-foundation.org
|
L: iommu@lists.linux-foundation.org
|
||||||
|
L: iommu@lists.linux.dev
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/xen/*swiotlb*
|
F: arch/x86/xen/*swiotlb*
|
||||||
F: drivers/xen/*swiotlb*
|
F: drivers/xen/*swiotlb*
|
||||||
|
4
Makefile
4
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc5
|
||||||
NAME = Superb Owl
|
NAME = Superb Owl
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -1141,7 +1141,7 @@ KBUILD_MODULES := 1
|
|||||||
|
|
||||||
autoksyms_recursive: descend modules.order
|
autoksyms_recursive: descend modules.order
|
||||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
"$(MAKE) -f $(srctree)/Makefile autoksyms_recursive"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
||||||
|
@ -1586,7 +1586,6 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
|||||||
aspeed-bmc-lenovo-hr630.dtb \
|
aspeed-bmc-lenovo-hr630.dtb \
|
||||||
aspeed-bmc-lenovo-hr855xg2.dtb \
|
aspeed-bmc-lenovo-hr855xg2.dtb \
|
||||||
aspeed-bmc-microsoft-olympus.dtb \
|
aspeed-bmc-microsoft-olympus.dtb \
|
||||||
aspeed-bmc-nuvia-dc-scm.dtb \
|
|
||||||
aspeed-bmc-opp-lanyang.dtb \
|
aspeed-bmc-opp-lanyang.dtb \
|
||||||
aspeed-bmc-opp-mihawk.dtb \
|
aspeed-bmc-opp-mihawk.dtb \
|
||||||
aspeed-bmc-opp-mowgli.dtb \
|
aspeed-bmc-opp-mowgli.dtb \
|
||||||
@ -1599,6 +1598,7 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
|||||||
aspeed-bmc-opp-witherspoon.dtb \
|
aspeed-bmc-opp-witherspoon.dtb \
|
||||||
aspeed-bmc-opp-zaius.dtb \
|
aspeed-bmc-opp-zaius.dtb \
|
||||||
aspeed-bmc-portwell-neptune.dtb \
|
aspeed-bmc-portwell-neptune.dtb \
|
||||||
|
aspeed-bmc-qcom-dc-scm-v1.dtb \
|
||||||
aspeed-bmc-quanta-q71l.dtb \
|
aspeed-bmc-quanta-q71l.dtb \
|
||||||
aspeed-bmc-quanta-s6q.dtb \
|
aspeed-bmc-quanta-s6q.dtb \
|
||||||
aspeed-bmc-supermicro-x11spi.dtb \
|
aspeed-bmc-supermicro-x11spi.dtb \
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
#include "aspeed-g6.dtsi"
|
#include "aspeed-g6.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Nuvia DC-SCM BMC";
|
model = "Qualcomm DC-SCM V1 BMC";
|
||||||
compatible = "nuvia,dc-scm-bmc", "aspeed,ast2600";
|
compatible = "qcom,dc-scm-v1-bmc", "aspeed,ast2600";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
@ -28,12 +28,12 @@
|
|||||||
&expgpio {
|
&expgpio {
|
||||||
gpio-line-names = "BT_ON",
|
gpio-line-names = "BT_ON",
|
||||||
"WL_ON",
|
"WL_ON",
|
||||||
"",
|
"PWR_LED_OFF",
|
||||||
"GLOBAL_RESET",
|
"GLOBAL_RESET",
|
||||||
"VDD_SD_IO_SEL",
|
"VDD_SD_IO_SEL",
|
||||||
"CAM_GPIO",
|
"GLOBAL_SHUTDOWN",
|
||||||
"SD_PWR_ON",
|
"SD_PWR_ON",
|
||||||
"SD_OC_N";
|
"SHUTDOWN_REQUEST";
|
||||||
};
|
};
|
||||||
|
|
||||||
&genet_mdio {
|
&genet_mdio {
|
||||||
|
@ -593,7 +593,7 @@
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_atmel_conn>;
|
pinctrl-0 = <&pinctrl_atmel_conn>;
|
||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
reset-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; /* SODIMM 106 */
|
reset-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; /* SODIMM 106 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -762,7 +762,7 @@
|
|||||||
regulator-name = "vddpu";
|
regulator-name = "vddpu";
|
||||||
regulator-min-microvolt = <725000>;
|
regulator-min-microvolt = <725000>;
|
||||||
regulator-max-microvolt = <1450000>;
|
regulator-max-microvolt = <1450000>;
|
||||||
regulator-enable-ramp-delay = <150>;
|
regulator-enable-ramp-delay = <380>;
|
||||||
anatop-reg-offset = <0x140>;
|
anatop-reg-offset = <0x140>;
|
||||||
anatop-vol-bit-shift = <9>;
|
anatop-vol-bit-shift = <9>;
|
||||||
anatop-vol-bit-width = <5>;
|
anatop-vol-bit-width = <5>;
|
||||||
|
@ -120,6 +120,7 @@
|
|||||||
compatible = "usb-nop-xceiv";
|
compatible = "usb-nop-xceiv";
|
||||||
clocks = <&clks IMX7D_USB_HSIC_ROOT_CLK>;
|
clocks = <&clks IMX7D_USB_HSIC_ROOT_CLK>;
|
||||||
clock-names = "main_clk";
|
clock-names = "main_clk";
|
||||||
|
power-domains = <&pgc_hsic_phy>;
|
||||||
#phy-cells = <0>;
|
#phy-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1153,7 +1154,6 @@
|
|||||||
compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
|
compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
|
||||||
reg = <0x30b30000 0x200>;
|
reg = <0x30b30000 0x200>;
|
||||||
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
power-domains = <&pgc_hsic_phy>;
|
|
||||||
clocks = <&clks IMX7D_USB_CTRL_CLK>;
|
clocks = <&clks IMX7D_USB_CTRL_CLK>;
|
||||||
fsl,usbphy = <&usbphynop3>;
|
fsl,usbphy = <&usbphynop3>;
|
||||||
fsl,usbmisc = <&usbmisc3 0>;
|
fsl,usbmisc = <&usbmisc3 0>;
|
||||||
|
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
|
/*
|
||||||
|
* Copyright (C) STMicroelectronics 2022 - All Rights Reserved
|
||||||
|
* Author: Alexandre Torgue <alexandre.torgue@foss.st.com> for STMicroelectronics.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/ {
|
||||||
|
firmware {
|
||||||
|
optee: optee {
|
||||||
|
compatible = "linaro,optee-tz";
|
||||||
|
method = "smc";
|
||||||
|
};
|
||||||
|
|
||||||
|
scmi: scmi {
|
||||||
|
compatible = "linaro,scmi-optee";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
linaro,optee-channel-id = <0>;
|
||||||
|
shmem = <&scmi_shm>;
|
||||||
|
|
||||||
|
scmi_clk: protocol@14 {
|
||||||
|
reg = <0x14>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
scmi_reset: protocol@16 {
|
||||||
|
reg = <0x16>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
scmi_sram: sram@2ffff000 {
|
||||||
|
compatible = "mmio-sram";
|
||||||
|
reg = <0x2ffff000 0x1000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0 0x2ffff000 0x1000>;
|
||||||
|
|
||||||
|
scmi_shm: scmi-sram@0 {
|
||||||
|
compatible = "arm,scmi-shmem";
|
||||||
|
reg = <0 0x80>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -115,33 +115,6 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
firmware {
|
|
||||||
optee: optee {
|
|
||||||
compatible = "linaro,optee-tz";
|
|
||||||
method = "smc";
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
scmi: scmi {
|
|
||||||
compatible = "linaro,scmi-optee";
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
linaro,optee-channel-id = <0>;
|
|
||||||
shmem = <&scmi_shm>;
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
scmi_clk: protocol@14 {
|
|
||||||
reg = <0x14>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
scmi_reset: protocol@16 {
|
|
||||||
reg = <0x16>;
|
|
||||||
#reset-cells = <1>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
@ -149,20 +122,6 @@
|
|||||||
interrupt-parent = <&intc>;
|
interrupt-parent = <&intc>;
|
||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
scmi_sram: sram@2ffff000 {
|
|
||||||
compatible = "mmio-sram";
|
|
||||||
reg = <0x2ffff000 0x1000>;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
ranges = <0 0x2ffff000 0x1000>;
|
|
||||||
|
|
||||||
scmi_shm: scmi-sram@0 {
|
|
||||||
compatible = "arm,scmi-shmem";
|
|
||||||
reg = <0 0x80>;
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
timers2: timer@40000000 {
|
timers2: timer@40000000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157a-dk1.dts"
|
#include "stm32mp157a-dk1.dts"
|
||||||
|
#include "stm32mp15-scmi.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board";
|
model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board";
|
||||||
@ -54,10 +55,6 @@
|
|||||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&optee {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&rcc {
|
&rcc {
|
||||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||||
@ -76,11 +73,3 @@
|
|||||||
&rtc {
|
&rtc {
|
||||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&scmi {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&scmi_shm {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c-dk2.dts"
|
#include "stm32mp157c-dk2.dts"
|
||||||
|
#include "stm32mp15-scmi.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board";
|
model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board";
|
||||||
@ -63,10 +64,6 @@
|
|||||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&optee {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&rcc {
|
&rcc {
|
||||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||||
@ -85,11 +82,3 @@
|
|||||||
&rtc {
|
&rtc {
|
||||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&scmi {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&scmi_shm {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c-ed1.dts"
|
#include "stm32mp157c-ed1.dts"
|
||||||
|
#include "stm32mp15-scmi.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter";
|
model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter";
|
||||||
@ -59,10 +60,6 @@
|
|||||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&optee {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&rcc {
|
&rcc {
|
||||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||||
@ -81,11 +78,3 @@
|
|||||||
&rtc {
|
&rtc {
|
||||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&scmi {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&scmi_shm {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157c-ev1.dts"
|
#include "stm32mp157c-ev1.dts"
|
||||||
|
#include "stm32mp15-scmi.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother";
|
model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother";
|
||||||
@ -68,10 +69,6 @@
|
|||||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&optee {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&rcc {
|
&rcc {
|
||||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||||
@ -90,11 +87,3 @@
|
|||||||
&rtc {
|
&rtc {
|
||||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&scmi {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
&scmi_shm {
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
@ -39,6 +39,7 @@ static int axxia_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
syscon = of_iomap(syscon_np, 0);
|
syscon = of_iomap(syscon_np, 0);
|
||||||
|
of_node_put(syscon_np);
|
||||||
if (!syscon)
|
if (!syscon)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -372,6 +372,7 @@ static void __init cns3xxx_init(void)
|
|||||||
/* De-Asscer SATA Reset */
|
/* De-Asscer SATA Reset */
|
||||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA));
|
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA));
|
||||||
}
|
}
|
||||||
|
of_node_put(dn);
|
||||||
|
|
||||||
dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-sdhci");
|
dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-sdhci");
|
||||||
if (of_device_is_available(dn)) {
|
if (of_device_is_available(dn)) {
|
||||||
@ -385,6 +386,7 @@ static void __init cns3xxx_init(void)
|
|||||||
cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO));
|
cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO));
|
||||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO));
|
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO));
|
||||||
}
|
}
|
||||||
|
of_node_put(dn);
|
||||||
|
|
||||||
pm_power_off = cns3xxx_power_off;
|
pm_power_off = cns3xxx_power_off;
|
||||||
|
|
||||||
|
@ -149,6 +149,7 @@ static void exynos_map_pmu(void)
|
|||||||
np = of_find_matching_node(NULL, exynos_dt_pmu_match);
|
np = of_find_matching_node(NULL, exynos_dt_pmu_match);
|
||||||
if (np)
|
if (np)
|
||||||
pmu_base_addr = of_iomap(np, 0);
|
pmu_base_addr = of_iomap(np, 0);
|
||||||
|
of_node_put(np);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init exynos_init_irq(void)
|
static void __init exynos_init_irq(void)
|
||||||
|
@ -218,13 +218,13 @@ void __init spear_setup_of_timer(void)
|
|||||||
irq = irq_of_parse_and_map(np, 0);
|
irq = irq_of_parse_and_map(np, 0);
|
||||||
if (!irq) {
|
if (!irq) {
|
||||||
pr_err("%s: No irq passed for timer via DT\n", __func__);
|
pr_err("%s: No irq passed for timer via DT\n", __func__);
|
||||||
return;
|
goto err_put_np;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpt_base = of_iomap(np, 0);
|
gpt_base = of_iomap(np, 0);
|
||||||
if (!gpt_base) {
|
if (!gpt_base) {
|
||||||
pr_err("%s: of iomap failed\n", __func__);
|
pr_err("%s: of iomap failed\n", __func__);
|
||||||
return;
|
goto err_put_np;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpt_clk = clk_get_sys("gpt0", NULL);
|
gpt_clk = clk_get_sys("gpt0", NULL);
|
||||||
@ -239,6 +239,8 @@ void __init spear_setup_of_timer(void)
|
|||||||
goto err_prepare_enable_clk;
|
goto err_prepare_enable_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
of_node_put(np);
|
||||||
|
|
||||||
spear_clockevent_init(irq);
|
spear_clockevent_init(irq);
|
||||||
spear_clocksource_init();
|
spear_clocksource_init();
|
||||||
|
|
||||||
@ -248,4 +250,6 @@ err_prepare_enable_clk:
|
|||||||
clk_put(gpt_clk);
|
clk_put(gpt_clk);
|
||||||
err_iomap:
|
err_iomap:
|
||||||
iounmap(gpt_base);
|
iounmap(gpt_base);
|
||||||
|
err_put_np:
|
||||||
|
of_node_put(np);
|
||||||
}
|
}
|
||||||
|
@ -280,8 +280,8 @@
|
|||||||
interrupts = <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&uart0_bus>;
|
pinctrl-0 = <&uart0_bus>;
|
||||||
clocks = <&cmu_peri CLK_GOUT_UART0_EXT_UCLK>,
|
clocks = <&cmu_peri CLK_GOUT_UART0_PCLK>,
|
||||||
<&cmu_peri CLK_GOUT_UART0_PCLK>;
|
<&cmu_peri CLK_GOUT_UART0_EXT_UCLK>;
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
clock-names = "uart", "clk_uart_baud0";
|
||||||
samsung,uart-fifosize = <64>;
|
samsung,uart-fifosize = <64>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -293,8 +293,8 @@
|
|||||||
interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&uart1_bus>;
|
pinctrl-0 = <&uart1_bus>;
|
||||||
clocks = <&cmu_peri CLK_GOUT_UART1_EXT_UCLK>,
|
clocks = <&cmu_peri CLK_GOUT_UART1_PCLK>,
|
||||||
<&cmu_peri CLK_GOUT_UART1_PCLK>;
|
<&cmu_peri CLK_GOUT_UART1_EXT_UCLK>;
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
clock-names = "uart", "clk_uart_baud0";
|
||||||
samsung,uart-fifosize = <256>;
|
samsung,uart-fifosize = <256>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -306,8 +306,8 @@
|
|||||||
interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&uart2_bus>;
|
pinctrl-0 = <&uart2_bus>;
|
||||||
clocks = <&cmu_peri CLK_GOUT_UART2_EXT_UCLK>,
|
clocks = <&cmu_peri CLK_GOUT_UART2_PCLK>,
|
||||||
<&cmu_peri CLK_GOUT_UART2_PCLK>;
|
<&cmu_peri CLK_GOUT_UART2_EXT_UCLK>;
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
clock-names = "uart", "clk_uart_baud0";
|
||||||
samsung,uart-fifosize = <256>;
|
samsung,uart-fifosize = <256>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc@0 {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
@ -456,13 +456,11 @@
|
|||||||
clock-names = "clk_ahb", "clk_xin";
|
clock-names = "clk_ahb", "clk_xin";
|
||||||
mmc-ddr-1_8v;
|
mmc-ddr-1_8v;
|
||||||
mmc-hs200-1_8v;
|
mmc-hs200-1_8v;
|
||||||
mmc-hs400-1_8v;
|
|
||||||
ti,trm-icp = <0x2>;
|
ti,trm-icp = <0x2>;
|
||||||
ti,otap-del-sel-legacy = <0x0>;
|
ti,otap-del-sel-legacy = <0x0>;
|
||||||
ti,otap-del-sel-mmc-hs = <0x0>;
|
ti,otap-del-sel-mmc-hs = <0x0>;
|
||||||
ti,otap-del-sel-ddr52 = <0x6>;
|
ti,otap-del-sel-ddr52 = <0x6>;
|
||||||
ti,otap-del-sel-hs200 = <0x7>;
|
ti,otap-del-sel-hs200 = <0x7>;
|
||||||
ti,otap-del-sel-hs400 = <0x4>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sdhci1: mmc@fa00000 {
|
sdhci1: mmc@fa00000 {
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
ranges;
|
ranges;
|
||||||
#interrupt-cells = <3>;
|
#interrupt-cells = <3>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
reg = <0x00 0x01800000 0x00 0x200000>, /* GICD */
|
reg = <0x00 0x01800000 0x00 0x100000>, /* GICD */
|
||||||
<0x00 0x01900000 0x00 0x100000>, /* GICR */
|
<0x00 0x01900000 0x00 0x100000>, /* GICR */
|
||||||
<0x00 0x6f000000 0x00 0x2000>, /* GICC */
|
<0x00 0x6f000000 0x00 0x2000>, /* GICC */
|
||||||
<0x00 0x6f010000 0x00 0x1000>, /* GICH */
|
<0x00 0x6f010000 0x00 0x1000>, /* GICH */
|
||||||
|
@ -2112,11 +2112,11 @@ static int finalize_hyp_mode(void)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exclude HYP BSS from kmemleak so that it doesn't get peeked
|
* Exclude HYP sections from kmemleak so that they don't get peeked
|
||||||
* at, which would end badly once the section is inaccessible.
|
* at, which would end badly once inaccessible.
|
||||||
* None of other sections should ever be introspected.
|
|
||||||
*/
|
*/
|
||||||
kmemleak_free_part(__hyp_bss_start, __hyp_bss_end - __hyp_bss_start);
|
kmemleak_free_part(__hyp_bss_start, __hyp_bss_end - __hyp_bss_start);
|
||||||
|
kmemleak_free_part(__va(hyp_mem_base), hyp_mem_size);
|
||||||
return pkvm_drop_host_privileges();
|
return pkvm_drop_host_privileges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +214,19 @@ static pte_t get_clear_contig(struct mm_struct *mm,
|
|||||||
return orig_pte;
|
return orig_pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pte_t get_clear_contig_flush(struct mm_struct *mm,
|
||||||
|
unsigned long addr,
|
||||||
|
pte_t *ptep,
|
||||||
|
unsigned long pgsize,
|
||||||
|
unsigned long ncontig)
|
||||||
|
{
|
||||||
|
pte_t orig_pte = get_clear_contig(mm, addr, ptep, pgsize, ncontig);
|
||||||
|
struct vm_area_struct vma = TLB_FLUSH_VMA(mm, 0);
|
||||||
|
|
||||||
|
flush_tlb_range(&vma, addr, addr + (pgsize * ncontig));
|
||||||
|
return orig_pte;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changing some bits of contiguous entries requires us to follow a
|
* Changing some bits of contiguous entries requires us to follow a
|
||||||
* Break-Before-Make approach, breaking the whole contiguous set
|
* Break-Before-Make approach, breaking the whole contiguous set
|
||||||
@ -447,19 +460,20 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
|||||||
int ncontig, i;
|
int ncontig, i;
|
||||||
size_t pgsize = 0;
|
size_t pgsize = 0;
|
||||||
unsigned long pfn = pte_pfn(pte), dpfn;
|
unsigned long pfn = pte_pfn(pte), dpfn;
|
||||||
|
struct mm_struct *mm = vma->vm_mm;
|
||||||
pgprot_t hugeprot;
|
pgprot_t hugeprot;
|
||||||
pte_t orig_pte;
|
pte_t orig_pte;
|
||||||
|
|
||||||
if (!pte_cont(pte))
|
if (!pte_cont(pte))
|
||||||
return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
||||||
|
|
||||||
ncontig = find_num_contig(vma->vm_mm, addr, ptep, &pgsize);
|
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||||
dpfn = pgsize >> PAGE_SHIFT;
|
dpfn = pgsize >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (!__cont_access_flags_changed(ptep, pte, ncontig))
|
if (!__cont_access_flags_changed(ptep, pte, ncontig))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
orig_pte = get_clear_contig(vma->vm_mm, addr, ptep, pgsize, ncontig);
|
orig_pte = get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||||
|
|
||||||
/* Make sure we don't lose the dirty or young state */
|
/* Make sure we don't lose the dirty or young state */
|
||||||
if (pte_dirty(orig_pte))
|
if (pte_dirty(orig_pte))
|
||||||
@ -470,7 +484,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
|||||||
|
|
||||||
hugeprot = pte_pgprot(pte);
|
hugeprot = pte_pgprot(pte);
|
||||||
for (i = 0; i < ncontig; i++, ptep++, addr += pgsize, pfn += dpfn)
|
for (i = 0; i < ncontig; i++, ptep++, addr += pgsize, pfn += dpfn)
|
||||||
set_pte_at(vma->vm_mm, addr, ptep, pfn_pte(pfn, hugeprot));
|
set_pte_at(mm, addr, ptep, pfn_pte(pfn, hugeprot));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -492,7 +506,7 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
|||||||
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||||
dpfn = pgsize >> PAGE_SHIFT;
|
dpfn = pgsize >> PAGE_SHIFT;
|
||||||
|
|
||||||
pte = get_clear_contig(mm, addr, ptep, pgsize, ncontig);
|
pte = get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||||
pte = pte_wrprotect(pte);
|
pte = pte_wrprotect(pte);
|
||||||
|
|
||||||
hugeprot = pte_pgprot(pte);
|
hugeprot = pte_pgprot(pte);
|
||||||
@ -505,17 +519,15 @@ void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
|||||||
pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
|
pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
|
||||||
unsigned long addr, pte_t *ptep)
|
unsigned long addr, pte_t *ptep)
|
||||||
{
|
{
|
||||||
|
struct mm_struct *mm = vma->vm_mm;
|
||||||
size_t pgsize;
|
size_t pgsize;
|
||||||
int ncontig;
|
int ncontig;
|
||||||
pte_t orig_pte;
|
|
||||||
|
|
||||||
if (!pte_cont(READ_ONCE(*ptep)))
|
if (!pte_cont(READ_ONCE(*ptep)))
|
||||||
return ptep_clear_flush(vma, addr, ptep);
|
return ptep_clear_flush(vma, addr, ptep);
|
||||||
|
|
||||||
ncontig = find_num_contig(vma->vm_mm, addr, ptep, &pgsize);
|
ncontig = find_num_contig(mm, addr, ptep, &pgsize);
|
||||||
orig_pte = get_clear_contig(vma->vm_mm, addr, ptep, pgsize, ncontig);
|
return get_clear_contig_flush(mm, addr, ptep, pgsize, ncontig);
|
||||||
flush_tlb_range(vma, addr, addr + pgsize * ncontig);
|
|
||||||
return orig_pte;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init hugetlbpage_init(void)
|
static int __init hugetlbpage_init(void)
|
||||||
|
@ -12,10 +12,9 @@ static inline unsigned long exception_era(struct pt_regs *regs)
|
|||||||
return regs->csr_era;
|
return regs->csr_era;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int compute_return_era(struct pt_regs *regs)
|
static inline void compute_return_era(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
regs->csr_era += 4;
|
regs->csr_era += 4;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _ASM_BRANCH_H */
|
#endif /* _ASM_BRANCH_H */
|
||||||
|
@ -426,6 +426,11 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
|||||||
|
|
||||||
#define kern_addr_valid(addr) (1)
|
#define kern_addr_valid(addr) (1)
|
||||||
|
|
||||||
|
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||||
|
{
|
||||||
|
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
|
|
||||||
/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
|
/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
|
||||||
@ -497,11 +502,6 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
|
|||||||
return pmd;
|
return pmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
|
||||||
{
|
|
||||||
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct page *pmd_page(pmd_t pmd)
|
static inline struct page *pmd_page(pmd_t pmd)
|
||||||
{
|
{
|
||||||
if (pmd_trans_huge(pmd))
|
if (pmd_trans_huge(pmd))
|
||||||
|
@ -263,7 +263,7 @@ void cpu_probe(void)
|
|||||||
|
|
||||||
c->cputype = CPU_UNKNOWN;
|
c->cputype = CPU_UNKNOWN;
|
||||||
c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0);
|
c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0);
|
||||||
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) >> 3) & 0x3;
|
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) & CPUCFG2_FPVERS) >> 3;
|
||||||
|
|
||||||
c->fpu_csr0 = FPU_CSR_RN;
|
c->fpu_csr0 = FPU_CSR_RN;
|
||||||
c->fpu_mask = FPU_CSR_RSVD;
|
c->fpu_mask = FPU_CSR_RSVD;
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
|
|
||||||
__REF
|
__REF
|
||||||
|
|
||||||
SYM_ENTRY(_stext, SYM_L_GLOBAL, SYM_A_NONE)
|
|
||||||
|
|
||||||
SYM_CODE_START(kernel_entry) # kernel entry point
|
SYM_CODE_START(kernel_entry) # kernel entry point
|
||||||
|
|
||||||
/* Config direct window and set PG */
|
/* Config direct window and set PG */
|
||||||
|
@ -475,8 +475,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)
|
|||||||
|
|
||||||
die_if_kernel("Reserved instruction in kernel code", regs);
|
die_if_kernel("Reserved instruction in kernel code", regs);
|
||||||
|
|
||||||
if (unlikely(compute_return_era(regs) < 0))
|
compute_return_era(regs);
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (unlikely(get_user(opcode, era) < 0)) {
|
if (unlikely(get_user(opcode, era) < 0)) {
|
||||||
status = SIGSEGV;
|
status = SIGSEGV;
|
||||||
|
@ -37,6 +37,7 @@ SECTIONS
|
|||||||
HEAD_TEXT_SECTION
|
HEAD_TEXT_SECTION
|
||||||
|
|
||||||
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
||||||
|
_stext = .;
|
||||||
.text : {
|
.text : {
|
||||||
TEXT_TEXT
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
|
@ -281,15 +281,16 @@ void setup_tlb_handler(int cpu)
|
|||||||
if (pcpu_handlers[cpu])
|
if (pcpu_handlers[cpu])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, get_order(vec_sz));
|
page = alloc_pages_node(cpu_to_node(cpu), GFP_ATOMIC, get_order(vec_sz));
|
||||||
if (!page)
|
if (!page)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
addr = page_address(page);
|
addr = page_address(page);
|
||||||
pcpu_handlers[cpu] = virt_to_phys(addr);
|
pcpu_handlers[cpu] = (unsigned long)addr;
|
||||||
memcpy((void *)addr, (void *)eentry, vec_sz);
|
memcpy((void *)addr, (void *)eentry, vec_sz);
|
||||||
local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz);
|
local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz);
|
||||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_TLBRENTRY);
|
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_EENTRY);
|
||||||
|
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_MERRENTRY);
|
||||||
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
|
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -111,8 +111,9 @@
|
|||||||
|
|
||||||
clocks = <&cgu X1000_CLK_RTCLK>,
|
clocks = <&cgu X1000_CLK_RTCLK>,
|
||||||
<&cgu X1000_CLK_EXCLK>,
|
<&cgu X1000_CLK_EXCLK>,
|
||||||
<&cgu X1000_CLK_PCLK>;
|
<&cgu X1000_CLK_PCLK>,
|
||||||
clock-names = "rtc", "ext", "pclk";
|
<&cgu X1000_CLK_TCU>;
|
||||||
|
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||||
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
@ -104,8 +104,9 @@
|
|||||||
|
|
||||||
clocks = <&cgu X1830_CLK_RTCLK>,
|
clocks = <&cgu X1830_CLK_RTCLK>,
|
||||||
<&cgu X1830_CLK_EXCLK>,
|
<&cgu X1830_CLK_EXCLK>,
|
||||||
<&cgu X1830_CLK_PCLK>;
|
<&cgu X1830_CLK_PCLK>,
|
||||||
clock-names = "rtc", "ext", "pclk";
|
<&cgu X1830_CLK_TCU>;
|
||||||
|
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||||
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
@ -44,6 +44,7 @@ static __init unsigned int ranchu_measure_hpt_freq(void)
|
|||||||
__func__);
|
__func__);
|
||||||
|
|
||||||
rtc_base = of_iomap(np, 0);
|
rtc_base = of_iomap(np, 0);
|
||||||
|
of_node_put(np);
|
||||||
if (!rtc_base)
|
if (!rtc_base)
|
||||||
panic("%s(): Failed to ioremap Goldfish RTC base!", __func__);
|
panic("%s(): Failed to ioremap Goldfish RTC base!", __func__);
|
||||||
|
|
||||||
|
@ -208,6 +208,12 @@ void __init ltq_soc_init(void)
|
|||||||
of_address_to_resource(np_sysgpe, 0, &res_sys[2]))
|
of_address_to_resource(np_sysgpe, 0, &res_sys[2]))
|
||||||
panic("Failed to get core resources");
|
panic("Failed to get core resources");
|
||||||
|
|
||||||
|
of_node_put(np_status);
|
||||||
|
of_node_put(np_ebu);
|
||||||
|
of_node_put(np_sys1);
|
||||||
|
of_node_put(np_syseth);
|
||||||
|
of_node_put(np_sysgpe);
|
||||||
|
|
||||||
if ((request_mem_region(res_status.start, resource_size(&res_status),
|
if ((request_mem_region(res_status.start, resource_size(&res_status),
|
||||||
res_status.name) < 0) ||
|
res_status.name) < 0) ||
|
||||||
(request_mem_region(res_ebu.start, resource_size(&res_ebu),
|
(request_mem_region(res_ebu.start, resource_size(&res_ebu),
|
||||||
|
@ -408,6 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
|||||||
if (!ltq_eiu_membase)
|
if (!ltq_eiu_membase)
|
||||||
panic("Failed to remap eiu memory");
|
panic("Failed to remap eiu memory");
|
||||||
}
|
}
|
||||||
|
of_node_put(eiu_node);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -441,6 +441,10 @@ void __init ltq_soc_init(void)
|
|||||||
of_address_to_resource(np_ebu, 0, &res_ebu))
|
of_address_to_resource(np_ebu, 0, &res_ebu))
|
||||||
panic("Failed to get core resources");
|
panic("Failed to get core resources");
|
||||||
|
|
||||||
|
of_node_put(np_pmu);
|
||||||
|
of_node_put(np_cgu);
|
||||||
|
of_node_put(np_ebu);
|
||||||
|
|
||||||
if (!request_mem_region(res_pmu.start, resource_size(&res_pmu),
|
if (!request_mem_region(res_pmu.start, resource_size(&res_pmu),
|
||||||
res_pmu.name) ||
|
res_pmu.name) ||
|
||||||
!request_mem_region(res_cgu.start, resource_size(&res_cgu),
|
!request_mem_region(res_cgu.start, resource_size(&res_cgu),
|
||||||
|
@ -214,6 +214,8 @@ static void update_gic_frequency_dt(void)
|
|||||||
|
|
||||||
if (of_update_property(node, &gic_frequency_prop) < 0)
|
if (of_update_property(node, &gic_frequency_prop) < 0)
|
||||||
pr_err("error updating gic frequency property\n");
|
pr_err("error updating gic frequency property\n");
|
||||||
|
|
||||||
|
of_node_put(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -98,13 +98,18 @@ static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup)
|
|||||||
np = of_find_compatible_node(NULL, NULL, lookup->compatible);
|
np = of_find_compatible_node(NULL, NULL, lookup->compatible);
|
||||||
if (np) {
|
if (np) {
|
||||||
lookup->name = (char *)np->name;
|
lookup->name = (char *)np->name;
|
||||||
if (lookup->phys_addr)
|
if (lookup->phys_addr) {
|
||||||
|
of_node_put(np);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if (!of_address_to_resource(np, 0, &res))
|
if (!of_address_to_resource(np, 0, &res))
|
||||||
lookup->phys_addr = res.start;
|
lookup->phys_addr = res.start;
|
||||||
|
of_node_put(np);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
of_node_put(root);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,9 @@ static unsigned int pic32_xlate_core_timer_irq(void)
|
|||||||
goto default_map;
|
goto default_map;
|
||||||
|
|
||||||
irq = irq_of_parse_and_map(node, 0);
|
irq = irq_of_parse_and_map(node, 0);
|
||||||
|
|
||||||
|
of_node_put(node);
|
||||||
|
|
||||||
if (!irq)
|
if (!irq)
|
||||||
goto default_map;
|
goto default_map;
|
||||||
|
|
||||||
|
@ -40,6 +40,8 @@ __iomem void *plat_of_remap_node(const char *node)
|
|||||||
if (of_address_to_resource(np, 0, &res))
|
if (of_address_to_resource(np, 0, &res))
|
||||||
panic("Failed to get resource for %s", node);
|
panic("Failed to get resource for %s", node);
|
||||||
|
|
||||||
|
of_node_put(np);
|
||||||
|
|
||||||
if (!request_mem_region(res.start,
|
if (!request_mem_region(res.start,
|
||||||
resource_size(&res),
|
resource_size(&res),
|
||||||
res.name))
|
res.name))
|
||||||
|
@ -640,8 +640,6 @@ static int icu_get_irq(unsigned int irq)
|
|||||||
|
|
||||||
printk(KERN_ERR "spurious ICU interrupt: %04x,%04x\n", pend1, pend2);
|
printk(KERN_ERR "spurious ICU interrupt: %04x,%04x\n", pend1, pend2);
|
||||||
|
|
||||||
atomic_inc(&irq_err_count);
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ config PARISC
|
|||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select ARCH_HAS_ELF_RANDOMIZE
|
select ARCH_HAS_ELF_RANDOMIZE
|
||||||
select ARCH_HAS_STRICT_KERNEL_RWX
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_HAS_STRICT_MODULE_RWX
|
||||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||||
select ARCH_HAS_PTE_SPECIAL
|
select ARCH_HAS_PTE_SPECIAL
|
||||||
select ARCH_NO_SG_CHAIN
|
select ARCH_NO_SG_CHAIN
|
||||||
|
@ -12,7 +12,7 @@ static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
|
|||||||
pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
|
pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_FB_STI)
|
#if defined(CONFIG_FB_STI)
|
||||||
int fb_is_primary_device(struct fb_info *info);
|
int fb_is_primary_device(struct fb_info *info);
|
||||||
#else
|
#else
|
||||||
static inline int fb_is_primary_device(struct fb_info *info)
|
static inline int fb_is_primary_device(struct fb_info *info)
|
||||||
|
@ -224,8 +224,13 @@ int main(void)
|
|||||||
BLANK();
|
BLANK();
|
||||||
DEFINE(ASM_SIGFRAME_SIZE, PARISC_RT_SIGFRAME_SIZE);
|
DEFINE(ASM_SIGFRAME_SIZE, PARISC_RT_SIGFRAME_SIZE);
|
||||||
DEFINE(SIGFRAME_CONTEXT_REGS, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
DEFINE(SIGFRAME_CONTEXT_REGS, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE32);
|
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE32);
|
||||||
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct compat_rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE32);
|
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct compat_rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE32);
|
||||||
|
#else
|
||||||
|
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE);
|
||||||
|
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
||||||
|
#endif
|
||||||
BLANK();
|
BLANK();
|
||||||
DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base));
|
DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base));
|
||||||
DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride));
|
DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride));
|
||||||
|
@ -722,6 +722,9 @@ void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned lon
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (parisc_requires_coherency()) {
|
if (parisc_requires_coherency()) {
|
||||||
|
if (vma->vm_flags & VM_SHARED)
|
||||||
|
flush_data_cache();
|
||||||
|
else
|
||||||
flush_user_cache_page(vma, vmaddr);
|
flush_user_cache_page(vma, vmaddr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,7 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop)
|
|||||||
" depw %%r0,31,2,%4\n"
|
" depw %%r0,31,2,%4\n"
|
||||||
"1: ldw 0(%%sr1,%4),%0\n"
|
"1: ldw 0(%%sr1,%4),%0\n"
|
||||||
"2: ldw 4(%%sr1,%4),%3\n"
|
"2: ldw 4(%%sr1,%4),%3\n"
|
||||||
" subi 32,%4,%2\n"
|
" subi 32,%2,%2\n"
|
||||||
" mtctl %2,11\n"
|
" mtctl %2,11\n"
|
||||||
" vshd %0,%3,%0\n"
|
" vshd %0,%3,%0\n"
|
||||||
"3: \n"
|
"3: \n"
|
||||||
|
@ -358,6 +358,10 @@ config ARCH_SUSPEND_NONZERO_CPU
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on PPC_POWERNV || PPC_PSERIES
|
depends on PPC_POWERNV || PPC_PSERIES
|
||||||
|
|
||||||
|
config ARCH_HAS_ADD_PAGES
|
||||||
|
def_bool y
|
||||||
|
depends on ARCH_ENABLE_MEMORY_HOTPLUG
|
||||||
|
|
||||||
config PPC_DCR_NATIVE
|
config PPC_DCR_NATIVE
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
9
arch/powerpc/include/asm/bpf_perf_event.h
Normal file
9
arch/powerpc/include/asm/bpf_perf_event.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _ASM_POWERPC_BPF_PERF_EVENT_H
|
||||||
|
#define _ASM_POWERPC_BPF_PERF_EVENT_H
|
||||||
|
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
|
typedef struct user_pt_regs bpf_user_pt_regs_t;
|
||||||
|
|
||||||
|
#endif /* _ASM_POWERPC_BPF_PERF_EVENT_H */
|
@ -1,9 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
||||||
#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__
|
|
||||||
#define _UAPI__ASM_BPF_PERF_EVENT_H__
|
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
|
|
||||||
typedef struct user_pt_regs bpf_user_pt_regs_t;
|
|
||||||
|
|
||||||
#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
|
|
@ -1855,7 +1855,7 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
|||||||
tm_reclaim_current(0);
|
tm_reclaim_current(0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memset(regs->gpr, 0, sizeof(regs->gpr));
|
memset(®s->gpr[1], 0, sizeof(regs->gpr) - sizeof(regs->gpr[0]));
|
||||||
regs->ctr = 0;
|
regs->ctr = 0;
|
||||||
regs->link = 0;
|
regs->link = 0;
|
||||||
regs->xer = 0;
|
regs->xer = 0;
|
||||||
|
@ -2302,7 +2302,7 @@ static void __init prom_init_stdout(void)
|
|||||||
|
|
||||||
static int __init prom_find_machine_type(void)
|
static int __init prom_find_machine_type(void)
|
||||||
{
|
{
|
||||||
char compat[256];
|
static char compat[256] __prombss;
|
||||||
int len, i = 0;
|
int len, i = 0;
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
phandle rtas;
|
phandle rtas;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# If you really need to reference something from prom_init.o add
|
# If you really need to reference something from prom_init.o add
|
||||||
# it to the list below:
|
# it to the list below:
|
||||||
|
|
||||||
grep "^CONFIG_KASAN=y$" .config >/dev/null
|
grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null
|
||||||
if [ $? -eq 0 ]
|
if [ $? -eq 0 ]
|
||||||
then
|
then
|
||||||
MEM_FUNCS="__memcpy __memset"
|
MEM_FUNCS="__memcpy __memset"
|
||||||
|
@ -1071,7 +1071,7 @@ static struct rtas_filter rtas_filters[] __ro_after_init = {
|
|||||||
{ "get-time-of-day", -1, -1, -1, -1, -1 },
|
{ "get-time-of-day", -1, -1, -1, -1, -1 },
|
||||||
{ "ibm,get-vpd", -1, 0, -1, 1, 2 },
|
{ "ibm,get-vpd", -1, 0, -1, 1, 2 },
|
||||||
{ "ibm,lpar-perftools", -1, 2, 3, -1, -1 },
|
{ "ibm,lpar-perftools", -1, 2, 3, -1, -1 },
|
||||||
{ "ibm,platform-dump", -1, 4, 5, -1, -1 },
|
{ "ibm,platform-dump", -1, 4, 5, -1, -1 }, /* Special cased */
|
||||||
{ "ibm,read-slot-reset-state", -1, -1, -1, -1, -1 },
|
{ "ibm,read-slot-reset-state", -1, -1, -1, -1, -1 },
|
||||||
{ "ibm,scan-log-dump", -1, 0, 1, -1, -1 },
|
{ "ibm,scan-log-dump", -1, 0, 1, -1, -1 },
|
||||||
{ "ibm,set-dynamic-indicator", -1, 2, -1, -1, -1 },
|
{ "ibm,set-dynamic-indicator", -1, 2, -1, -1, -1 },
|
||||||
@ -1120,6 +1120,15 @@ static bool block_rtas_call(int token, int nargs,
|
|||||||
size = 1;
|
size = 1;
|
||||||
|
|
||||||
end = base + size - 1;
|
end = base + size - 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special case for ibm,platform-dump - NULL buffer
|
||||||
|
* address is used to indicate end of dump processing
|
||||||
|
*/
|
||||||
|
if (!strcmp(f->name, "ibm,platform-dump") &&
|
||||||
|
base == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!in_rmo_buf(base, end))
|
if (!in_rmo_buf(base, end))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -935,12 +935,6 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
/* Print various info about the machine that has been gathered so far. */
|
/* Print various info about the machine that has been gathered so far. */
|
||||||
print_system_info();
|
print_system_info();
|
||||||
|
|
||||||
/* Reserve large chunks of memory for use by CMA for KVM. */
|
|
||||||
kvm_cma_reserve();
|
|
||||||
|
|
||||||
/* Reserve large chunks of memory for us by CMA for hugetlb */
|
|
||||||
gigantic_hugetlb_cma_reserve();
|
|
||||||
|
|
||||||
klp_init_thread_info(&init_task);
|
klp_init_thread_info(&init_task);
|
||||||
|
|
||||||
setup_initial_init_mm(_stext, _etext, _edata, _end);
|
setup_initial_init_mm(_stext, _etext, _edata, _end);
|
||||||
@ -955,6 +949,13 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
|
|
||||||
initmem_init();
|
initmem_init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reserve large chunks of memory for use by CMA for KVM and hugetlb. These must
|
||||||
|
* be called after initmem_init(), so that pageblock_order is initialised.
|
||||||
|
*/
|
||||||
|
kvm_cma_reserve();
|
||||||
|
gigantic_hugetlb_cma_reserve();
|
||||||
|
|
||||||
early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
|
early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
|
||||||
|
|
||||||
if (ppc_md.setup_arch)
|
if (ppc_md.setup_arch)
|
||||||
|
@ -105,6 +105,37 @@ void __ref arch_remove_linear_mapping(u64 start, u64 size)
|
|||||||
vm_unmap_aliases();
|
vm_unmap_aliases();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need
|
||||||
|
* updating.
|
||||||
|
*/
|
||||||
|
static void update_end_of_memory_vars(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long end_pfn = PFN_UP(start + size);
|
||||||
|
|
||||||
|
if (end_pfn > max_pfn) {
|
||||||
|
max_pfn = end_pfn;
|
||||||
|
max_low_pfn = end_pfn;
|
||||||
|
high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int __ref add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
|
||||||
|
struct mhp_params *params)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = __add_pages(nid, start_pfn, nr_pages, params);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* update max_pfn, max_low_pfn and high_memory */
|
||||||
|
update_end_of_memory_vars(start_pfn << PAGE_SHIFT,
|
||||||
|
nr_pages << PAGE_SHIFT);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int __ref arch_add_memory(int nid, u64 start, u64 size,
|
int __ref arch_add_memory(int nid, u64 start, u64 size,
|
||||||
struct mhp_params *params)
|
struct mhp_params *params)
|
||||||
{
|
{
|
||||||
@ -115,7 +146,7 @@ int __ref arch_add_memory(int nid, u64 start, u64 size,
|
|||||||
rc = arch_create_linear_mapping(nid, start, size, params);
|
rc = arch_create_linear_mapping(nid, start, size, params);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
rc = __add_pages(nid, start_pfn, nr_pages, params);
|
rc = add_pages(nid, start_pfn, nr_pages, params);
|
||||||
if (rc)
|
if (rc)
|
||||||
arch_remove_linear_mapping(start, size);
|
arch_remove_linear_mapping(start, size);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -96,8 +96,8 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
|
|||||||
pgdp = pgd_offset_k(ea);
|
pgdp = pgd_offset_k(ea);
|
||||||
p4dp = p4d_offset(pgdp, ea);
|
p4dp = p4d_offset(pgdp, ea);
|
||||||
if (p4d_none(*p4dp)) {
|
if (p4d_none(*p4dp)) {
|
||||||
pmdp = early_alloc_pgtable(PMD_TABLE_SIZE);
|
pudp = early_alloc_pgtable(PUD_TABLE_SIZE);
|
||||||
p4d_populate(&init_mm, p4dp, pmdp);
|
p4d_populate(&init_mm, p4dp, pudp);
|
||||||
}
|
}
|
||||||
pudp = pud_offset(p4dp, ea);
|
pudp = pud_offset(p4dp, ea);
|
||||||
if (pud_none(*pudp)) {
|
if (pud_none(*pudp)) {
|
||||||
@ -106,7 +106,7 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
|
|||||||
}
|
}
|
||||||
pmdp = pmd_offset(pudp, ea);
|
pmdp = pmd_offset(pudp, ea);
|
||||||
if (!pmd_present(*pmdp)) {
|
if (!pmd_present(*pmdp)) {
|
||||||
ptep = early_alloc_pgtable(PAGE_SIZE);
|
ptep = early_alloc_pgtable(PTE_TABLE_SIZE);
|
||||||
pmd_populate_kernel(&init_mm, pmdp, ptep);
|
pmd_populate_kernel(&init_mm, pmdp, ptep);
|
||||||
}
|
}
|
||||||
ptep = pte_offset_kernel(pmdp, ea);
|
ptep = pte_offset_kernel(pmdp, ea);
|
||||||
|
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _MICROWATT_H
|
||||||
|
#define _MICROWATT_H
|
||||||
|
|
||||||
|
void microwatt_rng_init(void);
|
||||||
|
|
||||||
|
#endif /* _MICROWATT_H */
|
@ -11,6 +11,7 @@
|
|||||||
#include <asm/archrandom.h>
|
#include <asm/archrandom.h>
|
||||||
#include <asm/cputable.h>
|
#include <asm/cputable.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
#include "microwatt.h"
|
||||||
|
|
||||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ static int microwatt_get_random_darn(unsigned long *v)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int rng_init(void)
|
void __init microwatt_rng_init(void)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
int i;
|
int i;
|
||||||
@ -37,12 +38,7 @@ static __init int rng_init(void)
|
|||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
if (microwatt_get_random_darn(&val)) {
|
if (microwatt_get_random_darn(&val)) {
|
||||||
ppc_md.get_random_seed = microwatt_get_random_darn;
|
ppc_md.get_random_seed = microwatt_get_random_darn;
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
|
||||||
|
|
||||||
return -EIO;
|
|
||||||
}
|
}
|
||||||
machine_subsys_initcall(, rng_init);
|
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
#include <asm/xics.h>
|
#include <asm/xics.h>
|
||||||
#include <asm/udbg.h>
|
#include <asm/udbg.h>
|
||||||
|
|
||||||
|
#include "microwatt.h"
|
||||||
|
|
||||||
static void __init microwatt_init_IRQ(void)
|
static void __init microwatt_init_IRQ(void)
|
||||||
{
|
{
|
||||||
xics_init();
|
xics_init();
|
||||||
@ -32,10 +34,16 @@ static int __init microwatt_populate(void)
|
|||||||
}
|
}
|
||||||
machine_arch_initcall(microwatt, microwatt_populate);
|
machine_arch_initcall(microwatt, microwatt_populate);
|
||||||
|
|
||||||
|
static void __init microwatt_setup_arch(void)
|
||||||
|
{
|
||||||
|
microwatt_rng_init();
|
||||||
|
}
|
||||||
|
|
||||||
define_machine(microwatt) {
|
define_machine(microwatt) {
|
||||||
.name = "microwatt",
|
.name = "microwatt",
|
||||||
.probe = microwatt_probe,
|
.probe = microwatt_probe,
|
||||||
.init_IRQ = microwatt_init_IRQ,
|
.init_IRQ = microwatt_init_IRQ,
|
||||||
|
.setup_arch = microwatt_setup_arch,
|
||||||
.progress = udbg_progress,
|
.progress = udbg_progress,
|
||||||
.calibrate_decr = generic_calibrate_decr,
|
.calibrate_decr = generic_calibrate_decr,
|
||||||
};
|
};
|
||||||
|
@ -42,4 +42,6 @@ ssize_t memcons_copy(struct memcons *mc, char *to, loff_t pos, size_t count);
|
|||||||
u32 __init memcons_get_size(struct memcons *mc);
|
u32 __init memcons_get_size(struct memcons *mc);
|
||||||
struct memcons *__init memcons_init(struct device_node *node, const char *mc_prop_name);
|
struct memcons *__init memcons_init(struct device_node *node, const char *mc_prop_name);
|
||||||
|
|
||||||
|
void pnv_rng_init(void);
|
||||||
|
|
||||||
#endif /* _POWERNV_H */
|
#endif /* _POWERNV_H */
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
|
#include "powernv.h"
|
||||||
|
|
||||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||||
|
|
||||||
@ -28,7 +29,6 @@ struct powernv_rng {
|
|||||||
|
|
||||||
static DEFINE_PER_CPU(struct powernv_rng *, powernv_rng);
|
static DEFINE_PER_CPU(struct powernv_rng *, powernv_rng);
|
||||||
|
|
||||||
|
|
||||||
int powernv_hwrng_present(void)
|
int powernv_hwrng_present(void)
|
||||||
{
|
{
|
||||||
struct powernv_rng *rng;
|
struct powernv_rng *rng;
|
||||||
@ -98,9 +98,6 @@ static int __init initialise_darn(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
|
||||||
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,32 +160,55 @@ static __init int rng_create(struct device_node *dn)
|
|||||||
|
|
||||||
rng_init_per_cpu(rng, dn);
|
rng_init_per_cpu(rng, dn);
|
||||||
|
|
||||||
pr_info_once("Registering arch random hook.\n");
|
|
||||||
|
|
||||||
ppc_md.get_random_seed = powernv_get_random_long;
|
ppc_md.get_random_seed = powernv_get_random_long;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int rng_init(void)
|
static int __init pnv_get_random_long_early(unsigned long *v)
|
||||||
{
|
{
|
||||||
struct device_node *dn;
|
struct device_node *dn;
|
||||||
int rc;
|
|
||||||
|
if (!slab_is_available())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (cmpxchg(&ppc_md.get_random_seed, pnv_get_random_long_early,
|
||||||
|
NULL) != pnv_get_random_long_early)
|
||||||
|
return 0;
|
||||||
|
|
||||||
for_each_compatible_node(dn, NULL, "ibm,power-rng") {
|
for_each_compatible_node(dn, NULL, "ibm,power-rng") {
|
||||||
rc = rng_create(dn);
|
if (rng_create(dn))
|
||||||
if (rc) {
|
|
||||||
pr_err("Failed creating rng for %pOF (%d).\n",
|
|
||||||
dn, rc);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* Create devices for hwrng driver */
|
/* Create devices for hwrng driver */
|
||||||
of_platform_device_create(dn, NULL, NULL);
|
of_platform_device_create(dn, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
initialise_darn();
|
if (!ppc_md.get_random_seed)
|
||||||
|
return 0;
|
||||||
|
return ppc_md.get_random_seed(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init pnv_rng_init(void)
|
||||||
|
{
|
||||||
|
struct device_node *dn;
|
||||||
|
|
||||||
|
/* Prefer darn over the rest. */
|
||||||
|
if (!initialise_darn())
|
||||||
|
return;
|
||||||
|
|
||||||
|
dn = of_find_compatible_node(NULL, NULL, "ibm,power-rng");
|
||||||
|
if (dn)
|
||||||
|
ppc_md.get_random_seed = pnv_get_random_long_early;
|
||||||
|
|
||||||
|
of_node_put(dn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init pnv_rng_late_init(void)
|
||||||
|
{
|
||||||
|
unsigned long v;
|
||||||
|
/* In case it wasn't called during init for some other reason. */
|
||||||
|
if (ppc_md.get_random_seed == pnv_get_random_long_early)
|
||||||
|
pnv_get_random_long_early(&v);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
machine_subsys_initcall(powernv, rng_init);
|
machine_subsys_initcall(powernv, pnv_rng_late_init);
|
||||||
|
@ -203,6 +203,8 @@ static void __init pnv_setup_arch(void)
|
|||||||
pnv_check_guarded_cores();
|
pnv_check_guarded_cores();
|
||||||
|
|
||||||
/* XXX PMCS */
|
/* XXX PMCS */
|
||||||
|
|
||||||
|
pnv_rng_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init pnv_init(void)
|
static void __init pnv_init(void)
|
||||||
|
@ -122,4 +122,6 @@ void pseries_lpar_read_hblkrm_characteristics(void);
|
|||||||
static inline void pseries_lpar_read_hblkrm_characteristics(void) { }
|
static inline void pseries_lpar_read_hblkrm_characteristics(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void pseries_rng_init(void);
|
||||||
|
|
||||||
#endif /* _PSERIES_PSERIES_H */
|
#endif /* _PSERIES_PSERIES_H */
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <asm/archrandom.h>
|
#include <asm/archrandom.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
#include <asm/plpar_wrappers.h>
|
#include <asm/plpar_wrappers.h>
|
||||||
|
#include "pseries.h"
|
||||||
|
|
||||||
|
|
||||||
static int pseries_get_random_long(unsigned long *v)
|
static int pseries_get_random_long(unsigned long *v)
|
||||||
@ -24,19 +25,13 @@ static int pseries_get_random_long(unsigned long *v)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int rng_init(void)
|
void __init pseries_rng_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *dn;
|
struct device_node *dn;
|
||||||
|
|
||||||
dn = of_find_compatible_node(NULL, NULL, "ibm,random");
|
dn = of_find_compatible_node(NULL, NULL, "ibm,random");
|
||||||
if (!dn)
|
if (!dn)
|
||||||
return -ENODEV;
|
return;
|
||||||
|
|
||||||
pr_info("Registering arch random hook.\n");
|
|
||||||
|
|
||||||
ppc_md.get_random_seed = pseries_get_random_long;
|
ppc_md.get_random_seed = pseries_get_random_long;
|
||||||
|
|
||||||
of_node_put(dn);
|
of_node_put(dn);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
machine_subsys_initcall(pseries, rng_init);
|
|
||||||
|
@ -839,6 +839,7 @@ static void __init pSeries_setup_arch(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
|
ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
|
||||||
|
pseries_rng_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pseries_panic(char *str)
|
static void pseries_panic(char *str)
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/bitmap.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
@ -57,7 +58,7 @@ static int __init xive_irq_bitmap_add(int base, int count)
|
|||||||
spin_lock_init(&xibm->lock);
|
spin_lock_init(&xibm->lock);
|
||||||
xibm->base = base;
|
xibm->base = base;
|
||||||
xibm->count = count;
|
xibm->count = count;
|
||||||
xibm->bitmap = kzalloc(xibm->count, GFP_KERNEL);
|
xibm->bitmap = bitmap_zalloc(xibm->count, GFP_KERNEL);
|
||||||
if (!xibm->bitmap) {
|
if (!xibm->bitmap) {
|
||||||
kfree(xibm);
|
kfree(xibm);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -75,7 +76,7 @@ static void xive_irq_bitmap_remove_all(void)
|
|||||||
|
|
||||||
list_for_each_entry_safe(xibm, tmp, &xive_irq_bitmaps, list) {
|
list_for_each_entry_safe(xibm, tmp, &xive_irq_bitmaps, list) {
|
||||||
list_del(&xibm->list);
|
list_del(&xibm->list);
|
||||||
kfree(xibm->bitmap);
|
bitmap_free(xibm->bitmap);
|
||||||
kfree(xibm);
|
kfree(xibm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,20 +75,20 @@ asm volatile(ALTERNATIVE( \
|
|||||||
"nop\n\t" \
|
"nop\n\t" \
|
||||||
"nop\n\t" \
|
"nop\n\t" \
|
||||||
"nop", \
|
"nop", \
|
||||||
"li t3, %2\n\t" \
|
"li t3, %1\n\t" \
|
||||||
"slli t3, t3, %4\n\t" \
|
"slli t3, t3, %3\n\t" \
|
||||||
"and t3, %0, t3\n\t" \
|
"and t3, %0, t3\n\t" \
|
||||||
"bne t3, zero, 2f\n\t" \
|
"bne t3, zero, 2f\n\t" \
|
||||||
"li t3, %3\n\t" \
|
"li t3, %2\n\t" \
|
||||||
"slli t3, t3, %4\n\t" \
|
"slli t3, t3, %3\n\t" \
|
||||||
"or %0, %0, t3\n\t" \
|
"or %0, %0, t3\n\t" \
|
||||||
"2:", THEAD_VENDOR_ID, \
|
"2:", THEAD_VENDOR_ID, \
|
||||||
ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
|
ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
|
||||||
: "+r"(_val) \
|
: "+r"(_val) \
|
||||||
: "0"(_val), \
|
: "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||||
"I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
|
||||||
"I"(_PAGE_PMA_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
"I"(_PAGE_PMA_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||||
"I"(ALT_THEAD_PBMT_SHIFT))
|
"I"(ALT_THEAD_PBMT_SHIFT) \
|
||||||
|
: "t3")
|
||||||
#else
|
#else
|
||||||
#define ALT_THEAD_PMA(_val)
|
#define ALT_THEAD_PMA(_val)
|
||||||
#endif
|
#endif
|
||||||
|
@ -484,7 +484,6 @@ config KEXEC
|
|||||||
config KEXEC_FILE
|
config KEXEC_FILE
|
||||||
bool "kexec file based system call"
|
bool "kexec file based system call"
|
||||||
select KEXEC_CORE
|
select KEXEC_CORE
|
||||||
select BUILD_BIN2C
|
|
||||||
depends on CRYPTO
|
depends on CRYPTO
|
||||||
depends on CRYPTO_SHA256
|
depends on CRYPTO_SHA256
|
||||||
depends on CRYPTO_SHA256_S390
|
depends on CRYPTO_SHA256_S390
|
||||||
|
@ -4,232 +4,15 @@
|
|||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2017, 2020
|
* Copyright IBM Corp. 2017, 2020
|
||||||
* Author(s): Harald Freudenberger
|
* Author(s): Harald Freudenberger
|
||||||
*
|
|
||||||
* The s390_arch_random_generate() function may be called from random.c
|
|
||||||
* in interrupt context. So this implementation does the best to be very
|
|
||||||
* fast. There is a buffer of random data which is asynchronously checked
|
|
||||||
* and filled by a workqueue thread.
|
|
||||||
* If there are enough bytes in the buffer the s390_arch_random_generate()
|
|
||||||
* just delivers these bytes. Otherwise false is returned until the
|
|
||||||
* worker thread refills the buffer.
|
|
||||||
* The worker fills the rng buffer by pulling fresh entropy from the
|
|
||||||
* high quality (but slow) true hardware random generator. This entropy
|
|
||||||
* is then spread over the buffer with an pseudo random generator PRNG.
|
|
||||||
* As the arch_get_random_seed_long() fetches 8 bytes and the calling
|
|
||||||
* function add_interrupt_randomness() counts this as 1 bit entropy the
|
|
||||||
* distribution needs to make sure there is in fact 1 bit entropy contained
|
|
||||||
* in 8 bytes of the buffer. The current values pull 32 byte entropy
|
|
||||||
* and scatter this into a 2048 byte buffer. So 8 byte in the buffer
|
|
||||||
* will contain 1 bit of entropy.
|
|
||||||
* The worker thread is rescheduled based on the charge level of the
|
|
||||||
* buffer but at least with 500 ms delay to avoid too much CPU consumption.
|
|
||||||
* So the max. amount of rng data delivered via arch_get_random_seed is
|
|
||||||
* limited to 4k bytes per second.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/static_key.h>
|
#include <linux/static_key.h>
|
||||||
#include <linux/workqueue.h>
|
|
||||||
#include <linux/moduleparam.h>
|
|
||||||
#include <asm/cpacf.h>
|
#include <asm/cpacf.h>
|
||||||
|
|
||||||
DEFINE_STATIC_KEY_FALSE(s390_arch_random_available);
|
DEFINE_STATIC_KEY_FALSE(s390_arch_random_available);
|
||||||
|
|
||||||
atomic64_t s390_arch_random_counter = ATOMIC64_INIT(0);
|
atomic64_t s390_arch_random_counter = ATOMIC64_INIT(0);
|
||||||
EXPORT_SYMBOL(s390_arch_random_counter);
|
EXPORT_SYMBOL(s390_arch_random_counter);
|
||||||
|
|
||||||
#define ARCH_REFILL_TICKS (HZ/2)
|
|
||||||
#define ARCH_PRNG_SEED_SIZE 32
|
|
||||||
#define ARCH_RNG_BUF_SIZE 2048
|
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(arch_rng_lock);
|
|
||||||
static u8 *arch_rng_buf;
|
|
||||||
static unsigned int arch_rng_buf_idx;
|
|
||||||
|
|
||||||
static void arch_rng_refill_buffer(struct work_struct *);
|
|
||||||
static DECLARE_DELAYED_WORK(arch_rng_work, arch_rng_refill_buffer);
|
|
||||||
|
|
||||||
bool s390_arch_random_generate(u8 *buf, unsigned int nbytes)
|
|
||||||
{
|
|
||||||
/* max hunk is ARCH_RNG_BUF_SIZE */
|
|
||||||
if (nbytes > ARCH_RNG_BUF_SIZE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* lock rng buffer */
|
|
||||||
if (!spin_trylock(&arch_rng_lock))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* try to resolve the requested amount of bytes from the buffer */
|
|
||||||
arch_rng_buf_idx -= nbytes;
|
|
||||||
if (arch_rng_buf_idx < ARCH_RNG_BUF_SIZE) {
|
|
||||||
memcpy(buf, arch_rng_buf + arch_rng_buf_idx, nbytes);
|
|
||||||
atomic64_add(nbytes, &s390_arch_random_counter);
|
|
||||||
spin_unlock(&arch_rng_lock);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* not enough bytes in rng buffer, refill is done asynchronously */
|
|
||||||
spin_unlock(&arch_rng_lock);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(s390_arch_random_generate);
|
|
||||||
|
|
||||||
static void arch_rng_refill_buffer(struct work_struct *unused)
|
|
||||||
{
|
|
||||||
unsigned int delay = ARCH_REFILL_TICKS;
|
|
||||||
|
|
||||||
spin_lock(&arch_rng_lock);
|
|
||||||
if (arch_rng_buf_idx > ARCH_RNG_BUF_SIZE) {
|
|
||||||
/* buffer is exhausted and needs refill */
|
|
||||||
u8 seed[ARCH_PRNG_SEED_SIZE];
|
|
||||||
u8 prng_wa[240];
|
|
||||||
/* fetch ARCH_PRNG_SEED_SIZE bytes of entropy */
|
|
||||||
cpacf_trng(NULL, 0, seed, sizeof(seed));
|
|
||||||
/* blow this entropy up to ARCH_RNG_BUF_SIZE with PRNG */
|
|
||||||
memset(prng_wa, 0, sizeof(prng_wa));
|
|
||||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
|
||||||
&prng_wa, NULL, 0, seed, sizeof(seed));
|
|
||||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
|
||||||
&prng_wa, arch_rng_buf, ARCH_RNG_BUF_SIZE, NULL, 0);
|
|
||||||
arch_rng_buf_idx = ARCH_RNG_BUF_SIZE;
|
|
||||||
}
|
|
||||||
delay += (ARCH_REFILL_TICKS * arch_rng_buf_idx) / ARCH_RNG_BUF_SIZE;
|
|
||||||
spin_unlock(&arch_rng_lock);
|
|
||||||
|
|
||||||
/* kick next check */
|
|
||||||
queue_delayed_work(system_long_wq, &arch_rng_work, delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Here follows the implementation of s390_arch_get_random_long().
|
|
||||||
*
|
|
||||||
* The random longs to be pulled by arch_get_random_long() are
|
|
||||||
* prepared in an 4K buffer which is filled from the NIST 800-90
|
|
||||||
* compliant s390 drbg. By default the random long buffer is refilled
|
|
||||||
* 256 times before the drbg itself needs a reseed. The reseed of the
|
|
||||||
* drbg is done with 32 bytes fetched from the high quality (but slow)
|
|
||||||
* trng which is assumed to deliver 100% entropy. So the 32 * 8 = 256
|
|
||||||
* bits of entropy are spread over 256 * 4KB = 1MB serving 131072
|
|
||||||
* arch_get_random_long() invocations before reseeded.
|
|
||||||
*
|
|
||||||
* How often the 4K random long buffer is refilled with the drbg
|
|
||||||
* before the drbg is reseeded can be adjusted. There is a module
|
|
||||||
* parameter 's390_arch_rnd_long_drbg_reseed' accessible via
|
|
||||||
* /sys/module/arch_random/parameters/rndlong_drbg_reseed
|
|
||||||
* or as kernel command line parameter
|
|
||||||
* arch_random.rndlong_drbg_reseed=<value>
|
|
||||||
* This parameter tells how often the drbg fills the 4K buffer before
|
|
||||||
* it is re-seeded by fresh entropy from the trng.
|
|
||||||
* A value of 16 results in reseeding the drbg at every 16 * 4 KB = 64
|
|
||||||
* KB with 32 bytes of fresh entropy pulled from the trng. So a value
|
|
||||||
* of 16 would result in 256 bits entropy per 64 KB.
|
|
||||||
* A value of 256 results in 1MB of drbg output before a reseed of the
|
|
||||||
* drbg is done. So this would spread the 256 bits of entropy among 1MB.
|
|
||||||
* Setting this parameter to 0 forces the reseed to take place every
|
|
||||||
* time the 4K buffer is depleted, so the entropy rises to 256 bits
|
|
||||||
* entropy per 4K or 0.5 bit entropy per arch_get_random_long(). With
|
|
||||||
* setting this parameter to negative values all this effort is
|
|
||||||
* disabled, arch_get_random long() returns false and thus indicating
|
|
||||||
* that the arch_get_random_long() feature is disabled at all.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static unsigned long rndlong_buf[512];
|
|
||||||
static DEFINE_SPINLOCK(rndlong_lock);
|
|
||||||
static int rndlong_buf_index;
|
|
||||||
|
|
||||||
static int rndlong_drbg_reseed = 256;
|
|
||||||
module_param_named(rndlong_drbg_reseed, rndlong_drbg_reseed, int, 0600);
|
|
||||||
MODULE_PARM_DESC(rndlong_drbg_reseed, "s390 arch_get_random_long() drbg reseed");
|
|
||||||
|
|
||||||
static inline void refill_rndlong_buf(void)
|
|
||||||
{
|
|
||||||
static u8 prng_ws[240];
|
|
||||||
static int drbg_counter;
|
|
||||||
|
|
||||||
if (--drbg_counter < 0) {
|
|
||||||
/* need to re-seed the drbg */
|
|
||||||
u8 seed[32];
|
|
||||||
|
|
||||||
/* fetch seed from trng */
|
|
||||||
cpacf_trng(NULL, 0, seed, sizeof(seed));
|
|
||||||
/* seed drbg */
|
|
||||||
memset(prng_ws, 0, sizeof(prng_ws));
|
|
||||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
|
||||||
&prng_ws, NULL, 0, seed, sizeof(seed));
|
|
||||||
/* re-init counter for drbg */
|
|
||||||
drbg_counter = rndlong_drbg_reseed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fill the arch_get_random_long buffer from drbg */
|
|
||||||
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN, &prng_ws,
|
|
||||||
(u8 *) rndlong_buf, sizeof(rndlong_buf),
|
|
||||||
NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool s390_arch_get_random_long(unsigned long *v)
|
|
||||||
{
|
|
||||||
bool rc = false;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* arch_get_random_long() disabled ? */
|
|
||||||
if (rndlong_drbg_reseed < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* try to lock the random long lock */
|
|
||||||
if (!spin_trylock_irqsave(&rndlong_lock, flags))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (--rndlong_buf_index >= 0) {
|
|
||||||
/* deliver next long value from the buffer */
|
|
||||||
*v = rndlong_buf[rndlong_buf_index];
|
|
||||||
rc = true;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* buffer is depleted and needs refill */
|
|
||||||
if (in_interrupt()) {
|
|
||||||
/* delay refill in interrupt context to next caller */
|
|
||||||
rndlong_buf_index = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* refill random long buffer */
|
|
||||||
refill_rndlong_buf();
|
|
||||||
rndlong_buf_index = ARRAY_SIZE(rndlong_buf);
|
|
||||||
|
|
||||||
/* and provide one random long */
|
|
||||||
*v = rndlong_buf[--rndlong_buf_index];
|
|
||||||
rc = true;
|
|
||||||
|
|
||||||
out:
|
|
||||||
spin_unlock_irqrestore(&rndlong_lock, flags);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(s390_arch_get_random_long);
|
|
||||||
|
|
||||||
static int __init s390_arch_random_init(void)
|
|
||||||
{
|
|
||||||
/* all the needed PRNO subfunctions available ? */
|
|
||||||
if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG) &&
|
|
||||||
cpacf_query_func(CPACF_PRNO, CPACF_PRNO_SHA512_DRNG_GEN)) {
|
|
||||||
|
|
||||||
/* alloc arch random working buffer */
|
|
||||||
arch_rng_buf = kmalloc(ARCH_RNG_BUF_SIZE, GFP_KERNEL);
|
|
||||||
if (!arch_rng_buf)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
/* kick worker queue job to fill the random buffer */
|
|
||||||
queue_delayed_work(system_long_wq,
|
|
||||||
&arch_rng_work, ARCH_REFILL_TICKS);
|
|
||||||
|
|
||||||
/* enable arch random to the outside world */
|
|
||||||
static_branch_enable(&s390_arch_random_available);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
arch_initcall(s390_arch_random_init);
|
|
||||||
|
@ -15,17 +15,13 @@
|
|||||||
|
|
||||||
#include <linux/static_key.h>
|
#include <linux/static_key.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
|
#include <asm/cpacf.h>
|
||||||
|
|
||||||
DECLARE_STATIC_KEY_FALSE(s390_arch_random_available);
|
DECLARE_STATIC_KEY_FALSE(s390_arch_random_available);
|
||||||
extern atomic64_t s390_arch_random_counter;
|
extern atomic64_t s390_arch_random_counter;
|
||||||
|
|
||||||
bool s390_arch_get_random_long(unsigned long *v);
|
|
||||||
bool s390_arch_random_generate(u8 *buf, unsigned int nbytes);
|
|
||||||
|
|
||||||
static inline bool __must_check arch_get_random_long(unsigned long *v)
|
static inline bool __must_check arch_get_random_long(unsigned long *v)
|
||||||
{
|
{
|
||||||
if (static_branch_likely(&s390_arch_random_available))
|
|
||||||
return s390_arch_get_random_long(v);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +33,9 @@ static inline bool __must_check arch_get_random_int(unsigned int *v)
|
|||||||
static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
|
static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
|
||||||
{
|
{
|
||||||
if (static_branch_likely(&s390_arch_random_available)) {
|
if (static_branch_likely(&s390_arch_random_available)) {
|
||||||
return s390_arch_random_generate((u8 *)v, sizeof(*v));
|
cpacf_trng(NULL, 0, (u8 *)v, sizeof(*v));
|
||||||
|
atomic64_add(sizeof(*v), &s390_arch_random_counter);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -45,7 +43,9 @@ static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
|
|||||||
static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
|
static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
|
||||||
{
|
{
|
||||||
if (static_branch_likely(&s390_arch_random_available)) {
|
if (static_branch_likely(&s390_arch_random_available)) {
|
||||||
return s390_arch_random_generate((u8 *)v, sizeof(*v));
|
cpacf_trng(NULL, 0, (u8 *)v, sizeof(*v));
|
||||||
|
atomic64_add(sizeof(*v), &s390_arch_random_counter);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -133,9 +133,9 @@ struct slibe {
|
|||||||
* @sb_count: number of storage blocks
|
* @sb_count: number of storage blocks
|
||||||
* @sba: storage block element addresses
|
* @sba: storage block element addresses
|
||||||
* @dcount: size of storage block elements
|
* @dcount: size of storage block elements
|
||||||
* @user0: user defineable value
|
* @user0: user definable value
|
||||||
* @res4: reserved paramater
|
* @res4: reserved parameter
|
||||||
* @user1: user defineable value
|
* @user1: user definable value
|
||||||
*/
|
*/
|
||||||
struct qaob {
|
struct qaob {
|
||||||
u64 res0[6];
|
u64 res0[6];
|
||||||
|
@ -219,6 +219,11 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
|||||||
unsigned long src;
|
unsigned long src;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (!(iter_is_iovec(iter) || iov_iter_is_kvec(iter)))
|
||||||
|
return -EINVAL;
|
||||||
|
/* Multi-segment iterators are not supported */
|
||||||
|
if (iter->nr_segs > 1)
|
||||||
|
return -EINVAL;
|
||||||
if (!csize)
|
if (!csize)
|
||||||
return 0;
|
return 0;
|
||||||
src = pfn_to_phys(pfn) + offset;
|
src = pfn_to_phys(pfn) + offset;
|
||||||
@ -228,7 +233,10 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
|||||||
rc = copy_oldmem_user(iter->iov->iov_base, src, csize);
|
rc = copy_oldmem_user(iter->iov->iov_base, src, csize);
|
||||||
else
|
else
|
||||||
rc = copy_oldmem_kernel(iter->kvec->iov_base, src, csize);
|
rc = copy_oldmem_kernel(iter->kvec->iov_base, src, csize);
|
||||||
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
iov_iter_advance(iter, csize);
|
||||||
|
return csize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -516,6 +516,26 @@ static int __hw_perf_event_init(struct perf_event *event, unsigned int type)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Events CPU_CYLCES and INSTRUCTIONS can be submitted with two different
|
||||||
|
* attribute::type values:
|
||||||
|
* - PERF_TYPE_HARDWARE:
|
||||||
|
* - pmu->type:
|
||||||
|
* Handle both type of invocations identical. They address the same hardware.
|
||||||
|
* The result is different when event modifiers exclude_kernel and/or
|
||||||
|
* exclude_user are also set.
|
||||||
|
*/
|
||||||
|
static int cpumf_pmu_event_type(struct perf_event *event)
|
||||||
|
{
|
||||||
|
u64 ev = event->attr.config;
|
||||||
|
|
||||||
|
if (cpumf_generic_events_basic[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||||
|
cpumf_generic_events_basic[PERF_COUNT_HW_INSTRUCTIONS] == ev ||
|
||||||
|
cpumf_generic_events_user[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||||
|
cpumf_generic_events_user[PERF_COUNT_HW_INSTRUCTIONS] == ev)
|
||||||
|
return PERF_TYPE_HARDWARE;
|
||||||
|
return PERF_TYPE_RAW;
|
||||||
|
}
|
||||||
|
|
||||||
static int cpumf_pmu_event_init(struct perf_event *event)
|
static int cpumf_pmu_event_init(struct perf_event *event)
|
||||||
{
|
{
|
||||||
unsigned int type = event->attr.type;
|
unsigned int type = event->attr.type;
|
||||||
@ -525,7 +545,7 @@ static int cpumf_pmu_event_init(struct perf_event *event)
|
|||||||
err = __hw_perf_event_init(event, type);
|
err = __hw_perf_event_init(event, type);
|
||||||
else if (event->pmu->type == type)
|
else if (event->pmu->type == type)
|
||||||
/* Registered as unknown PMU */
|
/* Registered as unknown PMU */
|
||||||
err = __hw_perf_event_init(event, PERF_TYPE_RAW);
|
err = __hw_perf_event_init(event, cpumf_pmu_event_type(event));
|
||||||
else
|
else
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
@ -193,8 +193,9 @@ static int paicrypt_event_init(struct perf_event *event)
|
|||||||
/* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */
|
/* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */
|
||||||
if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type)
|
if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
/* PAI crypto event must be valid */
|
/* PAI crypto event must be in valid range */
|
||||||
if (a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
if (a->config < PAI_CRYPTO_BASE ||
|
||||||
|
a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
/* Allow only CPU wide operation, no process context for now. */
|
/* Allow only CPU wide operation, no process context for now. */
|
||||||
if (event->hw.target || event->cpu == -1)
|
if (event->hw.target || event->cpu == -1)
|
||||||
@ -208,6 +209,12 @@ static int paicrypt_event_init(struct perf_event *event)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
/* Event initialization sets last_tag to 0. When later on the events
|
||||||
|
* are deleted and re-added, do not reset the event count value to zero.
|
||||||
|
* Events are added, deleted and re-added when 2 or more events
|
||||||
|
* are active at the same time.
|
||||||
|
*/
|
||||||
|
event->hw.last_tag = 0;
|
||||||
cpump->event = event;
|
cpump->event = event;
|
||||||
event->destroy = paicrypt_event_destroy;
|
event->destroy = paicrypt_event_destroy;
|
||||||
|
|
||||||
@ -242,9 +249,12 @@ static void paicrypt_start(struct perf_event *event, int flags)
|
|||||||
{
|
{
|
||||||
u64 sum;
|
u64 sum;
|
||||||
|
|
||||||
|
if (!event->hw.last_tag) {
|
||||||
|
event->hw.last_tag = 1;
|
||||||
sum = paicrypt_getall(event); /* Get current value */
|
sum = paicrypt_getall(event); /* Get current value */
|
||||||
local64_set(&event->hw.prev_count, sum);
|
|
||||||
local64_set(&event->count, 0);
|
local64_set(&event->count, 0);
|
||||||
|
local64_set(&event->hw.prev_count, sum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int paicrypt_add(struct perf_event *event, int flags)
|
static int paicrypt_add(struct perf_event *event, int flags)
|
||||||
|
@ -875,6 +875,11 @@ static void __init setup_randomness(void)
|
|||||||
if (stsi(vmms, 3, 2, 2) == 0 && vmms->count)
|
if (stsi(vmms, 3, 2, 2) == 0 && vmms->count)
|
||||||
add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
|
add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
|
||||||
memblock_free(vmms, PAGE_SIZE);
|
memblock_free(vmms, PAGE_SIZE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_RANDOM
|
||||||
|
if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG))
|
||||||
|
static_branch_enable(&s390_arch_random_available);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -48,7 +48,6 @@ OBJCOPYFLAGS_purgatory.ro += --remove-section='.note.*'
|
|||||||
$(obj)/purgatory.ro: $(obj)/purgatory $(obj)/purgatory.chk FORCE
|
$(obj)/purgatory.ro: $(obj)/purgatory $(obj)/purgatory.chk FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
$(obj)/kexec-purgatory.o: $(obj)/kexec-purgatory.S $(obj)/purgatory.ro FORCE
|
$(obj)/kexec-purgatory.o: $(obj)/purgatory.ro
|
||||||
$(call if_changed_rule,as_o_S)
|
|
||||||
|
|
||||||
obj-$(CONFIG_ARCH_HAS_KEXEC_PURGATORY) += kexec-purgatory.o
|
obj-y += kexec-purgatory.o
|
||||||
|
@ -323,7 +323,7 @@ static inline u32 efi64_convert_status(efi_status_t status)
|
|||||||
#define __efi64_argmap_get_memory_space_descriptor(phys, desc) \
|
#define __efi64_argmap_get_memory_space_descriptor(phys, desc) \
|
||||||
(__efi64_split(phys), (desc))
|
(__efi64_split(phys), (desc))
|
||||||
|
|
||||||
#define __efi64_argmap_set_memory_space_descriptor(phys, size, flags) \
|
#define __efi64_argmap_set_memory_space_attributes(phys, size, flags) \
|
||||||
(__efi64_split(phys), __efi64_split(size), __efi64_split(flags))
|
(__efi64_split(phys), __efi64_split(size), __efi64_split(flags))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -844,7 +844,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
|||||||
|
|
||||||
/* If source buffer is not aligned then use an intermediate buffer */
|
/* If source buffer is not aligned then use an intermediate buffer */
|
||||||
if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
|
if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
|
||||||
src_tpage = alloc_page(GFP_KERNEL);
|
src_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||||
if (!src_tpage)
|
if (!src_tpage)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -865,7 +865,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
|||||||
if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
|
if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
|
||||||
int dst_offset;
|
int dst_offset;
|
||||||
|
|
||||||
dst_tpage = alloc_page(GFP_KERNEL);
|
dst_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||||
if (!dst_tpage) {
|
if (!dst_tpage) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto e_free;
|
goto e_free;
|
||||||
@ -1665,19 +1665,24 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
|||||||
{
|
{
|
||||||
struct kvm_sev_info *dst = &to_kvm_svm(dst_kvm)->sev_info;
|
struct kvm_sev_info *dst = &to_kvm_svm(dst_kvm)->sev_info;
|
||||||
struct kvm_sev_info *src = &to_kvm_svm(src_kvm)->sev_info;
|
struct kvm_sev_info *src = &to_kvm_svm(src_kvm)->sev_info;
|
||||||
|
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
||||||
|
struct vcpu_svm *dst_svm, *src_svm;
|
||||||
struct kvm_sev_info *mirror;
|
struct kvm_sev_info *mirror;
|
||||||
|
unsigned long i;
|
||||||
|
|
||||||
dst->active = true;
|
dst->active = true;
|
||||||
dst->asid = src->asid;
|
dst->asid = src->asid;
|
||||||
dst->handle = src->handle;
|
dst->handle = src->handle;
|
||||||
dst->pages_locked = src->pages_locked;
|
dst->pages_locked = src->pages_locked;
|
||||||
dst->enc_context_owner = src->enc_context_owner;
|
dst->enc_context_owner = src->enc_context_owner;
|
||||||
|
dst->es_active = src->es_active;
|
||||||
|
|
||||||
src->asid = 0;
|
src->asid = 0;
|
||||||
src->active = false;
|
src->active = false;
|
||||||
src->handle = 0;
|
src->handle = 0;
|
||||||
src->pages_locked = 0;
|
src->pages_locked = 0;
|
||||||
src->enc_context_owner = NULL;
|
src->enc_context_owner = NULL;
|
||||||
|
src->es_active = false;
|
||||||
|
|
||||||
list_cut_before(&dst->regions_list, &src->regions_list, &src->regions_list);
|
list_cut_before(&dst->regions_list, &src->regions_list, &src->regions_list);
|
||||||
|
|
||||||
@ -1704,27 +1709,22 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
|||||||
list_del(&src->mirror_entry);
|
list_del(&src->mirror_entry);
|
||||||
list_add_tail(&dst->mirror_entry, &owner_sev_info->mirror_vms);
|
list_add_tail(&dst->mirror_entry, &owner_sev_info->mirror_vms);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
kvm_for_each_vcpu(i, dst_vcpu, dst_kvm) {
|
||||||
{
|
|
||||||
unsigned long i;
|
|
||||||
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
|
||||||
struct vcpu_svm *dst_svm, *src_svm;
|
|
||||||
|
|
||||||
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
|
||||||
if (!src_vcpu->arch.guest_state_protected)
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
|
||||||
src_svm = to_svm(src_vcpu);
|
|
||||||
dst_vcpu = kvm_get_vcpu(dst, i);
|
|
||||||
dst_svm = to_svm(dst_vcpu);
|
dst_svm = to_svm(dst_vcpu);
|
||||||
|
|
||||||
|
sev_init_vmcb(dst_svm);
|
||||||
|
|
||||||
|
if (!dst->es_active)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note, the source is not required to have the same number of
|
||||||
|
* vCPUs as the destination when migrating a vanilla SEV VM.
|
||||||
|
*/
|
||||||
|
src_vcpu = kvm_get_vcpu(dst_kvm, i);
|
||||||
|
src_svm = to_svm(src_vcpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transfer VMSA and GHCB state to the destination. Nullify and
|
* Transfer VMSA and GHCB state to the destination. Nullify and
|
||||||
* clear source fields as appropriate, the state now belongs to
|
* clear source fields as appropriate, the state now belongs to
|
||||||
@ -1740,8 +1740,23 @@ static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
|||||||
src_svm->vmcb->control.vmsa_pa = INVALID_PAGE;
|
src_svm->vmcb->control.vmsa_pa = INVALID_PAGE;
|
||||||
src_vcpu->arch.guest_state_protected = false;
|
src_vcpu->arch.guest_state_protected = false;
|
||||||
}
|
}
|
||||||
to_kvm_svm(src)->sev_info.es_active = false;
|
}
|
||||||
to_kvm_svm(dst)->sev_info.es_active = true;
|
|
||||||
|
static int sev_check_source_vcpus(struct kvm *dst, struct kvm *src)
|
||||||
|
{
|
||||||
|
struct kvm_vcpu *src_vcpu;
|
||||||
|
unsigned long i;
|
||||||
|
|
||||||
|
if (!sev_es_guest(src))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||||
|
if (!src_vcpu->arch.guest_state_protected)
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1789,11 +1804,9 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out_dst_vcpu;
|
goto out_dst_vcpu;
|
||||||
|
|
||||||
if (sev_es_guest(source_kvm)) {
|
ret = sev_check_source_vcpus(kvm, source_kvm);
|
||||||
ret = sev_es_migrate_from(kvm, source_kvm);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_source_vcpu;
|
goto out_source_vcpu;
|
||||||
}
|
|
||||||
|
|
||||||
sev_migrate_from(kvm, source_kvm);
|
sev_migrate_from(kvm, source_kvm);
|
||||||
kvm_vm_dead(source_kvm);
|
kvm_vm_dead(source_kvm);
|
||||||
@ -2914,7 +2927,7 @@ int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in)
|
|||||||
count, in);
|
count, in);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sev_es_init_vmcb(struct vcpu_svm *svm)
|
static void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||||
|
|
||||||
@ -2967,6 +2980,15 @@ void sev_es_init_vmcb(struct vcpu_svm *svm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sev_init_vmcb(struct vcpu_svm *svm)
|
||||||
|
{
|
||||||
|
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
||||||
|
clr_exception_intercept(svm, UD_VECTOR);
|
||||||
|
|
||||||
|
if (sev_es_guest(svm->vcpu.kvm))
|
||||||
|
sev_es_init_vmcb(svm);
|
||||||
|
}
|
||||||
|
|
||||||
void sev_es_vcpu_reset(struct vcpu_svm *svm)
|
void sev_es_vcpu_reset(struct vcpu_svm *svm)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1212,15 +1212,8 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
|
|||||||
svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK;
|
svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sev_guest(vcpu->kvm)) {
|
if (sev_guest(vcpu->kvm))
|
||||||
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
sev_init_vmcb(svm);
|
||||||
clr_exception_intercept(svm, UD_VECTOR);
|
|
||||||
|
|
||||||
if (sev_es_guest(vcpu->kvm)) {
|
|
||||||
/* Perform SEV-ES specific VMCB updates */
|
|
||||||
sev_es_init_vmcb(svm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
svm_hv_init_vmcb(vmcb);
|
svm_hv_init_vmcb(vmcb);
|
||||||
init_vmcb_after_set_cpuid(vcpu);
|
init_vmcb_after_set_cpuid(vcpu);
|
||||||
|
@ -649,10 +649,10 @@ void __init sev_set_cpu_caps(void);
|
|||||||
void __init sev_hardware_setup(void);
|
void __init sev_hardware_setup(void);
|
||||||
void sev_hardware_unsetup(void);
|
void sev_hardware_unsetup(void);
|
||||||
int sev_cpu_init(struct svm_cpu_data *sd);
|
int sev_cpu_init(struct svm_cpu_data *sd);
|
||||||
|
void sev_init_vmcb(struct vcpu_svm *svm);
|
||||||
void sev_free_vcpu(struct kvm_vcpu *vcpu);
|
void sev_free_vcpu(struct kvm_vcpu *vcpu);
|
||||||
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
|
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
|
||||||
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
|
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
|
||||||
void sev_es_init_vmcb(struct vcpu_svm *svm);
|
|
||||||
void sev_es_vcpu_reset(struct vcpu_svm *svm);
|
void sev_es_vcpu_reset(struct vcpu_svm *svm);
|
||||||
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
|
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
|
||||||
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa);
|
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa);
|
||||||
|
@ -1420,8 +1420,9 @@ st: if (is_imm8(insn->off))
|
|||||||
case BPF_JMP | BPF_CALL:
|
case BPF_JMP | BPF_CALL:
|
||||||
func = (u8 *) __bpf_call_base + imm32;
|
func = (u8 *) __bpf_call_base + imm32;
|
||||||
if (tail_call_reachable) {
|
if (tail_call_reachable) {
|
||||||
|
/* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */
|
||||||
EMIT3_off32(0x48, 0x8B, 0x85,
|
EMIT3_off32(0x48, 0x8B, 0x85,
|
||||||
-(bpf_prog->aux->stack_depth + 8));
|
-round_up(bpf_prog->aux->stack_depth, 8) - 8);
|
||||||
if (!imm32 || emit_call(&prog, func, image + addrs[i - 1] + 7))
|
if (!imm32 || emit_call(&prog, func, image + addrs[i - 1] + 7))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2173,7 +2173,7 @@ ENDPROC(ret_from_kernel_thread)
|
|||||||
|
|
||||||
#ifdef CONFIG_HIBERNATION
|
#ifdef CONFIG_HIBERNATION
|
||||||
|
|
||||||
.bss
|
.section .bss, "aw"
|
||||||
.align 4
|
.align 4
|
||||||
.Lsaved_regs:
|
.Lsaved_regs:
|
||||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||||
|
@ -154,6 +154,7 @@ static void __init calibrate_ccount(void)
|
|||||||
cpu = of_find_compatible_node(NULL, NULL, "cdns,xtensa-cpu");
|
cpu = of_find_compatible_node(NULL, NULL, "cdns,xtensa-cpu");
|
||||||
if (cpu) {
|
if (cpu) {
|
||||||
clk = of_clk_get(cpu, 0);
|
clk = of_clk_get(cpu, 0);
|
||||||
|
of_node_put(cpu);
|
||||||
if (!IS_ERR(clk)) {
|
if (!IS_ERR(clk)) {
|
||||||
ccount_freq = clk_get_rate(clk);
|
ccount_freq = clk_get_rate(clk);
|
||||||
return;
|
return;
|
||||||
|
@ -133,6 +133,7 @@ static int __init machine_setup(void)
|
|||||||
|
|
||||||
if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc")))
|
if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc")))
|
||||||
update_local_mac(eth);
|
update_local_mac(eth);
|
||||||
|
of_node_put(eth);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
arch_initcall(machine_setup);
|
arch_initcall(machine_setup);
|
||||||
|
@ -322,19 +322,6 @@ void blk_cleanup_queue(struct request_queue *q)
|
|||||||
blk_mq_exit_queue(q);
|
blk_mq_exit_queue(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* In theory, request pool of sched_tags belongs to request queue.
|
|
||||||
* However, the current implementation requires tag_set for freeing
|
|
||||||
* requests, so free the pool now.
|
|
||||||
*
|
|
||||||
* Queue has become frozen, there can't be any in-queue requests, so
|
|
||||||
* it is safe to free requests now.
|
|
||||||
*/
|
|
||||||
mutex_lock(&q->sysfs_lock);
|
|
||||||
if (q->elevator)
|
|
||||||
blk_mq_sched_free_rqs(q);
|
|
||||||
mutex_unlock(&q->sysfs_lock);
|
|
||||||
|
|
||||||
/* @q is and will stay empty, shutdown and put */
|
/* @q is and will stay empty, shutdown and put */
|
||||||
blk_put_queue(q);
|
blk_put_queue(q);
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user