]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Jul 2023 22:32:22 +0000 (15:32 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Jul 2023 22:32:22 +0000 (15:32 -0700)
Pull kvm updates from Paolo Bonzini:
 "ARM64:

   - Eager page splitting optimization for dirty logging, optionally
     allowing for a VM to avoid the cost of hugepage splitting in the
     stage-2 fault path.

   - Arm FF-A proxy for pKVM, allowing a pKVM host to safely interact
     with services that live in the Secure world. pKVM intervenes on
     FF-A calls to guarantee the host doesn't misuse memory donated to
     the hyp or a pKVM guest.

   - Support for running the split hypervisor with VHE enabled, known as
     'hVHE' mode. This is extremely useful for testing the split
     hypervisor on VHE-only systems, and paves the way for new use cases
     that depend on having two TTBRs available at EL2.

   - Generalized framework for configurable ID registers from userspace.
     KVM/arm64 currently prevents arbitrary CPU feature set
     configuration from userspace, but the intent is to relax this
     limitation and allow userspace to select a feature set consistent
     with the CPU.

   - Enable the use of Branch Target Identification (FEAT_BTI) in the
     hypervisor.

   - Use a separate set of pointer authentication keys for the
     hypervisor when running in protected mode, as the host is untrusted
     at runtime.

   - Ensure timer IRQs are consistently released in the init failure
     paths.

   - Avoid trapping CTR_EL0 on systems with Enhanced Virtualization
     Traps (FEAT_EVT), as it is a register commonly read from userspace.

   - Erratum workaround for the upcoming AmpereOne part, which has
     broken hardware A/D state management.

  RISC-V:

   - Redirect AMO load/store misaligned traps to KVM guest

   - Trap-n-emulate AIA in-kernel irqchip for KVM guest

   - Svnapot support for KVM Guest

  s390:

   - New uvdevice secret API

   - CMM selftest and fixes

   - fix racy access to target CPU for diag 9c

  x86:

   - Fix missing/incorrect #GP checks on ENCLS

   - Use standard mmu_notifier hooks for handling APIC access page

   - Drop now unnecessary TR/TSS load after VM-Exit on AMD

   - Print more descriptive information about the status of SEV and
     SEV-ES during module load

   - Add a test for splitting and reconstituting hugepages during and
     after dirty logging

   - Add support for CPU pinning in demand paging test

   - Add support for AMD PerfMonV2, with a variety of cleanups and minor
     fixes included along the way

   - Add a "nx_huge_pages=never" option to effectively avoid creating NX
     hugepage recovery threads (because nx_huge_pages=off can be toggled
     at runtime)

   - Move handling of PAT out of MTRR code and dedup SVM+VMX code

   - Fix output of PIC poll command emulation when there's an interrupt

   - Add a maintainer's handbook to document KVM x86 processes,
     preferred coding style, testing expectations, etc.

   - Misc cleanups, fixes and comments

  Generic:

   - Miscellaneous bugfixes and cleanups

  Selftests:

   - Generate dependency files so that partial rebuilds work as
     expected"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (153 commits)
  Documentation/process: Add a maintainer handbook for KVM x86
  Documentation/process: Add a label for the tip tree handbook's coding style
  KVM: arm64: Fix misuse of KVM_ARM_VCPU_POWER_OFF bit index
  RISC-V: KVM: Remove unneeded semicolon
  RISC-V: KVM: Allow Svnapot extension for Guest/VM
  riscv: kvm: define vcpu_sbi_ext_pmu in header
  RISC-V: KVM: Expose IMSIC registers as attributes of AIA irqchip
  RISC-V: KVM: Add in-kernel virtualization of AIA IMSIC
  RISC-V: KVM: Expose APLIC registers as attributes of AIA irqchip
  RISC-V: KVM: Add in-kernel emulation of AIA APLIC
  RISC-V: KVM: Implement device interface for AIA irqchip
  RISC-V: KVM: Skeletal in-kernel AIA irqchip support
  RISC-V: KVM: Set kvm_riscv_aia_nr_hgei to zero
  RISC-V: KVM: Add APLIC related defines
  RISC-V: KVM: Add IMSIC related defines
  RISC-V: KVM: Implement guest external interrupt line management
  KVM: x86: Remove PRIx* definitions as they are solely for user space
  s390/uv: Update query for secret-UVCs
  s390/uv: replace scnprintf with sysfs_emit
  s390/uvdevice: Add 'Lock Secret Store' UVC
  ...

27 files changed:
1  2 
Documentation/arch/arm64/silicon-errata.rst
Documentation/process/maintainer-handbooks.rst
Documentation/process/maintainer-tip.rst
Documentation/virt/kvm/api.rst
MAINTAINERS
arch/arm64/Kconfig
arch/arm64/include/asm/cpufeature.h
arch/arm64/include/asm/el2_setup.h
arch/arm64/include/asm/kvm_arm.h
arch/arm64/include/asm/kvm_asm.h
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/sysreg.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/head.S
arch/arm64/kernel/hyp-stub.S
arch/arm64/kernel/idreg-override.c
arch/arm64/kvm/hyp/include/hyp/switch.h
arch/arm64/kvm/sys_regs.c
arch/arm64/tools/cpucaps
arch/riscv/include/asm/csr.h
arch/riscv/include/asm/kvm_host.h
arch/riscv/include/uapi/asm/kvm.h
arch/riscv/kvm/Makefile
arch/riscv/kvm/vcpu.c
arch/s390/kernel/uv.c
arch/x86/kvm/x86.c
virt/kvm/kvm_main.c

index f093a9d8bc5cac4dfd31e79efe7528ca810d1b66,0000000000000000000000000000000000000000..496cdca5cb99002837a87b83834bce0d9fc0d60a
mode 100644,000000..100644
--- /dev/null
@@@ -1,224 -1,0 +1,227 @@@
 +=======================================
 +Silicon Errata and Software Workarounds
 +=======================================
 +
 +Author: Will Deacon <will.deacon@arm.com>
 +
 +Date  : 27 November 2015
 +
 +It is an unfortunate fact of life that hardware is often produced with
 +so-called "errata", which can cause it to deviate from the architecture
 +under specific circumstances.  For hardware produced by ARM, these
 +errata are broadly classified into the following categories:
 +
 +  ==========  ========================================================
 +  Category A  A critical error without a viable workaround.
 +  Category B  A significant or critical error with an acceptable
 +              workaround.
 +  Category C  A minor error that is not expected to occur under normal
 +              operation.
 +  ==========  ========================================================
 +
 +For more information, consult one of the "Software Developers Errata
 +Notice" documents available on infocenter.arm.com (registration
 +required).
 +
 +As far as Linux is concerned, Category B errata may require some special
 +treatment in the operating system. For example, avoiding a particular
 +sequence of code, or configuring the processor in a particular way. A
 +less common situation may require similar actions in order to declassify
 +a Category A erratum into a Category C erratum. These are collectively
 +known as "software workarounds" and are only required in the minority of
 +cases (e.g. those cases that both require a non-secure workaround *and*
 +can be triggered by Linux).
 +
 +For software workarounds that may adversely impact systems unaffected by
 +the erratum in question, a Kconfig entry is added under "Kernel
 +Features" -> "ARM errata workarounds via the alternatives framework".
 +These are enabled by default and patched in at runtime when an affected
 +CPU is detected. For less-intrusive workarounds, a Kconfig option is not
 +available and the code is structured (preferably with a comment) in such
 +a way that the erratum will not be hit.
 +
 +This approach can make it slightly onerous to determine exactly which
 +errata are worked around in an arbitrary kernel source tree, so this
 +file acts as a registry of software workarounds in the Linux Kernel and
 +will be updated when new workarounds are committed and backported to
 +stable kernels.
 +
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Implementor    | Component       | Erratum ID      | Kconfig                     |
 ++================+=================+=================+=============================+
 +| Allwinner      | A64/R18         | UNKNOWN1        | SUN50I_ERRATUM_UNKNOWN1     |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
++| Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
+++----------------+-----------------+-----------------+-----------------------------+
+++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2457168        | ARM64_ERRATUM_2457168       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2064142        | ARM64_ERRATUM_2064142       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2038923        | ARM64_ERRATUM_2038923       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #1902691        | ARM64_ERRATUM_1902691       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #826319         | ARM64_ERRATUM_826319        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #827319         | ARM64_ERRATUM_827319        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #824069         | ARM64_ERRATUM_824069        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #819472         | ARM64_ERRATUM_819472        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #845719         | ARM64_ERRATUM_845719        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A53      | #843419         | ARM64_ERRATUM_843419        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A55      | #1024718        | ARM64_ERRATUM_1024718       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A55      | #1530923        | ARM64_ERRATUM_1530923       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A55      | #2441007        | ARM64_ERRATUM_2441007       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A57      | #832075         | ARM64_ERRATUM_832075        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A57      | #852523         | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A57      | #834220         | ARM64_ERRATUM_834220        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A57      | #1319537        | ARM64_ERRATUM_1319367       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A57      | #1742098        | ARM64_ERRATUM_1742098       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A72      | #853709         | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A72      | #1319367        | ARM64_ERRATUM_1319367       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A72      | #1655431        | ARM64_ERRATUM_1742098       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A73      | #858921         | ARM64_ERRATUM_858921        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A76      | #1188873,1418040| ARM64_ERRATUM_1418040       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A76      | #1165522        | ARM64_ERRATUM_1165522       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A76      | #1286807        | ARM64_ERRATUM_1286807       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A76      | #1463225        | ARM64_ERRATUM_1463225       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A77      | #1508412        | ARM64_ERRATUM_1508412       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2051678        | ARM64_ERRATUM_2051678       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2077057        | ARM64_ERRATUM_2077057       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2441009        | ARM64_ERRATUM_2441009       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A510     | #2658417        | ARM64_ERRATUM_2658417       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A710     | #2119858        | ARM64_ERRATUM_2119858       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A710     | #2054223        | ARM64_ERRATUM_2054223       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A710     | #2224489        | ARM64_ERRATUM_2224489       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-A715     | #2645198        | ARM64_ERRATUM_2645198       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-X2       | #2119858        | ARM64_ERRATUM_2119858       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Cortex-X2       | #2224489        | ARM64_ERRATUM_2224489       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N1     | #1188873,1418040| ARM64_ERRATUM_1418040       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N1     | #1349291        | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N1     | #1542419        | ARM64_ERRATUM_1542419       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N2     | #2139208        | ARM64_ERRATUM_2139208       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N2     | #2067961        | ARM64_ERRATUM_2067961       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | Neoverse-N2     | #2253138        | ARM64_ERRATUM_2253138       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | MMU-500         | #841119,826419  | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | MMU-600         | #1076982,1209401| N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ARM            | MMU-700         | #2268618,2812531| N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Broadcom       | Brahma-B53      | N/A             | ARM64_ERRATUM_845719        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Broadcom       | Brahma-B53      | N/A             | ARM64_ERRATUM_843419        |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX ITS    | #22375,24313    | CAVIUM_ERRATUM_22375        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX ITS    | #23144          | CAVIUM_ERRATUM_23144        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX GICv3  | #23154,38545    | CAVIUM_ERRATUM_23154        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX GICv3  | #38539          | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX Core   | #27456          | CAVIUM_ERRATUM_27456        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX Core   | #30115          | CAVIUM_ERRATUM_30115        |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX SMMUv2 | #27704          | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX2 SMMUv3| #74             | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX2 SMMUv3| #126            | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Cavium         | ThunderX2 Core  | #219            | CAVIUM_TX2_ERRATUM_219      |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Marvell        | ARM-MMU-500     | #582743         | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| NVIDIA         | Carmel Core     | N/A             | NVIDIA_CARMEL_CNP_ERRATUM   |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| NVIDIA         | T241 GICv3/4.x  | T241-FABRIC-4   | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Freescale/NXP  | LS2080A/LS1043A | A-008585        | FSL_ERRATUM_A008585         |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Hisilicon      | Hip0{5,6,7}     | #161010101      | HISILICON_ERRATUM_161010101 |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Hisilicon      | Hip0{6,7}       | #161010701      | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Hisilicon      | Hip0{6,7}       | #161010803      | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Hisilicon      | Hip07           | #161600802      | HISILICON_ERRATUM_161600802 |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Hisilicon      | Hip08 SMMU PMCG | #162001800      | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo/Falkor v1  | E1003           | QCOM_FALKOR_ERRATUM_1003    |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo/Falkor v1  | E1009           | QCOM_FALKOR_ERRATUM_1009    |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | QDF2400 ITS     | E0065           | QCOM_QDF2400_ERRATUM_0065   |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Falkor v{1,2}   | E1041           | QCOM_FALKOR_ERRATUM_1041    |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo4xx Gold    | N/A             | ARM64_ERRATUM_1463225       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo4xx Gold    | N/A             | ARM64_ERRATUM_1418040       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo4xx Silver  | N/A             | ARM64_ERRATUM_1530923       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo4xx Silver  | N/A             | ARM64_ERRATUM_1024718       |
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Qualcomm Tech. | Kryo4xx Gold    | N/A             | ARM64_ERRATUM_1286807       |
 ++----------------+-----------------+-----------------+-----------------------------+
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Rockchip       | RK3588          | #3588001        | ROCKCHIP_ERRATUM_3588001    |
 ++----------------+-----------------+-----------------+-----------------------------+
 +
 ++----------------+-----------------+-----------------+-----------------------------+
 +| Fujitsu        | A64FX           | E#010001        | FUJITSU_ERRATUM_010001      |
 ++----------------+-----------------+-----------------+-----------------------------+
 +
 ++----------------+-----------------+-----------------+-----------------------------+
 +| ASR            | ASR8601         | #8601001        | N/A                         |
 ++----------------+-----------------+-----------------+-----------------------------+
index fe24cb665fb7b56cfcc5ff8401b9f19fc1661316,d12cbbe2b7dfa73e522f9af1db227e12c8dd17a6..9992bfd7eaa37cf4eecdba0aaa210839df872212
@@@ -15,6 -15,6 +15,7 @@@ Contents
     :numbered:
     :maxdepth: 2
  
 -   maintainer-tip
     maintainer-netdev
 +   maintainer-soc
 +   maintainer-tip
+    maintainer-kvm-x86
index 93d8a794bdfc6364d7b16d8dcfedb31a504e38e0,0cac75a86372790c5de4e4bd6b5bc31a3002d3e5..08dd0f804410b6dde4635c77ed930b70e57c8cac
@@@ -421,9 -421,6 +421,9 @@@ allowing themselves a breath. Please re
  The release candidate -rc1 is the starting point for new patches to be
  applied which are targeted for the next merge window.
  
 +So called _urgent_ branches will be merged into mainline during the
 +stabilization phase of each release.
 +
  
  Git
  ^^^
@@@ -455,6 -452,8 +455,8 @@@ and can be added to an existing kernel 
  Some of these options are x86-specific and can be left out when testing
  on other architectures.
  
+ .. _maintainer-tip-coding-style:
  Coding style notes
  ------------------
  
index 96c4475539c2c2c81ac47f086320e0204982180c,656bd293c8f420335b257de5b9097952755a7bb9..c0ddd3035462bd8ad99bb4147381b79399cff807
@@@ -2613,7 -2613,7 +2613,7 @@@ follows:
         this vcpu, and determines which register slices are visible through
         this ioctl interface.
  
 -(See Documentation/arm64/sve.rst for an explanation of the "vq"
 +(See Documentation/arch/arm64/sve.rst for an explanation of the "vq"
  nomenclature.)
  
  KVM_REG_ARM64_SVE_VLS is only accessible after KVM_ARM_VCPU_INIT.
@@@ -8445,6 -8445,33 +8445,33 @@@ structure
  When getting the Modified Change Topology Report value, the attr->addr
  must point to a byte where the value will be stored or retrieved from.
  
+ 8.40 KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE
+ ---------------------------------------
+ :Capability: KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE
+ :Architectures: arm64
+ :Type: vm
+ :Parameters: arg[0] is the new split chunk size.
+ :Returns: 0 on success, -EINVAL if any memslot was already created.
+ This capability sets the chunk size used in Eager Page Splitting.
+ Eager Page Splitting improves the performance of dirty-logging (used
+ in live migrations) when guest memory is backed by huge-pages.  It
+ avoids splitting huge-pages (into PAGE_SIZE pages) on fault, by doing
+ it eagerly when enabling dirty logging (with the
+ KVM_MEM_LOG_DIRTY_PAGES flag for a memory region), or when using
+ KVM_CLEAR_DIRTY_LOG.
+ The chunk size specifies how many pages to break at a time, using a
+ single allocation for each chunk. Bigger the chunk size, more pages
+ need to be allocated ahead of time.
+ The chunk size needs to be a valid block size. The list of acceptable
+ block sizes is exposed in KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES as a
+ 64-bit bitmap (each bit describing a block size). The default value is
+ 0, to disable the eager page splitting.
  9. Known KVM API problems
  =========================
  
diff --combined MAINTAINERS
index 33dd25d4149f129bdc286a8f1d804be6e5e1b5eb,2c6c9c9ed66e8099570a88680fd6b06843293110..d7d65163e54e8dbac4df521b95d9c3d2c79cdd86
@@@ -406,13 -406,6 +406,13 @@@ L:       linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    drivers/acpi/arm64
  
 +ACPI FOR RISC-V (ACPI/riscv)
 +M:    Sunil V L <sunilvl@ventanamicro.com>
 +L:    linux-acpi@vger.kernel.org
 +L:    linux-riscv@lists.infradead.org
 +S:    Maintained
 +F:    drivers/acpi/riscv/
 +
  ACPI PCC(Platform Communication Channel) MAILBOX DRIVER
  M:    Sudeep Holla <sudeep.holla@arm.com>
  L:    linux-acpi@vger.kernel.org
@@@ -456,8 -449,6 +456,8 @@@ F: include/linux/acpi_viot.
  ACPI WMI DRIVER
  L:    platform-driver-x86@vger.kernel.org
  S:    Orphan
 +F:    Documentation/driver-api/wmi.rst
 +F:    Documentation/wmi/
  F:    drivers/platform/x86/wmi.c
  F:    include/uapi/linux/wmi.h
  
@@@ -918,6 -909,13 +918,6 @@@ L:        netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/altera/
  
 -ALTERA TSE PCS
 -M:    Maxime Chevallier <maxime.chevallier@bootlin.com>
 -L:    netdev@vger.kernel.org
 -S:    Supported
 -F:    drivers/net/pcs/pcs-altera-tse.c
 -F:    include/linux/pcs-altera-tse.h
 -
  ALTERA UART/JTAG UART SERIAL DRIVERS
  M:    Tobias Klauser <tklauser@distanz.ch>
  L:    linux-serial@vger.kernel.org
@@@ -1636,7 -1634,6 +1636,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  C:    irc://irc.libera.chat/armlinux
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
 +F:    Documentation/process/maintainer-soc.rst
  F:    arch/arm/boot/dts/Makefile
  F:    arch/arm64/boot/dts/Makefile
  
@@@ -1668,9 -1665,9 +1668,9 @@@ F:      Documentation/devicetree/bindings/cl
  F:    Documentation/devicetree/bindings/i2c/arm,i2c-versatile.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/arm,versatile-fpga-irq.txt
  F:    Documentation/devicetree/bindings/mtd/mtd-physmap.yaml
 -F:    arch/arm/boot/dts/arm-realview-*
 -F:    arch/arm/boot/dts/integrator*
 -F:    arch/arm/boot/dts/versatile*
 +F:    arch/arm/boot/dts/arm/arm-realview-*
 +F:    arch/arm/boot/dts/arm/integrator*
 +F:    arch/arm/boot/dts/arm/versatile*
  F:    arch/arm/mach-versatile/
  F:    drivers/bus/arm-integrator-lm.c
  F:    drivers/clk/versatile/
@@@ -1841,7 -1838,7 +1841,7 @@@ F:      Documentation/devicetree/bindings/ne
  F:    Documentation/devicetree/bindings/pinctrl/actions,*
  F:    Documentation/devicetree/bindings/power/actions,owl-sps.txt
  F:    Documentation/devicetree/bindings/timer/actions,owl-timer.txt
 -F:    arch/arm/boot/dts/owl-*
 +F:    arch/arm/boot/dts/actions/
  F:    arch/arm/mach-actions/
  F:    arch/arm64/boot/dts/actions/
  F:    drivers/clk/actions/
@@@ -1887,7 -1884,6 +1887,7 @@@ L:      linux-amlogic@lists.infradead.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/clock/amlogic*
  F:    drivers/clk/meson/
 +F:    include/dt-bindings/clock/amlogic,a1*
  F:    include/dt-bindings/clock/gxbb*
  F:    include/dt-bindings/clock/meson*
  
@@@ -1915,12 -1911,10 +1915,12 @@@ L:   linux-arm-kernel@lists.infradead.or
  L:    linux-amlogic@lists.infradead.org
  S:    Maintained
  W:    http://linux-meson.com/
 -F:    arch/arm/boot/dts/meson*
 +F:    Documentation/devicetree/bindings/phy/amlogic*
 +F:    arch/arm/boot/dts/amlogic/
  F:    arch/arm/mach-meson/
  F:    arch/arm64/boot/dts/amlogic/
  F:    drivers/mmc/host/meson*
 +F:    drivers/phy/amlogic/
  F:    drivers/pinctrl/meson/
  F:    drivers/rtc/rtc-meson*
  F:    drivers/soc/amlogic/
@@@ -1931,7 -1925,7 +1931,7 @@@ M:      Tsahee Zidenberg <tsahee@annapurnala
  M:    Antoine Tenart <atenart@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/alpine*
 +F:    arch/arm/boot/dts/amazon/
  F:    arch/arm/mach-alpine/
  F:    arch/arm64/boot/dts/amazon/
  F:    drivers/*/*alpine*
@@@ -2002,7 -1996,7 +2002,7 @@@ M:      Lars Persson <lars.persson@axis.com
  L:    linux-arm-kernel@axis.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/axis,artpec6-pinctrl.txt
 -F:    arch/arm/boot/dts/artpec6*
 +F:    arch/arm/boot/dts/axis/
  F:    arch/arm/mach-artpec
  F:    drivers/clk/axis
  F:    drivers/crypto/axis
@@@ -2030,7 -2024,7 +2030,7 @@@ S:      Supporte
  Q:    https://patchwork.ozlabs.org/project/linux-aspeed/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joel/aspeed.git
  F:    Documentation/devicetree/bindings/arm/aspeed/
 -F:    arch/arm/boot/dts/aspeed-*
 +F:    arch/arm/boot/dts/aspeed/
  F:    arch/arm/mach-aspeed/
  N:    aspeed
  
@@@ -2049,7 -2043,8 +2049,7 @@@ ARM/CALXEDA HIGHBANK ARCHITECTUR
  M:    Andre Przywara <andre.przywara@arm.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/ecx-*.dts*
 -F:    arch/arm/boot/dts/highbank.dts
 +F:    arch/arm/boot/dts/calxeda/
  F:    arch/arm/mach-highbank/
  
  ARM/CAVIUM THUNDER NETWORK DRIVER
@@@ -2097,13 -2092,12 +2097,13 @@@ ARM/CONEXANT DIGICOLOR MACHINE SUPPOR
  M:    Baruch Siach <baruch@tkos.co.il>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/cx92755*
 +F:    arch/arm/boot/dts/cnxt/
  N:    digicolor
  
  ARM/CORESIGHT FRAMEWORK AND DRIVERS
  M:    Suzuki K Poulose <suzuki.poulose@arm.com>
  R:    Mike Leach <mike.leach@linaro.org>
 +R:    James Clark <james.clark@arm.com>
  R:    Leo Yan <leo.yan@linaro.org>
  L:    coresight@lists.linaro.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2137,7 -2131,7 +2137,7 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/net/cortina,gemini-ethernet.yaml
  F:    Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
  F:    Documentation/devicetree/bindings/rtc/faraday,ftrtc010.yaml
 -F:    arch/arm/boot/dts/gemini*
 +F:    arch/arm/boot/dts/gemini/
  F:    arch/arm/mach-gemini/
  F:    drivers/crypto/gemini/
  F:    drivers/net/ethernet/cortina/
@@@ -2190,8 -2184,7 +2190,8 @@@ R:      NXP Linux Team <linux-imx@nxp.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
 -F:    arch/arm64/boot/dts/freescale/
 +F:    arch/arm/boot/dts/nxp/imx/
 +F:    arch/arm/boot/dts/nxp/mxs/
  X:    arch/arm64/boot/dts/freescale/fsl-*
  X:    arch/arm64/boot/dts/freescale/qoriq-*
  X:    drivers/media/i2c/
@@@ -2204,7 -2197,7 +2204,7 @@@ M:      Li Yang <leoyang.li@nxp.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
 -F:    arch/arm/boot/dts/ls1021a*
 +F:    arch/arm/boot/dts/nxp/ls/
  F:    arch/arm64/boot/dts/freescale/fsl-*
  F:    arch/arm64/boot/dts/freescale/qoriq-*
  
@@@ -2216,7 -2209,7 +2216,7 @@@ R:      Stefan Agner <stefan@agner.ch
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
 -F:    arch/arm/boot/dts/vf*
 +F:    arch/arm/boot/dts/nxp/vf/
  F:    arch/arm/mach-imx/*vf610*
  
  ARM/GUMSTIX MACHINE SUPPORT
@@@ -2230,7 -2223,9 +2230,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Supported
  W:    http://www.hisilicon.com
  T:    git https://github.com/hisilicon/linux-hisi.git
 -F:    arch/arm/boot/dts/hi3*
 -F:    arch/arm/boot/dts/hip*
 -F:    arch/arm/boot/dts/hisi*
 +F:    arch/arm/boot/dts/hisilicon/
  F:    arch/arm/mach-hisi/
  F:    arch/arm64/boot/dts/hisilicon/
  
@@@ -2252,7 -2247,8 +2252,7 @@@ F:      Documentation/devicetree/bindings/i2
  F:    Documentation/devicetree/bindings/spi/hpe,gxp-spifi.yaml
  F:    Documentation/devicetree/bindings/timer/hpe,gxp-timer.yaml
  F:    Documentation/hwmon/gxp-fan-ctrl.rst
 -F:    arch/arm/boot/dts/hpe-bmc*
 -F:    arch/arm/boot/dts/hpe-gxp*
 +F:    arch/arm/boot/dts/hpe/
  F:    arch/arm/mach-hpe/
  F:    drivers/clocksource/timer-gxp.c
  F:    drivers/hwmon/gxp-fan-ctrl.c
@@@ -2266,7 -2262,7 +2266,7 @@@ M:      Javier Martinez Canillas <javier@dow
  L:    linux-omap@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/omap3-igep*
 +F:    arch/arm/boot/dts/ti/omap/omap3-igep*
  
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Linus Walleij <linusw@kernel.org>
@@@ -2279,7 -2275,7 +2279,7 @@@ F:      Documentation/devicetree/bindings/gp
  F:    Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
  F:    Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
  F:    Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
 -F:    arch/arm/boot/dts/intel-ixp*
 +F:    arch/arm/boot/dts/intel/ixp/
  F:    arch/arm/mach-ixp4xx/
  F:    drivers/bus/intel-ixp4xx-eb.c
  F:    drivers/clocksource/timer-ixp4xx.c
@@@ -2311,7 -2307,7 +2311,7 @@@ M:      Vladimir Zapolskiy <vz@mleia.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/i2c/i2c-lpc2k.txt
 -F:    arch/arm/boot/dts/lpc43*
 +F:    arch/arm/boot/dts/nxp/lpc/lpc43*
  F:    drivers/i2c/busses/i2c-lpc2k.c
  F:    drivers/memory/pl172.c
  F:    drivers/mtd/spi-nor/controllers/nxp-spifi.c
@@@ -2324,7 -2320,7 +2324,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://github.com/vzapolskiy/linux-lpc32xx.git
  F:    Documentation/devicetree/bindings/i2c/i2c-pnx.txt
 -F:    arch/arm/boot/dts/lpc32*
 +F:    arch/arm/boot/dts/nxp/lpc/lpc32*
  F:    arch/arm/mach-lpc32xx/
  F:    drivers/i2c/busses/i2c-pnx.c
  F:    drivers/net/ethernet/nxp/lpc_eth.c
@@@ -2342,8 -2338,8 +2342,8 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt
  F:    Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt
  F:    Documentation/devicetree/bindings/soc/dove/
 -F:    arch/arm/boot/dts/dove*
 -F:    arch/arm/boot/dts/orion5x*
 +F:    arch/arm/boot/dts/marvell/dove*
 +F:    arch/arm/boot/dts/marvell/orion5x*
  F:    arch/arm/mach-dove/
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
@@@ -2358,13 -2354,12 +2358,13 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
  F:    Documentation/devicetree/bindings/arm/marvell/
 -F:    arch/arm/boot/dts/armada*
 -F:    arch/arm/boot/dts/kirkwood*
 +F:    arch/arm/boot/dts/marvell/armada*
 +F:    arch/arm/boot/dts/marvell/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
  F:    arch/arm/mach-mvebu/
  F:    arch/arm64/boot/dts/marvell/armada*
  F:    arch/arm64/boot/dts/marvell/cn913*
 +F:    drivers/clk/mvebu/
  F:    drivers/cpufreq/armada-37xx-cpufreq.c
  F:    drivers/cpufreq/armada-8k-cpufreq.c
  F:    drivers/cpufreq/mvebu-cpufreq.c
@@@ -2394,7 -2389,10 +2394,7 @@@ L:     linux-mediatek@lists.infradead.org (
  S:    Maintained
  W:    https://mtk.wiki.kernel.org/
  C:    irc://irc.libera.chat/linux-mediatek
 -F:    arch/arm/boot/dts/mt2*
 -F:    arch/arm/boot/dts/mt6*
 -F:    arch/arm/boot/dts/mt7*
 -F:    arch/arm/boot/dts/mt8*
 +F:    arch/arm/boot/dts/mediatek/
  F:    arch/arm/mach-mediatek/
  F:    arch/arm64/boot/dts/mediatek/
  F:    drivers/soc/mediatek/
@@@ -2418,8 -2416,10 +2418,8 @@@ L:     linux-arm-kernel@lists.infradead.or
  S:    Supported
  W:    http://www.linux4sam.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux.git
 -F:    arch/arm/boot/dts/at91*.dts
 -F:    arch/arm/boot/dts/at91*.dtsi
 -F:    arch/arm/boot/dts/sama*.dts
 -F:    arch/arm/boot/dts/sama*.dtsi
 +F:    arch/arm/boot/dts/microchip/at91*
 +F:    arch/arm/boot/dts/microchip/sama*
  F:    arch/arm/include/debug/at91.S
  F:    arch/arm/mach-at91/
  F:    drivers/memory/atmel*
@@@ -2456,7 -2456,7 +2456,7 @@@ M:      Taichi Sugaya <sugaya.taichi@socione
  M:    Takao Orito <orito.takao@socionext.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/milbeaut*
 +F:    arch/arm/boot/dts/socionext/milbeaut*
  F:    arch/arm/mach-milbeaut/
  N:    milbeaut
  
@@@ -2470,7 -2470,7 +2470,7 @@@ T:      git git://github.com/linux-chenxing/
  F:    Documentation/devicetree/bindings/arm/mstar/*
  F:    Documentation/devicetree/bindings/clock/mstar,msc313-mpll.yaml
  F:    Documentation/devicetree/bindings/gpio/mstar,msc313-gpio.yaml
 -F:    arch/arm/boot/dts/mstar-*
 +F:    arch/arm/boot/dts/sigmastar/
  F:    arch/arm/mach-mstar/
  F:    drivers/clk/mstar/
  F:    drivers/clocksource/timer-msc313e.c
@@@ -2489,7 -2489,7 +2489,7 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/arm/ux500.yaml
  F:    Documentation/devicetree/bindings/arm/ux500/
  F:    Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml
 -F:    arch/arm/boot/dts/ste-*
 +F:    arch/arm/boot/dts/st/ste-*
  F:    arch/arm/mach-nomadik/
  F:    arch/arm/mach-ux500/
  F:    drivers/clk/clk-nomadik.c
@@@ -2506,18 -2506,6 +2506,18 @@@ F:    drivers/rtc/rtc-ab8500.
  F:    drivers/rtc/rtc-pl031.c
  F:    drivers/soc/ux500/
  
 +ARM/NUVOTON MA35 ARCHITECTURE
 +M:    Jacky Huang <ychuang3@nuvoton.com>
 +M:    Shan-Chun Hung <schung@nuvoton.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Supported
 +F:    Documentation/devicetree/bindings/*/*/*ma35*
 +F:    Documentation/devicetree/bindings/*/*ma35*
 +F:    arch/arm64/boot/dts/nuvoton/*ma35*
 +F:    drivers/*/*/*ma35*
 +F:    drivers/*/*ma35*
 +K:    ma35d1
 +
  ARM/NUVOTON NPCM ARCHITECTURE
  M:    Avi Fishman <avifishman70@gmail.com>
  M:    Tomer Maimon <tmaimon77@gmail.com>
@@@ -2529,8 -2517,9 +2529,8 @@@ L:      openbmc@lists.ozlabs.org (moderated 
  S:    Supported
  F:    Documentation/devicetree/bindings/*/*/*npcm*
  F:    Documentation/devicetree/bindings/*/*npcm*
 -F:    Documentation/devicetree/bindings/arm/npcm/*
  F:    Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
 -F:    arch/arm/boot/dts/nuvoton-npcm*
 +F:    arch/arm/boot/dts/nuvoton/nuvoton-npcm*
  F:    arch/arm/mach-npcm/
  F:    arch/arm64/boot/dts/nuvoton/
  F:    drivers/*/*/*npcm*
@@@ -2545,7 -2534,7 +2545,7 @@@ L:      openbmc@lists.ozlabs.org (moderated 
  S:    Maintained
  W:    https://github.com/neuschaefer/wpcm450/wiki
  F:    Documentation/devicetree/bindings/*/*wpcm*
 -F:    arch/arm/boot/dts/nuvoton-wpcm450*
 +F:    arch/arm/boot/dts/nuvoton/nuvoton-wpcm450*
  F:    arch/arm/configs/wpcm450_defconfig
  F:    arch/arm/mach-npcm/wpcm450.c
  F:    drivers/*/*/*wpcm*
@@@ -2586,19 -2575,20 +2586,19 @@@ F:   arch/arm64/boot/dts/qcom/sdm845-chez
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
  M:    Bjorn Andersson <andersson@kernel.org>
 -R:    Konrad Dybcio <konrad.dybcio@linaro.org>
 +M:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
  F:    Documentation/devicetree/bindings/*/qcom*
  F:    Documentation/devicetree/bindings/soc/qcom/
 -F:    arch/arm/boot/dts/qcom-*.dts
 -F:    arch/arm/boot/dts/qcom-*.dtsi
 +F:    arch/arm/boot/dts/qcom/
  F:    arch/arm/configs/qcom_defconfig
  F:    arch/arm/mach-qcom/
  F:    arch/arm64/boot/dts/qcom/
 +F:    drivers/*/*/pm8???-*
  F:    drivers/*/*/qcom*
  F:    drivers/*/*/qcom/
 -F:    drivers/*/pm8???-*
  F:    drivers/*/qcom*
  F:    drivers/*/qcom/
  F:    drivers/bluetooth/btqcomsmd.c
@@@ -2635,7 -2625,7 +2635,7 @@@ F:      Documentation/devicetree/bindings/gp
  F:    Documentation/devicetree/bindings/interrupt-controller/rda,8810pl-intc.yaml
  F:    Documentation/devicetree/bindings/serial/rda,8810pl-uart.yaml
  F:    Documentation/devicetree/bindings/timer/rda,8810pl-timer.yaml
 -F:    arch/arm/boot/dts/rda8810pl-*
 +F:    arch/arm/boot/dts/unisoc/
  F:    drivers/clocksource/timer-rda.c
  F:    drivers/gpio/gpio-rda.c
  F:    drivers/irqchip/irq-rda-intc.c
@@@ -2647,7 -2637,7 +2647,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  L:    linux-realtek-soc@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/realtek.yaml
 -F:    arch/arm/boot/dts/rtd*
 +F:    arch/arm/boot/dts/realtek/
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
@@@ -2661,7 -2651,13 +2661,7 @@@ C:     irc://irc.libera.chat/renesas-so
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
 -F:    arch/arm/boot/dts/emev2*
 -F:    arch/arm/boot/dts/gr-peach*
 -F:    arch/arm/boot/dts/iwg20d-q7*
 -F:    arch/arm/boot/dts/r7s*
 -F:    arch/arm/boot/dts/r8a*
 -F:    arch/arm/boot/dts/r9a*
 -F:    arch/arm/boot/dts/sh*
 +F:    arch/arm/boot/dts/renesas/
  F:    arch/arm/configs/shmobile_defconfig
  F:    arch/arm/include/debug/renesas-scif.S
  F:    arch/arm/mach-shmobile/
@@@ -2694,7 -2690,8 +2694,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/i2c/i2c-rk3x.yaml
  F:    Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
  F:    Documentation/devicetree/bindings/spi/spi-rockchip.yaml
 -F:    arch/arm/boot/dts/rk3*
 -F:    arch/arm/boot/dts/rv11*
 +F:    arch/arm/boot/dts/rockchip/
  F:    arch/arm/mach-rockchip/
  F:    drivers/*/*/*rockchip*
  F:    drivers/*/*rockchip*
@@@ -2713,12 -2710,14 +2713,12 @@@ Q:   https://patchwork.kernel.org/project
  B:    mailto:linux-samsung-soc@vger.kernel.org
  C:    irc://irc.libera.chat/linux-exynos
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
 -F:    Documentation/arm/samsung/
 +F:    Documentation/arch/arm/samsung/
  F:    Documentation/devicetree/bindings/arm/samsung/
  F:    Documentation/devicetree/bindings/hwinfo/samsung,*
  F:    Documentation/devicetree/bindings/power/pd-samsung.yaml
  F:    Documentation/devicetree/bindings/soc/samsung/
 -F:    arch/arm/boot/dts/exynos*
 -F:    arch/arm/boot/dts/s3c*
 -F:    arch/arm/boot/dts/s5p*
 +F:    arch/arm/boot/dts/samsung/
  F:    arch/arm/mach-exynos*/
  F:    arch/arm/mach-s3c/
  F:    arch/arm/mach-s5p*/
@@@ -2778,7 -2777,7 +2778,7 @@@ M:      Dinh Nguyen <dinguyen@kernel.org
  S:    Maintained
  W:    http://www.rocketboards.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
 -F:    arch/arm/boot/dts/socfpga*
 +F:    arch/arm/boot/dts/intel/socfpga/
  F:    arch/arm/configs/socfpga_defconfig
  F:    arch/arm/mach-socfpga/
  F:    arch/arm64/boot/dts/altera/
@@@ -2811,7 -2810,7 +2811,7 @@@ S:      Maintaine
  W:    http://www.stlinux.com
  F:    Documentation/devicetree/bindings/i2c/st,sti-i2c.yaml
  F:    Documentation/devicetree/bindings/spi/st,ssc-spi.yaml
 -F:    arch/arm/boot/dts/sti*
 +F:    arch/arm/boot/dts/st/sti*
  F:    arch/arm/mach-sti/
  F:    drivers/ata/ahci_st.c
  F:    drivers/char/hw_random/st-rng.c
@@@ -2844,10 -2843,9 +2844,10 @@@ L:    linux-stm32@st-md-mailman.stormreply
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git stm32-next
 -F:    arch/arm/boot/dts/stm32*
 +F:    arch/arm/boot/dts/st/stm32*
  F:    arch/arm/mach-stm32/
  F:    drivers/clocksource/armv7m_systick.c
 +F:    arch/arm64/boot/dts/st/
  N:    stm32
  N:    stm
  
@@@ -2860,7 -2858,7 +2860,7 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/clock/sunplus,sp7021-clkc.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/sunplus,sp7021-intc.yaml
  F:    Documentation/devicetree/bindings/reset/sunplus,reset.yaml
 -F:    arch/arm/boot/dts/sunplus-sp7021*.dts*
 +F:    arch/arm/boot/dts/sunplus/
  F:    arch/arm/configs/sp7021_*defconfig
  F:    arch/arm/mach-sunplus/
  F:    drivers/clk/clk-sp7021.c
@@@ -2874,7 -2872,7 +2874,7 @@@ M:      Jisheng Zhang <jszhang@kernel.org
  M:    Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/berlin*
 +F:    arch/arm/boot/dts/synaptics/
  F:    arch/arm/mach-berlin/
  F:    arch/arm64/boot/dts/synaptics/
  
@@@ -2916,7 -2914,7 +2916,7 @@@ M:      Santosh Shilimkar <ssantosh@kernel.o
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git
 -F:    arch/arm/boot/dts/keystone-*
 +F:    arch/arm/boot/dts/ti/keystone/
  F:    arch/arm/mach-keystone/
  
  ARM/TEXAS INSTRUMENT KEYSTONE CLOCK FRAMEWORK
@@@ -2948,6 -2946,7 +2948,6 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/hwinfo/ti,k3-socinfo.yaml
  F:    arch/arm64/boot/dts/ti/Makefile
  F:    arch/arm64/boot/dts/ti/k3-*
 -F:    include/dt-bindings/pinctrl/k3.h
  
  ARM/TOSHIBA VISCONTI ARCHITECTURE
  M:    Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
@@@ -2980,7 -2979,7 +2980,7 @@@ F:      Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/gpio/socionext,uniphier-gpio.yaml
  F:    Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.yaml
  F:    Documentation/devicetree/bindings/soc/socionext/socionext,uniphier*.yaml
 -F:    arch/arm/boot/dts/uniphier*
 +F:    arch/arm/boot/dts/socionext/uniphier*
  F:    arch/arm/include/asm/hardware/cache-uniphier.h
  F:    arch/arm/mach-uniphier/
  F:    arch/arm/mm/cache-uniphier.c
@@@ -3005,7 -3004,7 +3005,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    */*/*/vexpress*
  F:    */*/vexpress*
 -F:    arch/arm/boot/dts/vexpress*
 +F:    arch/arm/boot/dts/arm/vexpress*
  F:    arch/arm/mach-versatile/
  F:    arch/arm64/boot/dts/arm/
  F:    drivers/clk/versatile/clk-vexpress-osc.c
@@@ -3063,7 -3062,7 +3063,7 @@@ M:      Will Deacon <will@kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git
 -F:    Documentation/arm64/
 +F:    Documentation/arch/arm64/
  F:    arch/arm64/
  F:    tools/testing/selftests/arm64/
  X:    arch/arm64/boot/dts/
@@@ -3385,16 -3384,6 +3385,16 @@@ F:    include/uapi/linux/audit.
  F:    kernel/audit*
  F:    lib/*audit.c
  
 +AUXILIARY BUS DRIVER
 +M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 +R:    Dave Ertman <david.m.ertman@intel.com>
 +R:    Ira Weiny <ira.weiny@intel.com>
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
 +F:    Documentation/driver-api/auxiliary_bus.rst
 +F:    drivers/base/auxiliary.c
 +F:    include/linux/auxiliary_bus.h
 +
  AUXILIARY DISPLAY DRIVERS
  M:    Miguel Ojeda <ojeda@kernel.org>
  S:    Maintained
@@@ -3422,10 -3411,10 +3422,10 @@@ AXENTIA ARM DEVICE
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/at91-linea.dtsi
 -F:    arch/arm/boot/dts/at91-natte.dtsi
 -F:    arch/arm/boot/dts/at91-nattis-2-natte-2.dts
 -F:    arch/arm/boot/dts/at91-tse850-3.dts
 +F:    arch/arm/boot/dts/microchip/at91-linea.dtsi
 +F:    arch/arm/boot/dts/microchip/at91-natte.dtsi
 +F:    arch/arm/boot/dts/microchip/at91-nattis-2-natte-2.dts
 +F:    arch/arm/boot/dts/microchip/at91-tse850-3.dts
  
  AXENTIA ASOC DRIVERS
  M:    Peter Rosin <peda@axentia.se>
@@@ -3624,7 -3613,6 +3624,7 @@@ S:      Supporte
  W:    http://www.bluez.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git
 +F:    Documentation/devicetree/bindings/net/bluetooth/
  F:    drivers/bluetooth/
  
  BLUETOOTH SUBSYSTEM
@@@ -3912,7 -3900,7 +3912,7 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/b44.*
  
  BROADCOM B53/SF2 ETHERNET SWITCH DRIVER
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  L:    netdev@vger.kernel.org
  L:    openwrt-devel@lists.openwrt.org (subscribers-only)
  S:    Supported
@@@ -3923,7 -3911,7 +3923,7 @@@ F:      include/linux/dsa/brcm.
  F:    include/linux/platform_data/b53.h
  
  BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@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-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -3937,7 -3925,7 +3937,7 @@@ N:      bcm283
  N:    raspberrypi
  
  BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  M:    Ray Jui <rjui@broadcom.com>
  M:    Scott Branden <sbranden@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
@@@ -3976,26 -3964,25 +3976,26 @@@ F:   Documentation/devicetree/bindings/pi
  F:    drivers/pinctrl/bcm/pinctrl-bcm4908.c
  
  BROADCOM BCM5301X ARM ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    RafaÅ‚ MiÅ‚ecki <zajec5@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/bcm470*
 -F:    arch/arm/boot/dts/bcm5301*
 -F:    arch/arm/boot/dts/bcm953012*
 +F:    arch/arm/boot/dts/broadcom/bcm-ns.dtsi
 +F:    arch/arm/boot/dts/broadcom/bcm470*
 +F:    arch/arm/boot/dts/broadcom/bcm5301*
 +F:    arch/arm/boot/dts/broadcom/bcm953012*
  F:    arch/arm/mach-bcm/bcm_5301x.c
  
  BROADCOM BCM53573 ARM ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    arch/arm/boot/dts/bcm47189*
 -F:    arch/arm/boot/dts/bcm53573*
 +F:    arch/arm/boot/dts/broadcom/bcm47189*
 +F:    arch/arm/boot/dts/broadcom/bcm53573*
  
  BROADCOM BCM63XX/BCM33XX UDC DRIVER
  M:    Kevin Cernekee <cernekee@gmail.com>
@@@ -4004,13 -3991,13 +4004,13 @@@ S:   Maintaine
  F:    drivers/usb/gadget/udc/bcm63xx_udc.*
  
  BROADCOM BCM7XXX ARM ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
 -F:    arch/arm/boot/dts/bcm7*.dts*
 +F:    arch/arm/boot/dts/broadcom/bcm7*.dts*
  F:    arch/arm/include/asm/hardware/cache-b15-rac.h
  F:    arch/arm/mach-bcm/*brcmstb*
  F:    arch/arm/mm/cache-b15-rac.c
@@@ -4024,7 -4011,7 +4024,7 @@@ BROADCOM BCMBCA ARM ARCHITECTUR
  M:    William Zhang <william.zhang@broadcom.com>
  M:    Anand Gore <anand.gore@broadcom.com>
  M:    Kursad Oney <kursad.oney@broadcom.com>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -4049,7 -4036,7 +4049,7 @@@ N:      bcm[9]?685
  N:    bcm[9]?6878
  
  BROADCOM BDC DRIVER
 -M:    Justin Chen <justinpopo6@gmail.com>
 +M:    Justin Chen <justin.chen@broadcom.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-usb@vger.kernel.org
@@@ -4065,7 -4052,7 +4065,7 @@@ S:      Maintaine
  F:    drivers/cpufreq/bmips-cpufreq.c
  
  BROADCOM BMIPS MIPS ARCHITECTURE
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mips@vger.kernel.org
  S:    Maintained
@@@ -4133,14 -4120,14 +4133,14 @@@ F:   drivers/net/wireless/broadcom/brcm80
  
  BROADCOM BRCMSTB GPIO DRIVER
  M:    Doug Berger <opendmb@gmail.com>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  S:    Supported
  F:    Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.yaml
  F:    drivers/gpio/gpio-brcmstb.c
  
  BROADCOM BRCMSTB I2C DRIVER
 -M:    Kamal Dasu <kdasu.kdev@gmail.com>
 +M:    Kamal Dasu <kamal.dasu@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-i2c@vger.kernel.org
  S:    Supported
@@@ -4156,7 -4143,7 +4156,7 @@@ F:      Documentation/devicetree/bindings/se
  F:    drivers/tty/serial/8250/8250_bcm7271.c
  
  BROADCOM BRCMSTB USB EHCI DRIVER
 -M:    Justin Chen <justinpopo6@gmail.com>
 +M:    Justin Chen <justin.chen@broadcom.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-usb@vger.kernel.org
@@@ -4173,7 -4160,7 +4173,7 @@@ F:      Documentation/devicetree/bindings/us
  F:    drivers/usb/misc/brcmstb-usb-pinmap.c
  
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
 -M:    Justin Chen <justinpopo6@gmail.com>
 +M:    Justin Chen <justin.chen@broadcom.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-kernel@vger.kernel.org
@@@ -4192,7 -4179,7 +4192,7 @@@ F:      drivers/spi/spi-bcm63xx-hsspi.
  F:    drivers/spi/spi-bcmbca-hsspi.c
  
  BROADCOM ETHERNET PHY DRIVERS
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -4203,7 -4190,7 +4203,7 @@@ F:      include/linux/brcmphy.
  
  BROADCOM GENET ETHERNET DRIVER
  M:    Doug Berger <opendmb@gmail.com>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -4287,7 -4274,7 +4287,7 @@@ F:      drivers/firmware/broadcom/
  
  BROADCOM PMB (POWER MANAGEMENT BUS) DRIVER
  M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
@@@ -4303,7 -4290,7 +4303,7 @@@ F:      drivers/bcma
  F:    include/linux/bcma/
  
  BROADCOM SPI DRIVER
 -M:    Kamal Dasu <kdasu.kdev@gmail.com>
 +M:    Kamal Dasu <kamal.dasu@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/spi/brcm,spi-bcm-qspi.yaml
@@@ -4337,7 -4324,7 +4337,7 @@@ F:      drivers/memory/brcmstb_dpfe.
  
  BROADCOM STB NAND FLASH DRIVER
  M:    Brian Norris <computersforpeace@gmail.com>
 -M:    Kamal Dasu <kdasu.kdev@gmail.com>
 +M:    Kamal Dasu <kamal.dasu@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
@@@ -4347,7 -4334,7 +4347,7 @@@ F:      include/linux/platform_data/brcmnand
  BROADCOM STB PCIE DRIVER
  M:    Jim Quinlan <jim2101024@gmail.com>
  M:    Nicolas Saenz Julienne <nsaenz@kernel.org>
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
@@@ -4355,7 -4342,7 +4355,7 @@@ F:      Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pcie-brcmstb.c
  
  BROADCOM SYSTEMPORT ETHERNET DRIVER
 -M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Florian Fainelli <florian.fainelli@broadcom.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -4500,13 -4487,6 +4500,13 @@@ S:    Supporte
  F:    Documentation/filesystems/caching/cachefiles.rst
  F:    fs/cachefiles/
  
 +CACHESTAT: PAGE CACHE STATS FOR A FILE
 +M:    Nhat Pham <nphamcs@gmail.com>
 +M:    Johannes Weiner <hannes@cmpxchg.org>
 +L:    linux-mm@kvack.org
 +S:    Maintained
 +F:    tools/testing/selftests/cachestat/test_cachestat.c
 +
  CADENCE MIPI-CSI2 BRIDGES
  M:    Maxime Ripard <mripard@kernel.org>
  L:    linux-media@vger.kernel.org
@@@ -4540,12 -4520,6 +4540,12 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    drivers/usb/cdns3/
  X:    drivers/usb/cdns3/cdns3*
  
 +CADENCE USBHS DRIVER
 +M:    Pawel Laszczak <pawell@cadence.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/gadget/udc/cdns2
 +
  CADET FM/AM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -5220,13 -5194,6 +5220,13 @@@ S:    Maintaine
  F:    drivers/cxl/
  F:    include/uapi/linux/cxl_mem.h
  
 +COMPUTE EXPRESS LINK PMU (CPMU)
 +M:    Jonathan Cameron <jonathan.cameron@huawei.com>
 +L:    linux-cxl@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/admin-guide/perf/cxl.rst
 +F:    drivers/perf/cxl_pmu.c
 +
  CONEXANT ACCESSRUNNER USB DRIVER
  L:    accessrunner-general@lists.sourceforge.net
  S:    Orphan
@@@ -5377,18 -5344,6 +5377,18 @@@ F:    include/linux/sched/cpufreq.
  F:    kernel/sched/cpufreq*.c
  F:    tools/testing/selftests/cpufreq/
  
 +CPU HOTPLUG
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +M:    Peter Zijlstra <peterz@infradead.org>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git smp/core
 +F:    kernel/cpu.c
 +F:    kernel/smpboot.*
 +F:    include/linux/cpu.h
 +F:    include/linux/cpuhotplug.h
 +F:    include/linux/smpboot.h
 +
  CPU IDLE TIME MANAGEMENT FRAMEWORK
  M:    "Rafael J. Wysocki" <rafael@kernel.org>
  M:    Daniel Lezcano <daniel.lezcano@linaro.org>
@@@ -5757,7 -5712,10 +5757,7 @@@ DC395x SCSI drive
  M:    Oliver Neukum <oliver@neukum.org>
  M:    Ali Akcaagac <aliakc@web.de>
  M:    Jamie Lenehan <lenehan@twibble.org>
 -L:    dc395x@twibble.org
  S:    Maintained
 -W:    http://twibble.org/dist/dc395x/
 -W:    http://lists.twibble.org/mailman/listinfo/dc395x/
  F:    Documentation/scsi/dc395x.rst
  F:    drivers/scsi/dc395x.*
  
@@@ -5867,7 -5825,6 +5867,7 @@@ M:      Armin Wolf <W_Armin@gmx.de
  S:    Maintained
  F:    Documentation/ABI/testing/debugfs-dell-wmi-ddv
  F:    Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
 +F:    Documentation/wmi/devices/dell-wmi-ddv.rst
  F:    drivers/platform/x86/dell/dell-wmi-ddv.c
  
  DELL WMI DESCRIPTOR DRIVER
@@@ -6049,15 -6006,15 +6049,15 @@@ DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD S
  M:    Christoph Niedermaier <cniedermaier@dh-electronics.com>
  L:    kernel@dh-electronics.com
  S:    Maintained
 -F:    arch/arm/boot/dts/imx6*-dhcom-*
 -F:    arch/arm/boot/dts/imx6*-dhcor-*
 +F:    arch/arm/boot/dts/nxp/imx/imx6*-dhcom-*
 +F:    arch/arm/boot/dts/nxp/imx/imx6*-dhcor-*
  
  DH ELECTRONICS STM32MP1 DHCOM/DHCOR BOARD SUPPORT
  M:    Marek Vasut <marex@denx.de>
  L:    kernel@dh-electronics.com
  S:    Maintained
 -F:    arch/arm/boot/dts/stm32mp1*-dhcom-*
 -F:    arch/arm/boot/dts/stm32mp1*-dhcor-*
 +F:    arch/arm/boot/dts/st/stm32mp1*-dhcom-*
 +F:    arch/arm/boot/dts/st/stm32mp1*-dhcor-*
  
  DIALOG SEMICONDUCTOR DRIVERS
  M:    Support Opensource <support.opensource@diasemi.com>
@@@ -6270,12 -6227,6 +6270,12 @@@ X:    Documentation/power
  X:    Documentation/spi/
  X:    Documentation/userspace-api/media/
  
 +DOCUMENTATION PROCESS
 +M:    Jonathan Corbet <corbet@lwn.net>
 +S:    Maintained
 +F:    Documentation/process/
 +L:    workflows@vger.kernel.org
 +
  DOCUMENTATION REPORTING ISSUES
  M:    Thorsten Leemhuis <linux@leemhuis.info>
  L:    linux-doc@vger.kernel.org
@@@ -6632,7 -6583,6 +6632,7 @@@ M:      Rob Clark <robdclark@gmail.com
  M:    Abhinav Kumar <quic_abhinavk@quicinc.com>
  M:    Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
  R:    Sean Paul <sean@poorly.run>
 +R:    Marijn Suijten <marijn.suijten@somainline.org>
  L:    linux-arm-msm@vger.kernel.org
  L:    dri-devel@lists.freedesktop.org
  L:    freedreno@lists.freedesktop.org
@@@ -6753,12 -6703,6 +6753,12 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/display/panel/samsung,s6d27a1.yaml
  F:    drivers/gpu/drm/panel/panel-samsung-s6d27a1.c
  
 +DRM DRIVER FOR SAMSUNG S6D7AA0 PANELS
 +M:    Artur Weber <aweber.kernel@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/samsung,s6d7aa0.yaml
 +F:    drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c
 +
  DRM DRIVER FOR SITRONIX ST7586 PANELS
  M:    David Lechner <david@lechnology.com>
  S:    Maintained
@@@ -6831,7 -6775,6 +6831,7 @@@ F:      drivers/gpu/drm/udl
  DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
  M:    Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
  M:    Melissa Wen <melissa.srw@gmail.com>
 +M:    Maíra Canal <mairacanal@riseup.net>
  R:    Haneen Mohammed <hamohammed.sa@gmail.com>
  R:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
@@@ -6934,7 -6877,6 +6934,7 @@@ S:      Maintaine
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/bridge/
  F:    drivers/gpu/drm/bridge/
 +F:    drivers/gpu/drm/drm_bridge.c
  F:    include/drm/drm_bridge.h
  
  DRM DRIVERS FOR EXYNOS
@@@ -7043,7 -6985,8 +7043,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.yaml
  F:    Documentation/devicetree/bindings/display/bridge/renesas,lvds.yaml
  F:    Documentation/devicetree/bindings/display/renesas,du.yaml
 -F:    drivers/gpu/drm/rcar-du/
 -F:    drivers/gpu/drm/shmobile/
 +F:    drivers/gpu/drm/renesas/
  F:    include/linux/platform_data/shmob_drm.h
  
  DRM DRIVERS FOR ROCKCHIP
@@@ -7139,6 -7082,7 +7139,6 @@@ F:      Documentation/gpu/xen-front.rs
  F:    drivers/gpu/drm/xen/
  
  DRM DRIVERS FOR XILINX
 -M:    Hyun Kwon <hyun.kwon@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
@@@ -7538,14 -7482,6 +7538,14 @@@ L:    linux-edac@vger.kernel.or
  S:    Maintained
  F:    drivers/edac/mpc85xx_edac.[ch]
  
 +EDAC-NPCM
 +M:    Marvin Lin <kflin@nuvoton.com>
 +M:    Stanley Chu <yschu@nuvoton.com>
 +L:    linux-edac@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/memory-controllers/nuvoton,npcm-memory-controller.yaml
 +F:    drivers/edac/npcm_edac.c
 +
  EDAC-PASEMI
  M:    Egor Martovetsky <egor@pasemi.com>
  L:    linux-edac@vger.kernel.org
@@@ -8042,12 -7978,6 +8042,12 @@@ S:    Maintaine
  F:    drivers/hwmon/f75375s.c
  F:    include/linux/f75375s.h
  
 +FINTEK F81604 USB to 2xCANBUS DEVICE DRIVER
 +M:    Ji-Ze Hong (Peter Hong) <peter_hong@fintek.com.tw>
 +L:    linux-can@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/can/usb/f81604.c
 +
  FIREWIRE AUDIO DRIVERS and IEC 61883-1/6 PACKET STREAMING ENGINE
  M:    Clemens Ladisch <clemens@ladisch.de>
  M:    Takashi Sakamoto <o-takashi@sakamocchi.jp>
@@@ -8143,7 -8073,6 +8143,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
  F:    lib/memcpy_kunit.c
 +F:    lib/strcat_kunit.c
  F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
@@@ -8742,9 -8671,6 +8742,9 @@@ F:      drivers/input/touchscreen/resistive-
  GENERIC STRING LIBRARY
  R:    Andy Shevchenko <andy@kernel.org>
  S:    Maintained
 +F:    include/linux/string.h
 +F:    include/linux/string_choices.h
 +F:    include/linux/string_helpers.h
  F:    lib/string.c
  F:    lib/string_helpers.c
  F:    lib/test-string_helpers.c
@@@ -9238,12 -9164,6 +9238,12 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/hid/hid-pxrc.c
  
 +HID NVIDIA SHIELD DRIVER
 +M:    Rahul Rameshbabu <rrameshbabu@nvidia.com>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-nvidia-shield.c
 +
  HID PLAYSTATION DRIVER
  M:    Roderick Colenbrander <roderick.colenbrander@sony.com>
  L:    linux-input@vger.kernel.org
@@@ -9507,13 -9427,6 +9507,13 @@@ F:    lib/test_hmm
  F:    mm/hmm*
  F:    tools/testing/selftests/mm/*hmm*
  
 +HONEYWELL MPRLS0025PA PRESSURE SENSOR SERIES IIO DRIVER
 +M:    Andreas Klinger <ak@it-klinger.de>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml
 +F:    drivers/iio/pressure/mprls0025pa.c
 +
  HOST AP DRIVER
  M:    Jouni Malinen <j@w1.fi>
  L:    linux-wireless@vger.kernel.org
@@@ -9526,13 -9439,6 +9526,13 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Orphan
  F:    drivers/platform/x86/hp/tc1100-wmi.c
  
 +HP WMI HARDWARE MONITOR DRIVER
 +M:    James Seo <james@equiv.tech>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/hwmon/hp-wmi-sensors.rst
 +F:    drivers/hwmon/hp-wmi-sensors.c
 +
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
  S:    Maintained
@@@ -10358,13 -10264,6 +10358,13 @@@ L: linux-fbdev@vger.kernel.or
  S:    Maintained
  F:    drivers/video/fbdev/i810/
  
 +INTEL 8254 COUNTER DRIVER
 +M:    William Breathitt Gray <william.gray@linaro.org>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/counter/i8254.c
 +F:    include/linux/i8254.h
 +
  INTEL 8255 GPIO DRIVER
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-gpio@vger.kernel.org
@@@ -10447,8 -10346,9 +10447,8 @@@ M:   Jesse Brandeburg <jesse.brandeburg@i
  M:    Tony Nguyen <anthony.l.nguyen@intel.com>
  L:    intel-wired-lan@lists.osuosl.org (moderated for non-subscribers)
  S:    Supported
 -W:    http://www.intel.com/support/feedback.htm
 -W:    http://e1000.sourceforge.net/
 -Q:    http://patchwork.ozlabs.org/project/intel-wired-lan/list/
 +W:    https://www.intel.com/content/www/us/en/support.html
 +Q:    https://patchwork.ozlabs.org/project/intel-wired-lan/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue.git
  F:    Documentation/networking/device_drivers/ethernet/intel/
@@@ -10914,6 -10814,7 +10914,6 @@@ S:   Maintaine
  F:    drivers/net/ethernet/sgi/ioc3-eth.c
  
  IOMAP FILESYSTEM LIBRARY
 -M:    Christoph Hellwig <hch@infradead.org>
  M:    Darrick J. Wong <djwong@kernel.org>
  L:    linux-xfs@vger.kernel.org
  L:    linux-fsdevel@vger.kernel.org
@@@ -11374,10 -11275,6 +11374,10 @@@ W: http://kernelnewbies.org/KernelJanit
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    Chuck Lever <chuck.lever@oracle.com>
  M:    Jeff Layton <jlayton@kernel.org>
 +R:    Neil Brown <neilb@suse.de>
 +R:    Olga Kornievskaia <kolga@netapp.com>
 +R:    Dai Ngo <Dai.Ngo@oracle.com>
 +R:    Tom Talpey <tom@talpey.com>
  L:    linux-nfs@vger.kernel.org
  S:    Supported
  W:    http://nfs.sourceforge.net/
@@@ -11435,8 -11332,6 +11435,8 @@@ L:   linux-kselftest@vger.kernel.or
  L:    kunit-dev@googlegroups.com
  S:    Maintained
  W:    https://google.github.io/kunit-docs/third_party/kernel/docs/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kunit
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git kunit-fixes
  F:    Documentation/dev-tools/kunit/
  F:    include/kunit/
  F:    lib/kunit/
@@@ -11485,6 -11380,7 +11485,6 @@@ F:   tools/testing/selftests/kvm/aarch64
  
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
  M:    Huacai Chen <chenhuacai@kernel.org>
 -M:    Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>
  L:    linux-mips@vger.kernel.org
  L:    kvm@vger.kernel.org
  S:    Maintained
@@@ -11494,13 -11390,7 +11494,13 @@@ F: arch/mips/include/uapi/asm/kvm
  F:    arch/mips/kvm/
  
  KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
 +M:    Michael Ellerman <mpe@ellerman.id.au>
 +R:    Nicholas Piggin <npiggin@gmail.com>
  L:    linuxppc-dev@lists.ozlabs.org
 +L:    kvm@vger.kernel.org
 +S:    Maintained (Book3S 64-bit HV)
 +S:    Odd fixes (Book3S 64-bit PR)
 +S:    Orphan (Book3E and 32-bit)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git topic/ppc-kvm
  F:    arch/powerpc/include/asm/kvm*
  F:    arch/powerpc/include/uapi/asm/kvm*
@@@ -11546,6 -11436,7 +11546,7 @@@ M:   Sean Christopherson <seanjc@google.c
  M:    Paolo Bonzini <pbonzini@redhat.com>
  L:    kvm@vger.kernel.org
  S:    Supported
+ P:    Documentation/process/maintainer-kvm-x86.rst
  T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
  F:    arch/x86/include/asm/kvm*
  F:    arch/x86/include/asm/svm.h
@@@ -11862,7 -11753,7 +11863,7 @@@ LEGO MINDSTORMS EV
  R:    David Lechner <david@lechnology.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/power/supply/lego,ev3-battery.yaml
 -F:    arch/arm/boot/dts/da850-lego-ev3.dts
 +F:    arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts
  F:    drivers/power/supply/lego_ev3_battery.c
  
  LEGO USB Tower driver
@@@ -12033,12 -11924,11 +12034,12 @@@ F:        lib/linear_ranges.
  F:    lib/test_linear_ranges.c
  
  LINUX FOR POWER MACINTOSH
 -M:    Benjamin Herrenschmidt <benh@kernel.crashing.org>
  L:    linuxppc-dev@lists.ozlabs.org
 -S:    Odd Fixes
 +S:    Orphan
  F:    arch/powerpc/platforms/powermac/
  F:    drivers/macintosh/
 +X:    drivers/macintosh/adb-iop.c
 +X:    drivers/macintosh/via-macii.c
  
  LINUX FOR POWERPC (32-BIT AND 64-BIT)
  M:    Michael Ellerman <mpe@ellerman.id.au>
@@@ -12657,11 -12547,12 +12658,11 @@@ MARVELL NAND CONTROLLER DRIVE
  M:    Miquel Raynal <miquel.raynal@bootlin.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/mtd/marvell-nand.txt
  F:    drivers/mtd/nand/raw/marvell_nand.c
  
  MARVELL OCTEON ENDPOINT DRIVER
  M:    Veerasenareddy Burru <vburru@marvell.com>
 -M:    Abhijit Ayarekar <aayarekar@marvell.com>
 +M:    Sathesh Edara <sedara@marvell.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/marvell/octeon_ep
@@@ -12743,15 -12634,6 +12744,15 @@@ F: Documentation/userspace-api/media/dr
  F:    drivers/media/i2c/max2175*
  F:    include/uapi/linux/max2175.h
  
 +MAX31827 TEMPERATURE SWITCH DRIVER
 +M:    Daniel Matyas <daniel.matyas@analog.com>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Supported
 +W:    http://ez.analog.com/community/linux-device-drivers
 +F:    Documentation/devicetree/bindings/hwmon/adi,max31827.yaml
 +F:    Documentation/hwmon/max31827.rst
 +F:    drivers/hwmon/max31827.c
 +
  MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  L:    linux-hwmon@vger.kernel.org
  S:    Orphan
@@@ -12969,13 -12851,6 +12970,13 @@@ F: Documentation/devicetree/bindings/ne
  F:    drivers/net/ieee802154/mcr20a.c
  F:    drivers/net/ieee802154/mcr20a.h
  
 +MDIO REGMAP DRIVER
 +M:    Maxime Chevallier <maxime.chevallier@bootlin.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/mdio/mdio-regmap.c
 +F:    include/linux/mdio/mdio-regmap.h
 +
  MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-iio@vger.kernel.org
@@@ -13275,15 -13150,6 +13276,15 @@@ S: Maintaine
  F:    drivers/net/pcs/pcs-mtk-lynxi.c
  F:    include/linux/pcs/pcs-mtk-lynxi.h
  
 +MEDIATEK ETHERNET PHY DRIVERS
 +M:    Daniel Golle <daniel@makrotopia.org>
 +M:    Qingfang Deng <dqfext@gmail.com>
 +M:    SkyLake Huang <SkyLake.Huang@mediatek.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/phy/mediatek-ge-soc.c
 +F:    drivers/net/phy/mediatek-ge.c
 +
  MEDIATEK I2C CONTROLLER DRIVER
  M:    Qii Wang <qii.wang@mediatek.com>
  L:    linux-i2c@vger.kernel.org
@@@ -13345,7 -13211,6 +13346,7 @@@ R:   Shayne Chen <shayne.chen@mediatek.co
  R:    Sean Wang <sean.wang@mediatek.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
 +T:    git https://github.com/nbd168/wireless
  F:    Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
  F:    drivers/net/wireless/mediatek/mt76/
  
@@@ -13380,12 -13245,6 +13381,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
  F:    drivers/i2c/busses/i2c-mt7621.c
  
 +MEDIATEK MTMIPS CLOCK DRIVER
 +M:    Sergio Paracuellos <sergio.paracuellos@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/clock/mediatek,mtmips-sysc.yaml
 +F:    drivers/clk/ralink/clk-mtmips.c
 +
  MEDIATEK NAND CONTROLLER DRIVER
  L:    linux-mtd@lists.infradead.org
  S:    Orphan
@@@ -13781,7 -13640,6 +13782,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/ABI/stable/sysfs-bus-mhi
  F:    Documentation/mhi/
  F:    drivers/bus/mhi/
 +F:    drivers/pci/endpoint/functions/pci-epf-mhi.c
  F:    include/linux/mhi.h
  
  MICROBLAZE ARCHITECTURE
@@@ -13864,7 -13722,6 +13865,7 @@@ MICROCHIP EIC DRIVE
  M:    Claudiu Beznea <claudiu.beznea@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
 +F:    Documentation/devicetree/bindings/interrupt-controller/microchip,sama7g5-eic.yaml
  F:    drivers/irqchip/irq-mchp-eic.c
  
  MICROCHIP I2C DRIVER
@@@ -14191,12 -14048,12 +14192,12 @@@ MIKROTIK CRS3XX 98DX3236 BOARD SUPPOR
  M:    Luka Kovacic <luka.kovacic@sartura.hr>
  M:    Luka Perkov <luka.perkov@sartura.hr>
  S:    Maintained
 -F:    arch/arm/boot/dts/armada-xp-crs305-1g-4s-bit.dts
 -F:    arch/arm/boot/dts/armada-xp-crs305-1g-4s.dts
 -F:    arch/arm/boot/dts/armada-xp-crs326-24g-2s-bit.dts
 -F:    arch/arm/boot/dts/armada-xp-crs326-24g-2s.dts
 -F:    arch/arm/boot/dts/armada-xp-crs328-4c-20s-4s-bit.dts
 -F:    arch/arm/boot/dts/armada-xp-crs328-4c-20s-4s.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s-bit.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s-bit.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s-bit.dts
 +F:    arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dts
  
  MIPI CCS, SMIA AND SMIA++ IMAGE SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
@@@ -14299,7 -14156,7 +14300,7 @@@ R:   Lubomir Rintel <lkundrak@v3.sk
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Odd Fixes
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lkundrak/linux-mmp.git
 -F:    arch/arm/boot/dts/mmp*
 +F:    arch/arm/boot/dts/marvell/mmp*
  F:    arch/arm/mach-mmp/
  F:    include/linux/soc/mmp/
  
@@@ -14839,7 -14696,7 +14840,7 @@@ NETWORKING [LABELED] (NetLabel, Labele
  M:    Paul Moore <paul@paul-moore.com>
  L:    netdev@vger.kernel.org
  L:    linux-security-module@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  W:    https://github.com/netlabel
  F:    Documentation/netlabel/
  F:    include/net/calipso.h
@@@ -14875,7 -14732,6 +14876,7 @@@ NETWORKING [TCP
  M:    Eric Dumazet <edumazet@google.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 +F:    include/linux/net_mm.h
  F:    include/linux/tcp.h
  F:    include/net/tcp.h
  F:    include/trace/events/tcp.h
@@@ -15432,13 -15288,19 +15433,13 @@@ M:        Tony Lindgren <tony@atomide.com
  L:    linux-omap@vger.kernel.org
  L:    devicetree@vger.kernel.org
  S:    Maintained
 -F:    arch/arm/boot/dts/*am3*
 -F:    arch/arm/boot/dts/*am4*
 -F:    arch/arm/boot/dts/*am5*
 -F:    arch/arm/boot/dts/*dra7*
 -F:    arch/arm/boot/dts/*omap*
 -F:    arch/arm/boot/dts/logicpd-som-lv*
 -F:    arch/arm/boot/dts/logicpd-torpedo*
 +F:    arch/arm/boot/dts/ti/omap/
  
  OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2)
  L:    linux-omap@vger.kernel.org
  L:    linux-fbdev@vger.kernel.org
  S:    Orphan
 -F:    Documentation/arm/omap/dss.rst
 +F:    Documentation/arch/arm/omap/dss.rst
  F:    drivers/video/fbdev/omap2/
  
  OMAP FRAMEBUFFER SUPPORT
@@@ -15540,7 -15402,7 +15541,7 @@@ OMAP/NEWFLOW NANOBONE MACHINE SUPPOR
  M:    Mark Jackson <mpfj@newflow.co.uk>
  L:    linux-omap@vger.kernel.org
  S:    Maintained
 -F:    arch/arm/boot/dts/am335x-nano.dts
 +F:    arch/arm/boot/dts/ti/omap/am335x-nano.dts
  
  OMAP1 SUPPORT
  M:    Aaro Koskinen <aaro.koskinen@iki.fi>
@@@ -15567,7 -15429,6 +15568,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    arch/arm/configs/omap2plus_defconfig
  F:    arch/arm/mach-omap2/
  F:    drivers/bus/ti-sysc.c
 +F:    drivers/gpio/gpio-tps65219.c
  F:    drivers/i2c/busses/i2c-omap.c
  F:    drivers/irqchip/irq-omap-intc.c
  F:    drivers/mfd/*omap*.c
@@@ -15988,7 -15849,6 +15989,7 @@@ F:   include/media/i2c/ov2659.
  
  OVERLAY FILESYSTEM
  M:    Miklos Szeredi <miklos@szeredi.hu>
 +M:    Amir Goldstein <amir73il@gmail.com>
  L:    linux-unionfs@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git
@@@ -16091,7 -15951,7 +16092,7 @@@ F:   include/uapi/linux/ppdev.
  
  PARAVIRT_OPS INTERFACE
  M:    Juergen Gross <jgross@suse.com>
 -M:    Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
 +R:    Ajay Kaher <akaher@vmware.com>
  R:    Alexey Makhalov <amakhalov@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    virtualization@lists.linux-foundation.org
@@@ -16834,7 -16694,7 +16835,7 @@@ PIN CONTROLLER - QUALCOM
  M:    Bjorn Andersson <andersson@kernel.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/pinctrl/qcom,*.txt
 +F:    Documentation/devicetree/bindings/pinctrl/qcom,*
  F:    drivers/pinctrl/qcom/
  
  PIN CONTROLLER - RENESAS
@@@ -17289,7 -17149,7 +17290,7 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://github.com/hzhuang1/linux.git
  T:    git git://github.com/rjarzmik/linux.git
 -F:    arch/arm/boot/dts/pxa*
 +F:    arch/arm/boot/dts/intel/pxa/
  F:    arch/arm/mach-pxa/
  F:    drivers/dma/pxa*
  F:    drivers/pcmcia/pxa2xx*
@@@ -17327,7 -17187,6 +17328,7 @@@ F:   sound/soc/codecs/wcd9335.
  F:    sound/soc/codecs/wcd934x.c
  F:    sound/soc/codecs/wsa881x.c
  F:    sound/soc/codecs/wsa883x.c
 +F:    sound/soc/codecs/wsa884x.c
  F:    sound/soc/qcom/
  
  QCOM EMBEDDED USB DEBUGGER (EUD)
@@@ -17502,8 -17361,6 +17503,8 @@@ QUALCOMM ATHEROS ATH11K WIRELESS DRIVE
  M:    Kalle Valo <kvalo@kernel.org>
  L:    ath11k@lists.infradead.org
  S:    Supported
 +W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath11k
 +B:    https://wireless.wiki.kernel.org/en/users/Drivers/ath11k/bugreport
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
  F:    Documentation/devicetree/bindings/net/wireless/qcom,ath11k.yaml
  F:    drivers/net/wireless/ath/ath11k/
@@@ -17513,7 -17370,6 +17514,7 @@@ M:   Toke Høiland-Jørgensen <toke@toke.
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/ath9k
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
  F:    Documentation/devicetree/bindings/net/wireless/qca,ath9k.yaml
  F:    drivers/net/wireless/ath/ath9k/
  
@@@ -17546,8 -17402,6 +17547,8 @@@ F:   include/dt-bindings/clock/qcom,
  
  QUALCOMM CLOUD AI (QAIC) DRIVER
  M:    Jeffrey Hugo <quic_jhugo@quicinc.com>
 +R:    Carl Vanderlip <quic_carlv@quicinc.com>
 +R:    Pranjal Ramajor Asha Kanojiya <quic_pkanojiy@quicinc.com>
  L:    linux-arm-msm@vger.kernel.org
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
@@@ -17700,14 -17554,6 +17701,14 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
  F:    drivers/thermal/qcom/
  
 +QUALCOMM TYPEC PORT MANAGER DRIVER
 +M:    Bryan O'Donoghue <bryan.odonoghue@linaro.org>
 +L:    linux-arm-msm@vger.kernel.org
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/qcom,pmic-*.yaml
 +F:    drivers/usb/typec/tcpm/qcom/
 +
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
  M:    Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
  M:    Vikash Garodia <quic_vgarodia@quicinc.com>
@@@ -17953,7 -17799,7 +17954,7 @@@ M:   Boqun Feng <boqun.feng@gmail.com
  R:    Steven Rostedt <rostedt@goodmis.org>
  R:    Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  R:    Lai Jiangshan <jiangshanlai@gmail.com>
 -R:    Zqiang <qiang1.zhang@intel.com>
 +R:    Zqiang <qiang.zhang1211@gmail.com>
  L:    rcu@vger.kernel.org
  S:    Supported
  W:    http://www.rdrop.com/users/paulmck/RCU/
@@@ -18225,13 -18071,6 +18226,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/clock/renesas,versaclock7.yaml
  F:    drivers/clk/clk-versaclock7.c
  
 +RENESAS X9250 DIGITAL POTENTIOMETERS DRIVER
 +M:    Herve Codina <herve.codina@bootlin.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/potentiometer/renesas,x9250.yaml
 +F:    drivers/iio/potentiometer/x9250.c
 +
  RESET CONTROLLER FRAMEWORK
  M:    Philipp Zabel <p.zabel@pengutronix.de>
  S:    Maintained
@@@ -18343,8 -18182,6 +18344,8 @@@ Q:   https://patchwork.kernel.org/project
  T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
  F:    Documentation/devicetree/bindings/riscv/
  F:    arch/riscv/boot/dts/
 +X:    arch/riscv/boot/dts/allwinner/
 +X:    arch/riscv/boot/dts/renesas/
  
  RISC-V PMU DRIVERS
  M:    Atish Patra <atishp@atishpatra.org>
@@@ -18355,14 -18192,6 +18356,14 @@@ F: drivers/perf/riscv_pmu.
  F:    drivers/perf/riscv_pmu_legacy.c
  F:    drivers/perf/riscv_pmu_sbi.c
  
 +RISC-V THEAD SoC SUPPORT
 +M:    Jisheng Zhang <jszhang@kernel.org>
 +M:    Guo Ren <guoren@kernel.org>
 +M:    Fu Wei <wefu@redhat.com>
 +L:    linux-riscv@lists.infradead.org
 +S:    Maintained
 +F:    arch/riscv/boot/dts/thead/
 +
  RNBD BLOCK DRIVERS
  M:    Md. Haris Iqbal <haris.iqbal@ionos.com>
  M:    Jack Wang <jinpu.wang@ionos.com>
@@@ -18444,11 -18273,10 +18445,11 @@@ S:        Maintaine
  F:    Documentation/devicetree/bindings/iio/light/bh1750.yaml
  F:    drivers/iio/light/bh1750.c
  
 -ROHM BU27034 AMBIENT LIGHT SENSOR DRIVER
 +ROHM BU270xx LIGHT SENSOR DRIVERs
  M:    Matti Vaittinen <mazziesaccount@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
 +F:    drivers/iio/light/rohm-bu27008.c
  F:    drivers/iio/light/rohm-bu27034.c
  
  ROHM MULTIFUNCTION BD9571MWV-M PMIC DEVICE DRIVERS
@@@ -18947,7 -18775,7 +18948,7 @@@ SANCLOUD BEAGLEBONE ENHANCED DEVICE TRE
  M:    Paul Barker <paul.barker@sancloud.com>
  R:    Marc Murphy <marc.murphy@sancloud.com>
  S:    Supported
 -F:    arch/arm/boot/dts/am335x-sancloud*
 +F:    arch/arm/boot/dts/ti/omap/am335x-sancloud*
  
  SC1200 WDT DRIVER
  M:    Zwane Mwaikambo <zwanem@gmail.com>
@@@ -18974,16 -18802,6 +18975,16 @@@ F: include/linux/wait.
  F:    include/uapi/linux/sched.h
  F:    kernel/sched/
  
 +SCSI LIBSAS SUBSYSTEM
 +R:    John Garry <john.g.garry@oracle.com>
 +R:    Jason Yan <yanaijie@huawei.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/scsi/libsas/
 +F:    include/scsi/libsas.h
 +F:    include/scsi/sas_ata.h
 +F:    Documentation/scsi/libsas.rst
 +
  SCSI RDMA PROTOCOL (SRP) INITIATOR
  M:    Bart Van Assche <bvanassche@acm.org>
  L:    linux-rdma@vger.kernel.org
@@@ -19112,7 -18930,7 +19113,7 @@@ K:   \bsecure_computin
  K:    \bTIF_SECCOMP\b
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
 -M:    Kamal Dasu <kdasu.kdev@gmail.com>
 +M:    Kamal Dasu <kamal.dasu@broadcom.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mmc@vger.kernel.org
@@@ -19786,15 -19604,15 +19787,15 @@@ F:        include/uapi/linux/raid
  SOLIDRUN CLEARFOG SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
  S:    Maintained
 -F:    arch/arm/boot/dts/armada-388-clearfog*
 -F:    arch/arm/boot/dts/armada-38x-solidrun-*
 +F:    arch/arm/boot/dts/marvell/armada-388-clearfog*
 +F:    arch/arm/boot/dts/marvell/armada-38x-solidrun-*
  
  SOLIDRUN CUBOX-I/HUMMINGBOARD SUPPORT
  M:    Russell King <linux@armlinux.org.uk>
  S:    Maintained
 -F:    arch/arm/boot/dts/imx6*-cubox-i*
 -F:    arch/arm/boot/dts/imx6*-hummingboard*
 -F:    arch/arm/boot/dts/imx6*-sr-*
 +F:    arch/arm/boot/dts/nxp/imx/imx6*-cubox-i*
 +F:    arch/arm/boot/dts/nxp/imx/imx6*-hummingboard*
 +F:    arch/arm/boot/dts/nxp/imx/imx6*-sr-*
  
  SONIC NETWORK DRIVER
  M:    Thomas Bogendoerfer <tsbogend@alpha.franken.de>
@@@ -20079,7 -19897,7 +20080,7 @@@ M:   soc@kernel.or
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  W:    http://www.st.com/spear
 -F:    arch/arm/boot/dts/spear*
 +F:    arch/arm/boot/dts/st/spear*
  F:    arch/arm/mach-spear/
  F:    drivers/clk/spear/
  F:    drivers/pinctrl/spear/
@@@ -20318,13 -20136,6 +20319,13 @@@ F: Documentation/devicetree/bindings/cl
  F:    drivers/clk/starfive/clk-starfive-jh71*
  F:    include/dt-bindings/clock/starfive?jh71*.h
  
 +STARFIVE CRYPTO DRIVER
 +M:    Jia Jie Ho <jiajie.ho@starfivetech.com>
 +M:    William Qiu <william.qiu@starfivetech.com>
 +S:    Supported
 +F:    Documentation/devicetree/bindings/crypto/starfive*
 +F:    drivers/crypto/starfive/
 +
  STARFIVE JH71X0 PINCTRL DRIVERS
  M:    Emil Renner Berthing <kernel@esmil.dk>
  M:    Jianlong Huang <jianlong.huang@starfivetech.com>
@@@ -20343,12 -20154,6 +20344,12 @@@ F: Documentation/devicetree/bindings/re
  F:    drivers/reset/starfive/reset-starfive-jh71*
  F:    include/dt-bindings/reset/starfive?jh71*.h
  
 +STARFIVE JH71X0 USB DRIVERS
 +M:    Minda Chen <minda.chen@starfivetech.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/starfive,jh7110-usb.yaml
 +F:    drivers/usb/cdns3/cdns3-starfive.c
 +
  STARFIVE JH71XX PMU CONTROLLER DRIVER
  M:    Walker Chen <walker.chen@starfivetech.com>
  S:    Supported
@@@ -20356,12 -20161,6 +20357,12 @@@ F: Documentation/devicetree/bindings/po
  F:    drivers/soc/starfive/jh71xx_pmu.c
  F:    include/dt-bindings/power/starfive,jh7110-pmu.h
  
 +STARFIVE JH7110 TDM DRIVER
 +M:    Walker Chen <walker.chen@starfivetech.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/starfive,jh7110-tdm.yaml
 +F:    sound/soc/starfive/jh7110_tdm.c
 +
  STARFIVE SOC DRIVERS
  M:    Conor Dooley <conor@kernel.org>
  S:    Maintained
@@@ -21306,7 -21105,7 +21307,7 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
  F:    Documentation/devicetree/bindings/i2c/i2c-davinci.txt
 -F:    arch/arm/boot/dts/da850*
 +F:    arch/arm/boot/dts/ti/davinci/
  F:    arch/arm/mach-davinci/
  F:    drivers/i2c/busses/i2c-davinci.c
  
@@@ -22146,7 -21945,6 +22147,7 @@@ F:   drivers/usb
  F:    include/dt-bindings/usb/
  F:    include/linux/usb.h
  F:    include/linux/usb/
 +F:    include/uapi/linux/usb/
  
  USB TYPEC BUS FOR ALTERNATE MODES
  M:    Heikki Krogerus <heikki.krogerus@linux.intel.com>
@@@ -22321,13 -22119,6 +22322,13 @@@ F: Documentation/filesystems/vfat.rs
  F:    fs/fat/
  F:    tools/testing/selftests/filesystems/fat/
  
 +VFIO CDX DRIVER
 +M:    Nipun Gupta <nipun.gupta@amd.com>
 +M:    Nikhil Agarwal <nikhil.agarwal@amd.com>
 +L:    kvm@vger.kernel.org
 +S:    Maintained
 +F:    drivers/vfio/cdx/*
 +
  VFIO DRIVER
  M:    Alex Williamson <alex.williamson@redhat.com>
  L:    kvm@vger.kernel.org
@@@ -22409,6 -22200,7 +22410,6 @@@ L:   linux-fbdev@vger.kernel.or
  S:    Maintained
  F:    drivers/video/fbdev/via/
  F:    include/linux/via-core.h
 -F:    include/linux/via-gpio.h
  F:    include/linux/via_i2c.h
  
  VIA VELOCITY NETWORK DRIVER
@@@ -22661,14 -22453,6 +22662,14 @@@ L: linux-fsdevel@vger.kernel.or
  S:    Maintained
  F:    fs/vboxsf/*
  
 +VIRTUAL PCM TEST DRIVER
 +M:    Ivan Orlov <ivan.orlov0322@gmail.com>
 +L:    alsa-devel@alsa-project.org
 +S:    Maintained
 +F:    Documentation/sound/cards/pcmtest.rst
 +F:    sound/drivers/pcmtest.c
 +F:    tools/testing/selftests/alsa/test-pcmtest-driver.c
 +
  VIRTUAL SERIO DEVICE DRIVER
  M:    Stephen Chandler Paul <thatslyude@gmail.com>
  S:    Maintained
@@@ -22739,7 -22523,7 +22740,7 @@@ S:   Supporte
  F:    drivers/misc/vmw_balloon.c
  
  VMWARE HYPERVISOR INTERFACE
 -M:    Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
 +M:    Ajay Kaher <akaher@vmware.com>
  M:    Alexey Makhalov <amakhalov@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    virtualization@lists.linux-foundation.org
@@@ -22766,8 -22550,8 +22767,8 @@@ F:   drivers/scsi/vmw_pvscsi.
  F:    drivers/scsi/vmw_pvscsi.h
  
  VMWARE VIRTUAL PTP CLOCK DRIVER
 -M:    Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
  M:    Deep Shah <sdeep@vmware.com>
 +R:    Ajay Kaher <akaher@vmware.com>
  R:    Alexey Makhalov <amakhalov@vmware.com>
  R:    VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
  L:    netdev@vger.kernel.org
@@@ -22990,13 -22774,6 +22991,13 @@@ L: linux-wireless@vger.kernel.or
  S:    Odd fixes
  F:    drivers/net/wireless/legacy/wl3501*
  
 +WMI BINARY MOF DRIVER
 +L:    platform-drivers-x86@vger.kernel.org
 +S:    Orphan
 +F:    Documentation/ABI/stable/sysfs-platform-wmi-bmof
 +F:    Documentation/wmi/devices/wmi-bmof.rst
 +F:    drivers/platform/x86/wmi-bmof.c
 +
  WOLFSON MICROELECTRONICS DRIVERS
  L:    patches@opensource.cirrus.com
  S:    Supported
@@@ -23376,9 -23153,8 +23377,9 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/adc/xilinx-ams.c
  
  XILINX AXI ETHERNET DRIVER
 -M:    Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
 +M:    Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
  S:    Maintained
 +F:    Documentation/devicetree/bindings/net/xlnx,axi-ethernet.yaml
  F:    drivers/net/ethernet/xilinx/xilinx_axienet*
  
  XILINX CAN DRIVER
@@@ -23396,8 -23172,8 +23397,8 @@@ F:   drivers/soc/xilinx/xlnx_event_manage
  F:    include/linux/firmware/xlnx-event-manager.h
  
  XILINX GPIO DRIVER
 -M:    Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
 -R:    Srinivas Neeli <srinivas.neeli@xilinx.com>
 +M:    Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
 +R:    Srinivas Neeli <srinivas.neeli@amd.com>
  R:    Michal Simek <michal.simek@amd.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/gpio/gpio-zynq.yaml
@@@ -23412,8 -23188,8 +23413,8 @@@ F:   drivers/pwm/pwm-xilinx.
  F:    include/clocksource/timer-xilinx.h
  
  XILINX SD-FEC IP CORES
 -M:    Derek Kiernan <derek.kiernan@xilinx.com>
 -M:    Dragan Cvetic <dragan.cvetic@xilinx.com>
 +M:    Derek Kiernan <derek.kiernan@amd.com>
 +M:    Dragan Cvetic <dragan.cvetic@amd.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/misc/xlnx,sd-fec.txt
  F:    Documentation/misc-devices/xilinx_sdfec.rst
@@@ -23429,6 -23205,7 +23430,6 @@@ S:   Maintaine
  F:    drivers/tty/serial/uartlite.c
  
  XILINX VIDEO IP CORES
 -M:    Hyun Kwon <hyun.kwon@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
  S:    Supported
@@@ -23457,6 -23234,7 +23458,6 @@@ F:   include/linux/dma/amd_xdma.
  F:    include/linux/platform_data/amd_xdma.h
  
  XILINX ZYNQMP DPDMA DRIVER
 -M:    Hyun Kwon <hyun.kwon@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    dmaengine@vger.kernel.org
  S:    Supported
@@@ -23472,6 -23250,7 +23473,6 @@@ F:   Documentation/devicetree/bindings/me
  F:    drivers/edac/zynqmp_edac.c
  
  XILINX ZYNQMP PSGTR PHY DRIVER
 -M:    Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
@@@ -23480,7 -23259,7 +23481,7 @@@ F:   Documentation/devicetree/bindings/ph
  F:    drivers/phy/xilinx/phy-zynqmp.c
  
  XILINX ZYNQMP SHA3 DRIVER
 -M:    Harsha <harsha.harsha@xilinx.com>
 +M:    Harsha <harsha.harsha@amd.com>
  S:    Maintained
  F:    drivers/crypto/xilinx/zynqmp-sha.c
  
diff --combined arch/arm64/Kconfig
index 891ab530a665acd36e9259de2425af44d512b94c,4b269da9c548d7074161de96ecc8fe4d9dee9f4e..7856c3a3e35afb606d174452c0f938a793503d6b
@@@ -120,7 -120,6 +120,7 @@@ config ARM6
        select CRC32
        select DCACHE_WORD_ACCESS
        select DYNAMIC_FTRACE if FUNCTION_TRACER
 +      select DMA_BOUNCE_UNALIGNED_KMALLOC
        select DMA_DIRECT_REMAP
        select EDAC_SUPPORT
        select FRAME_POINTER
        select HAVE_FTRACE_MCOUNT_RECORD
        select HAVE_FUNCTION_TRACER
        select HAVE_FUNCTION_ERROR_INJECTION
 +      select HAVE_FUNCTION_GRAPH_RETVAL if HAVE_FUNCTION_GRAPH_TRACER
        select HAVE_FUNCTION_GRAPH_TRACER
        select HAVE_GCC_PLUGINS
 +      select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && \
 +              HW_PERF_EVENTS && HAVE_PERF_EVENTS_NMI
        select HAVE_HW_BREAKPOINT if PERF_EVENTS
        select HAVE_IOREMAP_PROT
        select HAVE_IRQ_TIME_ACCOUNTING
        select HAVE_MOD_ARCH_SPECIFIC
        select HAVE_NMI
        select HAVE_PERF_EVENTS
 +      select HAVE_PERF_EVENTS_NMI if ARM64_PSEUDO_NMI
        select HAVE_PERF_REGS
        select HAVE_PERF_USER_STACK_DUMP
        select HAVE_PREEMPT_DYNAMIC_KEY
        select HAVE_KPROBES
        select HAVE_KRETPROBES
        select HAVE_GENERIC_VDSO
 +      select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
        select IRQ_DOMAIN
        select IRQ_FORCED_THREADING
        select KASAN_VMALLOC if KASAN
 +      select LOCK_MM_AND_FIND_VMA
        select MODULES_USE_ELF_RELA
        select NEED_DMA_MAP_STATE
        select NEED_SG_DMA_LENGTH
@@@ -414,6 -407,25 +414,25 @@@ menu "Kernel Features
  
  menu "ARM errata workarounds via the alternatives framework"
  
+ config AMPERE_ERRATUM_AC03_CPU_38
+         bool "AmpereOne: AC03_CPU_38: Certain bits in the Virtualization Translation Control Register and Translation Control Registers do not follow RES0 semantics"
+       default y
+       help
+         This option adds an alternative code sequence to work around Ampere
+         erratum AC03_CPU_38 on AmpereOne.
+         The affected design reports FEAT_HAFDBS as not implemented in
+         ID_AA64MMFR1_EL1.HAFDBS, but (V)TCR_ELx.{HA,HD} are not RES0
+         as required by the architecture. The unadvertised HAFDBS
+         implementation suffers from an additional erratum where hardware
+         A/D updates can occur after a PTE has been marked invalid.
+         The workaround forces KVM to explicitly set VTCR_EL2.HA to 0,
+         which avoids enabling unadvertised hardware Access Flag management
+         at stage-2.
+         If unsure, say Y.
  config ARM64_WORKAROUND_CLEAN_CACHE
        bool
  
@@@ -1592,7 -1604,7 +1611,7 @@@ config ARM64_TAGGED_ADDR_AB
          When this option is enabled, user applications can opt in to a
          relaxed ABI via prctl() allowing tagged addresses to be passed
          to system calls as pointer arguments. For details, see
 -        Documentation/arm64/tagged-address-abi.rst.
 +        Documentation/arch/arm64/tagged-address-abi.rst.
  
  menuconfig COMPAT
        bool "Kernel support for 32-bit EL0"
@@@ -1626,7 -1638,7 +1645,7 @@@ config KUSER_HELPER
          the system. This permits binaries to be run on ARMv4 through
          to ARMv8 without modification.
  
 -        See Documentation/arm/kernel_user_helpers.rst for details.
 +        See Documentation/arch/arm/kernel_user_helpers.rst for details.
  
          However, the fixed address nature of these helpers can be used
          by ROP (return orientated programming) authors when creating
@@@ -2054,7 -2066,7 +2073,7 @@@ config ARM64_MT
          explicitly opt in. The mechanism for the userspace is
          described in:
  
 -        Documentation/arm64/memory-tagging-extension.rst.
 +        Documentation/arch/arm64/memory-tagging-extension.rst.
  
  endmenu # "ARMv8.5 architectural features"
  
index 7a95c324e52a4d215144765293d589e71f2c0623,e753d989163f7faef2290708924d474043bc51fd..96e50227f940ecbde381ccc422d9d8c1433e5e2c
@@@ -15,6 -15,9 +15,9 @@@
  #define MAX_CPU_FEATURES      128
  #define cpu_feature(x)                KERNEL_HWCAP_ ## x
  
+ #define ARM64_SW_FEATURE_OVERRIDE_NOKASLR     0
+ #define ARM64_SW_FEATURE_OVERRIDE_HVHE                4
  #ifndef __ASSEMBLY__
  
  #include <linux/bug.h>
@@@ -107,7 -110,7 +110,7 @@@ extern struct arm64_ftr_reg arm64_ftr_r
   * CPU capabilities:
   *
   * We use arm64_cpu_capabilities to represent system features, errata work
 - * arounds (both used internally by kernel and tracked in cpu_hwcaps) and
 + * arounds (both used internally by kernel and tracked in system_cpucaps) and
   * ELF HWCAPs (which are exposed to user).
   *
   * To support systems with heterogeneous CPUs, we need to make sure that we
@@@ -419,12 -422,12 +422,12 @@@ static __always_inline bool is_hyp_code
        return is_vhe_hyp_code() || is_nvhe_hyp_code();
  }
  
 -extern DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
 +extern DECLARE_BITMAP(system_cpucaps, ARM64_NCAPS);
  
 -extern DECLARE_BITMAP(boot_capabilities, ARM64_NCAPS);
 +extern DECLARE_BITMAP(boot_cpucaps, ARM64_NCAPS);
  
  #define for_each_available_cap(cap)           \
 -      for_each_set_bit(cap, cpu_hwcaps, ARM64_NCAPS)
 +      for_each_set_bit(cap, system_cpucaps, ARM64_NCAPS)
  
  bool this_cpu_has_cap(unsigned int cap);
  void cpu_set_feature(unsigned int num);
@@@ -437,7 -440,7 +440,7 @@@ unsigned long cpu_get_elf_hwcap2(void)
  
  static __always_inline bool system_capabilities_finalized(void)
  {
 -      return alternative_has_feature_likely(ARM64_ALWAYS_SYSTEM);
 +      return alternative_has_cap_likely(ARM64_ALWAYS_SYSTEM);
  }
  
  /*
@@@ -449,7 -452,7 +452,7 @@@ static __always_inline bool cpus_have_c
  {
        if (num >= ARM64_NCAPS)
                return false;
 -      return arch_test_bit(num, cpu_hwcaps);
 +      return arch_test_bit(num, system_cpucaps);
  }
  
  /*
@@@ -464,7 -467,7 +467,7 @@@ static __always_inline bool __cpus_have
  {
        if (num >= ARM64_NCAPS)
                return false;
 -      return alternative_has_feature_unlikely(num);
 +      return alternative_has_cap_unlikely(num);
  }
  
  /*
@@@ -504,6 -507,16 +507,6 @@@ static __always_inline bool cpus_have_c
                return cpus_have_cap(num);
  }
  
 -static inline void cpus_set_cap(unsigned int num)
 -{
 -      if (num >= ARM64_NCAPS) {
 -              pr_warn("Attempt to set an illegal CPU capability (%d >= %d)\n",
 -                      num, ARM64_NCAPS);
 -      } else {
 -              __set_bit(num, cpu_hwcaps);
 -      }
 -}
 -
  static inline int __attribute_const__
  cpuid_feature_extract_signed_field_width(u64 features, int field, int width)
  {
@@@ -905,6 -918,7 +908,7 @@@ static inline unsigned int get_vmid_bit
        return 8;
  }
  
+ s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new, s64 cur);
  struct arm64_ftr_reg *get_arm64_ftr_reg(u32 sys_id);
  
  extern struct arm64_ftr_override id_aa64mmfr1_override;
@@@ -915,6 -929,8 +919,8 @@@ extern struct arm64_ftr_override id_aa6
  extern struct arm64_ftr_override id_aa64isar1_override;
  extern struct arm64_ftr_override id_aa64isar2_override;
  
+ extern struct arm64_ftr_override arm64_sw_feature_override;
  u32 get_kvm_ipa_limit(void);
  void dump_cpu_features(void);
  
index f4c3d30bf746c796e467c90bef285927a5935758,5a353f94e9cd443876a455ae7357431a2d020e9b..8e5ffb58f83ea56d634e791521025ec744e0fa16
        isb
  .endm
  
 +.macro __init_el2_hcrx
 +      mrs     x0, id_aa64mmfr1_el1
 +      ubfx    x0, x0, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
 +      cbz     x0, .Lskip_hcrx_\@
 +      mov_q   x0, HCRX_HOST_FLAGS
 +      msr_s   SYS_HCRX_EL2, x0
 +.Lskip_hcrx_\@:
 +.endm
 +
  /*
   * Allow Non-secure EL1 and EL0 to access physical timer and counter.
   * This is not necessary for VHE, since the host kernel runs in EL2,
   */
  .macro __init_el2_timers
        mov     x0, #3                          // Enable EL1 physical timers
+       mrs     x1, hcr_el2
+       and     x1, x1, #HCR_E2H
+       cbz     x1, .LnVHE_\@
+       lsl     x0, x0, #10
+ .LnVHE_\@:
        msr     cnthctl_el2, x0
        msr     cntvoff_el2, xzr                // Clear virtual offset
  .endm
@@@ -78,7 -74,7 +83,7 @@@
        cbz     x0, .Lskip_trace_\@             // Skip if TraceBuffer is not present
  
        mrs_s   x0, SYS_TRBIDR_EL1
 -      and     x0, x0, TRBIDR_PROG
 +      and     x0, x0, TRBIDR_EL1_P
        cbnz    x0, .Lskip_trace_\@             // If TRBE is available at EL2
  
        mov     x0, #(MDCR_EL2_E2TB_MASK << MDCR_EL2_E2TB_SHIFT)
  .endm
  
  /* Coprocessor traps */
- .macro __init_el2_nvhe_cptr
+ .macro __init_el2_cptr
+       mrs     x1, hcr_el2
+       and     x1, x1, #HCR_E2H
+       cbz     x1, .LnVHE_\@
+       mov     x0, #(CPACR_EL1_FPEN_EL1EN | CPACR_EL1_FPEN_EL0EN)
+       b       .Lset_cptr_\@
+ .LnVHE_\@:
        mov     x0, #0x33ff
+ .Lset_cptr_\@:
        msr     cptr_el2, x0                    // Disable copro. traps to EL2
  .endm
  
        mov     x0, xzr
        mrs     x1, id_aa64pfr1_el1
        ubfx    x1, x1, #ID_AA64PFR1_EL1_SME_SHIFT, #4
 -      cbz     x1, .Lset_fgt_\@
 +      cbz     x1, .Lset_pie_fgt_\@
  
        /* Disable nVHE traps of TPIDR2 and SMPRI */
        orr     x0, x0, #HFGxTR_EL2_nSMPRI_EL1_MASK
        orr     x0, x0, #HFGxTR_EL2_nTPIDR2_EL0_MASK
  
 +.Lset_pie_fgt_\@:
 +      mrs_s   x1, SYS_ID_AA64MMFR3_EL1
 +      ubfx    x1, x1, #ID_AA64MMFR3_EL1_S1PIE_SHIFT, #4
 +      cbz     x1, .Lset_fgt_\@
 +
 +      /* Disable trapping of PIR_EL1 / PIRE0_EL1 */
 +      orr     x0, x0, #HFGxTR_EL2_nPIR_EL1
 +      orr     x0, x0, #HFGxTR_EL2_nPIRE0_EL1
 +
  .Lset_fgt_\@:
        msr_s   SYS_HFGRTR_EL2, x0
        msr_s   SYS_HFGWTR_EL2, x0
   */
  .macro init_el2_state
        __init_el2_sctlr
 +      __init_el2_hcrx
        __init_el2_timers
        __init_el2_debug
        __init_el2_lor
        __init_el2_gicv3
        __init_el2_hstr
        __init_el2_nvhe_idregs
-       __init_el2_nvhe_cptr
+       __init_el2_cptr
        __init_el2_fgt
-       __init_el2_nvhe_prepare_eret
  .endm
  
  #ifndef __KVM_NVHE_HYPERVISOR__
  
  .Linit_sve_\@:        /* SVE register access */
        mrs     x0, cptr_el2                    // Disable SVE traps
+       mrs     x1, hcr_el2
+       and     x1, x1, #HCR_E2H
+       cbz     x1, .Lcptr_nvhe_\@
+       // VHE case
+       orr     x0, x0, #(CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN)
+       b       .Lset_cptr_\@
+ .Lcptr_nvhe_\@: // nVHE case
        bic     x0, x0, #CPTR_EL2_TZ
+ .Lset_cptr_\@:
        msr     cptr_el2, x0
        isb
        mov     x1, #ZCR_ELx_LEN_MASK           // SVE: Enable full vector
        cbz     x1, .Lskip_sme_\@
  
        msr_s   SYS_SMPRIMAP_EL2, xzr           // Make all priorities equal
 -
 -      mrs     x1, id_aa64mmfr1_el1            // HCRX_EL2 present?
 -      ubfx    x1, x1, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
 -      cbz     x1, .Lskip_sme_\@
 -
 -      mrs_s   x1, SYS_HCRX_EL2
 -      orr     x1, x1, #HCRX_EL2_SMPME_MASK    // Enable priority mapping
 -      msr_s   SYS_HCRX_EL2, x1
  .Lskip_sme_\@:
  .endm
  
index c6e12e8f2751c223f3de1f6c723546bc692d1247,addbadc9766430418f2c8b0739989a800f9c2e46..58e5eb27da68d67418ab54c177ac033a264a4aad
@@@ -9,7 -9,6 +9,7 @@@
  
  #include <asm/esr.h>
  #include <asm/memory.h>
 +#include <asm/sysreg.h>
  #include <asm/types.h>
  
  /* Hyp Configuration Register (HCR) bits */
@@@ -19,6 -18,7 +19,7 @@@
  #define HCR_ATA_SHIFT 56
  #define HCR_ATA               (UL(1) << HCR_ATA_SHIFT)
  #define HCR_AMVOFFEN  (UL(1) << 51)
+ #define HCR_TID4      (UL(1) << 49)
  #define HCR_FIEN      (UL(1) << 47)
  #define HCR_FWB               (UL(1) << 46)
  #define HCR_API               (UL(1) << 41)
  #define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
                         HCR_BSU_IS | HCR_FB | HCR_TACR | \
                         HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
-                        HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3 | HCR_TID2)
+                        HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3)
  #define HCR_VIRT_EXCP_MASK (HCR_VSE | HCR_VI | HCR_VF)
  #define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
  #define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)
  #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
  
 +#define HCRX_GUEST_FLAGS (HCRX_EL2_SMPME | HCRX_EL2_TCR2En)
 +#define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En)
 +
  /* TCR_EL2 Registers bits */
  #define TCR_EL2_RES1          ((1U << 31) | (1 << 23))
  #define TCR_EL2_TBI           (1 << 20)
  #define CPTR_EL2_TFP  (1 << CPTR_EL2_TFP_SHIFT)
  #define CPTR_EL2_TZ   (1 << 8)
  #define CPTR_NVHE_EL2_RES1    0x000032ff /* known RES1 bits in CPTR_EL2 (nVHE) */
- #define CPTR_EL2_DEFAULT      CPTR_NVHE_EL2_RES1
  #define CPTR_NVHE_EL2_RES0    (GENMASK(63, 32) |      \
                                 GENMASK(29, 21) |      \
                                 GENMASK(19, 14) |      \
        ECN(SOFTSTP_CUR), ECN(WATCHPT_LOW), ECN(WATCHPT_CUR), \
        ECN(BKPT32), ECN(VECTOR32), ECN(BRK64), ECN(ERET)
  
- #define CPACR_EL1_DEFAULT     (CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN |\
-                                CPACR_EL1_ZEN_EL1EN)
+ #define CPACR_EL1_TTA         (1 << 28)
  
  #define kvm_mode_names                                \
        { PSR_MODE_EL0t,        "EL0t" },       \
index 86042afa86c320cf7141b75df10f317659d122dd,bb17b2ead4c71a3521c822c112a31a2e7bdb6153..7d170aaa2db4195b5405a46caf6bcbcb22f0fe38
@@@ -68,6 -68,7 +68,7 @@@ enum __kvm_host_smccc_func 
        __KVM_HOST_SMCCC_FUNC___kvm_vcpu_run,
        __KVM_HOST_SMCCC_FUNC___kvm_flush_vm_context,
        __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid_ipa,
+       __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid_ipa_nsh,
        __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid,
        __KVM_HOST_SMCCC_FUNC___kvm_flush_cpu_context,
        __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff,
@@@ -225,6 -226,9 +226,9 @@@ extern void __kvm_flush_vm_context(void
  extern void __kvm_flush_cpu_context(struct kvm_s2_mmu *mmu);
  extern void __kvm_tlb_flush_vmid_ipa(struct kvm_s2_mmu *mmu, phys_addr_t ipa,
                                     int level);
+ extern void __kvm_tlb_flush_vmid_ipa_nsh(struct kvm_s2_mmu *mmu,
+                                        phys_addr_t ipa,
+                                        int level);
  extern void __kvm_tlb_flush_vmid(struct kvm_s2_mmu *mmu);
  
  extern void __kvm_timer_set_cntvoff(u64 cntvoff);
@@@ -267,24 -271,6 +271,24 @@@ extern u64 __kvm_get_mdcr_el2(void)
        __kvm_at_err;                                                   \
  } )
  
 +void __noreturn hyp_panic(void);
 +asmlinkage void kvm_unexpected_el2_exception(void);
 +asmlinkage void __noreturn hyp_panic(void);
 +asmlinkage void __noreturn hyp_panic_bad_stack(void);
 +asmlinkage void kvm_unexpected_el2_exception(void);
 +struct kvm_cpu_context;
 +void handle_trap(struct kvm_cpu_context *host_ctxt);
 +asmlinkage void __noreturn kvm_host_psci_cpu_entry(bool is_cpu_on);
 +void __noreturn __pkvm_init_finalise(void);
 +void kvm_nvhe_prepare_backtrace(unsigned long fp, unsigned long pc);
 +void kvm_patch_vector_branch(struct alt_instr *alt,
 +      __le32 *origptr, __le32 *updptr, int nr_inst);
 +void kvm_get_kimage_voffset(struct alt_instr *alt,
 +      __le32 *origptr, __le32 *updptr, int nr_inst);
 +void kvm_compute_final_ctr_el0(struct alt_instr *alt,
 +      __le32 *origptr, __le32 *updptr, int nr_inst);
 +void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr, u64 elr_virt,
 +      u64 elr_phys, u64 par, uintptr_t vcpu, u64 far, u64 hpfar);
  
  #else /* __ASSEMBLY__ */
  
index d48609d9542310722b34c40b368e89c167cdc0a2,1143ce07c5c59bac06daa0ec22134cee6bee7c67..8b6096753740ccce477ae60aa195bd8ff088da20
@@@ -39,6 -39,7 +39,7 @@@
  #define KVM_MAX_VCPUS VGIC_V3_MAX_CPUS
  
  #define KVM_VCPU_MAX_FEATURES 7
+ #define KVM_VCPU_VALID_FEATURES       (BIT(KVM_VCPU_MAX_FEATURES) - 1)
  
  #define KVM_REQ_SLEEP \
        KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
@@@ -159,6 -160,21 +160,21 @@@ struct kvm_s2_mmu 
        /* The last vcpu id that ran on each physical CPU */
        int __percpu *last_vcpu_ran;
  
+ #define KVM_ARM_EAGER_SPLIT_CHUNK_SIZE_DEFAULT 0
+       /*
+        * Memory cache used to split
+        * KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE worth of huge pages. It
+        * is used to allocate stage2 page tables while splitting huge
+        * pages. The choice of KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE
+        * influences both the capacity of the split page cache, and
+        * how often KVM reschedules. Be wary of raising CHUNK_SIZE
+        * too high.
+        *
+        * Protected by kvm->slots_lock.
+        */
+       struct kvm_mmu_memory_cache split_page_cache;
+       uint64_t split_page_chunk_size;
        struct kvm_arch *arch;
  };
  
@@@ -214,25 -230,23 +230,23 @@@ struct kvm_arch 
  #define KVM_ARCH_FLAG_MTE_ENABLED                     1
        /* At least one vCPU has ran in the VM */
  #define KVM_ARCH_FLAG_HAS_RAN_ONCE                    2
-       /*
-        * The following two bits are used to indicate the guest's EL1
-        * register width configuration. A value of KVM_ARCH_FLAG_EL1_32BIT
-        * bit is valid only when KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED is set.
-        * Otherwise, the guest's EL1 register width has not yet been
-        * determined yet.
-        */
- #define KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED            3
- #define KVM_ARCH_FLAG_EL1_32BIT                               4
+       /* The vCPU feature set for the VM is configured */
+ #define KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED                3
        /* PSCI SYSTEM_SUSPEND enabled for the guest */
- #define KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED          5
+ #define KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED          4
        /* VM counter offset */
- #define KVM_ARCH_FLAG_VM_COUNTER_OFFSET                       6
+ #define KVM_ARCH_FLAG_VM_COUNTER_OFFSET                       5
        /* Timer PPIs made immutable */
- #define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE            7
+ #define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE            6
        /* SMCCC filter initialized for the VM */
- #define KVM_ARCH_FLAG_SMCCC_FILTER_CONFIGURED         8
+ #define KVM_ARCH_FLAG_SMCCC_FILTER_CONFIGURED         7
+       /* Initial ID reg values loaded */
+ #define KVM_ARCH_FLAG_ID_REGS_INITIALIZED             8
        unsigned long flags;
  
+       /* VM-wide vCPU feature set */
+       DECLARE_BITMAP(vcpu_features, KVM_VCPU_MAX_FEATURES);
        /*
         * VM-wide PMU filter, implemented as a bitmap and big enough for
         * up to 2^10 events (ARMv8.0) or 2^16 events (ARMv8.1+).
  
        cpumask_var_t supported_cpus;
  
-       u8 pfr0_csv2;
-       u8 pfr0_csv3;
-       struct {
-               u8 imp:4;
-               u8 unimp:4;
-       } dfr0_pmuver;
        /* Hypercall features firmware registers' descriptor */
        struct kvm_smccc_features smccc_feat;
        struct maple_tree smccc_filter;
  
+       /*
+        * Emulated CPU ID registers per VM
+        * (Op0, Op1, CRn, CRm, Op2) of the ID registers to be saved in it
+        * is (3, 0, 0, crm, op2), where 1<=crm<8, 0<=op2<8.
+        *
+        * These emulated idregs are VM-wide, but accessed from the context of a vCPU.
+        * Atomic access to multiple idregs are guarded by kvm_arch.config_lock.
+        */
+ #define IDREG_IDX(id)         (((sys_reg_CRm(id) - 1) << 3) | sys_reg_Op2(id))
+ #define IDREG(kvm, id)                ((kvm)->arch.id_regs[IDREG_IDX(id)])
+ #define KVM_ARM_ID_REG_NUM    (IDREG_IDX(sys_reg(3, 0, 0, 7, 7)) + 1)
+       u64 id_regs[KVM_ARM_ID_REG_NUM];
        /*
         * For an untrusted host VM, 'pkvm.handle' is used to lookup
         * the associated pKVM instance in the hypervisor.
@@@ -279,7 -299,6 +299,7 @@@ enum vcpu_sysreg 
        TTBR0_EL1,      /* Translation Table Base Register 0 */
        TTBR1_EL1,      /* Translation Table Base Register 1 */
        TCR_EL1,        /* Translation Control Register */
 +      TCR2_EL1,       /* Extended Translation Control Register */
        ESR_EL1,        /* Exception Syndrome Register */
        AFSR0_EL1,      /* Auxiliary Fault Status Register 0 */
        AFSR1_EL1,      /* Auxiliary Fault Status Register 1 */
        TFSR_EL1,       /* Tag Fault Status Register (EL1) */
        TFSRE0_EL1,     /* Tag Fault Status Register (EL0) */
  
 +      /* Permission Indirection Extension registers */
 +      PIR_EL1,       /* Permission Indirection Register 1 (EL1) */
 +      PIRE0_EL1,     /*  Permission Indirection Register 0 (EL1) */
 +
        /* 32bit specific registers. */
        DACR32_EL2,     /* Domain Access Control Register */
        IFSR32_EL2,     /* Instruction Fault Status Register */
@@@ -410,6 -425,7 +430,7 @@@ struct kvm_host_data 
  struct kvm_host_psci_config {
        /* PSCI version used by host. */
        u32 version;
+       u32 smccc_version;
  
        /* Function IDs used by host if version is v0.1. */
        struct psci_0_1_function_ids function_ids_0_1;
@@@ -1038,7 -1054,7 +1059,7 @@@ void kvm_arm_clear_debug(struct kvm_vcp
  void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
  
  #define kvm_vcpu_os_lock_enabled(vcpu)                \
 -      (!!(__vcpu_sys_reg(vcpu, OSLSR_EL1) & SYS_OSLSR_OSLK))
 +      (!!(__vcpu_sys_reg(vcpu, OSLSR_EL1) & OSLSR_EL1_OSLK))
  
  int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
                               struct kvm_device_attr *attr);
index 7a1e626318145f31c0e55afa83f7298a67d84a2f,bae9eeae99750c137b29be32c84706cb7e7da2d8..b481935e9314e5e13fa5543597d2b34558844c47
  #define SYS_SVCR_SMSTART_SM_EL0               sys_reg(0, 3, 4, 3, 3)
  #define SYS_SVCR_SMSTOP_SMZA_EL0      sys_reg(0, 3, 4, 6, 3)
  
 -#define SYS_OSDTRRX_EL1                       sys_reg(2, 0, 0, 0, 2)
 -#define SYS_MDCCINT_EL1                       sys_reg(2, 0, 0, 2, 0)
 -#define SYS_MDSCR_EL1                 sys_reg(2, 0, 0, 2, 2)
 -#define SYS_OSDTRTX_EL1                       sys_reg(2, 0, 0, 3, 2)
 -#define SYS_OSECCR_EL1                        sys_reg(2, 0, 0, 6, 2)
  #define SYS_DBGBVRn_EL1(n)            sys_reg(2, 0, 0, n, 4)
  #define SYS_DBGBCRn_EL1(n)            sys_reg(2, 0, 0, n, 5)
  #define SYS_DBGWVRn_EL1(n)            sys_reg(2, 0, 0, n, 6)
  #define SYS_DBGWCRn_EL1(n)            sys_reg(2, 0, 0, n, 7)
  #define SYS_MDRAR_EL1                 sys_reg(2, 0, 1, 0, 0)
  
 -#define SYS_OSLAR_EL1                 sys_reg(2, 0, 1, 0, 4)
 -#define SYS_OSLAR_OSLK                        BIT(0)
 -
  #define SYS_OSLSR_EL1                 sys_reg(2, 0, 1, 1, 4)
 -#define SYS_OSLSR_OSLM_MASK           (BIT(3) | BIT(0))
 -#define SYS_OSLSR_OSLM_NI             0
 -#define SYS_OSLSR_OSLM_IMPLEMENTED    BIT(3)
 -#define SYS_OSLSR_OSLK                        BIT(1)
 +#define OSLSR_EL1_OSLM_MASK           (BIT(3) | BIT(0))
 +#define OSLSR_EL1_OSLM_NI             0
 +#define OSLSR_EL1_OSLM_IMPLEMENTED    BIT(3)
 +#define OSLSR_EL1_OSLK                        BIT(1)
  
  #define SYS_OSDLR_EL1                 sys_reg(2, 0, 1, 3, 4)
  #define SYS_DBGPRCR_EL1                       sys_reg(2, 0, 1, 4, 4)
  
  /*** End of Statistical Profiling Extension ***/
  
 -/*
 - * TRBE Registers
 - */
 -#define SYS_TRBLIMITR_EL1             sys_reg(3, 0, 9, 11, 0)
 -#define SYS_TRBPTR_EL1                        sys_reg(3, 0, 9, 11, 1)
 -#define SYS_TRBBASER_EL1              sys_reg(3, 0, 9, 11, 2)
 -#define SYS_TRBSR_EL1                 sys_reg(3, 0, 9, 11, 3)
 -#define SYS_TRBMAR_EL1                        sys_reg(3, 0, 9, 11, 4)
 -#define SYS_TRBTRG_EL1                        sys_reg(3, 0, 9, 11, 6)
 -#define SYS_TRBIDR_EL1                        sys_reg(3, 0, 9, 11, 7)
 -
 -#define TRBLIMITR_LIMIT_MASK          GENMASK_ULL(51, 0)
 -#define TRBLIMITR_LIMIT_SHIFT         12
 -#define TRBLIMITR_NVM                 BIT(5)
 -#define TRBLIMITR_TRIG_MODE_MASK      GENMASK(1, 0)
 -#define TRBLIMITR_TRIG_MODE_SHIFT     3
 -#define TRBLIMITR_FILL_MODE_MASK      GENMASK(1, 0)
 -#define TRBLIMITR_FILL_MODE_SHIFT     1
 -#define TRBLIMITR_ENABLE              BIT(0)
 -#define TRBPTR_PTR_MASK                       GENMASK_ULL(63, 0)
 -#define TRBPTR_PTR_SHIFT              0
 -#define TRBBASER_BASE_MASK            GENMASK_ULL(51, 0)
 -#define TRBBASER_BASE_SHIFT           12
 -#define TRBSR_EC_MASK                 GENMASK(5, 0)
 -#define TRBSR_EC_SHIFT                        26
 -#define TRBSR_IRQ                     BIT(22)
 -#define TRBSR_TRG                     BIT(21)
 -#define TRBSR_WRAP                    BIT(20)
 -#define TRBSR_ABORT                   BIT(18)
 -#define TRBSR_STOP                    BIT(17)
 -#define TRBSR_MSS_MASK                        GENMASK(15, 0)
 -#define TRBSR_MSS_SHIFT                       0
 -#define TRBSR_BSC_MASK                        GENMASK(5, 0)
 -#define TRBSR_BSC_SHIFT                       0
 -#define TRBSR_FSC_MASK                        GENMASK(5, 0)
 -#define TRBSR_FSC_SHIFT                       0
 -#define TRBMAR_SHARE_MASK             GENMASK(1, 0)
 -#define TRBMAR_SHARE_SHIFT            8
 -#define TRBMAR_OUTER_MASK             GENMASK(3, 0)
 -#define TRBMAR_OUTER_SHIFT            4
 -#define TRBMAR_INNER_MASK             GENMASK(3, 0)
 -#define TRBMAR_INNER_SHIFT            0
 -#define TRBTRG_TRG_MASK                       GENMASK(31, 0)
 -#define TRBTRG_TRG_SHIFT              0
 -#define TRBIDR_FLAG                   BIT(5)
 -#define TRBIDR_PROG                   BIT(4)
 -#define TRBIDR_ALIGN_MASK             GENMASK(3, 0)
 -#define TRBIDR_ALIGN_SHIFT            0
 +#define TRBSR_EL1_BSC_MASK            GENMASK(5, 0)
 +#define TRBSR_EL1_BSC_SHIFT           0
  
  #define SYS_PMINTENSET_EL1            sys_reg(3, 0, 9, 14, 1)
  #define SYS_PMINTENCLR_EL1            sys_reg(3, 0, 9, 14, 2)
                         (BIT(18)) | (BIT(22)) | (BIT(23)) | (BIT(28)) | \
                         (BIT(29)))
  
+ #define SCTLR_EL2_BT  (BIT(36))
  #ifdef CONFIG_CPU_BIG_ENDIAN
  #define ENDIAN_SET_EL2                SCTLR_ELx_EE
  #else
  #define ICH_VTR_TDS_SHIFT     19
  #define ICH_VTR_TDS_MASK      (1 << ICH_VTR_TDS_SHIFT)
  
 +/*
 + * Permission Indirection Extension (PIE) permission encodings.
 + * Encodings with the _O suffix, have overlays applied (Permission Overlay Extension).
 + */
 +#define PIE_NONE_O    0x0
 +#define PIE_R_O               0x1
 +#define PIE_X_O               0x2
 +#define PIE_RX_O      0x3
 +#define PIE_RW_O      0x5
 +#define PIE_RWnX_O    0x6
 +#define PIE_RWX_O     0x7
 +#define PIE_R         0x8
 +#define PIE_GCS               0x9
 +#define PIE_RX                0xa
 +#define PIE_RW                0xc
 +#define PIE_RWX               0xe
 +
 +#define PIRx_ELx_PERM(idx, perm)      ((perm) << ((idx) * 4))
 +
  #define ARM64_FEATURE_FIELD_BITS      4
  
  /* Defined for compatibility only, do not add new users. */
index 6ea7f23b128719ffb35de3076d5d8bd6a0e1e736,3d93147179a00d68b09dc52845cf7b2fbc4e6e07..f9d456fe132d87195e2e9b6f0483a1d6d1b360eb
@@@ -105,11 -105,11 +105,11 @@@ unsigned int compat_elf_hwcap __read_mo
  unsigned int compat_elf_hwcap2 __read_mostly;
  #endif
  
 -DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
 -EXPORT_SYMBOL(cpu_hwcaps);
 -static struct arm64_cpu_capabilities const __ro_after_init *cpu_hwcaps_ptrs[ARM64_NCAPS];
 +DECLARE_BITMAP(system_cpucaps, ARM64_NCAPS);
 +EXPORT_SYMBOL(system_cpucaps);
 +static struct arm64_cpu_capabilities const __ro_after_init *cpucap_ptrs[ARM64_NCAPS];
  
 -DECLARE_BITMAP(boot_capabilities, ARM64_NCAPS);
 +DECLARE_BITMAP(boot_cpucaps, ARM64_NCAPS);
  
  bool arm64_use_ng_mappings = false;
  EXPORT_SYMBOL(arm64_use_ng_mappings);
@@@ -137,7 -137,7 +137,7 @@@ static cpumask_var_t cpu_32bit_el0_mas
  void dump_cpu_features(void)
  {
        /* file-wide pr_fmt adds "CPU features: " prefix */
 -      pr_emerg("0x%*pb\n", ARM64_NCAPS, &cpu_hwcaps);
 +      pr_emerg("0x%*pb\n", ARM64_NCAPS, &system_cpucaps);
  }
  
  #define ARM64_CPUID_FIELDS(reg, field, min_value)                     \
@@@ -223,7 -223,6 +223,7 @@@ static const struct arm64_ftr_bits ftr_
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_CSSC_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_RPRFM_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_HIGHER_SAFE, ID_AA64ISAR2_EL1_BC_SHIFT, 4, 0),
 +      ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_MOPS_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
                       FTR_STRICT, FTR_EXACT, ID_AA64ISAR2_EL1_APA3_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH),
@@@ -365,7 -364,6 +365,7 @@@ static const struct arm64_ftr_bits ftr_
  static const struct arm64_ftr_bits ftr_id_aa64mmfr1[] = {
        ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_TIDCP1_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_AFP_SHIFT, 4, 0),
 +      ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_HCX_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_ETS_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_TWED_SHIFT, 4, 0),
        ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64MMFR1_EL1_XNX_SHIFT, 4, 0),
@@@ -398,12 -396,6 +398,12 @@@ static const struct arm64_ftr_bits ftr_
        ARM64_FTR_END,
  };
  
 +static const struct arm64_ftr_bits ftr_id_aa64mmfr3[] = {
 +      ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR3_EL1_S1PIE_SHIFT, 4, 0),
 +      ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR3_EL1_TCRX_SHIFT, 4, 0),
 +      ARM64_FTR_END,
 +};
 +
  static const struct arm64_ftr_bits ftr_ctr[] = {
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */
        ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_EL0_DIC_SHIFT, 1, 1),
@@@ -672,6 -664,8 +672,8 @@@ struct arm64_ftr_override __ro_after_in
  struct arm64_ftr_override __ro_after_init id_aa64isar1_override;
  struct arm64_ftr_override __ro_after_init id_aa64isar2_override;
  
+ struct arm64_ftr_override arm64_sw_feature_override;
  static const struct __ftr_reg_entry {
        u32                     sys_id;
        struct arm64_ftr_reg    *reg;
        ARM64_FTR_REG_OVERRIDE(SYS_ID_AA64MMFR1_EL1, ftr_id_aa64mmfr1,
                               &id_aa64mmfr1_override),
        ARM64_FTR_REG(SYS_ID_AA64MMFR2_EL1, ftr_id_aa64mmfr2),
 +      ARM64_FTR_REG(SYS_ID_AA64MMFR3_EL1, ftr_id_aa64mmfr3),
  
        /* Op1 = 0, CRn = 1, CRm = 2 */
        ARM64_FTR_REG(SYS_ZCR_EL1, ftr_zcr),
@@@ -807,7 -800,7 +809,7 @@@ static u64 arm64_ftr_set_value(const st
        return reg;
  }
  
- static s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
+ s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new,
                                s64 cur)
  {
        s64 ret = 0;
@@@ -963,24 -956,24 +965,24 @@@ extern const struct arm64_cpu_capabilit
  static const struct arm64_cpu_capabilities arm64_features[];
  
  static void __init
 -init_cpu_hwcaps_indirect_list_from_array(const struct arm64_cpu_capabilities *caps)
 +init_cpucap_indirect_list_from_array(const struct arm64_cpu_capabilities *caps)
  {
        for (; caps->matches; caps++) {
                if (WARN(caps->capability >= ARM64_NCAPS,
                        "Invalid capability %d\n", caps->capability))
                        continue;
 -              if (WARN(cpu_hwcaps_ptrs[caps->capability],
 +              if (WARN(cpucap_ptrs[caps->capability],
                        "Duplicate entry for capability %d\n",
                        caps->capability))
                        continue;
 -              cpu_hwcaps_ptrs[caps->capability] = caps;
 +              cpucap_ptrs[caps->capability] = caps;
        }
  }
  
 -static void __init init_cpu_hwcaps_indirect_list(void)
 +static void __init init_cpucap_indirect_list(void)
  {
 -      init_cpu_hwcaps_indirect_list_from_array(arm64_features);
 -      init_cpu_hwcaps_indirect_list_from_array(arm64_errata);
 +      init_cpucap_indirect_list_from_array(arm64_features);
 +      init_cpucap_indirect_list_from_array(arm64_errata);
  }
  
  static void __init setup_boot_cpu_capabilities(void);
@@@ -1026,7 -1019,6 +1028,7 @@@ void __init init_cpu_features(struct cp
        init_cpu_ftr_reg(SYS_ID_AA64MMFR0_EL1, info->reg_id_aa64mmfr0);
        init_cpu_ftr_reg(SYS_ID_AA64MMFR1_EL1, info->reg_id_aa64mmfr1);
        init_cpu_ftr_reg(SYS_ID_AA64MMFR2_EL1, info->reg_id_aa64mmfr2);
 +      init_cpu_ftr_reg(SYS_ID_AA64MMFR3_EL1, info->reg_id_aa64mmfr3);
        init_cpu_ftr_reg(SYS_ID_AA64PFR0_EL1, info->reg_id_aa64pfr0);
        init_cpu_ftr_reg(SYS_ID_AA64PFR1_EL1, info->reg_id_aa64pfr1);
        init_cpu_ftr_reg(SYS_ID_AA64ZFR0_EL1, info->reg_id_aa64zfr0);
                init_cpu_ftr_reg(SYS_GMID_EL1, info->reg_gmid);
  
        /*
 -       * Initialize the indirect array of CPU hwcaps capabilities pointers
 -       * before we handle the boot CPU below.
 +       * Initialize the indirect array of CPU capabilities pointers before we
 +       * handle the boot CPU below.
         */
 -      init_cpu_hwcaps_indirect_list();
 +      init_cpucap_indirect_list();
  
        /*
         * Detect and enable early CPU capabilities based on the boot CPU,
@@@ -1272,8 -1264,6 +1274,8 @@@ void update_cpu_features(int cpu
                                      info->reg_id_aa64mmfr1, boot->reg_id_aa64mmfr1);
        taint |= check_update_ftr_reg(SYS_ID_AA64MMFR2_EL1, cpu,
                                      info->reg_id_aa64mmfr2, boot->reg_id_aa64mmfr2);
 +      taint |= check_update_ftr_reg(SYS_ID_AA64MMFR3_EL1, cpu,
 +                                    info->reg_id_aa64mmfr3, boot->reg_id_aa64mmfr3);
  
        taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
                                      info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
@@@ -1403,7 -1393,6 +1405,7 @@@ u64 __read_sysreg_by_encoding(u32 sys_i
        read_sysreg_case(SYS_ID_AA64MMFR0_EL1);
        read_sysreg_case(SYS_ID_AA64MMFR1_EL1);
        read_sysreg_case(SYS_ID_AA64MMFR2_EL1);
 +      read_sysreg_case(SYS_ID_AA64MMFR3_EL1);
        read_sysreg_case(SYS_ID_AA64ISAR0_EL1);
        read_sysreg_case(SYS_ID_AA64ISAR1_EL1);
        read_sysreg_case(SYS_ID_AA64ISAR2_EL1);
@@@ -2009,6 -1998,19 +2011,19 @@@ static bool has_nested_virt_support(con
        return true;
  }
  
+ static bool hvhe_possible(const struct arm64_cpu_capabilities *entry,
+                         int __unused)
+ {
+       u64 val;
+       val = read_sysreg(id_aa64mmfr1_el1);
+       if (!cpuid_feature_extract_unsigned_field(val, ID_AA64MMFR1_EL1_VH_SHIFT))
+               return false;
+       val = arm64_sw_feature_override.val & arm64_sw_feature_override.mask;
+       return cpuid_feature_extract_unsigned_field(val, ARM64_SW_FEATURE_OVERRIDE_HVHE);
+ }
  #ifdef CONFIG_ARM64_PAN
  static void cpu_enable_pan(const struct arm64_cpu_capabilities *__unused)
  {
@@@ -2061,9 -2063,9 +2076,9 @@@ static bool has_address_auth_cpucap(con
  static bool has_address_auth_metacap(const struct arm64_cpu_capabilities *entry,
                                     int scope)
  {
 -      bool api = has_address_auth_cpucap(cpu_hwcaps_ptrs[ARM64_HAS_ADDRESS_AUTH_IMP_DEF], scope);
 -      bool apa = has_address_auth_cpucap(cpu_hwcaps_ptrs[ARM64_HAS_ADDRESS_AUTH_ARCH_QARMA5], scope);
 -      bool apa3 = has_address_auth_cpucap(cpu_hwcaps_ptrs[ARM64_HAS_ADDRESS_AUTH_ARCH_QARMA3], scope);
 +      bool api = has_address_auth_cpucap(cpucap_ptrs[ARM64_HAS_ADDRESS_AUTH_IMP_DEF], scope);
 +      bool apa = has_address_auth_cpucap(cpucap_ptrs[ARM64_HAS_ADDRESS_AUTH_ARCH_QARMA5], scope);
 +      bool apa3 = has_address_auth_cpucap(cpucap_ptrs[ARM64_HAS_ADDRESS_AUTH_ARCH_QARMA3], scope);
  
        return apa || apa3 || api;
  }
@@@ -2199,11 -2201,6 +2214,11 @@@ static void cpu_enable_dit(const struc
        set_pstate_dit(1);
  }
  
 +static void cpu_enable_mops(const struct arm64_cpu_capabilities *__unused)
 +{
 +      sysreg_clear_set(sctlr_el1, 0, SCTLR_EL1_MSCEn);
 +}
 +
  /* Internal helper functions to match cpu capability type */
  static bool
  cpucap_late_cpu_optional(const struct arm64_cpu_capabilities *cap)
@@@ -2253,7 -2250,11 +2268,7 @@@ static const struct arm64_cpu_capabilit
                .capability = ARM64_HAS_ECV_CNTPOFF,
                .type = ARM64_CPUCAP_SYSTEM_FEATURE,
                .matches = has_cpuid_feature,
 -              .sys_reg = SYS_ID_AA64MMFR0_EL1,
 -              .field_pos = ID_AA64MMFR0_EL1_ECV_SHIFT,
 -              .field_width = 4,
 -              .sign = FTR_UNSIGNED,
 -              .min_field_value = ID_AA64MMFR0_EL1_ECV_CNTPOFF,
 +              ARM64_CPUID_FIELDS(ID_AA64MMFR0_EL1, ECV, CNTPOFF)
        },
  #ifdef CONFIG_ARM64_PAN
        {
                .type = ARM64_CPUCAP_SYSTEM_FEATURE,
                .matches = is_kvm_protected_mode,
        },
 +      {
 +              .desc = "HCRX_EL2 register",
 +              .capability = ARM64_HAS_HCX,
 +              .type = ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE,
 +              .matches = has_cpuid_feature,
 +              ARM64_CPUID_FIELDS(ID_AA64MMFR1_EL1, HCX, IMP)
 +      },
  #endif
        {
                .desc = "Kernel page table isolation (KPTI)",
                .cpu_enable = cpu_enable_dit,
                ARM64_CPUID_FIELDS(ID_AA64PFR0_EL1, DIT, IMP)
        },
 +      {
 +              .desc = "Memory Copy and Memory Set instructions",
 +              .capability = ARM64_HAS_MOPS,
 +              .type = ARM64_CPUCAP_SYSTEM_FEATURE,
 +              .matches = has_cpuid_feature,
 +              .cpu_enable = cpu_enable_mops,
 +              ARM64_CPUID_FIELDS(ID_AA64ISAR2_EL1, MOPS, IMP)
 +      },
 +      {
 +              .capability = ARM64_HAS_TCR2,
 +              .type = ARM64_CPUCAP_SYSTEM_FEATURE,
 +              .matches = has_cpuid_feature,
 +              ARM64_CPUID_FIELDS(ID_AA64MMFR3_EL1, TCRX, IMP)
 +      },
 +      {
 +              .desc = "Stage-1 Permission Indirection Extension (S1PIE)",
 +              .capability = ARM64_HAS_S1PIE,
 +              .type = ARM64_CPUCAP_BOOT_CPU_FEATURE,
 +              .matches = has_cpuid_feature,
 +              ARM64_CPUID_FIELDS(ID_AA64MMFR3_EL1, S1PIE, IMP)
 +      },
+       {
+               .desc = "VHE for hypervisor only",
+               .capability = ARM64_KVM_HVHE,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .matches = hvhe_possible,
+       },
+       {
+               .desc = "Enhanced Virtualization Traps",
+               .capability = ARM64_HAS_EVT,
+               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
+               .sys_reg = SYS_ID_AA64MMFR2_EL1,
+               .sign = FTR_UNSIGNED,
+               .field_pos = ID_AA64MMFR2_EL1_EVT_SHIFT,
+               .field_width = 4,
+               .min_field_value = ID_AA64MMFR2_EL1_EVT_IMP,
+               .matches = has_cpuid_feature,
+       },
        {},
  };
  
@@@ -2811,7 -2801,6 +2843,7 @@@ static const struct arm64_cpu_capabilit
        HWCAP_CAP(ID_AA64ISAR2_EL1, RPRFM, IMP, CAP_HWCAP, KERNEL_HWCAP_RPRFM),
        HWCAP_CAP(ID_AA64ISAR2_EL1, RPRES, IMP, CAP_HWCAP, KERNEL_HWCAP_RPRES),
        HWCAP_CAP(ID_AA64ISAR2_EL1, WFxT, IMP, CAP_HWCAP, KERNEL_HWCAP_WFXT),
 +      HWCAP_CAP(ID_AA64ISAR2_EL1, MOPS, IMP, CAP_HWCAP, KERNEL_HWCAP_MOPS),
  #ifdef CONFIG_ARM64_SME
        HWCAP_CAP(ID_AA64PFR1_EL1, SME, IMP, CAP_HWCAP, KERNEL_HWCAP_SME),
        HWCAP_CAP(ID_AA64SMFR0_EL1, FA64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_FA64),
@@@ -2938,7 -2927,7 +2970,7 @@@ static void update_cpu_capabilities(u1
  
        scope_mask &= ARM64_CPUCAP_SCOPE_MASK;
        for (i = 0; i < ARM64_NCAPS; i++) {
 -              caps = cpu_hwcaps_ptrs[i];
 +              caps = cpucap_ptrs[i];
                if (!caps || !(caps->type & scope_mask) ||
                    cpus_have_cap(caps->capability) ||
                    !caps->matches(caps, cpucap_default_scope(caps)))
  
                if (caps->desc)
                        pr_info("detected: %s\n", caps->desc);
 -              cpus_set_cap(caps->capability);
 +
 +              __set_bit(caps->capability, system_cpucaps);
  
                if ((scope_mask & SCOPE_BOOT_CPU) && (caps->type & SCOPE_BOOT_CPU))
 -                      set_bit(caps->capability, boot_capabilities);
 +                      set_bit(caps->capability, boot_cpucaps);
        }
  }
  
@@@ -2964,7 -2952,7 +2996,7 @@@ static int cpu_enable_non_boot_scope_ca
        u16 non_boot_scope = SCOPE_ALL & ~SCOPE_BOOT_CPU;
  
        for_each_available_cap(i) {
 -              const struct arm64_cpu_capabilities *cap = cpu_hwcaps_ptrs[i];
 +              const struct arm64_cpu_capabilities *cap = cpucap_ptrs[i];
  
                if (WARN_ON(!cap))
                        continue;
@@@ -2994,7 -2982,7 +3026,7 @@@ static void __init enable_cpu_capabilit
        for (i = 0; i < ARM64_NCAPS; i++) {
                unsigned int num;
  
 -              caps = cpu_hwcaps_ptrs[i];
 +              caps = cpucap_ptrs[i];
                if (!caps || !(caps->type & scope_mask))
                        continue;
                num = caps->capability;
@@@ -3039,7 -3027,7 +3071,7 @@@ static void verify_local_cpu_caps(u16 s
        scope_mask &= ARM64_CPUCAP_SCOPE_MASK;
  
        for (i = 0; i < ARM64_NCAPS; i++) {
 -              caps = cpu_hwcaps_ptrs[i];
 +              caps = cpucap_ptrs[i];
                if (!caps || !(caps->type & scope_mask))
                        continue;
  
@@@ -3238,7 -3226,7 +3270,7 @@@ static void __init setup_boot_cpu_capab
  bool this_cpu_has_cap(unsigned int n)
  {
        if (!WARN_ON(preemptible()) && n < ARM64_NCAPS) {
 -              const struct arm64_cpu_capabilities *cap = cpu_hwcaps_ptrs[n];
 +              const struct arm64_cpu_capabilities *cap = cpucap_ptrs[n];
  
                if (cap)
                        return cap->matches(cap, SCOPE_LOCAL_CPU);
@@@ -3251,13 -3239,13 +3283,13 @@@ EXPORT_SYMBOL_GPL(this_cpu_has_cap)
  /*
   * This helper function is used in a narrow window when,
   * - The system wide safe registers are set with all the SMP CPUs and,
 - * - The SYSTEM_FEATURE cpu_hwcaps may not have been set.
 + * - The SYSTEM_FEATURE system_cpucaps may not have been set.
   * In all other cases cpus_have_{const_}cap() should be used.
   */
  static bool __maybe_unused __system_matches_cap(unsigned int n)
  {
        if (n < ARM64_NCAPS) {
 -              const struct arm64_cpu_capabilities *cap = cpu_hwcaps_ptrs[n];
 +              const struct arm64_cpu_capabilities *cap = cpucap_ptrs[n];
  
                if (cap)
                        return cap->matches(cap, SCOPE_SYSTEM);
diff --combined arch/arm64/kernel/head.S
index 0f5a30f109d9234d955afc546cd87a3e3da190c5,23955050da73be5964380344f7e4f6cf67273f28..757a0de07f91bbe0ad6261d11bcab9a5ddcd2cac
@@@ -382,7 -382,7 +382,7 @@@ SYM_FUNC_START_LOCAL(create_idmap
        adrp    x0, init_idmap_pg_dir
        adrp    x3, _text
        adrp    x6, _end + MAX_FDT_SIZE + SWAPPER_BLOCK_SIZE
 -      mov     x7, SWAPPER_RX_MMUFLAGS
 +      mov_q   x7, SWAPPER_RX_MMUFLAGS
  
        map_memory x0, x1, x3, x6, x7, x3, IDMAP_PGD_ORDER, x10, x11, x12, x13, x14, EXTRA_SHIFT
  
        adrp    x2, init_pg_dir
        adrp    x3, init_pg_end
        bic     x4, x2, #SWAPPER_BLOCK_SIZE - 1
 -      mov     x5, SWAPPER_RW_MMUFLAGS
 +      mov_q   x5, SWAPPER_RW_MMUFLAGS
        mov     x6, #SWAPPER_BLOCK_SHIFT
        bl      remap_region
  
        bfi     x22, x21, #0, #SWAPPER_BLOCK_SHIFT              // remapped FDT address
        add     x3, x2, #MAX_FDT_SIZE + SWAPPER_BLOCK_SIZE
        bic     x4, x21, #SWAPPER_BLOCK_SIZE - 1
 -      mov     x5, SWAPPER_RW_MMUFLAGS
 +      mov_q   x5, SWAPPER_RW_MMUFLAGS
        mov     x6, #SWAPPER_BLOCK_SHIFT
        bl      remap_region
  
@@@ -430,7 -430,7 +430,7 @@@ SYM_FUNC_START_LOCAL(create_kernel_mapp
        adrp    x3, _text                       // runtime __pa(_text)
        sub     x6, x6, x3                      // _end - _text
        add     x6, x6, x5                      // runtime __va(_end)
 -      mov     x7, SWAPPER_RW_MMUFLAGS
 +      mov_q   x7, SWAPPER_RW_MMUFLAGS
  
        map_memory x0, x1, x5, x6, x7, x3, (VA_BITS - PGDIR_SHIFT), x10, x11, x12, x13, x14
  
@@@ -603,6 -603,8 +603,8 @@@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL
        msr     sctlr_el1, x1
        mov     x2, xzr
  2:
+       __init_el2_nvhe_prepare_eret
        mov     w0, #BOOT_CPU_MODE_EL2
        orr     x0, x0, x2
        eret
index d63de1973ddbb4b348e711beb5c59fc5d1cdcf4b,5c71e10195458775b9072aba74f072ae7a7a2c55..65f76064c86b24db53795ea420efe56f4a21172d
@@@ -82,7 -82,15 +82,15 @@@ SYM_CODE_START_LOCAL(__finalise_el2
        tbnz    x1, #0, 1f
  
        // Needs to be VHE capable, obviously
-       check_override id_aa64mmfr1 ID_AA64MMFR1_EL1_VH_SHIFT 2f 1f x1 x2
+       check_override id_aa64mmfr1 ID_AA64MMFR1_EL1_VH_SHIFT 0f 1f x1 x2
+ 0:    // Check whether we only want the hypervisor to run VHE, not the kernel
+       adr_l   x1, arm64_sw_feature_override
+       ldr     x2, [x1, FTR_OVR_VAL_OFFSET]
+       ldr     x1, [x1, FTR_OVR_MASK_OFFSET]
+       and     x2, x2, x1
+       ubfx    x2, x2, #ARM64_SW_FEATURE_OVERRIDE_HVHE, #4
+       cbz     x2, 2f
  
  1:    mov_q   x0, HVC_STUB_ERR
        eret
        msr     ttbr1_el1, x0
        mrs_s   x0, SYS_MAIR_EL12
        msr     mair_el1, x0
 +      mrs     x1, REG_ID_AA64MMFR3_EL1
 +      ubfx    x1, x1, #ID_AA64MMFR3_EL1_TCRX_SHIFT, #4
 +      cbz     x1, .Lskip_tcr2
 +      mrs     x0, REG_TCR2_EL12
 +      msr     REG_TCR2_EL1, x0
 +
 +      // Transfer permission indirection state
 +      mrs     x1, REG_ID_AA64MMFR3_EL1
 +      ubfx    x1, x1, #ID_AA64MMFR3_EL1_S1PIE_SHIFT, #4
 +      cbz     x1, .Lskip_indirection
 +      mrs     x0, REG_PIRE0_EL12
 +      msr     REG_PIRE0_EL1, x0
 +      mrs     x0, REG_PIR_EL12
 +      msr     REG_PIR_EL1, x0
 +
 +.Lskip_indirection:
 +.Lskip_tcr2:
 +
        isb
  
        // Hack the exception return to stay at EL2
index 8439248c21d327d0f216a154ab59fa80715d9d77,c553d30089e58bf2e797d773bb2125cca872d9f5..2fe2491b692cd767f902f8f71d05fdcb751e68d2
@@@ -123,7 -123,6 +123,7 @@@ static const struct ftr_set_desc isar2 
        .fields         = {
                FIELD("gpa3", ID_AA64ISAR2_EL1_GPA3_SHIFT, NULL),
                FIELD("apa3", ID_AA64ISAR2_EL1_APA3_SHIFT, NULL),
 +              FIELD("mops", ID_AA64ISAR2_EL1_MOPS_SHIFT, NULL),
                {}
        },
  };
@@@ -139,15 -138,22 +139,22 @@@ static const struct ftr_set_desc smfr0 
        },
  };
  
- extern struct arm64_ftr_override kaslr_feature_override;
+ static bool __init hvhe_filter(u64 val)
+ {
+       u64 mmfr1 = read_sysreg(id_aa64mmfr1_el1);
+       return (val == 1 &&
+               lower_32_bits(__boot_status) == BOOT_CPU_MODE_EL2 &&
+               cpuid_feature_extract_unsigned_field(mmfr1,
+                                                    ID_AA64MMFR1_EL1_VH_SHIFT));
+ }
  
- static const struct ftr_set_desc kaslr __initconst = {
-       .name           = "kaslr",
- #ifdef CONFIG_RANDOMIZE_BASE
-       .override       = &kaslr_feature_override,
- #endif
+ static const struct ftr_set_desc sw_features __initconst = {
+       .name           = "arm64_sw",
+       .override       = &arm64_sw_feature_override,
        .fields         = {
-               FIELD("disabled", 0, NULL),
+               FIELD("nokaslr", ARM64_SW_FEATURE_OVERRIDE_NOKASLR, NULL),
+               FIELD("hvhe", ARM64_SW_FEATURE_OVERRIDE_HVHE, hvhe_filter),
                {}
        },
  };
@@@ -159,7 -165,7 +166,7 @@@ static const struct ftr_set_desc * cons
        &isar1,
        &isar2,
        &smfr0,
-       &kaslr,
+       &sw_features,
  };
  
  static const struct {
          "id_aa64isar1.gpi=0 id_aa64isar1.gpa=0 "
          "id_aa64isar1.api=0 id_aa64isar1.apa=0 "
          "id_aa64isar2.gpa3=0 id_aa64isar2.apa3=0"        },
 +      { "arm64.nomops",               "id_aa64isar2.mops=0" },
        { "arm64.nomte",                "id_aa64pfr1.mte=0" },
-       { "nokaslr",                    "kaslr.disabled=1" },
+       { "nokaslr",                    "arm64_sw.nokaslr=1" },
  };
  
  static int __init parse_nokaslr(char *unused)
index 2f6e0b3e4a7518b31a54f96cca4acd9e87906c5d,f35d5abedf9c08302f3fb9576387c0d26e9d037b..4bddb8541bece001f45c3669a79b631441dcd7f3
@@@ -70,6 -70,56 +70,56 @@@ static inline void __activate_traps_fps
        }
  }
  
+ static inline bool __hfgxtr_traps_required(void)
+ {
+       if (cpus_have_final_cap(ARM64_SME))
+               return true;
+       if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38))
+               return true;
+       return false;
+ }
+ static inline void __activate_traps_hfgxtr(void)
+ {
+       u64 r_clr = 0, w_clr = 0, r_set = 0, w_set = 0, tmp;
+       if (cpus_have_final_cap(ARM64_SME)) {
+               tmp = HFGxTR_EL2_nSMPRI_EL1_MASK | HFGxTR_EL2_nTPIDR2_EL0_MASK;
+               r_clr |= tmp;
+               w_clr |= tmp;
+       }
+       /*
+        * Trap guest writes to TCR_EL1 to prevent it from enabling HA or HD.
+        */
+       if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38))
+               w_set |= HFGxTR_EL2_TCR_EL1_MASK;
+       sysreg_clear_set_s(SYS_HFGRTR_EL2, r_clr, r_set);
+       sysreg_clear_set_s(SYS_HFGWTR_EL2, w_clr, w_set);
+ }
+ static inline void __deactivate_traps_hfgxtr(void)
+ {
+       u64 r_clr = 0, w_clr = 0, r_set = 0, w_set = 0, tmp;
+       if (cpus_have_final_cap(ARM64_SME)) {
+               tmp = HFGxTR_EL2_nSMPRI_EL1_MASK | HFGxTR_EL2_nTPIDR2_EL0_MASK;
+               r_set |= tmp;
+               w_set |= tmp;
+       }
+       if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38))
+               w_clr |= HFGxTR_EL2_TCR_EL1_MASK;
+       sysreg_clear_set_s(SYS_HFGRTR_EL2, r_clr, r_set);
+       sysreg_clear_set_s(SYS_HFGWTR_EL2, w_clr, w_set);
+ }
  static inline void __activate_traps_common(struct kvm_vcpu *vcpu)
  {
        /* Trap on AArch32 cp15 c15 (impdef sysregs) accesses (EL1 or EL0) */
        vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
        write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
  
-       if (cpus_have_final_cap(ARM64_SME)) {
-               sysreg_clear_set_s(SYS_HFGRTR_EL2,
-                                  HFGxTR_EL2_nSMPRI_EL1_MASK |
-                                  HFGxTR_EL2_nTPIDR2_EL0_MASK,
-                                  0);
-               sysreg_clear_set_s(SYS_HFGWTR_EL2,
-                                  HFGxTR_EL2_nSMPRI_EL1_MASK |
-                                  HFGxTR_EL2_nTPIDR2_EL0_MASK,
-                                  0);
-       }
+       if (__hfgxtr_traps_required())
+               __activate_traps_hfgxtr();
  }
  
  static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu)
                vcpu_clear_flag(vcpu, PMUSERENR_ON_CPU);
        }
  
-       if (cpus_have_final_cap(ARM64_SME)) {
-               sysreg_clear_set_s(SYS_HFGRTR_EL2, 0,
-                                  HFGxTR_EL2_nSMPRI_EL1_MASK |
-                                  HFGxTR_EL2_nTPIDR2_EL0_MASK);
-               sysreg_clear_set_s(SYS_HFGWTR_EL2, 0,
-                                  HFGxTR_EL2_nSMPRI_EL1_MASK |
-                                  HFGxTR_EL2_nTPIDR2_EL0_MASK);
-       }
+       if (__hfgxtr_traps_required())
+               __deactivate_traps_hfgxtr();
  }
  
  static inline void ___activate_traps(struct kvm_vcpu *vcpu)
  
        if (cpus_have_final_cap(ARM64_HAS_RAS_EXTN) && (hcr & HCR_VSE))
                write_sysreg_s(vcpu->arch.vsesr_el2, SYS_VSESR_EL2);
 +
 +      if (cpus_have_final_cap(ARM64_HAS_HCX))
 +              write_sysreg_s(HCRX_GUEST_FLAGS, SYS_HCRX_EL2);
  }
  
  static inline void ___deactivate_traps(struct kvm_vcpu *vcpu)
                vcpu->arch.hcr_el2 &= ~HCR_VSE;
                vcpu->arch.hcr_el2 |= read_sysreg(hcr_el2) & HCR_VSE;
        }
 +
 +      if (cpus_have_final_cap(ARM64_HAS_HCX))
 +              write_sysreg_s(HCRX_HOST_FLAGS, SYS_HCRX_EL2);
  }
  
  static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
@@@ -209,7 -239,7 +245,7 @@@ static bool kvm_hyp_handle_fpsimd(struc
        /* Valid trap.  Switch the context: */
  
        /* First disable enough traps to allow us to update the registers */
-       if (has_vhe()) {
+       if (has_vhe() || has_hvhe()) {
                reg = CPACR_EL1_FPEN_EL0EN | CPACR_EL1_FPEN_EL1EN;
                if (sve_guest)
                        reg |= CPACR_EL1_ZEN_EL0EN | CPACR_EL1_ZEN_EL1EN;
@@@ -401,12 -431,39 +437,39 @@@ static bool kvm_hyp_handle_cntpct(struc
        return true;
  }
  
+ static bool handle_ampere1_tcr(struct kvm_vcpu *vcpu)
+ {
+       u32 sysreg = esr_sys64_to_sysreg(kvm_vcpu_get_esr(vcpu));
+       int rt = kvm_vcpu_sys_get_rt(vcpu);
+       u64 val = vcpu_get_reg(vcpu, rt);
+       if (sysreg != SYS_TCR_EL1)
+               return false;
+       /*
+        * Affected parts do not advertise support for hardware Access Flag /
+        * Dirty state management in ID_AA64MMFR1_EL1.HAFDBS, but the underlying
+        * control bits are still functional. The architecture requires these be
+        * RES0 on systems that do not implement FEAT_HAFDBS.
+        *
+        * Uphold the requirements of the architecture by masking guest writes
+        * to TCR_EL1.{HA,HD} here.
+        */
+       val &= ~(TCR_HD | TCR_HA);
+       write_sysreg_el1(val, SYS_TCR);
+       return true;
+ }
  static bool kvm_hyp_handle_sysreg(struct kvm_vcpu *vcpu, u64 *exit_code)
  {
        if (cpus_have_final_cap(ARM64_WORKAROUND_CAVIUM_TX2_219_TVM) &&
            handle_tx2_tvm(vcpu))
                return true;
  
+       if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38) &&
+           handle_ampere1_tcr(vcpu))
+               return true;
        if (static_branch_unlikely(&vgic_v3_cpuif_trap) &&
            __vgic_v3_perform_cpuif_access(vcpu) == 1)
                return true;
index 5b5d5e5449dc1357e14a74f09d824e643b6911b1,6ce28afde022ce9196edac835d7443605fa0042b..bd3431823ec547d7dc1a945e20b00fd6f87c4cae
@@@ -42,6 -42,8 +42,8 @@@
   */
  
  static u64 sys_reg_to_index(const struct sys_reg_desc *reg);
+ static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
+                     u64 val);
  
  static bool read_from_write_only(struct kvm_vcpu *vcpu,
                                 struct sys_reg_params *params,
@@@ -401,9 -403,9 +403,9 @@@ static bool trap_oslar_el1(struct kvm_v
                return read_from_write_only(vcpu, p, r);
  
        /* Forward the OSLK bit to OSLSR */
 -      oslsr = __vcpu_sys_reg(vcpu, OSLSR_EL1) & ~SYS_OSLSR_OSLK;
 -      if (p->regval & SYS_OSLAR_OSLK)
 -              oslsr |= SYS_OSLSR_OSLK;
 +      oslsr = __vcpu_sys_reg(vcpu, OSLSR_EL1) & ~OSLSR_EL1_OSLK;
 +      if (p->regval & OSLAR_EL1_OSLK)
 +              oslsr |= OSLSR_EL1_OSLK;
  
        __vcpu_sys_reg(vcpu, OSLSR_EL1) = oslsr;
        return true;
@@@ -427,7 -429,7 +429,7 @@@ static int set_oslsr_el1(struct kvm_vcp
         * The only modifiable bit is the OSLK bit. Refuse the write if
         * userspace attempts to change any other bit in the register.
         */
 -      if ((val ^ rd->val) & ~SYS_OSLSR_OSLK)
 +      if ((val ^ rd->val) & ~OSLSR_EL1_OSLK)
                return -EINVAL;
  
        __vcpu_sys_reg(vcpu, rd->reg) = val;
@@@ -553,10 -555,11 +555,11 @@@ static int get_bvr(struct kvm_vcpu *vcp
        return 0;
  }
  
- static void reset_bvr(struct kvm_vcpu *vcpu,
+ static u64 reset_bvr(struct kvm_vcpu *vcpu,
                      const struct sys_reg_desc *rd)
  {
        vcpu->arch.vcpu_debug_state.dbg_bvr[rd->CRm] = rd->val;
+       return rd->val;
  }
  
  static bool trap_bcr(struct kvm_vcpu *vcpu,
@@@ -589,10 -592,11 +592,11 @@@ static int get_bcr(struct kvm_vcpu *vcp
        return 0;
  }
  
- static void reset_bcr(struct kvm_vcpu *vcpu,
+ static u64 reset_bcr(struct kvm_vcpu *vcpu,
                      const struct sys_reg_desc *rd)
  {
        vcpu->arch.vcpu_debug_state.dbg_bcr[rd->CRm] = rd->val;
+       return rd->val;
  }
  
  static bool trap_wvr(struct kvm_vcpu *vcpu,
@@@ -626,10 -630,11 +630,11 @@@ static int get_wvr(struct kvm_vcpu *vcp
        return 0;
  }
  
- static void reset_wvr(struct kvm_vcpu *vcpu,
+ static u64 reset_wvr(struct kvm_vcpu *vcpu,
                      const struct sys_reg_desc *rd)
  {
        vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm] = rd->val;
+       return rd->val;
  }
  
  static bool trap_wcr(struct kvm_vcpu *vcpu,
@@@ -662,25 -667,28 +667,28 @@@ static int get_wcr(struct kvm_vcpu *vcp
        return 0;
  }
  
- static void reset_wcr(struct kvm_vcpu *vcpu,
+ static u64 reset_wcr(struct kvm_vcpu *vcpu,
                      const struct sys_reg_desc *rd)
  {
        vcpu->arch.vcpu_debug_state.dbg_wcr[rd->CRm] = rd->val;
+       return rd->val;
  }
  
- static void reset_amair_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_amair_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 amair = read_sysreg(amair_el1);
        vcpu_write_sys_reg(vcpu, amair, AMAIR_EL1);
+       return amair;
  }
  
- static void reset_actlr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_actlr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 actlr = read_sysreg(actlr_el1);
        vcpu_write_sys_reg(vcpu, actlr, ACTLR_EL1);
+       return actlr;
  }
  
- static void reset_mpidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_mpidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 mpidr;
  
        mpidr = (vcpu->vcpu_id & 0x0f) << MPIDR_LEVEL_SHIFT(0);
        mpidr |= ((vcpu->vcpu_id >> 4) & 0xff) << MPIDR_LEVEL_SHIFT(1);
        mpidr |= ((vcpu->vcpu_id >> 12) & 0xff) << MPIDR_LEVEL_SHIFT(2);
-       vcpu_write_sys_reg(vcpu, (1ULL << 31) | mpidr, MPIDR_EL1);
+       mpidr |= (1ULL << 31);
+       vcpu_write_sys_reg(vcpu, mpidr, MPIDR_EL1);
+       return mpidr;
  }
  
  static unsigned int pmu_visibility(const struct kvm_vcpu *vcpu,
        return REG_HIDDEN;
  }
  
- static void reset_pmu_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_pmu_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 n, mask = BIT(ARMV8_PMU_CYCLE_IDX);
  
        /* No PMU available, any PMU reg may UNDEF... */
        if (!kvm_arm_support_pmu_v3())
-               return;
+               return 0;
  
        n = read_sysreg(pmcr_el0) >> ARMV8_PMU_PMCR_N_SHIFT;
        n &= ARMV8_PMU_PMCR_N_MASK;
  
        reset_unknown(vcpu, r);
        __vcpu_sys_reg(vcpu, r->reg) &= mask;
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
- static void reset_pmevcntr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_pmevcntr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        reset_unknown(vcpu, r);
        __vcpu_sys_reg(vcpu, r->reg) &= GENMASK(31, 0);
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
- static void reset_pmevtyper(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_pmevtyper(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        reset_unknown(vcpu, r);
        __vcpu_sys_reg(vcpu, r->reg) &= ARMV8_PMU_EVTYPE_MASK;
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
- static void reset_pmselr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_pmselr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        reset_unknown(vcpu, r);
        __vcpu_sys_reg(vcpu, r->reg) &= ARMV8_PMU_COUNTER_MASK;
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
- static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 pmcr;
  
        /* No PMU available, PMCR_EL0 may UNDEF... */
        if (!kvm_arm_support_pmu_v3())
-               return;
+               return 0;
  
        /* Only preserve PMCR_EL0.N, and reset the rest to 0 */
        pmcr = read_sysreg(pmcr_el0) & (ARMV8_PMU_PMCR_N_MASK << ARMV8_PMU_PMCR_N_SHIFT);
                pmcr |= ARMV8_PMU_PMCR_LC;
  
        __vcpu_sys_reg(vcpu, r->reg) = pmcr;
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
  static bool check_pmu_access_disabled(struct kvm_vcpu *vcpu, u64 flags)
@@@ -1187,25 -1208,89 +1208,89 @@@ static bool access_arch_timer(struct kv
        return true;
  }
  
- static u8 vcpu_pmuver(const struct kvm_vcpu *vcpu)
+ static s64 kvm_arm64_ftr_safe_value(u32 id, const struct arm64_ftr_bits *ftrp,
+                                   s64 new, s64 cur)
  {
-       if (kvm_vcpu_has_pmu(vcpu))
-               return vcpu->kvm->arch.dfr0_pmuver.imp;
+       struct arm64_ftr_bits kvm_ftr = *ftrp;
+       /* Some features have different safe value type in KVM than host features */
+       switch (id) {
+       case SYS_ID_AA64DFR0_EL1:
+               if (kvm_ftr.shift == ID_AA64DFR0_EL1_PMUVer_SHIFT)
+                       kvm_ftr.type = FTR_LOWER_SAFE;
+               break;
+       case SYS_ID_DFR0_EL1:
+               if (kvm_ftr.shift == ID_DFR0_EL1_PerfMon_SHIFT)
+                       kvm_ftr.type = FTR_LOWER_SAFE;
+               break;
+       }
  
-       return vcpu->kvm->arch.dfr0_pmuver.unimp;
+       return arm64_ftr_safe_value(&kvm_ftr, new, cur);
  }
  
- static u8 perfmon_to_pmuver(u8 perfmon)
+ /**
+  * arm64_check_features() - Check if a feature register value constitutes
+  * a subset of features indicated by the idreg's KVM sanitised limit.
+  *
+  * This function will check if each feature field of @val is the "safe" value
+  * against idreg's KVM sanitised limit return from reset() callback.
+  * If a field value in @val is the same as the one in limit, it is always
+  * considered the safe value regardless For register fields that are not in
+  * writable, only the value in limit is considered the safe value.
+  *
+  * Return: 0 if all the fields are safe. Otherwise, return negative errno.
+  */
+ static int arm64_check_features(struct kvm_vcpu *vcpu,
+                               const struct sys_reg_desc *rd,
+                               u64 val)
  {
-       switch (perfmon) {
-       case ID_DFR0_EL1_PerfMon_PMUv3:
-               return ID_AA64DFR0_EL1_PMUVer_IMP;
-       case ID_DFR0_EL1_PerfMon_IMPDEF:
-               return ID_AA64DFR0_EL1_PMUVer_IMP_DEF;
-       default:
-               /* Anything ARMv8.1+ and NI have the same value. For now. */
-               return perfmon;
+       const struct arm64_ftr_reg *ftr_reg;
+       const struct arm64_ftr_bits *ftrp = NULL;
+       u32 id = reg_to_encoding(rd);
+       u64 writable_mask = rd->val;
+       u64 limit = rd->reset(vcpu, rd);
+       u64 mask = 0;
+       /*
+        * Hidden and unallocated ID registers may not have a corresponding
+        * struct arm64_ftr_reg. Of course, if the register is RAZ we know the
+        * only safe value is 0.
+        */
+       if (sysreg_visible_as_raz(vcpu, rd))
+               return val ? -E2BIG : 0;
+       ftr_reg = get_arm64_ftr_reg(id);
+       if (!ftr_reg)
+               return -EINVAL;
+       ftrp = ftr_reg->ftr_bits;
+       for (; ftrp && ftrp->width; ftrp++) {
+               s64 f_val, f_lim, safe_val;
+               u64 ftr_mask;
+               ftr_mask = arm64_ftr_mask(ftrp);
+               if ((ftr_mask & writable_mask) != ftr_mask)
+                       continue;
+               f_val = arm64_ftr_value(ftrp, val);
+               f_lim = arm64_ftr_value(ftrp, limit);
+               mask |= ftr_mask;
+               if (f_val == f_lim)
+                       safe_val = f_val;
+               else
+                       safe_val = kvm_arm64_ftr_safe_value(id, ftrp, f_val, f_lim);
+               if (safe_val != f_val)
+                       return -E2BIG;
        }
+       /* For fields that are not writable, values in limit are the safe values. */
+       if ((val & ~mask) != (limit & ~mask))
+               return -E2BIG;
+       return 0;
  }
  
  static u8 pmuver_to_perfmon(u8 pmuver)
  }
  
  /* Read a sanitised cpufeature ID register by sys_reg_desc */
- static u64 read_id_reg(const struct kvm_vcpu *vcpu, struct sys_reg_desc const *r)
+ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
+                                      const struct sys_reg_desc *r)
  {
        u32 id = reg_to_encoding(r);
        u64 val;
        val = read_sanitised_ftr_reg(id);
  
        switch (id) {
-       case SYS_ID_AA64PFR0_EL1:
-               if (!vcpu_has_sve(vcpu))
-                       val &= ~ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_SVE);
-               val &= ~ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_AMU);
-               val &= ~ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV2);
-               val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV2), (u64)vcpu->kvm->arch.pfr0_csv2);
-               val &= ~ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV3);
-               val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV3), (u64)vcpu->kvm->arch.pfr0_csv3);
-               if (kvm_vgic_global_state.type == VGIC_V3) {
-                       val &= ~ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_GIC);
-                       val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_GIC), 1);
-               }
-               break;
        case SYS_ID_AA64PFR1_EL1:
                if (!kvm_has_mte(vcpu->kvm))
                        val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE);
                                 ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_GPA3));
                if (!cpus_have_final_cap(ARM64_HAS_WFXT))
                        val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_WFxT);
 +              val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_MOPS);
                break;
-       case SYS_ID_AA64DFR0_EL1:
-               /* Limit debug to ARMv8.0 */
-               val &= ~ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_DebugVer);
-               val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_DebugVer), 6);
-               /* Set PMUver to the required version */
-               val &= ~ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer);
-               val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer),
-                                 vcpu_pmuver(vcpu));
-               /* Hide SPE from guests */
-               val &= ~ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMSVer);
-               break;
-       case SYS_ID_DFR0_EL1:
-               val &= ~ARM64_FEATURE_MASK(ID_DFR0_EL1_PerfMon);
-               val |= FIELD_PREP(ARM64_FEATURE_MASK(ID_DFR0_EL1_PerfMon),
-                                 pmuver_to_perfmon(vcpu_pmuver(vcpu)));
-               break;
        case SYS_ID_AA64MMFR2_EL1:
                val &= ~ID_AA64MMFR2_EL1_CCIDX_MASK;
                break;
        return val;
  }
  
+ static u64 kvm_read_sanitised_id_reg(struct kvm_vcpu *vcpu,
+                                    const struct sys_reg_desc *r)
+ {
+       return __kvm_read_sanitised_id_reg(vcpu, r);
+ }
+ static u64 read_id_reg(const struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ {
+       return IDREG(vcpu->kvm, reg_to_encoding(r));
+ }
+ /*
+  * Return true if the register's (Op0, Op1, CRn, CRm, Op2) is
+  * (3, 0, 0, crm, op2), where 1<=crm<8, 0<=op2<8.
+  */
+ static inline bool is_id_reg(u32 id)
+ {
+       return (sys_reg_Op0(id) == 3 && sys_reg_Op1(id) == 0 &&
+               sys_reg_CRn(id) == 0 && sys_reg_CRm(id) >= 1 &&
+               sys_reg_CRm(id) < 8);
+ }
  static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
                                  const struct sys_reg_desc *r)
  {
@@@ -1355,88 -1433,113 +1434,113 @@@ static unsigned int sve_visibility(cons
        return REG_HIDDEN;
  }
  
- static int set_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
-                              const struct sys_reg_desc *rd,
-                              u64 val)
+ static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
+                                         const struct sys_reg_desc *rd)
  {
-       u8 csv2, csv3;
+       u64 val = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1);
+       if (!vcpu_has_sve(vcpu))
+               val &= ~ID_AA64PFR0_EL1_SVE_MASK;
  
        /*
-        * Allow AA64PFR0_EL1.CSV2 to be set from userspace as long as
-        * it doesn't promise more than what is actually provided (the
-        * guest could otherwise be covered in ectoplasmic residue).
+        * The default is to expose CSV2 == 1 if the HW isn't affected.
+        * Although this is a per-CPU feature, we make it global because
+        * asymmetric systems are just a nuisance.
+        *
+        * Userspace can override this as long as it doesn't promise
+        * the impossible.
         */
-       csv2 = cpuid_feature_extract_unsigned_field(val, ID_AA64PFR0_EL1_CSV2_SHIFT);
-       if (csv2 > 1 ||
-           (csv2 && arm64_get_spectre_v2_state() != SPECTRE_UNAFFECTED))
-               return -EINVAL;
+       if (arm64_get_spectre_v2_state() == SPECTRE_UNAFFECTED) {
+               val &= ~ID_AA64PFR0_EL1_CSV2_MASK;
+               val |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, CSV2, IMP);
+       }
+       if (arm64_get_meltdown_state() == SPECTRE_UNAFFECTED) {
+               val &= ~ID_AA64PFR0_EL1_CSV3_MASK;
+               val |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, CSV3, IMP);
+       }
  
-       /* Same thing for CSV3 */
-       csv3 = cpuid_feature_extract_unsigned_field(val, ID_AA64PFR0_EL1_CSV3_SHIFT);
-       if (csv3 > 1 ||
-           (csv3 && arm64_get_meltdown_state() != SPECTRE_UNAFFECTED))
-               return -EINVAL;
+       if (kvm_vgic_global_state.type == VGIC_V3) {
+               val &= ~ID_AA64PFR0_EL1_GIC_MASK;
+               val |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, GIC, IMP);
+       }
  
-       /* We can only differ with CSV[23], and anything else is an error */
-       val ^= read_id_reg(vcpu, rd);
-       val &= ~(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV2) |
-                ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_CSV3));
-       if (val)
-               return -EINVAL;
+       val &= ~ID_AA64PFR0_EL1_AMU_MASK;
  
-       vcpu->kvm->arch.pfr0_csv2 = csv2;
-       vcpu->kvm->arch.pfr0_csv3 = csv3;
+       return val;
+ }
  
-       return 0;
+ static u64 read_sanitised_id_aa64dfr0_el1(struct kvm_vcpu *vcpu,
+                                         const struct sys_reg_desc *rd)
+ {
+       u64 val = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1);
+       /* Limit debug to ARMv8.0 */
+       val &= ~ID_AA64DFR0_EL1_DebugVer_MASK;
+       val |= SYS_FIELD_PREP_ENUM(ID_AA64DFR0_EL1, DebugVer, IMP);
+       /*
+        * Only initialize the PMU version if the vCPU was configured with one.
+        */
+       val &= ~ID_AA64DFR0_EL1_PMUVer_MASK;
+       if (kvm_vcpu_has_pmu(vcpu))
+               val |= SYS_FIELD_PREP(ID_AA64DFR0_EL1, PMUVer,
+                                     kvm_arm_pmu_get_pmuver_limit());
+       /* Hide SPE from guests */
+       val &= ~ID_AA64DFR0_EL1_PMSVer_MASK;
+       return val;
  }
  
  static int set_id_aa64dfr0_el1(struct kvm_vcpu *vcpu,
                               const struct sys_reg_desc *rd,
                               u64 val)
  {
-       u8 pmuver, host_pmuver;
-       bool valid_pmu;
-       host_pmuver = kvm_arm_pmu_get_pmuver_limit();
+       u8 pmuver = SYS_FIELD_GET(ID_AA64DFR0_EL1, PMUVer, val);
  
        /*
-        * Allow AA64DFR0_EL1.PMUver to be set from userspace as long
-        * as it doesn't promise more than what the HW gives us. We
-        * allow an IMPDEF PMU though, only if no PMU is supported
-        * (KVM backward compatibility handling).
+        * Prior to commit 3d0dba5764b9 ("KVM: arm64: PMU: Move the
+        * ID_AA64DFR0_EL1.PMUver limit to VM creation"), KVM erroneously
+        * exposed an IMP_DEF PMU to userspace and the guest on systems w/
+        * non-architectural PMUs. Of course, PMUv3 is the only game in town for
+        * PMU virtualization, so the IMP_DEF value was rather user-hostile.
+        *
+        * At minimum, we're on the hook to allow values that were given to
+        * userspace by KVM. Cover our tracks here and replace the IMP_DEF value
+        * with a more sensible NI. The value of an ID register changing under
+        * the nose of the guest is unfortunate, but is certainly no more
+        * surprising than an ill-guided PMU driver poking at impdef system
+        * registers that end in an UNDEF...
         */
-       pmuver = FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), val);
-       if ((pmuver != ID_AA64DFR0_EL1_PMUVer_IMP_DEF && pmuver > host_pmuver))
-               return -EINVAL;
+       if (pmuver == ID_AA64DFR0_EL1_PMUVer_IMP_DEF)
+               val &= ~ID_AA64DFR0_EL1_PMUVer_MASK;
  
-       valid_pmu = (pmuver != 0 && pmuver != ID_AA64DFR0_EL1_PMUVer_IMP_DEF);
-       /* Make sure view register and PMU support do match */
-       if (kvm_vcpu_has_pmu(vcpu) != valid_pmu)
-               return -EINVAL;
+       return set_id_reg(vcpu, rd, val);
+ }
  
-       /* We can only differ with PMUver, and anything else is an error */
-       val ^= read_id_reg(vcpu, rd);
-       val &= ~ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer);
-       if (val)
-               return -EINVAL;
+ static u64 read_sanitised_id_dfr0_el1(struct kvm_vcpu *vcpu,
+                                     const struct sys_reg_desc *rd)
+ {
+       u8 perfmon = pmuver_to_perfmon(kvm_arm_pmu_get_pmuver_limit());
+       u64 val = read_sanitised_ftr_reg(SYS_ID_DFR0_EL1);
  
-       if (valid_pmu)
-               vcpu->kvm->arch.dfr0_pmuver.imp = pmuver;
-       else
-               vcpu->kvm->arch.dfr0_pmuver.unimp = pmuver;
+       val &= ~ID_DFR0_EL1_PerfMon_MASK;
+       if (kvm_vcpu_has_pmu(vcpu))
+               val |= SYS_FIELD_PREP(ID_DFR0_EL1, PerfMon, perfmon);
  
-       return 0;
+       return val;
  }
  
  static int set_id_dfr0_el1(struct kvm_vcpu *vcpu,
                           const struct sys_reg_desc *rd,
                           u64 val)
  {
-       u8 perfmon, host_perfmon;
-       bool valid_pmu;
+       u8 perfmon = SYS_FIELD_GET(ID_DFR0_EL1, PerfMon, val);
  
-       host_perfmon = pmuver_to_perfmon(kvm_arm_pmu_get_pmuver_limit());
+       if (perfmon == ID_DFR0_EL1_PerfMon_IMPDEF) {
+               val &= ~ID_DFR0_EL1_PerfMon_MASK;
+               perfmon = 0;
+       }
  
        /*
         * Allow DFR0_EL1.PerfMon to be set from userspace as long as
         * AArch64 side (as everything is emulated with that), and
         * that this is a PMUv3.
         */
-       perfmon = FIELD_GET(ARM64_FEATURE_MASK(ID_DFR0_EL1_PerfMon), val);
-       if ((perfmon != ID_DFR0_EL1_PerfMon_IMPDEF && perfmon > host_perfmon) ||
-           (perfmon != 0 && perfmon < ID_DFR0_EL1_PerfMon_PMUv3))
+       if (perfmon != 0 && perfmon < ID_DFR0_EL1_PerfMon_PMUv3)
                return -EINVAL;
  
-       valid_pmu = (perfmon != 0 && perfmon != ID_DFR0_EL1_PerfMon_IMPDEF);
-       /* Make sure view register and PMU support do match */
-       if (kvm_vcpu_has_pmu(vcpu) != valid_pmu)
-               return -EINVAL;
-       /* We can only differ with PerfMon, and anything else is an error */
-       val ^= read_id_reg(vcpu, rd);
-       val &= ~ARM64_FEATURE_MASK(ID_DFR0_EL1_PerfMon);
-       if (val)
-               return -EINVAL;
-       if (valid_pmu)
-               vcpu->kvm->arch.dfr0_pmuver.imp = perfmon_to_pmuver(perfmon);
-       else
-               vcpu->kvm->arch.dfr0_pmuver.unimp = perfmon_to_pmuver(perfmon);
-       return 0;
+       return set_id_reg(vcpu, rd, val);
  }
  
  /*
  static int get_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
                      u64 *val)
  {
+       /*
+        * Avoid locking if the VM has already started, as the ID registers are
+        * guaranteed to be invariant at that point.
+        */
+       if (kvm_vm_has_ran_once(vcpu->kvm)) {
+               *val = read_id_reg(vcpu, rd);
+               return 0;
+       }
+       mutex_lock(&vcpu->kvm->arch.config_lock);
        *val = read_id_reg(vcpu, rd);
+       mutex_unlock(&vcpu->kvm->arch.config_lock);
        return 0;
  }
  
  static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
                      u64 val)
  {
-       /* This is what we mean by invariant: you can't change it. */
-       if (val != read_id_reg(vcpu, rd))
-               return -EINVAL;
+       u32 id = reg_to_encoding(rd);
+       int ret;
  
-       return 0;
+       mutex_lock(&vcpu->kvm->arch.config_lock);
+       /*
+        * Once the VM has started the ID registers are immutable. Reject any
+        * write that does not match the final register value.
+        */
+       if (kvm_vm_has_ran_once(vcpu->kvm)) {
+               if (val != read_id_reg(vcpu, rd))
+                       ret = -EBUSY;
+               else
+                       ret = 0;
+               mutex_unlock(&vcpu->kvm->arch.config_lock);
+               return ret;
+       }
+       ret = arm64_check_features(vcpu, rd, val);
+       if (!ret)
+               IDREG(vcpu->kvm, id) = val;
+       mutex_unlock(&vcpu->kvm->arch.config_lock);
+       /*
+        * arm64_check_features() returns -E2BIG to indicate the register's
+        * feature set is a superset of the maximally-allowed register value.
+        * While it would be nice to precisely describe this to userspace, the
+        * existing UAPI for KVM_SET_ONE_REG has it that invalid register
+        * writes return -EINVAL.
+        */
+       if (ret == -E2BIG)
+               ret = -EINVAL;
+       return ret;
  }
  
  static int get_raz_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
@@@ -1530,7 -1656,7 +1657,7 @@@ static bool access_clidr(struct kvm_vcp
   * Fabricate a CLIDR_EL1 value instead of using the real value, which can vary
   * by the physical CPU which the vcpu currently resides in.
   */
- static void reset_clidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
+ static u64 reset_clidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
  {
        u64 ctr_el0 = read_sanitised_ftr_reg(SYS_CTR_EL0);
        u64 clidr;
                clidr |= 2 << CLIDR_TTYPE_SHIFT(loc);
  
        __vcpu_sys_reg(vcpu, r->reg) = clidr;
+       return __vcpu_sys_reg(vcpu, r->reg);
  }
  
  static int set_clidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
@@@ -1677,6 -1805,17 +1806,17 @@@ static unsigned int elx2_visibility(con
        .visibility = elx2_visibility,          \
  }
  
+ /*
+  * Since reset() callback and field val are not used for idregs, they will be
+  * used for specific purposes for idregs.
+  * The reset() would return KVM sanitised register value. The value would be the
+  * same as the host kernel sanitised value if there is no KVM sanitisation.
+  * The val would be used as a mask indicating writable fields for the idreg.
+  * Only bits with 1 are writable from userspace. This mask might not be
+  * necessary in the future whenever all ID registers are enabled as writable
+  * from userspace.
+  */
  /* sys_reg_desc initialiser for known cpufeature ID registers */
  #define ID_SANITISED(name) {                  \
        SYS_DESC(SYS_##name),                   \
        .get_user = get_id_reg,                 \
        .set_user = set_id_reg,                 \
        .visibility = id_visibility,            \
+       .reset = kvm_read_sanitised_id_reg,     \
+       .val = 0,                               \
  }
  
  /* sys_reg_desc initialiser for known cpufeature ID registers */
        .get_user = get_id_reg,                 \
        .set_user = set_id_reg,                 \
        .visibility = aa32_id_visibility,       \
+       .reset = kvm_read_sanitised_id_reg,     \
+       .val = 0,                               \
  }
  
  /*
        .access = access_id_reg,                        \
        .get_user = get_id_reg,                         \
        .set_user = set_id_reg,                         \
-       .visibility = raz_visibility                    \
+       .visibility = raz_visibility,                   \
+       .reset = kvm_read_sanitised_id_reg,             \
+       .val = 0,                                       \
  }
  
  /*
        .get_user = get_id_reg,                 \
        .set_user = set_id_reg,                 \
        .visibility = raz_visibility,           \
+       .reset = kvm_read_sanitised_id_reg,     \
+       .val = 0,                               \
  }
  
  static bool access_sp_el1(struct kvm_vcpu *vcpu,
@@@ -1801,7 -1948,7 +1949,7 @@@ static const struct sys_reg_desc sys_re
        { SYS_DESC(SYS_MDRAR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_OSLAR_EL1), trap_oslar_el1 },
        { SYS_DESC(SYS_OSLSR_EL1), trap_oslsr_el1, reset_val, OSLSR_EL1,
 -              SYS_OSLSR_OSLM_IMPLEMENTED, .set_user = set_oslsr_el1, },
 +              OSLSR_EL1_OSLM_IMPLEMENTED, .set_user = set_oslsr_el1, },
        { SYS_DESC(SYS_OSDLR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_DBGPRCR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_DBGCLAIMSET_EL1), trap_raz_wi },
        /* CRm=1 */
        AA32_ID_SANITISED(ID_PFR0_EL1),
        AA32_ID_SANITISED(ID_PFR1_EL1),
-       { SYS_DESC(SYS_ID_DFR0_EL1), .access = access_id_reg,
-         .get_user = get_id_reg, .set_user = set_id_dfr0_el1,
-         .visibility = aa32_id_visibility, },
+       { SYS_DESC(SYS_ID_DFR0_EL1),
+         .access = access_id_reg,
+         .get_user = get_id_reg,
+         .set_user = set_id_dfr0_el1,
+         .visibility = aa32_id_visibility,
+         .reset = read_sanitised_id_dfr0_el1,
+         .val = ID_DFR0_EL1_PerfMon_MASK, },
        ID_HIDDEN(ID_AFR0_EL1),
        AA32_ID_SANITISED(ID_MMFR0_EL1),
        AA32_ID_SANITISED(ID_MMFR1_EL1),
  
        /* AArch64 ID registers */
        /* CRm=4 */
-       { SYS_DESC(SYS_ID_AA64PFR0_EL1), .access = access_id_reg,
-         .get_user = get_id_reg, .set_user = set_id_aa64pfr0_el1, },
+       { SYS_DESC(SYS_ID_AA64PFR0_EL1),
+         .access = access_id_reg,
+         .get_user = get_id_reg,
+         .set_user = set_id_reg,
+         .reset = read_sanitised_id_aa64pfr0_el1,
+         .val = ID_AA64PFR0_EL1_CSV2_MASK | ID_AA64PFR0_EL1_CSV3_MASK, },
        ID_SANITISED(ID_AA64PFR1_EL1),
        ID_UNALLOCATED(4,2),
        ID_UNALLOCATED(4,3),
        ID_UNALLOCATED(4,7),
  
        /* CRm=5 */
-       { SYS_DESC(SYS_ID_AA64DFR0_EL1), .access = access_id_reg,
-         .get_user = get_id_reg, .set_user = set_id_aa64dfr0_el1, },
+       { SYS_DESC(SYS_ID_AA64DFR0_EL1),
+         .access = access_id_reg,
+         .get_user = get_id_reg,
+         .set_user = set_id_aa64dfr0_el1,
+         .reset = read_sanitised_id_aa64dfr0_el1,
+         .val = ID_AA64DFR0_EL1_PMUVer_MASK, },
        ID_SANITISED(ID_AA64DFR1_EL1),
        ID_UNALLOCATED(5,2),
        ID_UNALLOCATED(5,3),
        ID_SANITISED(ID_AA64MMFR0_EL1),
        ID_SANITISED(ID_AA64MMFR1_EL1),
        ID_SANITISED(ID_AA64MMFR2_EL1),
 -      ID_UNALLOCATED(7,3),
 +      ID_SANITISED(ID_AA64MMFR3_EL1),
        ID_UNALLOCATED(7,4),
        ID_UNALLOCATED(7,5),
        ID_UNALLOCATED(7,6),
        { SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 },
        { SYS_DESC(SYS_TTBR1_EL1), access_vm_reg, reset_unknown, TTBR1_EL1 },
        { SYS_DESC(SYS_TCR_EL1), access_vm_reg, reset_val, TCR_EL1, 0 },
 +      { SYS_DESC(SYS_TCR2_EL1), access_vm_reg, reset_val, TCR2_EL1, 0 },
  
        PTRAUTH_KEY(APIA),
        PTRAUTH_KEY(APIB),
        { SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi },
  
        { SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
 +      { SYS_DESC(SYS_PIRE0_EL1), access_vm_reg, reset_unknown, PIRE0_EL1 },
 +      { SYS_DESC(SYS_PIR_EL1), access_vm_reg, reset_unknown, PIR_EL1 },
        { SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
  
        { SYS_DESC(SYS_LORSA_EL1), trap_loregion },
        EL2_REG(ACTLR_EL2, access_rw, reset_val, 0),
        EL2_REG(HCR_EL2, access_rw, reset_val, 0),
        EL2_REG(MDCR_EL2, access_rw, reset_val, 0),
-       EL2_REG(CPTR_EL2, access_rw, reset_val, CPTR_EL2_DEFAULT ),
+       EL2_REG(CPTR_EL2, access_rw, reset_val, CPTR_NVHE_EL2_RES1),
        EL2_REG(HSTR_EL2, access_rw, reset_val, 0),
        EL2_REG(HACR_EL2, access_rw, reset_val, 0),
  
        EL2_REG(SP_EL2, NULL, reset_unknown, 0),
  };
  
+ static const struct sys_reg_desc *first_idreg;
  static bool trap_dbgdidr(struct kvm_vcpu *vcpu,
                        struct sys_reg_params *p,
                        const struct sys_reg_desc *r)
@@@ -2950,6 -3108,28 +3112,28 @@@ static bool emulate_sys_reg(struct kvm_
        return false;
  }
  
+ static void kvm_reset_id_regs(struct kvm_vcpu *vcpu)
+ {
+       const struct sys_reg_desc *idreg = first_idreg;
+       u32 id = reg_to_encoding(idreg);
+       struct kvm *kvm = vcpu->kvm;
+       if (test_bit(KVM_ARCH_FLAG_ID_REGS_INITIALIZED, &kvm->arch.flags))
+               return;
+       lockdep_assert_held(&kvm->arch.config_lock);
+       /* Initialize all idregs */
+       while (is_id_reg(id)) {
+               IDREG(kvm, id) = idreg->reset(vcpu, idreg);
+               idreg++;
+               id = reg_to_encoding(idreg);
+       }
+       set_bit(KVM_ARCH_FLAG_ID_REGS_INITIALIZED, &kvm->arch.flags);
+ }
  /**
   * kvm_reset_sys_regs - sets system registers to reset value
   * @vcpu: The VCPU pointer
@@@ -2961,9 -3141,17 +3145,17 @@@ void kvm_reset_sys_regs(struct kvm_vcp
  {
        unsigned long i;
  
-       for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++)
-               if (sys_reg_descs[i].reset)
-                       sys_reg_descs[i].reset(vcpu, &sys_reg_descs[i]);
+       kvm_reset_id_regs(vcpu);
+       for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) {
+               const struct sys_reg_desc *r = &sys_reg_descs[i];
+               if (is_id_reg(reg_to_encoding(r)))
+                       continue;
+               if (r->reset)
+                       r->reset(vcpu, r);
+       }
  }
  
  /**
@@@ -3064,19 -3252,21 +3256,21 @@@ id_to_sys_reg_desc(struct kvm_vcpu *vcp
   */
  
  #define FUNCTION_INVARIANT(reg)                                               \
-       static void get_##reg(struct kvm_vcpu *v,                       \
+       static u64 get_##reg(struct kvm_vcpu *v,                        \
                              const struct sys_reg_desc *r)             \
        {                                                               \
                ((struct sys_reg_desc *)r)->val = read_sysreg(reg);     \
+               return ((struct sys_reg_desc *)r)->val;                 \
        }
  
  FUNCTION_INVARIANT(midr_el1)
  FUNCTION_INVARIANT(revidr_el1)
  FUNCTION_INVARIANT(aidr_el1)
  
- static void get_ctr_el0(struct kvm_vcpu *v, const struct sys_reg_desc *r)
+ static u64 get_ctr_el0(struct kvm_vcpu *v, const struct sys_reg_desc *r)
  {
        ((struct sys_reg_desc *)r)->val = read_sanitised_ftr_reg(SYS_CTR_EL0);
+       return ((struct sys_reg_desc *)r)->val;
  }
  
  /* ->val is filled in by kvm_sys_reg_table_init() */
@@@ -3368,6 -3558,7 +3562,7 @@@ int kvm_arm_copy_sys_reg_indices(struc
  
  int __init kvm_sys_reg_table_init(void)
  {
+       struct sys_reg_params params;
        bool valid = true;
        unsigned int i;
  
        for (i = 0; i < ARRAY_SIZE(invariant_sys_regs); i++)
                invariant_sys_regs[i].reset(NULL, &invariant_sys_regs[i]);
  
+       /* Find the first idreg (SYS_ID_PFR0_EL1) in sys_reg_descs. */
+       params = encoding_to_params(SYS_ID_PFR0_EL1);
+       first_idreg = find_reg(&params, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
+       if (!first_idreg)
+               return -EINVAL;
        return 0;
  }
diff --combined arch/arm64/tools/cpucaps
index 19c23c4fa2da0795ef0a8c24ce9f6df020d7d831,b21c84672bbf161be5fcba6c2e7452bbb20fda78..c80ed4f3cbcee29bebd70bc3071ba3c39b3689d3
@@@ -25,6 -25,7 +25,7 @@@ HAS_E0P
  HAS_ECV
  HAS_ECV_CNTPOFF
  HAS_EPAN
+ HAS_EVT
  HAS_GENERIC_AUTH
  HAS_GENERIC_AUTH_ARCH_QARMA3
  HAS_GENERIC_AUTH_ARCH_QARMA5
@@@ -32,25 -33,22 +33,26 @@@ HAS_GENERIC_AUTH_IMP_DE
  HAS_GIC_CPUIF_SYSREGS
  HAS_GIC_PRIO_MASKING
  HAS_GIC_PRIO_RELAXED_SYNC
 +HAS_HCX
  HAS_LDAPR
  HAS_LSE_ATOMICS
 +HAS_MOPS
  HAS_NESTED_VIRT
  HAS_NO_FPSIMD
  HAS_NO_HW_PREFETCH
  HAS_PAN
 +HAS_S1PIE
  HAS_RAS_EXTN
  HAS_RNG
  HAS_SB
  HAS_STAGE2_FWB
 +HAS_TCR2
  HAS_TIDCP1
  HAS_TLB_RANGE
  HAS_VIRT_HOST_EXTN
  HAS_WFXT
  HW_DBM
+ KVM_HVHE
  KVM_PROTECTED_MODE
  MISMATCHED_CACHE_TYPE
  MTE
@@@ -81,6 -79,7 +83,7 @@@ WORKAROUND_207705
  WORKAROUND_2457168
  WORKAROUND_2645198
  WORKAROUND_2658417
+ WORKAROUND_AMPERE_AC03_CPU_38
  WORKAROUND_TRBE_OVERWRITE_FILL_MODE
  WORKAROUND_TSB_FLUSH_FAILURE
  WORKAROUND_TRBE_WRITE_OUT_OF_RANGE
index b98b3b6c9da2d81e5bbd0fe34e39a834dc9be812,917814a0f99e6dc18c07333ac3c30cad689d6100..7bac43a3176ed1d45aad779e2e625e0dfa17ecd5
  #define SR_FS_CLEAN   _AC(0x00004000, UL)
  #define SR_FS_DIRTY   _AC(0x00006000, UL)
  
 +#define SR_VS         _AC(0x00000600, UL) /* Vector Status */
 +#define SR_VS_OFF     _AC(0x00000000, UL)
 +#define SR_VS_INITIAL _AC(0x00000200, UL)
 +#define SR_VS_CLEAN   _AC(0x00000400, UL)
 +#define SR_VS_DIRTY   _AC(0x00000600, UL)
 +
  #define SR_XS         _AC(0x00018000, UL) /* Extension Status */
  #define SR_XS_OFF     _AC(0x00000000, UL)
  #define SR_XS_INITIAL _AC(0x00008000, UL)
  #define SR_XS_CLEAN   _AC(0x00010000, UL)
  #define SR_XS_DIRTY   _AC(0x00018000, UL)
  
 +#define SR_FS_VS      (SR_FS | SR_VS) /* Vector and Floating-Point Unit */
 +
  #ifndef CONFIG_64BIT
 -#define SR_SD         _AC(0x80000000, UL) /* FS/XS dirty */
 +#define SR_SD         _AC(0x80000000, UL) /* FS/VS/XS dirty */
  #else
 -#define SR_SD         _AC(0x8000000000000000, UL) /* FS/XS dirty */
 +#define SR_SD         _AC(0x8000000000000000, UL) /* FS/VS/XS dirty */
  #endif
  
  #ifdef CONFIG_64BIT
@@@ -90,7 -82,9 +90,9 @@@
  #define EXC_INST_ACCESS               1
  #define EXC_INST_ILLEGAL      2
  #define EXC_BREAKPOINT                3
+ #define EXC_LOAD_MISALIGNED   4
  #define EXC_LOAD_ACCESS               5
+ #define EXC_STORE_MISALIGNED  6
  #define EXC_STORE_ACCESS      7
  #define EXC_SYSCALL           8
  #define EXC_HYPERVISOR_SYSCALL        9
  #define CSR_MVIPH             0x319
  #define CSR_MIPH              0x354
  
 +#define CSR_VSTART            0x8
 +#define CSR_VCSR              0xf
 +#define CSR_VL                        0xc20
 +#define CSR_VTYPE             0xc21
 +#define CSR_VLENB             0xc22
 +
  #ifdef CONFIG_RISCV_M_MODE
  # define CSR_STATUS   CSR_MSTATUS
  # define CSR_IE               CSR_MIE
index bd47a1dc2ff85f72009152643cdd744e0e4ad3ec,871432586a639e62a9cbf5b57a7e4c6836c893a1..2d8ee53b66c7b1377bead9b5b02226fcb0e533eb
@@@ -15,7 -15,6 +15,7 @@@
  #include <linux/spinlock.h>
  #include <asm/hwcap.h>
  #include <asm/kvm_aia.h>
 +#include <asm/ptrace.h>
  #include <asm/kvm_vcpu_fp.h>
  #include <asm/kvm_vcpu_insn.h>
  #include <asm/kvm_vcpu_sbi.h>
@@@ -28,6 -27,8 +28,8 @@@
  
  #define KVM_VCPU_MAX_FEATURES         0
  
+ #define KVM_IRQCHIP_NUM_PINS          1024
  #define KVM_REQ_SLEEP \
        KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
  #define KVM_REQ_VCPU_RESET            KVM_ARCH_REQ(1)
@@@ -146,7 -147,6 +148,7 @@@ struct kvm_cpu_context 
        unsigned long sstatus;
        unsigned long hstatus;
        union __riscv_fp_state fp;
 +      struct __riscv_v_ext_state vector;
  };
  
  struct kvm_vcpu_csr {
@@@ -320,6 -320,8 +322,8 @@@ int kvm_riscv_gstage_vmid_init(struct k
  bool kvm_riscv_gstage_vmid_ver_changed(struct kvm_vmid *vmid);
  void kvm_riscv_gstage_vmid_update(struct kvm_vcpu *vcpu);
  
+ int kvm_riscv_setup_default_irq_routing(struct kvm *kvm, u32 lines);
  void __kvm_riscv_unpriv_trap(void);
  
  unsigned long kvm_riscv_vcpu_unpriv_read(struct kvm_vcpu *vcpu,
index 855c047e86d49664e6518842188fa17986213807,a1ca18408bbd599288a7c8531cc0ba5dbe1b0513..930fdc4101cdab8eddbd31e2ff33fb27f17bc998
@@@ -15,6 -15,7 +15,7 @@@
  #include <asm/bitsperlong.h>
  #include <asm/ptrace.h>
  
+ #define __KVM_HAVE_IRQ_LINE
  #define __KVM_HAVE_READONLY_MEM
  
  #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
@@@ -121,7 -122,7 +122,8 @@@ enum KVM_RISCV_ISA_EXT_ID 
        KVM_RISCV_ISA_EXT_ZICBOZ,
        KVM_RISCV_ISA_EXT_ZBB,
        KVM_RISCV_ISA_EXT_SSAIA,
 +      KVM_RISCV_ISA_EXT_V,
+       KVM_RISCV_ISA_EXT_SVNAPOT,
        KVM_RISCV_ISA_EXT_MAX,
  };
  
@@@ -204,13 -205,77 +206,84 @@@ enum KVM_RISCV_SBI_EXT_ID 
  #define KVM_REG_RISCV_SBI_MULTI_REG_LAST      \
                KVM_REG_RISCV_SBI_MULTI_REG(KVM_RISCV_SBI_EXT_MAX - 1)
  
 +/* V extension registers are mapped as type 9 */
 +#define KVM_REG_RISCV_VECTOR          (0x09 << KVM_REG_RISCV_TYPE_SHIFT)
 +#define KVM_REG_RISCV_VECTOR_CSR_REG(name)    \
 +              (offsetof(struct __riscv_v_ext_state, name) / sizeof(unsigned long))
 +#define KVM_REG_RISCV_VECTOR_REG(n)   \
 +              ((n) + sizeof(struct __riscv_v_ext_state) / sizeof(unsigned long))
 +
+ /* Device Control API: RISC-V AIA */
+ #define KVM_DEV_RISCV_APLIC_ALIGN             0x1000
+ #define KVM_DEV_RISCV_APLIC_SIZE              0x4000
+ #define KVM_DEV_RISCV_APLIC_MAX_HARTS         0x4000
+ #define KVM_DEV_RISCV_IMSIC_ALIGN             0x1000
+ #define KVM_DEV_RISCV_IMSIC_SIZE              0x1000
+ #define KVM_DEV_RISCV_AIA_GRP_CONFIG          0
+ #define KVM_DEV_RISCV_AIA_CONFIG_MODE         0
+ #define KVM_DEV_RISCV_AIA_CONFIG_IDS          1
+ #define KVM_DEV_RISCV_AIA_CONFIG_SRCS         2
+ #define KVM_DEV_RISCV_AIA_CONFIG_GROUP_BITS   3
+ #define KVM_DEV_RISCV_AIA_CONFIG_GROUP_SHIFT  4
+ #define KVM_DEV_RISCV_AIA_CONFIG_HART_BITS    5
+ #define KVM_DEV_RISCV_AIA_CONFIG_GUEST_BITS   6
+ /*
+  * Modes of RISC-V AIA device:
+  * 1) EMUL (aka Emulation): Trap-n-emulate IMSIC
+  * 2) HWACCEL (aka HW Acceleration): Virtualize IMSIC using IMSIC guest files
+  * 3) AUTO (aka Automatic): Virtualize IMSIC using IMSIC guest files whenever
+  *    available otherwise fallback to trap-n-emulation
+  */
+ #define KVM_DEV_RISCV_AIA_MODE_EMUL           0
+ #define KVM_DEV_RISCV_AIA_MODE_HWACCEL                1
+ #define KVM_DEV_RISCV_AIA_MODE_AUTO           2
+ #define KVM_DEV_RISCV_AIA_IDS_MIN             63
+ #define KVM_DEV_RISCV_AIA_IDS_MAX             2048
+ #define KVM_DEV_RISCV_AIA_SRCS_MAX            1024
+ #define KVM_DEV_RISCV_AIA_GROUP_BITS_MAX      8
+ #define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MIN     24
+ #define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MAX     56
+ #define KVM_DEV_RISCV_AIA_HART_BITS_MAX               16
+ #define KVM_DEV_RISCV_AIA_GUEST_BITS_MAX      8
+ #define KVM_DEV_RISCV_AIA_GRP_ADDR            1
+ #define KVM_DEV_RISCV_AIA_ADDR_APLIC          0
+ #define KVM_DEV_RISCV_AIA_ADDR_IMSIC(__vcpu)  (1 + (__vcpu))
+ #define KVM_DEV_RISCV_AIA_ADDR_MAX            \
+               (1 + KVM_DEV_RISCV_APLIC_MAX_HARTS)
+ #define KVM_DEV_RISCV_AIA_GRP_CTRL            2
+ #define KVM_DEV_RISCV_AIA_CTRL_INIT           0
+ /*
+  * The device attribute type contains the memory mapped offset of the
+  * APLIC register (range 0x0000-0x3FFF) and it must be 4-byte aligned.
+  */
+ #define KVM_DEV_RISCV_AIA_GRP_APLIC           3
+ /*
+  * The lower 12-bits of the device attribute type contains the iselect
+  * value of the IMSIC register (range 0x70-0xFF) whereas the higher order
+  * bits contains the VCPU id.
+  */
+ #define KVM_DEV_RISCV_AIA_GRP_IMSIC           4
+ #define KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS     12
+ #define KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK     \
+               ((1U << KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS) - 1)
+ #define KVM_DEV_RISCV_AIA_IMSIC_MKATTR(__vcpu, __isel)        \
+               (((__vcpu) << KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS) | \
+                ((__isel) & KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK))
+ #define KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL(__attr)      \
+               ((__attr) & KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK)
+ #define KVM_DEV_RISCV_AIA_IMSIC_GET_VCPU(__attr)      \
+               ((__attr) >> KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS)
+ /* One single KVM irqchip, ie. the AIA */
+ #define KVM_NR_IRQCHIPS                       1
  #endif
  
  #endif /* __LINUX_KVM_RISCV_H */
diff --combined arch/riscv/kvm/Makefile
index 7b4c21f9aa6a6302c958a890be7fa314836f589f,c1d1356387ff053c3ca340bdfb8c4d3d2b95b4c3..fee0671e2dc12d65e3faeb48f21d0493f06f556c
@@@ -17,7 -17,6 +17,7 @@@ kvm-y += mmu.
  kvm-y += vcpu.o
  kvm-y += vcpu_exit.o
  kvm-y += vcpu_fp.o
 +kvm-y += vcpu_vector.o
  kvm-y += vcpu_insn.o
  kvm-y += vcpu_switch.o
  kvm-y += vcpu_sbi.o
@@@ -28,3 -27,6 +28,6 @@@ kvm-y += vcpu_sbi_hsm.
  kvm-y += vcpu_timer.o
  kvm-$(CONFIG_RISCV_PMU_SBI) += vcpu_pmu.o vcpu_sbi_pmu.o
  kvm-y += aia.o
+ kvm-y += aia_device.o
+ kvm-y += aia_aplic.o
+ kvm-y += aia_imsic.o
diff --combined arch/riscv/kvm/vcpu.c
index de24127e7e93f5f11b14e7a98e6f0700bcd3ebd5,7b355900f2354a9c7e185db8c1df86b55b12018d..d12ef99901fc50334df504c04d9492304f513411
@@@ -22,8 -22,6 +22,8 @@@
  #include <asm/cacheflush.h>
  #include <asm/hwcap.h>
  #include <asm/sbi.h>
 +#include <asm/vector.h>
 +#include <asm/kvm_vcpu_vector.h>
  
  const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
        KVM_GENERIC_VCPU_STATS(),
@@@ -59,11 -57,11 +59,12 @@@ static const unsigned long kvm_isa_ext_
        [KVM_RISCV_ISA_EXT_H] = RISCV_ISA_EXT_h,
        [KVM_RISCV_ISA_EXT_I] = RISCV_ISA_EXT_i,
        [KVM_RISCV_ISA_EXT_M] = RISCV_ISA_EXT_m,
 +      [KVM_RISCV_ISA_EXT_V] = RISCV_ISA_EXT_v,
  
        KVM_ISA_EXT_ARR(SSAIA),
        KVM_ISA_EXT_ARR(SSTC),
        KVM_ISA_EXT_ARR(SVINVAL),
+       KVM_ISA_EXT_ARR(SVNAPOT),
        KVM_ISA_EXT_ARR(SVPBMT),
        KVM_ISA_EXT_ARR(ZBB),
        KVM_ISA_EXT_ARR(ZIHINTPAUSE),
@@@ -88,8 -86,6 +89,8 @@@ static bool kvm_riscv_vcpu_isa_enable_a
        switch (ext) {
        case KVM_RISCV_ISA_EXT_H:
                return false;
 +      case KVM_RISCV_ISA_EXT_V:
 +              return riscv_v_vstate_ctrl_user_allowed();
        default:
                break;
        }
@@@ -107,6 -103,7 +108,7 @@@ static bool kvm_riscv_vcpu_isa_disable_
        case KVM_RISCV_ISA_EXT_SSAIA:
        case KVM_RISCV_ISA_EXT_SSTC:
        case KVM_RISCV_ISA_EXT_SVINVAL:
+       case KVM_RISCV_ISA_EXT_SVNAPOT:
        case KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
        case KVM_RISCV_ISA_EXT_ZBB:
                return false;
@@@ -143,8 -140,6 +145,8 @@@ static void kvm_riscv_reset_vcpu(struc
  
        kvm_riscv_vcpu_fp_reset(vcpu);
  
 +      kvm_riscv_vcpu_vector_reset(vcpu);
 +
        kvm_riscv_vcpu_timer_reset(vcpu);
  
        kvm_riscv_vcpu_aia_reset(vcpu);
@@@ -205,9 -200,6 +207,9 @@@ int kvm_arch_vcpu_create(struct kvm_vcp
        cntx->hstatus |= HSTATUS_SPVP;
        cntx->hstatus |= HSTATUS_SPV;
  
 +      if (kvm_riscv_vcpu_alloc_vector_context(vcpu, cntx))
 +              return -ENOMEM;
 +
        /* By default, make CY, TM, and IR counters accessible in VU mode */
        reset_csr->scounteren = 0x7;
  
@@@ -251,9 -243,6 +253,9 @@@ void kvm_arch_vcpu_destroy(struct kvm_v
  
        /* Free unused pages pre-allocated for G-stage page table mappings */
        kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
 +
 +      /* Free vector context space for host and guest kernel */
 +      kvm_riscv_vcpu_free_vector_context(vcpu);
  }
  
  int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
  
  void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
  {
+       kvm_riscv_aia_wakeon_hgei(vcpu, true);
  }
  
  void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu)
  {
+       kvm_riscv_aia_wakeon_hgei(vcpu, false);
  }
  
  int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
@@@ -692,9 -683,6 +696,9 @@@ static int kvm_riscv_vcpu_set_reg(struc
                return kvm_riscv_vcpu_set_reg_isa_ext(vcpu, reg);
        case KVM_REG_RISCV_SBI_EXT:
                return kvm_riscv_vcpu_set_reg_sbi_ext(vcpu, reg);
 +      case KVM_REG_RISCV_VECTOR:
 +              return kvm_riscv_vcpu_set_reg_vector(vcpu, reg,
 +                                               KVM_REG_RISCV_VECTOR);
        default:
                break;
        }
@@@ -724,9 -712,6 +728,9 @@@ static int kvm_riscv_vcpu_get_reg(struc
                return kvm_riscv_vcpu_get_reg_isa_ext(vcpu, reg);
        case KVM_REG_RISCV_SBI_EXT:
                return kvm_riscv_vcpu_get_reg_sbi_ext(vcpu, reg);
 +      case KVM_REG_RISCV_VECTOR:
 +              return kvm_riscv_vcpu_get_reg_vector(vcpu, reg,
 +                                               KVM_REG_RISCV_VECTOR);
        default:
                break;
        }
@@@ -1021,9 -1006,6 +1025,9 @@@ void kvm_arch_vcpu_load(struct kvm_vcp
        kvm_riscv_vcpu_host_fp_save(&vcpu->arch.host_context);
        kvm_riscv_vcpu_guest_fp_restore(&vcpu->arch.guest_context,
                                        vcpu->arch.isa);
 +      kvm_riscv_vcpu_host_vector_save(&vcpu->arch.host_context);
 +      kvm_riscv_vcpu_guest_vector_restore(&vcpu->arch.guest_context,
 +                                          vcpu->arch.isa);
  
        kvm_riscv_vcpu_aia_load(vcpu, cpu);
  
@@@ -1043,9 -1025,6 +1047,9 @@@ void kvm_arch_vcpu_put(struct kvm_vcpu 
        kvm_riscv_vcpu_host_fp_restore(&vcpu->arch.host_context);
  
        kvm_riscv_vcpu_timer_save(vcpu);
 +      kvm_riscv_vcpu_guest_vector_save(&vcpu->arch.guest_context,
 +                                       vcpu->arch.isa);
 +      kvm_riscv_vcpu_host_vector_restore(&vcpu->arch.host_context);
  
        csr->vsstatus = csr_read(CSR_VSSTATUS);
        csr->vsie = csr_read(CSR_VSIE);
diff --combined arch/s390/kernel/uv.c
index 3c62d1b218b15d9c20fa97c537b575e0491366fd,273a0281a18975651293437268a6a0be0acd78e1..66f0eb1c872bfefd81c9ff4de4261c1bf3c6afbe
  int __bootdata_preserved(prot_virt_guest);
  #endif
  
+ /*
+  * uv_info contains both host and guest information but it's currently only
+  * expected to be used within modules if it's the KVM module or for
+  * any PV guest module.
+  *
+  * The kernel itself will write these values once in uv_query_info()
+  * and then make some of them readable via a sysfs interface.
+  */
  struct uv_info __bootdata_preserved(uv_info);
+ EXPORT_SYMBOL(uv_info);
  
  #if IS_ENABLED(CONFIG_KVM)
  int __bootdata_preserved(prot_virt_host);
  EXPORT_SYMBOL(prot_virt_host);
- EXPORT_SYMBOL(uv_info);
  
  static int __init uv_init(phys_addr_t stor_base, unsigned long stor_len)
  {
@@@ -294,8 -302,6 +302,8 @@@ again
  
        rc = -ENXIO;
        ptep = get_locked_pte(gmap->mm, uaddr, &ptelock);
 +      if (!ptep)
 +              goto out;
        if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) {
                page = pte_page(*ptep);
                rc = -EAGAIN;
@@@ -462,13 -468,13 +470,13 @@@ EXPORT_SYMBOL_GPL(arch_make_page_access
  
  #if defined(CONFIG_PROTECTED_VIRTUALIZATION_GUEST) || IS_ENABLED(CONFIG_KVM)
  static ssize_t uv_query_facilities(struct kobject *kobj,
-                                  struct kobj_attribute *attr, char *page)
+                                  struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n%lx\n%lx\n%lx\n",
-                       uv_info.inst_calls_list[0],
-                       uv_info.inst_calls_list[1],
-                       uv_info.inst_calls_list[2],
-                       uv_info.inst_calls_list[3]);
+       return sysfs_emit(buf, "%lx\n%lx\n%lx\n%lx\n",
+                         uv_info.inst_calls_list[0],
+                         uv_info.inst_calls_list[1],
+                         uv_info.inst_calls_list[2],
+                         uv_info.inst_calls_list[3]);
  }
  
  static struct kobj_attribute uv_query_facilities_attr =
@@@ -493,30 -499,27 +501,27 @@@ static struct kobj_attribute uv_query_s
        __ATTR(supp_se_hdr_pcf, 0444, uv_query_supp_se_hdr_pcf, NULL);
  
  static ssize_t uv_query_dump_cpu_len(struct kobject *kobj,
-                                    struct kobj_attribute *attr, char *page)
+                                    struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n",
-                       uv_info.guest_cpu_stor_len);
+       return sysfs_emit(buf, "%lx\n", uv_info.guest_cpu_stor_len);
  }
  
  static struct kobj_attribute uv_query_dump_cpu_len_attr =
        __ATTR(uv_query_dump_cpu_len, 0444, uv_query_dump_cpu_len, NULL);
  
  static ssize_t uv_query_dump_storage_state_len(struct kobject *kobj,
-                                              struct kobj_attribute *attr, char *page)
+                                              struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n",
-                       uv_info.conf_dump_storage_state_len);
+       return sysfs_emit(buf, "%lx\n", uv_info.conf_dump_storage_state_len);
  }
  
  static struct kobj_attribute uv_query_dump_storage_state_len_attr =
        __ATTR(dump_storage_state_len, 0444, uv_query_dump_storage_state_len, NULL);
  
  static ssize_t uv_query_dump_finalize_len(struct kobject *kobj,
-                                         struct kobj_attribute *attr, char *page)
+                                         struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n",
-                       uv_info.conf_dump_finalize_len);
+       return sysfs_emit(buf, "%lx\n", uv_info.conf_dump_finalize_len);
  }
  
  static struct kobj_attribute uv_query_dump_finalize_len_attr =
@@@ -532,53 -535,86 +537,86 @@@ static struct kobj_attribute uv_query_f
        __ATTR(feature_indications, 0444, uv_query_feature_indications, NULL);
  
  static ssize_t uv_query_max_guest_cpus(struct kobject *kobj,
-                                      struct kobj_attribute *attr, char *page)
+                                      struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%d\n",
-                       uv_info.max_guest_cpu_id + 1);
+       return sysfs_emit(buf, "%d\n", uv_info.max_guest_cpu_id + 1);
  }
  
  static struct kobj_attribute uv_query_max_guest_cpus_attr =
        __ATTR(max_cpus, 0444, uv_query_max_guest_cpus, NULL);
  
  static ssize_t uv_query_max_guest_vms(struct kobject *kobj,
-                                     struct kobj_attribute *attr, char *page)
+                                     struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%d\n",
-                       uv_info.max_num_sec_conf);
+       return sysfs_emit(buf, "%d\n", uv_info.max_num_sec_conf);
  }
  
  static struct kobj_attribute uv_query_max_guest_vms_attr =
        __ATTR(max_guests, 0444, uv_query_max_guest_vms, NULL);
  
  static ssize_t uv_query_max_guest_addr(struct kobject *kobj,
-                                      struct kobj_attribute *attr, char *page)
+                                      struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n",
-                       uv_info.max_sec_stor_addr);
+       return sysfs_emit(buf, "%lx\n", uv_info.max_sec_stor_addr);
  }
  
  static struct kobj_attribute uv_query_max_guest_addr_attr =
        __ATTR(max_address, 0444, uv_query_max_guest_addr, NULL);
  
  static ssize_t uv_query_supp_att_req_hdr_ver(struct kobject *kobj,
-                                            struct kobj_attribute *attr, char *page)
+                                            struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n", uv_info.supp_att_req_hdr_ver);
+       return sysfs_emit(buf, "%lx\n", uv_info.supp_att_req_hdr_ver);
  }
  
  static struct kobj_attribute uv_query_supp_att_req_hdr_ver_attr =
        __ATTR(supp_att_req_hdr_ver, 0444, uv_query_supp_att_req_hdr_ver, NULL);
  
  static ssize_t uv_query_supp_att_pflags(struct kobject *kobj,
-                                       struct kobj_attribute *attr, char *page)
+                                       struct kobj_attribute *attr, char *buf)
  {
-       return scnprintf(page, PAGE_SIZE, "%lx\n", uv_info.supp_att_pflags);
+       return sysfs_emit(buf, "%lx\n", uv_info.supp_att_pflags);
  }
  
  static struct kobj_attribute uv_query_supp_att_pflags_attr =
        __ATTR(supp_att_pflags, 0444, uv_query_supp_att_pflags, NULL);
  
+ static ssize_t uv_query_supp_add_secret_req_ver(struct kobject *kobj,
+                                               struct kobj_attribute *attr, char *buf)
+ {
+       return sysfs_emit(buf, "%lx\n", uv_info.supp_add_secret_req_ver);
+ }
+ static struct kobj_attribute uv_query_supp_add_secret_req_ver_attr =
+       __ATTR(supp_add_secret_req_ver, 0444, uv_query_supp_add_secret_req_ver, NULL);
+ static ssize_t uv_query_supp_add_secret_pcf(struct kobject *kobj,
+                                           struct kobj_attribute *attr, char *buf)
+ {
+       return sysfs_emit(buf, "%lx\n", uv_info.supp_add_secret_pcf);
+ }
+ static struct kobj_attribute uv_query_supp_add_secret_pcf_attr =
+       __ATTR(supp_add_secret_pcf, 0444, uv_query_supp_add_secret_pcf, NULL);
+ static ssize_t uv_query_supp_secret_types(struct kobject *kobj,
+                                         struct kobj_attribute *attr, char *buf)
+ {
+       return sysfs_emit(buf, "%lx\n", uv_info.supp_secret_types);
+ }
+ static struct kobj_attribute uv_query_supp_secret_types_attr =
+       __ATTR(supp_secret_types, 0444, uv_query_supp_secret_types, NULL);
+ static ssize_t uv_query_max_secrets(struct kobject *kobj,
+                                   struct kobj_attribute *attr, char *buf)
+ {
+       return sysfs_emit(buf, "%d\n", uv_info.max_secrets);
+ }
+ static struct kobj_attribute uv_query_max_secrets_attr =
+       __ATTR(max_secrets, 0444, uv_query_max_secrets, NULL);
  static struct attribute *uv_query_attrs[] = {
        &uv_query_facilities_attr.attr,
        &uv_query_feature_indications_attr.attr,
        &uv_query_dump_cpu_len_attr.attr,
        &uv_query_supp_att_req_hdr_ver_attr.attr,
        &uv_query_supp_att_pflags_attr.attr,
+       &uv_query_supp_add_secret_req_ver_attr.attr,
+       &uv_query_supp_add_secret_pcf_attr.attr,
+       &uv_query_supp_secret_types_attr.attr,
+       &uv_query_max_secrets_attr.attr,
        NULL,
  };
  
@@@ -600,18 -640,18 +642,18 @@@ static struct attribute_group uv_query_
  };
  
  static ssize_t uv_is_prot_virt_guest(struct kobject *kobj,
-                                    struct kobj_attribute *attr, char *page)
+                                    struct kobj_attribute *attr, char *buf)
  {
        int val = 0;
  
  #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
        val = prot_virt_guest;
  #endif
-       return scnprintf(page, PAGE_SIZE, "%d\n", val);
+       return sysfs_emit(buf, "%d\n", val);
  }
  
  static ssize_t uv_is_prot_virt_host(struct kobject *kobj,
-                                   struct kobj_attribute *attr, char *page)
+                                   struct kobj_attribute *attr, char *buf)
  {
        int val = 0;
  
        val = prot_virt_host;
  #endif
  
-       return scnprintf(page, PAGE_SIZE, "%d\n", val);
+       return sysfs_emit(buf, "%d\n", val);
  }
  
  static struct kobj_attribute uv_prot_virt_guest =
diff --combined arch/x86/kvm/x86.c
index 7f70207e86899a63a3db956b92910229f11d8f56,8bca4d2405f8c06047d537dd52a7430397018ca0..a6b9bea62fb8ac4498cccc7686196f6b63a8c1e9
@@@ -1017,13 -1017,11 +1017,11 @@@ void kvm_load_guest_xsave_state(struct 
                        wrmsrl(MSR_IA32_XSS, vcpu->arch.ia32_xss);
        }
  
- #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
-       if (static_cpu_has(X86_FEATURE_PKU) &&
+       if (cpu_feature_enabled(X86_FEATURE_PKU) &&
            vcpu->arch.pkru != vcpu->arch.host_pkru &&
            ((vcpu->arch.xcr0 & XFEATURE_MASK_PKRU) ||
             kvm_is_cr4_bit_set(vcpu, X86_CR4_PKE)))
                write_pkru(vcpu->arch.pkru);
- #endif /* CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS */
  }
  EXPORT_SYMBOL_GPL(kvm_load_guest_xsave_state);
  
@@@ -1032,15 -1030,13 +1030,13 @@@ void kvm_load_host_xsave_state(struct k
        if (vcpu->arch.guest_state_protected)
                return;
  
- #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
-       if (static_cpu_has(X86_FEATURE_PKU) &&
+       if (cpu_feature_enabled(X86_FEATURE_PKU) &&
            ((vcpu->arch.xcr0 & XFEATURE_MASK_PKRU) ||
             kvm_is_cr4_bit_set(vcpu, X86_CR4_PKE))) {
                vcpu->arch.pkru = rdpkru();
                if (vcpu->arch.pkru != vcpu->arch.host_pkru)
                        write_pkru(vcpu->arch.host_pkru);
        }
- #endif /* CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS */
  
        if (kvm_is_cr4_bit_set(vcpu, X86_CR4_OSXSAVE)) {
  
@@@ -1427,15 -1423,14 +1423,14 @@@ int kvm_emulate_rdpmc(struct kvm_vcpu *
  EXPORT_SYMBOL_GPL(kvm_emulate_rdpmc);
  
  /*
-  * List of msr numbers which we expose to userspace through KVM_GET_MSRS
-  * and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST.
-  *
-  * The three MSR lists(msrs_to_save, emulated_msrs, msr_based_features)
-  * extract the supported MSRs from the related const lists.
-  * msrs_to_save is selected from the msrs_to_save_all to reflect the
-  * capabilities of the host cpu. This capabilities test skips MSRs that are
-  * kvm-specific. Those are put in emulated_msrs_all; filtering of emulated_msrs
-  * may depend on host virtualization features rather than host cpu features.
+  * The three MSR lists(msrs_to_save, emulated_msrs, msr_based_features) track
+  * the set of MSRs that KVM exposes to userspace through KVM_GET_MSRS,
+  * KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST.  msrs_to_save holds MSRs that
+  * require host support, i.e. should be probed via RDMSR.  emulated_msrs holds
+  * MSRs that KVM emulates without strictly requiring host support.
+  * msr_based_features holds MSRs that enumerate features, i.e. are effectively
+  * CPUID leafs.  Note, msr_based_features isn't mutually exclusive with
+  * msrs_to_save and emulated_msrs.
   */
  
  static const u32 msrs_to_save_base[] = {
@@@ -1483,6 -1478,10 +1478,10 @@@ static const u32 msrs_to_save_pmu[] = 
        MSR_F15H_PERF_CTL3, MSR_F15H_PERF_CTL4, MSR_F15H_PERF_CTL5,
        MSR_F15H_PERF_CTR0, MSR_F15H_PERF_CTR1, MSR_F15H_PERF_CTR2,
        MSR_F15H_PERF_CTR3, MSR_F15H_PERF_CTR4, MSR_F15H_PERF_CTR5,
+       MSR_AMD64_PERF_CNTR_GLOBAL_CTL,
+       MSR_AMD64_PERF_CNTR_GLOBAL_STATUS,
+       MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR,
  };
  
  static u32 msrs_to_save[ARRAY_SIZE(msrs_to_save_base) +
@@@ -1531,11 -1530,11 +1530,11 @@@ static const u32 emulated_msrs_all[] = 
        MSR_IA32_UCODE_REV,
  
        /*
-        * The following list leaves out MSRs whose values are determined
-        * by arch/x86/kvm/vmx/nested.c based on CPUID or other MSRs.
-        * We always support the "true" VMX control MSRs, even if the host
-        * processor does not, so I am putting these registers here rather
-        * than in msrs_to_save_all.
+        * KVM always supports the "true" VMX control MSRs, even if the host
+        * does not.  The VMX MSRs as a whole are considered "emulated" as KVM
+        * doesn't strictly require them to exist in the host (ignoring that
+        * KVM would refuse to load in the first place if the core set of MSRs
+        * aren't supported).
         */
        MSR_IA32_VMX_BASIC,
        MSR_IA32_VMX_TRUE_PINBASED_CTLS,
@@@ -1631,7 -1630,7 +1630,7 @@@ static u64 kvm_get_arch_capabilities(vo
         * If we're doing cache flushes (either "always" or "cond")
         * we will do one whenever the guest does a vmlaunch/vmresume.
         * If an outer hypervisor is doing the cache flush for us
-        * (VMENTER_L1D_FLUSH_NESTED_VM), we can safely pass that
+        * (ARCH_CAP_SKIP_VMENTRY_L1DFLUSH), we can safely pass that
         * capability to the guest too, and if EPT is disabled we're not
         * vulnerable.  Overall, only VMENTER_L1D_FLUSH_NEVER will
         * require a nested hypervisor to do a flush of its own.
@@@ -1809,7 -1808,7 +1808,7 @@@ bool kvm_msr_allowed(struct kvm_vcpu *v
                unsigned long *bitmap = ranges[i].bitmap;
  
                if ((index >= start) && (index < end) && (flags & type)) {
-                       allowed = !!test_bit(index - start, bitmap);
+                       allowed = test_bit(index - start, bitmap);
                        break;
                }
        }
@@@ -2799,13 -2798,14 +2798,13 @@@ static u64 read_tsc(void
  static inline u64 vgettsc(struct pvclock_clock *clock, u64 *tsc_timestamp,
                          int *mode)
  {
 -      long v;
        u64 tsc_pg_val;
 +      long v;
  
        switch (clock->vclock_mode) {
        case VDSO_CLOCKMODE_HVCLOCK:
 -              tsc_pg_val = hv_read_tsc_page_tsc(hv_get_tsc_page(),
 -                                                tsc_timestamp);
 -              if (tsc_pg_val != U64_MAX) {
 +              if (hv_read_tsc_page_tsc(hv_get_tsc_page(),
 +                                       tsc_timestamp, &tsc_pg_val)) {
                        /* TSC page valid */
                        *mode = VDSO_CLOCKMODE_HVCLOCK;
                        v = (tsc_pg_val - clock->cycle_last) &
@@@ -3701,8 -3701,14 +3700,14 @@@ int kvm_set_msr_common(struct kvm_vcpu 
                        return 1;
                }
                break;
-       case 0x200 ... MSR_IA32_MC0_CTL2 - 1:
-       case MSR_IA32_MCx_CTL2(KVM_MAX_MCE_BANKS) ... 0x2ff:
+       case MSR_IA32_CR_PAT:
+               if (!kvm_pat_valid(data))
+                       return 1;
+               vcpu->arch.pat = data;
+               break;
+       case MTRRphysBase_MSR(0) ... MSR_MTRRfix4K_F8000:
+       case MSR_MTRRdefType:
                return kvm_mtrr_set_msr(vcpu, msr, data);
        case MSR_IA32_APICBASE:
                return kvm_set_apic_base(vcpu, msr_info);
@@@ -4109,9 -4115,12 +4114,12 @@@ int kvm_get_msr_common(struct kvm_vcpu 
                msr_info->data = kvm_scale_tsc(rdtsc(), ratio) + offset;
                break;
        }
+       case MSR_IA32_CR_PAT:
+               msr_info->data = vcpu->arch.pat;
+               break;
        case MSR_MTRRcap:
-       case 0x200 ... MSR_IA32_MC0_CTL2 - 1:
-       case MSR_IA32_MCx_CTL2(KVM_MAX_MCE_BANKS) ... 0x2ff:
+       case MTRRphysBase_MSR(0) ... MSR_MTRRfix4K_F8000:
+       case MSR_MTRRdefType:
                return kvm_mtrr_get_msr(vcpu, msr_info->index, &msr_info->data);
        case 0xcd: /* fsb frequency */
                msr_info->data = 3;
@@@ -7149,6 -7158,12 +7157,12 @@@ static void kvm_probe_msr_to_save(u32 m
                    kvm_pmu_cap.num_counters_fixed)
                        return;
                break;
+       case MSR_AMD64_PERF_CNTR_GLOBAL_CTL:
+       case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS:
+       case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR:
+               if (!kvm_cpu_cap_has(X86_FEATURE_PERFMON_V2))
+                       return;
+               break;
        case MSR_IA32_XFD:
        case MSR_IA32_XFD_ERR:
                if (!kvm_cpu_cap_has(X86_FEATURE_XFD))
@@@ -10434,20 -10449,6 +10448,6 @@@ static void vcpu_load_eoi_exitmap(struc
                vcpu, (u64 *)vcpu->arch.ioapic_handled_vectors);
  }
  
- void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
-                                           unsigned long start, unsigned long end)
- {
-       unsigned long apic_address;
-       /*
-        * The physical address of apic access page is stored in the VMCS.
-        * Update it when it becomes invalid.
-        */
-       apic_address = gfn_to_hva(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT);
-       if (start <= apic_address && apic_address < end)
-               kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
- }
  void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)
  {
        static_call_cond(kvm_x86_guest_memory_reclaimed)(kvm);
@@@ -13161,7 -13162,7 +13161,7 @@@ EXPORT_SYMBOL_GPL(kvm_arch_end_assignme
  
  bool noinstr kvm_arch_has_assigned_device(struct kvm *kvm)
  {
 -      return arch_atomic_read(&kvm->arch.assigned_device_count);
 +      return raw_atomic_read(&kvm->arch.assigned_device_count);
  }
  EXPORT_SYMBOL_GPL(kvm_arch_has_assigned_device);
  
diff --combined virt/kvm/kvm_main.c
index 19f301ef23c90faffc1472825f386be09f6bfe23,b838c8f71349e078986d1fda6b5a9a68c96cc415..dfbaafbe3a00991bd40e21bc19dcf606ec553e4a
@@@ -154,11 -154,6 +154,6 @@@ static unsigned long long kvm_active_vm
  
  static DEFINE_PER_CPU(cpumask_var_t, cpu_kick_mask);
  
- __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
-                                                  unsigned long start, unsigned long end)
- {
- }
  __weak void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)
  {
  }
@@@ -521,18 -516,6 +516,6 @@@ static inline struct kvm *mmu_notifier_
        return container_of(mn, struct kvm, mmu_notifier);
  }
  
- static void kvm_mmu_notifier_invalidate_range(struct mmu_notifier *mn,
-                                             struct mm_struct *mm,
-                                             unsigned long start, unsigned long end)
- {
-       struct kvm *kvm = mmu_notifier_to_kvm(mn);
-       int idx;
-       idx = srcu_read_lock(&kvm->srcu);
-       kvm_arch_mmu_notifier_invalidate_range(kvm, start, end);
-       srcu_read_unlock(&kvm->srcu, idx);
- }
  typedef bool (*hva_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range);
  
  typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start,
@@@ -910,7 -893,6 +893,6 @@@ static void kvm_mmu_notifier_release(st
  }
  
  static const struct mmu_notifier_ops kvm_mmu_notifier_ops = {
-       .invalidate_range       = kvm_mmu_notifier_invalidate_range,
        .invalidate_range_start = kvm_mmu_notifier_invalidate_range_start,
        .invalidate_range_end   = kvm_mmu_notifier_invalidate_range_end,
        .clear_flush_young      = kvm_mmu_notifier_clear_flush_young,
@@@ -2495,7 -2477,7 +2477,7 @@@ static inline int check_user_page_hwpoi
  {
        int rc, flags = FOLL_HWPOISON | FOLL_WRITE;
  
 -      rc = get_user_pages(addr, 1, flags, NULL, NULL);
 +      rc = get_user_pages(addr, 1, flags, NULL);
        return rc == -EHWPOISON;
  }
  
@@@ -2596,7 -2578,6 +2578,7 @@@ static int hva_to_pfn_remapped(struct v
  {
        kvm_pfn_t pfn;
        pte_t *ptep;
 +      pte_t pte;
        spinlock_t *ptl;
        int r;
  
                        return r;
        }
  
 -      if (write_fault && !pte_write(*ptep)) {
 +      pte = ptep_get(ptep);
 +
 +      if (write_fault && !pte_write(pte)) {
                pfn = KVM_PFN_ERR_RO_FAULT;
                goto out;
        }
  
        if (writable)
 -              *writable = pte_write(*ptep);
 -      pfn = pte_pfn(*ptep);
 +              *writable = pte_write(pte);
 +      pfn = pte_pfn(pte);
  
        /*
         * Get a reference here because callers of *hva_to_pfn* and
         * tail pages of non-compound higher order allocations, which
         * would then underflow the refcount when the caller does the
         * required put_page. Don't allow those pages here.
 -       */ 
 +       */
        if (!kvm_try_get_pfn(pfn))
                r = -EFAULT;
  
@@@ -3891,7 -3870,10 +3873,10 @@@ static int create_vcpu_fd(struct kvm_vc
  static int vcpu_get_pid(void *data, u64 *val)
  {
        struct kvm_vcpu *vcpu = data;
-       *val = pid_nr(rcu_access_pointer(vcpu->pid));
+       rcu_read_lock();
+       *val = pid_nr(rcu_dereference(vcpu->pid));
+       rcu_read_unlock();
        return 0;
  }
  
@@@ -3993,7 -3975,7 +3978,7 @@@ static int kvm_vm_ioctl_create_vcpu(str
        if (r < 0)
                goto kvm_put_xa_release;
  
-       if (KVM_BUG_ON(!!xa_store(&kvm->vcpu_array, vcpu->vcpu_idx, vcpu, 0), kvm)) {
+       if (KVM_BUG_ON(xa_store(&kvm->vcpu_array, vcpu->vcpu_idx, vcpu, 0), kvm)) {
                r = -EINVAL;
                goto kvm_put_xa_release;
        }
@@@ -4623,7 -4605,7 +4608,7 @@@ int __attribute__((weak)) kvm_vm_ioctl_
        return -EINVAL;
  }
  
static bool kvm_are_all_memslots_empty(struct kvm *kvm)
+ bool kvm_are_all_memslots_empty(struct kvm *kvm)
  {
        int i;
  
  
        return true;
  }
+ EXPORT_SYMBOL_GPL(kvm_are_all_memslots_empty);
  
  static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
                                           struct kvm_enable_cap *cap)
@@@ -5315,6 -5298,12 +5301,12 @@@ static void hardware_disable_all(void
  }
  #endif /* CONFIG_KVM_GENERIC_HARDWARE_ENABLING */
  
+ static void kvm_iodevice_destructor(struct kvm_io_device *dev)
+ {
+       if (dev->ops->destructor)
+               dev->ops->destructor(dev);
+ }
  static void kvm_io_bus_destroy(struct kvm_io_bus *bus)
  {
        int i;
@@@ -5538,7 -5527,7 +5530,7 @@@ int kvm_io_bus_register_dev(struct kvm 
  int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
                              struct kvm_io_device *dev)
  {
-       int i, j;
+       int i;
        struct kvm_io_bus *new_bus, *bus;
  
        lockdep_assert_held(&kvm->slots_lock);
        rcu_assign_pointer(kvm->buses[bus_idx], new_bus);
        synchronize_srcu_expedited(&kvm->srcu);
  
-       /* Destroy the old bus _after_ installing the (null) bus. */
+       /*
+        * If NULL bus is installed, destroy the old bus, including all the
+        * attached devices. Otherwise, destroy the caller's device only.
+        */
        if (!new_bus) {
                pr_err("kvm: failed to shrink bus, removing it completely\n");
-               for (j = 0; j < bus->dev_count; j++) {
-                       if (j == i)
-                               continue;
-                       kvm_iodevice_destructor(bus->range[j].dev);
-               }
+               kvm_io_bus_destroy(bus);
+               return -ENOMEM;
        }
  
+       kvm_iodevice_destructor(dev);
        kfree(bus);
-       return new_bus ? 0 : -ENOMEM;
+       return 0;
  }
  
  struct kvm_io_device *kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx,