]> Git Repo - linux.git/commitdiff
Merge tag 'iommu-updates-v5.14' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Fri, 2 Jul 2021 20:22:47 +0000 (13:22 -0700)
committerLinus Torvalds <[email protected]>
Fri, 2 Jul 2021 20:22:47 +0000 (13:22 -0700)
Pull iommu updates from Joerg Roedel:

 - SMMU Updates from Will Deacon:

     - SMMUv3:
        - Support stalling faults for platform devices
        - Decrease defaults sizes for the event and PRI queues
     - SMMUv2:
        - Support for a new '->probe_finalize' hook, needed by Nvidia
        - Even more Qualcomm compatible strings
        - Avoid Adreno TTBR1 quirk for DB820C platform

 - Intel VT-d updates from Lu Baolu:

     - Convert Intel IOMMU to use sva_lib helpers in iommu core
     - ftrace and debugfs supports for page fault handling
     - Support asynchronous nested capabilities
     - Various misc cleanups

 - Support for new VIOT ACPI table to make the VirtIO IOMMU
   available on x86

 - Add the amd_iommu=force_enable command line option to enable
   the IOMMU on platforms where they are known to cause problems

 - Support for version 2 of the Rockchip IOMMU

 - Various smaller fixes, cleanups and refactorings

* tag 'iommu-updates-v5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: (66 commits)
  iommu/virtio: Enable x86 support
  iommu/dma: Pass address limit rather than size to iommu_setup_dma_ops()
  ACPI: Add driver for the VIOT table
  ACPI: Move IOMMU setup code out of IORT
  ACPI: arm64: Move DMA setup operations out of IORT
  iommu/vt-d: Fix dereference of pointer info before it is null checked
  iommu: Update "iommu.strict" documentation
  iommu/arm-smmu: Check smmu->impl pointer before dereferencing
  iommu/arm-smmu-v3: Remove unnecessary oom message
  iommu/arm-smmu: Fix arm_smmu_device refcount leak in address translation
  iommu/arm-smmu: Fix arm_smmu_device refcount leak when arm_smmu_rpm_get fails
  iommu/vt-d: Fix linker error on 32-bit
  iommu/vt-d: No need to typecast
  iommu/vt-d: Define counter explicitly as unsigned int
  iommu/vt-d: Remove unnecessary braces
  iommu/vt-d: Removed unused iommu_count in dmar domain
  iommu/vt-d: Use bitfields for DMAR capabilities
  iommu/vt-d: Use DEVICE_ATTR_RO macro
  iommu/vt-d: Fix out-bounds-warning in intel/svm.c
  iommu/vt-d: Add PRQ handling latency sampling
  ...

12 files changed:
1  2 
Documentation/admin-guide/kernel-parameters.txt
MAINTAINERS
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/arm64/iort.c
drivers/acpi/bus.c
drivers/acpi/scan.c
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
drivers/iommu/arm/arm-smmu/arm-smmu.c
drivers/iommu/arm/arm-smmu/arm-smmu.h
include/acpi/acpi_bus.h
include/linux/acpi.h

index 13f13fdd47319d09c13ac98a8c985f8805b18b8c,2dda5ada4e1a720af7f4d5c05d6900d67d3cc4d0..0081d83457e8b78d37f614562bce154816c5021d
                        the GPE dispatcher.
                        This facility can be used to prevent such uncontrolled
                        GPE floodings.
 -                      Format: <byte>
 +                      Format: <byte> or <bitmap-list>
  
        acpi_no_auto_serialize  [HW,ACPI]
                        Disable auto-serialization of AML methods
                                          allowed anymore to lift isolation
                                          requirements as needed. This option
                                          does not override iommu=pt
+                       force_enable - Force enable the IOMMU on platforms known
+                                      to be buggy with IOMMU enabled. Use this
+                                      option with care.
  
        amd_iommu_dump= [HW,X86-64]
                        Enable AMD IOMMU driver option to dump the ACPI table
        ccw_timeout_log [S390]
                        See Documentation/s390/common_io.rst for details.
  
 -      cgroup_disable= [KNL] Disable a particular controller
 -                      Format: {name of the controller(s) to disable}
 +      cgroup_disable= [KNL] Disable a particular controller or optional feature
 +                      Format: {name of the controller(s) or feature(s) to disable}
                        The effects of cgroup_disable=foo are:
                        - foo isn't auto-mounted if you mount all cgroups in
                          a single hierarchy
                        - foo isn't visible as an individually mountable
                          subsystem
 +                      - if foo is an optional feature then the feature is
 +                        disabled and corresponding cgroup files are not
 +                        created
                        {Currently only "memory" controller deal with this and
                        cut the overhead, others just disable the usage. So
                        only cgroup_disable=memory is actually worthy}
 +                      Specifying "pressure" disables per-cgroup pressure
 +                      stall information accounting feature
  
        cgroup_no_v1=   [KNL] Disable cgroup controllers and named hierarchies in v1
                        Format: { { controller | "all" | "named" }
                        loops can be debugged more effectively on production
                        systems.
  
 +      clocksource.max_cswd_read_retries= [KNL]
 +                      Number of clocksource_watchdog() retries due to
 +                      external delays before the clock will be marked
 +                      unstable.  Defaults to three retries, that is,
 +                      four attempts to read the clock under test.
 +
 +      clocksource.verify_n_cpus= [KNL]
 +                      Limit the number of CPUs checked for clocksources
 +                      marked with CLOCK_SOURCE_VERIFY_PERCPU that
 +                      are marked unstable due to excessive skew.
 +                      A negative value says to check all CPUs, while
 +                      zero says not to check any.  Values larger than
 +                      nr_cpu_ids are silently truncated to nr_cpu_ids.
 +                      The actual CPUs are chosen randomly, with
 +                      no replacement if the same CPU is chosen twice.
 +
 +      clocksource-wdtest.holdoff= [KNL]
 +                      Set the time in seconds that the clocksource
 +                      watchdog test waits before commencing its tests.
 +                      Defaults to zero when built as a module and to
 +                      10 seconds when built into the kernel.
 +
        clearcpuid=BITNUM[,BITNUM...] [X86]
                        Disable CPUID feature X for the kernel. See
                        arch/x86/include/asm/cpufeatures.h for the valid bit
                        Documentation/admin-guide/mm/hugetlbpage.rst.
                        Format: size[KMG]
  
 +      hugetlb_free_vmemmap=
 +                      [KNL] Reguires CONFIG_HUGETLB_PAGE_FREE_VMEMMAP
 +                      enabled.
 +                      Allows heavy hugetlb users to free up some more
 +                      memory (6 * PAGE_SIZE for each 2MB hugetlb page).
 +                      Format: { on | off (default) }
 +
 +                      on:  enable the feature
 +                      off: disable the feature
 +
 +                      Built with CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON=y,
 +                      the default is on.
 +
 +                      This is not compatible with memory_hotplug.memmap_on_memory.
 +                      If both parameters are enabled, hugetlb_free_vmemmap takes
 +                      precedence over memory_hotplug.memmap_on_memory.
 +
        hung_task_panic=
                        [KNL] Should the hung task detector generate panics.
                        Format: 0 | 1
                          forcing Dual Address Cycle for PCI cards supporting
                          greater than 32-bit addressing.
  
-       iommu.strict=   [ARM64] Configure TLB invalidation behaviour
+       iommu.strict=   [ARM64, X86] Configure TLB invalidation behaviour
                        Format: { "0" | "1" }
                        0 - Lazy mode.
                          Request that DMA unmap operations use deferred
                        1 - Strict mode (default).
                          DMA unmap operations invalidate IOMMU hardware TLBs
                          synchronously.
+                       Note: on x86, the default behaviour depends on the
+                       equivalent driver-specific parameters, but a strict
+                       mode explicitly specified by either method takes
+                       precedence.
  
        iommu.passthrough=
                        [ARM64, X86] Configure DMA to bypass the IOMMU by default.
                        Note that even when enabled, there are a few cases where
                        the feature is not effective.
  
 +                      This is not compatible with hugetlb_free_vmemmap. If
 +                      both parameters are enabled, hugetlb_free_vmemmap takes
 +                      precedence over memory_hotplug.memmap_on_memory.
 +
        memtest=        [KNL,X86,ARM,PPC,RISCV] Enable memtest
                        Format: <integer>
                        default : 0 <disable>
  
        noclflush       [BUGS=X86] Don't use the CLFLUSH instruction
  
 -      nodelayacct     [KNL] Disable per-task delay accounting
 +      delayacct       [KNL] Enable per-task delay accounting
  
        nodsp           [SH] Disable hardware DSP at boot time.
  
  
        nr_uarts=       [SERIAL] maximum number of UARTs to be registered.
  
 +      numa=off        [KNL, ARM64, PPC, RISCV, SPARC, X86] Disable NUMA, Only
 +                      set up a single NUMA node spanning all memory.
 +
        numa_balancing= [KNL,ARM64,PPC,RISCV,S390,X86] Enable or disable automatic
                        NUMA balancing.
                        Allowed values are enable and disable
                        off: turn off poisoning (default)
                        on: turn on poisoning
  
 +      page_reporting.page_reporting_order=
 +                      [KNL] Minimal page reporting order
 +                      Format: <integer>
 +                      Adjust the minimal page reporting order. The page
 +                      reporting is disabled when it exceeds (MAX_ORDER-1).
 +
        panic=          [KNL] Kernel behaviour on panic: delay <timeout>
                        timeout > 0: seconds before rebooting
                        timeout = 0: wait forever
                        Reserves a hole at the top of the kernel virtual
                        address space.
  
 -      reservelow=     [X86]
 -                      Format: nn[K]
 -                      Set the amount of memory to reserve for BIOS at
 -                      the bottom of the address space.
 -
        reset_devices   [KNL] Force drivers to reset the underlying device
                        during initialization.
  
                                  exception. Default behavior is by #AC if
                                  both features are enabled in hardware.
  
 +                      ratelimit:N -
 +                                Set system wide rate limit to N bus locks
 +                                per second for bus lock detection.
 +                                0 < N <= 1000.
 +
 +                                N/A for split lock detection.
 +
 +
                        If an #AC exception is hit in the kernel or in
                        firmware (i.e. not while executing in user mode)
                        the kernel will oops in either "warn" or "fatal"
diff --combined MAINTAINERS
index 0d9d8fbd9e92958ba22aa093ce409c37418747bb,714dbe03e15081f8acd2be58611966dda4831a0a..4d42bc8c9b8bc4dccc732f15deeee55c6c164bff
@@@ -431,6 -431,14 +431,14 @@@ W:       https://01.org/linux-acp
  B:    https://bugzilla.kernel.org
  F:    drivers/acpi/acpi_video.c
  
+ ACPI VIOT DRIVER
+ M:    Jean-Philippe Brucker <[email protected]>
+ L:    [email protected]
+ L:    [email protected]
+ S:    Maintained
+ F:    drivers/acpi/viot.c
+ F:    include/linux/acpi_viot.h
  ACPI WMI DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -878,7 -886,7 +886,7 @@@ M: Harry Wentland <[email protected]
  M:    Leo Li <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://people.freedesktop.org/~agd5f/linux
 +T:    git https://gitlab.freedesktop.org/agd5f/linux.git
  F:    drivers/gpu/drm/amd/display/
  
  AMD FAM15H PROCESSOR POWER MONITORING DRIVER
@@@ -954,7 -962,7 +962,7 @@@ AMD POWERPLA
  M:    Evan Quan <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://people.freedesktop.org/~agd5f/linux
 +T:    git https://gitlab.freedesktop.org/agd5f/linux.git
  F:    drivers/gpu/drm/amd/pm/powerplay/
  
  AMD SEATTLE DEVICE TREE SUPPORT
@@@ -973,7 -981,7 +981,7 @@@ F: drivers/net/ethernet/amd/xgbe
  
  AMD SENSOR FUSION HUB DRIVER
  M:    Nehal Shah <[email protected]>
 -M:    Sandeep Singh <sandeep.singh@amd.com>
 +M:    Basavaraj Natikar <basavaraj.natikar@amd.com>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/hid/amd-sfh*
@@@ -1655,11 -1663,9 +1663,11 @@@ C:    irc://chat.freenode.net/asahi-de
  T:    git https://github.com/AsahiLinux/linux.git
  F:    Documentation/devicetree/bindings/arm/apple.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/apple,aic.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml
  F:    arch/arm64/boot/dts/apple/
  F:    drivers/irqchip/irq-apple-aic.c
  F:    include/dt-bindings/interrupt-controller/apple-aic.h
 +F:    include/dt-bindings/pinctrl/apple.h
  
  ARM/ARTPEC MACHINE SUPPORT
  M:    Jesper Nilsson <[email protected]>
@@@ -1813,13 -1819,12 +1821,13 @@@ F:   Documentation/devicetree/bindings/ne
  F:    Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
  F:    Documentation/devicetree/bindings/rtc/faraday,ftrtc010.txt
  F:    arch/arm/mach-gemini/
 +F:    drivers/crypto/gemini/
  F:    drivers/net/ethernet/cortina/
  F:    drivers/pinctrl/pinctrl-gemini.c
  F:    drivers/rtc/rtc-ftrtc010.c
  
  ARM/CZ.NIC TURRIS SUPPORT
 -M:    Marek Behun <[email protected]>
 +M:    Marek Behún <[email protected]>
  S:    Maintained
  W:    https://www.turris.cz/
  F:    Documentation/ABI/testing/debugfs-moxtet
@@@ -1975,7 -1980,6 +1983,7 @@@ F:      Documentation/devicetree/bindings/in
  F:    Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
  F:    arch/arm/mach-ixp4xx/
  F:    drivers/clocksource/timer-ixp4xx.c
 +F:    drivers/crypto/ixp4xx_crypto.c
  F:    drivers/gpio/gpio-ixp4xx.c
  F:    drivers/irqchip/irq-ixp4xx.c
  F:    include/linux/irqchip/irq-ixp4xx.h
@@@ -3739,6 -3743,9 +3747,6 @@@ F:      drivers/gpio/gpio-bcm-kona.
  
  BROADCOM NETXTREME-E ROCE DRIVER
  M:    Selvin Xavier <[email protected]>
 -M:    Devesh Sharma <[email protected]>
 -M:    Somnath Kotur <[email protected]>
 -M:    Sriharsha Basavapatna <[email protected]>
  M:    Naresh Kumar PBS <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -4446,18 -4453,6 +4454,18 @@@ F:    include/linux/compiler-clang.
  F:    scripts/clang-tools/
  K:    \b(?i:clang|llvm)\b
  
 +CLANG CONTROL FLOW INTEGRITY SUPPORT
 +M:    Sami Tolvanen <[email protected]>
 +M:    Kees Cook <[email protected]>
 +R:    Nathan Chancellor <[email protected]>
 +R:    Nick Desaulniers <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +B:    https://github.com/ClangBuiltLinux/linux/issues
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/clang/features
 +F:    include/linux/cfi.h
 +F:    kernel/cfi.c
 +
  CLEANCACHE API
  M:    Konrad Rzeszutek Wilk <[email protected]>
  L:    [email protected]
@@@ -4623,12 -4618,6 +4631,12 @@@ S:    Supporte
  F:    drivers/video/console/
  F:    include/linux/console*
  
 +CONTEXT TRACKING
 +M:    Frederic Weisbecker <[email protected]>
 +S:    Maintained
 +F:    kernel/context_tracking.c
 +F:    include/linux/context_tracking*
 +
  CONTROL GROUP (CGROUP)
  M:    Tejun Heo <[email protected]>
  M:    Zefan Li <[email protected]>
@@@ -5198,14 -5187,7 +5206,14 @@@ DELL WMI NOTIFICATIONS DRIVE
  M:    Matthew Garrett <[email protected]>
  M:    Pali Rohár <[email protected]>
  S:    Maintained
 -F:    drivers/platform/x86/dell/dell-wmi.c
 +F:    drivers/platform/x86/dell/dell-wmi-base.c
 +
 +DELL WMI HARDWARE PRIVACY SUPPORT
 +M:    Perry Yuan <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/platform/x86/dell/dell-wmi-privacy.c
  
  DELTA ST MEDIA DRIVER
  M:    Hugues Fruchet <[email protected]>
@@@ -5215,13 -5197,6 +5223,13 @@@ W:    https://linuxtv.or
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/platform/sti/delta
  
 +DELTA DPS920AB PSU DRIVER
 +M:    Robert Marko <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/hwmon/dps920ab.rst
 +F:    drivers/hwmon/pmbus/dps920ab.c
 +
  DENALI NAND DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -5911,13 -5886,6 +5919,13 @@@ S:    Orphan / Obsolet
  F:    drivers/gpu/drm/savage/
  F:    include/uapi/drm/savage_drm.h
  
 +DRM DRIVER FOR SIMPLE FRAMEBUFFERS
 +M:    Thomas Zimmermann <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    drivers/gpu/drm/tiny/simpledrm.c
 +
  DRM DRIVER FOR SIS VIDEO CARDS
  S:    Orphan / Obsolete
  F:    drivers/gpu/drm/sis/
@@@ -6125,14 -6093,6 +6133,14 @@@ T:    git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/hisilicon/
  F:    drivers/gpu/drm/hisilicon/
  
 +DRM DRIVER FOR HYPERV SYNTHETIC VIDEO DEVICE
 +M:    Deepak Rawat <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    drivers/gpu/drm/hyperv
 +
  DRM DRIVERS FOR LIMA
  M:    Qiang Yu <[email protected]>
  L:    [email protected]
@@@ -6295,7 -6255,7 +6303,7 @@@ M:      Christian Koenig <christian.koenig@a
  M:    Huang Rui <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://people.freedesktop.org/~agd5f/linux
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/ttm/
  F:    include/drm/ttm/
  
@@@ -6493,11 -6453,10 +6501,11 @@@ F:   Documentation/filesystems/ecryptfs.r
  F:    fs/ecryptfs/
  
  EDAC-AMD64
 -M:    Borislav Petkov <[email protected]>
 +M:    Yazen Ghannam <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Supported
  F:    drivers/edac/amd64_edac*
 +F:    drivers/edac/mce_amd*
  
  EDAC-ARMADA
  M:    Jan Luebbe <[email protected]>
@@@ -6778,6 -6737,7 +6786,6 @@@ F:      drivers/net/ethernet/emulex/benet
  
  EMULEX ONECONNECT ROCE DRIVER
  M:    Selvin Xavier <[email protected]>
 -M:    Devesh Sharma <[email protected]>
  L:    [email protected]
  S:    Odd Fixes
  W:    http://www.broadcom.com
@@@ -6819,7 -6779,7 +6827,7 @@@ F:      include/video/s1d13xxxfb.
  
  EROFS FILE SYSTEM
  M:    Gao Xiang <[email protected]>
 -M:    Chao Yu <[email protected]>
 +M:    Chao Yu <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
@@@ -6860,8 -6820,6 +6868,8 @@@ F:      Documentation/devicetree/bindings/ne
  F:    Documentation/devicetree/bindings/net/qca,ar803x.yaml
  F:    Documentation/networking/phy.rst
  F:    drivers/net/mdio/
 +F:    drivers/net/mdio/acpi_mdio.c
 +F:    drivers/net/mdio/fwnode_mdio.c
  F:    drivers/net/mdio/of_mdio.c
  F:    drivers/net/pcs/
  F:    drivers/net/phy/
@@@ -7216,7 -7174,7 +7224,7 @@@ F:      include/video
  
  FREESCALE CAAM (Cryptographic Acceleration and Assurance Module) DRIVER
  M:    Horia Geantă <[email protected]>
 -M:    Aymen Sghaier <aymen.sghaier@nxp.com>
 +M:    Pankaj Gupta <pankaj.gupta@nxp.com>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/crypto/fsl-sec4.txt
@@@ -7404,6 -7362,7 +7412,6 @@@ F:      drivers/net/ethernet/freescale/fs_en
  F:    include/linux/fs_enet_pd.h
  
  FREESCALE SOC SOUND DRIVERS
 -M:    Timur Tabi <[email protected]>
  M:    Nicolin Chen <[email protected]>
  M:    Xiubo Li <[email protected]>
  R:    Fabio Estevam <[email protected]>
@@@ -7606,12 -7565,6 +7614,12 @@@ M:    Kieran Bingham <[email protected]
  S:    Supported
  F:    scripts/gdb/
  
 +GEMINI CRYPTO DRIVER
 +M:    Corentin Labbe <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/crypto/gemini/
 +
  GEMTEK FM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/input/touchscreen/resistive-adc-touch.c
  
 +GENERIC STRING LIBRARY
 +R:    Andy Shevchenko <[email protected]>
 +S:    Maintained
 +F:    lib/string.c
 +F:    lib/string_helpers.c
 +F:    lib/test_string.c
 +F:    lib/test-string_helpers.c
 +
  GENERIC UIO DRIVER FOR PCI DEVICES
  M:    "Michael S. Tsirkin" <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/i2c/busses/i2c-icy.c
  
 -IDE SUBSYSTEM
 -M:    "David S. Miller" <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -Q:    http://patchwork.ozlabs.org/project/linux-ide/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide.git
 -F:    Documentation/ide/
 -F:    drivers/ide/
 -F:    include/linux/ide.h
 -
 -IDE/ATAPI DRIVERS
 -L:    [email protected]
 -S:    Orphan
 -F:    Documentation/cdrom/ide-cd.rst
 -F:    drivers/ide/ide-cd*
 -
  IDEAPAD LAPTOP EXTRAS DRIVER
  M:    Ike Panhc <[email protected]>
  L:    [email protected]
@@@ -9186,15 -9147,6 +9194,15 @@@ F:    Documentation/networking/device_driv
  F:    drivers/net/ethernet/intel/
  F:    drivers/net/ethernet/intel/*/
  F:    include/linux/avf/virtchnl.h
 +F:    include/linux/net/intel/iidc.h
 +
 +INTEL ETHERNET PROTOCOL DRIVER FOR RDMA
 +M:    Mustafa Ismail <[email protected]>
 +M:    Shiraz Saleem <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/infiniband/hw/irdma/
 +F:    include/uapi/rdma/irdma-abi.h
  
  INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
  M:    Maik Broemme <[email protected]>
@@@ -9300,12 -9252,6 +9308,12 @@@ F:    Documentation/admin-guide/media/ipu3
  F:    Documentation/userspace-api/media/v4l/pixfmt-meta-intel-ipu3.rst
  F:    drivers/staging/media/ipu3/
  
 +INTEL IXP4XX CRYPTO SUPPORT
 +M:    Corentin Labbe <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/crypto/ixp4xx_crypto.c
 +
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
  M:    Krzysztof Halasa <[email protected]>
  S:    Maintained
  S:    Supported
  F:    drivers/cpufreq/intel_pstate.c
  
 -INTEL RDMA RNIC DRIVER
 -M:    Faisal Latif <[email protected]>
 -M:    Shiraz Saleem <[email protected]>
 -L:    [email protected]
 -S:    Supported
 -F:    drivers/infiniband/hw/i40iw/
 -F:    include/uapi/rdma/i40iw-abi.h
 -
  INTEL SCU DRIVERS
  M:    Mika Westerberg <[email protected]>
  S:    Maintained
  F:    arch/x86/include/asm/intel_scu_ipc.h
  F:    drivers/platform/x86/intel_scu_*
  
 +INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER
 +M:    Daniel Scally <[email protected]>
 +S:    Maintained
 +F:    drivers/platform/x86/intel/int3472/
 +
  INTEL SPEED SELECT TECHNOLOGY
  M:    Srinivas Pandruvada <[email protected]>
  L:    [email protected]
@@@ -9466,7 -9415,7 +9474,7 @@@ F:      include/linux/firmware/intel/stratix
  F:    include/linux/firmware/intel/stratix10-svc-client.h
  
  INTEL TELEMETRY DRIVER
 -M:    Rajneesh Bhardwaj <[email protected]l.com>
 +M:    Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
  M:    "David E. Box" <[email protected]>
  L:    [email protected]
  S:    Maintained
  S:    Maintained
  F:    drivers/platform/x86/intel-wmi-thunderbolt.c
  
 +INTEL WWAN IOSM DRIVER
 +M:    M Chetan Kumar <[email protected]>
 +M:    Intel Corporation <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/net/wwan/iosm/
 +
  INTEL(R) TRACE HUB
  M:    Alexander Shishkin <[email protected]>
  S:    Supported
@@@ -9794,14 -9736,6 +9802,14 @@@ Q:    http://patchwork.linuxtv.org/project
  T:    git git://linuxtv.org/anttip/media_tree.git
  F:    drivers/media/tuners/it913x*
  
 +ITE IT66121 HDMI BRIDGE DRIVER
 +M:    Phong LE <[email protected]>
 +M:    Neil Armstrong <[email protected]>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/display/bridge/ite,it66121.yaml
 +F:    drivers/gpu/drm/bridge/ite-it66121.c
 +
  IVTV VIDEO4LINUX DRIVER
  M:    Andy Walls <[email protected]>
  L:    [email protected]
@@@ -10069,8 -10003,6 +10077,8 @@@ F:   arch/arm64/include/asm/kvm
  F:    arch/arm64/include/uapi/asm/kvm*
  F:    arch/arm64/kvm/
  F:    include/kvm/arm_*
 +F:    tools/testing/selftests/kvm/*/aarch64/
 +F:    tools/testing/selftests/kvm/aarch64/
  
  KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
  M:    Huacai Chen <[email protected]>
@@@ -10936,7 -10868,6 +10944,7 @@@ S:   Maintaine
  F:    drivers/mailbox/
  F:    include/linux/mailbox_client.h
  F:    include/linux/mailbox_controller.h
 +F:    include/dt-bindings/mailbox/
  F:    Documentation/devicetree/bindings/mailbox/
  
  MAILBOX ARM MHUv2
@@@ -11023,7 -10954,7 +11031,7 @@@ F:   include/linux/mv643xx.
  
  MARVELL MV88X3310 PHY DRIVER
  M:    Russell King <[email protected]>
 -M:    Marek Behun <[email protected]>
 +M:    Marek Behún <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/phy/marvell10g.c
@@@ -11369,7 -11300,6 +11377,7 @@@ F:   include/media/imx.
  
  MEDIA DRIVERS FOR FREESCALE IMX7
  M:    Rui Miguel Silva <[email protected]>
 +M:    Laurent Pinchart <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  S:    Supported
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/renesas,csi2.yaml
 +F:    Documentation/devicetree/bindings/media/renesas,isp.yaml
  F:    Documentation/devicetree/bindings/media/renesas,vin.yaml
  F:    drivers/media/platform/rcar-vin/
  
@@@ -11908,7 -11837,6 +11916,7 @@@ F:   include/linux/mmzone.
  F:    include/linux/pagewalk.h
  F:    include/linux/vmalloc.h
  F:    mm/
 +F:    tools/testing/selftests/vm/
  
  MEMORY TECHNOLOGY DEVICES (MTD)
  M:    Miquel Raynal <[email protected]>
@@@ -12070,13 -11998,11 +12078,13 @@@ MICROCHIP ISC DRIVE
  M:    Eugen Hristev <[email protected]>
  L:    [email protected]
  S:    Supported
 -F:    Documentation/devicetree/bindings/media/atmel-isc.txt
 +F:    Documentation/devicetree/bindings/media/atmel,isc.yaml
 +F:    Documentation/devicetree/bindings/media/microchip,xisc.yaml
  F:    drivers/media/platform/atmel/atmel-isc-base.c
  F:    drivers/media/platform/atmel/atmel-isc-regs.h
  F:    drivers/media/platform/atmel/atmel-isc.h
  F:    drivers/media/platform/atmel/atmel-sama5d2-isc.c
 +F:    drivers/media/platform/atmel/atmel-sama7g5-isc.c
  F:    include/linux/atmel-isc-media.h
  
  MICROCHIP ISI DRIVER
@@@ -12274,7 -12200,7 +12282,7 @@@ M:   Maximilian Luz <luzmaximilian@gmail.
  L:    [email protected]
  S:    Maintained
  W:    https://github.com/linux-surface/surface-aggregator-module
 -C:    irc://chat.freenode.net/##linux-surface
 +C:    irc://irc.libera.chat/linux-surface
  F:    Documentation/driver-api/surface_aggregator/
  F:    drivers/platform/surface/aggregator/
  F:    drivers/platform/surface/surface_acpi_notify.c
@@@ -12470,12 -12396,6 +12478,12 @@@ F: Documentation/userspace-api/media/dr
  F:    drivers/media/pci/meye/
  F:    include/uapi/linux/meye.h
  
 +MOTORCOMM PHY DRIVER
 +M:    Peter Geis <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/net/phy/motorcomm.c
 +
  MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
  S:    Orphan
  F:    Documentation/driver-api/serial/moxa-smartio.rst
@@@ -12690,7 -12610,7 +12698,7 @@@ S:   Orpha
  F:    drivers/net/ethernet/natsemi/natsemi.c
  
  NCR 5380 SCSI DRIVERS
 -M:    Finn Thain <fthain@telegraphics.com.au>
 +M:    Finn Thain <fthain@linux-m68k.org>
  M:    Michael Schmitz <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -12747,7 -12667,6 +12755,7 @@@ W:   http://www.netfilter.org
  W:    http://www.iptables.org/
  W:    http://www.nftables.org/
  Q:    http://patchwork.ozlabs.org/project/netfilter-devel/list/
 +C:    irc://irc.libera.chat/netfilter
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git
  F:    include/linux/netfilter*
@@@ -13163,7 -13082,7 +13171,7 @@@ F:   Documentation/filesystems/ntfs.rs
  F:    fs/ntfs/
  
  NUBUS SUBSYSTEM
 -M:    Finn Thain <fthain@telegraphics.com.au>
 +M:    Finn Thain <fthain@linux-m68k.org>
  L:    [email protected]
  S:    Maintained
  F:    arch/*/include/asm/nubus.h
@@@ -13285,7 -13204,6 +13293,7 @@@ M:   Vladimir Oltean <[email protected]
  L:    [email protected]
  S:    Maintained
  F:    drivers/net/dsa/sja1105
 +F:    drivers/net/pcs/pcs-xpcs-nxp.c
  
  NXP TDA998X DRM DRIVER
  M:    Russell King <[email protected]>
@@@ -15231,13 -15149,6 +15239,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/opp/qcom-nvmem-cpufreq.txt
  F:    drivers/cpufreq/qcom-cpufreq-nvmem.c
  
 +QUALCOMM CRYPTO DRIVERS
 +M:    Thara Gopinath <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/crypto/qce/
 +
  QUALCOMM EMAC GIGABIT ETHERNET DRIVER
  M:    Timur Tabi <[email protected]>
  L:    [email protected]
@@@ -15366,7 -15277,6 +15374,7 @@@ F:   drivers/net/wireless/quantenn
  RADEON and AMDGPU DRM DRIVERS
  M:    Alex Deucher <[email protected]>
  M:    Christian König <[email protected]>
 +M:    Pan, Xinhui <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git https://gitlab.freedesktop.org/agd5f/linux.git
@@@ -15674,13 -15584,6 +15682,13 @@@ F: include/linux/rpmsg
  F:    include/uapi/linux/rpmsg.h
  F:    samples/rpmsg/
  
 +REMOTE PROCESSOR MESSAGING (RPMSG) WWAN CONTROL DRIVER
 +M:    Stephan Gerhold <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/net/wwan/rpmsg_wwan_ctrl.c
 +
  RENESAS CLOCK DRIVERS
  M:    Geert Uytterhoeven <[email protected]>
  L:    [email protected]
@@@ -15810,14 -15713,6 +15818,14 @@@ F: arch/riscv
  N:    riscv
  K:    riscv
  
 +RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
 +M:    Lewis Hanly <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/mailbox/mailbox-mpfs.c
 +F:    drivers/soc/microchip/
 +F:    include/soc/microchip/mpfs.h
 +
  RNBD BLOCK DRIVERS
  M:    Md. Haris Iqbal <[email protected]>
  M:    Jack Wang <[email protected]>
@@@ -17119,13 -17014,6 +17127,13 @@@ S: Maintaine
  F:    drivers/ssb/
  F:    include/linux/ssb/
  
 +SONY IMX208 SENSOR DRIVER
 +M:    Sakari Ailus <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/imx208.c
 +
  SONY IMX214 SENSOR DRIVER
  M:    Ricardo Ribalda <[email protected]>
  L:    [email protected]
@@@ -17794,7 -17682,6 +17802,7 @@@ M:   Jose Abreu <[email protected]
  L:    [email protected]
  S:    Supported
  F:    drivers/net/pcs/pcs-xpcs.c
 +F:    drivers/net/pcs/pcs-xpcs.h
  F:    include/linux/pcs/pcs-xpcs.h
  
  SYNOPSYS DESIGNWARE I2C DRIVER
@@@ -18297,13 -18184,6 +18305,13 @@@ W: http://thinkwiki.org/wiki/Ibm-acp
  T:    git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
  F:    drivers/platform/x86/thinkpad_acpi.c
  
 +THINKPAD LMI DRIVER
 +M:    Mark Pearson <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-class-firmware-attributes
 +F:    drivers/platform/x86/think-lmi.?
 +
  THUNDERBOLT DMA TRAFFIC TEST DRIVER
  M:    Isaac Hazan <[email protected]>
  L:    [email protected]
@@@ -19706,10 -19586,6 +19714,10 @@@ F: include/dt-bindings/regulator
  F:    include/linux/regulator/
  K:    regulator_get_optional
  
 +VOLTAGE AND CURRENT REGULATOR IRQ HELPERS
 +R:    Matti Vaittinen <[email protected]>
 +F:    drivers/regulator/irq_helpers.c
 +
  VRF
  M:    David Ahern <[email protected]>
  L:    [email protected]
@@@ -19727,7 -19603,6 +19735,7 @@@ S:   Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk.git
  F:    Documentation/core-api/printk-formats.rst
  F:    lib/test_printf.c
 +F:    lib/test_scanf.c
  F:    lib/vsprintf.c
  
  VT1211 HARDWARE MONITOR DRIVER
@@@ -19911,16 -19786,6 +19919,16 @@@ F: Documentation/core-api/workqueue.rs
  F:    include/linux/workqueue.h
  F:    kernel/workqueue.c
  
 +WWAN DRIVERS
 +M:    Loic Poulain <[email protected]>
 +M:    Sergey Ryazanov <[email protected]>
 +R:    Johannes Berg <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/net/wwan/
 +F:    include/linux/wwan.h
 +F:    include/uapi/linux/wwan.h
 +
  X-POWERS AXP288 PMIC DRIVERS
  M:    Hans de Goede <[email protected]>
  S:    Maintained
@@@ -20316,6 -20181,7 +20324,6 @@@ M:   Seth Jennings <[email protected]
  M:    Dan Streetman <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    include/linux/zbud.h
  F:    mm/zbud.c
  
  ZD1211RW WIRELESS DRIVER
diff --combined drivers/acpi/Kconfig
index 3972de7b75653ce15f59ee7ebb5d27f6373239d1,3758c6940ed7c306657428ba2ef969a489f369e6..fe0bb6277e4d08249a6edeecdcf84f145c1d35a0
@@@ -526,6 -526,9 +526,9 @@@ endi
  
  source "drivers/acpi/pmic/Kconfig"
  
+ config ACPI_VIOT
+       bool
  endif # ACPI
  
  config X86_PM_TIMER
  
          You should nearly always say Y here because many modern
          systems require this timer.
 +
 +config ACPI_PRMT
 +      bool "Platform Runtime Mechanism Support"
 +      depends on EFI && X86_64
 +      default y
diff --combined drivers/acpi/Makefile
index ceb1aed4b1fc9eff7bd8bbb78ec19196f31712c5,a6e644c48987218bf994e1acc8aa788c1fe4f6f1..3018714e87d9c0e8fc5801896241b4780bb1ca66
@@@ -8,11 -8,6 +8,11 @@@ ccflags-$(CONFIG_ACPI_DEBUG)   += -DACPI_
  #
  # ACPI Boot-Time Table Parsing
  #
 +ifeq ($(CONFIG_ACPI_CUSTOM_DSDT),y)
 +tables.o: $(src)/../../include/$(subst $\",,$(CONFIG_ACPI_CUSTOM_DSDT_FILE)) ;
 +
 +endif
 +
  obj-$(CONFIG_ACPI)            += tables.o
  obj-$(CONFIG_X86)             += blacklist.o
  
@@@ -66,7 -61,6 +66,7 @@@ acpi-$(CONFIG_ACPI_FPDT)      += acpi_fpdt.
  acpi-$(CONFIG_ACPI_LPIT)      += acpi_lpit.o
  acpi-$(CONFIG_ACPI_GENERIC_GSI) += irq.o
  acpi-$(CONFIG_ACPI_WATCHDOG)  += acpi_watchdog.o
 +acpi-$(CONFIG_ACPI_PRMT)      += prmt.o
  
  # Address translation
  acpi-$(CONFIG_ACPI_ADXL)      += acpi_adxl.o
@@@ -124,3 -118,5 +124,5 @@@ video-objs                 += acpi_video.o video_dete
  obj-y                         += dptf/
  
  obj-$(CONFIG_ARM64)           += arm64/
+ obj-$(CONFIG_ACPI_VIOT)               += viot.o
index e34937e11186a0c814bffae2b3007e721e4972cd,9efe7bcde8663b6860cc4fc9e33aa2e7f870adda..3b23fb775ac456cc743adba2230dff2bdb028a1c
@@@ -806,23 -806,6 +806,6 @@@ static struct acpi_iort_node *iort_get_
        return NULL;
  }
  
- static inline const struct iommu_ops *iort_fwspec_iommu_ops(struct device *dev)
- {
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       return (fwspec && fwspec->ops) ? fwspec->ops : NULL;
- }
- static inline int iort_add_device_replay(struct device *dev)
- {
-       int err = 0;
-       if (dev->bus && !device_iommu_mapped(dev))
-               err = iommu_probe_device(dev);
-       return err;
- }
  /**
   * iort_iommu_msi_get_resv_regions - Reserved region driver helper
   * @dev: Device from iommu_get_resv_regions()
@@@ -900,18 -883,6 +883,6 @@@ static inline bool iort_iommu_driver_en
        }
  }
  
- static int arm_smmu_iort_xlate(struct device *dev, u32 streamid,
-                              struct fwnode_handle *fwnode,
-                              const struct iommu_ops *ops)
- {
-       int ret = iommu_fwspec_init(dev, fwnode, ops);
-       if (!ret)
-               ret = iommu_fwspec_add_ids(dev, &streamid, 1);
-       return ret;
- }
  static bool iort_pci_rc_supports_ats(struct acpi_iort_node *node)
  {
        struct acpi_iort_root_complex *pci_rc;
@@@ -946,7 -917,7 +917,7 @@@ static int iort_iommu_xlate(struct devi
                return iort_iommu_driver_enabled(node->type) ?
                       -EPROBE_DEFER : -ENODEV;
  
-       return arm_smmu_iort_xlate(dev, streamid, iort_fwnode, ops);
+       return acpi_iommu_fwspec_init(dev, streamid, iort_fwnode, ops);
  }
  
  struct iort_pci_alias_info {
@@@ -968,15 -939,17 +939,17 @@@ static int iort_pci_iommu_init(struct p
  static void iort_named_component_init(struct device *dev,
                                      struct acpi_iort_node *node)
  {
-       struct property_entry props[2] = {};
+       struct property_entry props[3] = {};
        struct acpi_iort_named_component *nc;
  
        nc = (struct acpi_iort_named_component *)node->node_data;
        props[0] = PROPERTY_ENTRY_U32("pasid-num-bits",
                                      FIELD_GET(ACPI_IORT_NC_PASID_BITS,
                                                nc->node_flags));
+       if (nc->node_flags & ACPI_IORT_NC_STALL_SUPPORTED)
+               props[1] = PROPERTY_ENTRY_BOOL("dma-can-stall");
  
 -      if (device_add_properties(dev, props))
 +      if (device_create_managed_software_node(dev, props, NULL))
                dev_warn(dev, "Could not add device properties\n");
  }
  
@@@ -1020,24 -993,13 +993,13 @@@ static int iort_nc_iommu_map_id(struct 
   * @dev: device to configure
   * @id_in: optional input id const value pointer
   *
-  * Returns: iommu_ops pointer on configuration success
-  *          NULL on configuration failure
+  * Returns: 0 on success, <0 on failure
   */
- const struct iommu_ops *iort_iommu_configure_id(struct device *dev,
-                                               const u32 *id_in)
+ int iort_iommu_configure_id(struct device *dev, const u32 *id_in)
  {
        struct acpi_iort_node *node;
-       const struct iommu_ops *ops;
        int err = -ENODEV;
  
-       /*
-        * If we already translated the fwspec there
-        * is nothing left to do, return the iommu_ops.
-        */
-       ops = iort_fwspec_iommu_ops(dev);
-       if (ops)
-               return ops;
        if (dev_is_pci(dev)) {
                struct iommu_fwspec *fwspec;
                struct pci_bus *bus = to_pci_dev(dev)->bus;
                node = iort_scan_node(ACPI_IORT_NODE_PCI_ROOT_COMPLEX,
                                      iort_match_node_callback, &bus->dev);
                if (!node)
-                       return NULL;
+                       return -ENODEV;
  
                info.node = node;
                err = pci_for_each_dma_alias(to_pci_dev(dev),
                node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,
                                      iort_match_node_callback, dev);
                if (!node)
-                       return NULL;
+                       return -ENODEV;
  
                err = id_in ? iort_nc_iommu_map_id(dev, node, id_in) :
                              iort_nc_iommu_map(dev, node);
                        iort_named_component_init(dev, node);
        }
  
-       /*
-        * If we have reason to believe the IOMMU driver missed the initial
-        * add_device callback for dev, replay it to get things in order.
-        */
-       if (!err) {
-               ops = iort_fwspec_iommu_ops(dev);
-               err = iort_add_device_replay(dev);
-       }
-       /* Ignore all other errors apart from EPROBE_DEFER */
-       if (err == -EPROBE_DEFER) {
-               ops = ERR_PTR(err);
-       } else if (err) {
-               dev_dbg(dev, "Adding to IOMMU failed: %d\n", err);
-               ops = NULL;
-       }
-       return ops;
+       return err;
  }
  
  #else
  int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head)
  { return 0; }
- const struct iommu_ops *iort_iommu_configure_id(struct device *dev,
-                                               const u32 *input_id)
- { return NULL; }
+ int iort_iommu_configure_id(struct device *dev, const u32 *input_id)
+ { return -ENODEV; }
  #endif
  
  static int nc_dma_get_range(struct device *dev, u64 *size)
@@@ -1144,56 -1088,18 +1088,18 @@@ static int rc_dma_get_range(struct devi
  }
  
  /**
-  * iort_dma_setup() - Set-up device DMA parameters.
+  * iort_dma_get_ranges() - Look up DMA addressing limit for the device
+  * @dev: device to lookup
+  * @size: DMA range size result pointer
   *
-  * @dev: device to configure
-  * @dma_addr: device DMA address result pointer
-  * @dma_size: DMA range size result pointer
+  * Return: 0 on success, an error otherwise.
   */
void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size)
int iort_dma_get_ranges(struct device *dev, u64 *size)
  {
-       u64 end, mask, dmaaddr = 0, size = 0, offset = 0;
-       int ret;
-       /*
-        * If @dev is expected to be DMA-capable then the bus code that created
-        * it should have initialised its dma_mask pointer by this point. For
-        * now, we'll continue the legacy behaviour of coercing it to the
-        * coherent mask if not, but we'll no longer do so quietly.
-        */
-       if (!dev->dma_mask) {
-               dev_warn(dev, "DMA mask not set\n");
-               dev->dma_mask = &dev->coherent_dma_mask;
-       }
-       if (dev->coherent_dma_mask)
-               size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
+       if (dev_is_pci(dev))
+               return rc_dma_get_range(dev, size);
        else
-               size = 1ULL << 32;
-       ret = acpi_dma_get_range(dev, &dmaaddr, &offset, &size);
-       if (ret == -ENODEV)
-               ret = dev_is_pci(dev) ? rc_dma_get_range(dev, &size)
-                                     : nc_dma_get_range(dev, &size);
-       if (!ret) {
-               /*
-                * Limit coherent and dma mask based on size retrieved from
-                * firmware.
-                */
-               end = dmaaddr + size - 1;
-               mask = DMA_BIT_MASK(ilog2(end) + 1);
-               dev->bus_dma_limit = end;
-               dev->coherent_dma_mask = min(dev->coherent_dma_mask, mask);
-               *dev->dma_mask = min(*dev->dma_mask, mask);
-       }
-       *dma_addr = dmaaddr;
-       *dma_size = size;
-       ret = dma_direct_set_offset(dev, dmaaddr + offset, dmaaddr, size);
-       dev_dbg(dev, "dma_offset(%#08llx)%s\n", offset, ret ? " failed!" : "");
+               return nc_dma_get_range(dev, size);
  }
  
  static void __init acpi_iort_register_irq(int hwirq, const char *name,
diff --combined drivers/acpi/bus.c
index 60fb6a843853a491dfa1e8756ceb8383c999aff5,d6f4e2f06fdb6861804dbf67a95a61ffdf29f45a..ee24246d88fde166d27755ad1f7d4b9bca49ca07
  #include <linux/dmi.h>
  #endif
  #include <linux/acpi_iort.h>
+ #include <linux/acpi_viot.h>
  #include <linux/pci.h>
  #include <acpi/apei.h>
  #include <linux/suspend.h>
 +#include <linux/prmt.h>
  
  #include "internal.h"
  
@@@ -263,6 -263,8 +264,6 @@@ out_success
  
  out_kfree:
        kfree(output.pointer);
 -      if (status != AE_OK)
 -              context->ret.pointer = NULL;
        return status;
  }
  EXPORT_SYMBOL(acpi_run_osc);
@@@ -303,7 -305,6 +304,7 @@@ static void acpi_bus_osc_negotiate_plat
  
        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_HOTPLUG_OST_SUPPORT;
        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PCLPI_SUPPORT;
 +      capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PRM_SUPPORT;
  
  #ifdef CONFIG_ARM64
        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_GENERIC_INITIATOR_SUPPORT;
@@@ -359,7 -360,7 +360,7 @@@ EXPORT_SYMBOL_GPL(osc_sb_native_usb4_co
  
  static void acpi_bus_decode_usb_osc(const char *msg, u32 bits)
  {
 -      printk(KERN_INFO PREFIX "%s USB3%c DisplayPort%c PCIe%c XDomain%c\n", msg,
 +      pr_info("%s USB3%c DisplayPort%c PCIe%c XDomain%c\n", msg,
               (bits & OSC_USB_USB3_TUNNELING) ? '+' : '-',
               (bits & OSC_USB_DP_TUNNELING) ? '+' : '-',
               (bits & OSC_USB_PCIE_TUNNELING) ? '+' : '-',
@@@ -398,7 -399,7 +399,7 @@@ static void acpi_bus_osc_negotiate_usb_
                return;
  
        if (context.ret.length != sizeof(capbuf)) {
 -              printk(KERN_INFO PREFIX "USB4 _OSC: returned invalid length buffer\n");
 +              pr_info("USB4 _OSC: returned invalid length buffer\n");
                goto out_free;
        }
  
@@@ -1195,8 -1196,7 +1196,8 @@@ void __init acpi_subsystem_init(void
  
  static acpi_status acpi_bus_table_handler(u32 event, void *table, void *context)
  {
 -      acpi_scan_table_handler(event, table, context);
 +      if (event == ACPI_TABLE_EVENT_LOAD)
 +              acpi_scan_table_notify();
  
        return acpi_sysfs_table_handler(event, table, context);
  }
@@@ -1315,13 -1315,13 +1316,13 @@@ static int __init acpi_init(void
        }
  
        acpi_kobj = kobject_create_and_add("acpi", firmware_kobj);
 -      if (!acpi_kobj) {
 +      if (!acpi_kobj)
                pr_debug("%s: kset create error\n", __func__);
 -              acpi_kobj = NULL;
 -      }
  
 +      init_prmt();
        result = acpi_bus_init();
        if (result) {
 +              kobject_put(acpi_kobj);
                disable_acpi();
                return result;
        }
        acpi_wakeup_device_init();
        acpi_debugger_init();
        acpi_setup_sb_notify_handler();
+       acpi_viot_init();
        return 0;
  }
  
diff --combined drivers/acpi/scan.c
index 0641bc20b09749138dfe530f019378d956d5373e,3e2bb04ab528f7174b0ceb0304fe331a4a3de844..b24513ec3fae1886208c8590181573a241a2ed85
@@@ -3,14 -3,14 +3,16 @@@
   * scan.c - support for transforming the ACPI namespace into individual objects
   */
  
 +#define pr_fmt(fmt) "ACPI: " fmt
 +
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/slab.h>
  #include <linux/kernel.h>
  #include <linux/acpi.h>
  #include <linux/acpi_iort.h>
+ #include <linux/acpi_viot.h>
+ #include <linux/iommu.h>
  #include <linux/signal.h>
  #include <linux/kthread.h>
  #include <linux/dmi.h>
@@@ -49,6 -49,12 +51,6 @@@ static DEFINE_MUTEX(acpi_hp_context_loc
   */
  static u64 spcr_uart_addr;
  
 -struct acpi_dep_data {
 -      struct list_head node;
 -      acpi_handle supplier;
 -      acpi_handle consumer;
 -};
 -
  void acpi_scan_lock_acquire(void)
  {
        mutex_lock(&acpi_scan_lock);
@@@ -608,6 -614,11 +610,6 @@@ struct acpi_device *acpi_bus_get_acpi_d
        return handle_to_device(handle, get_acpi_device);
  }
  
 -void acpi_bus_put_acpi_device(struct acpi_device *adev)
 -{
 -      acpi_dev_put(adev);
 -}
 -
  static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id)
  {
        struct acpi_device_bus_id *acpi_device_bus_id;
@@@ -635,29 -646,24 +637,29 @@@ static int acpi_device_set_name(struct 
        return 0;
  }
  
 -int acpi_device_add(struct acpi_device *device,
 -                  void (*release)(struct device *))
 +static int acpi_tie_acpi_dev(struct acpi_device *adev)
  {
 -      struct acpi_device_bus_id *acpi_device_bus_id;
 -      int result;
 +      acpi_handle handle = adev->handle;
 +      acpi_status status;
  
 -      if (device->handle) {
 -              acpi_status status;
 +      if (!handle)
 +              return 0;
  
 -              status = acpi_attach_data(device->handle, acpi_scan_drop_device,
 -                                        device);
 -              if (ACPI_FAILURE(status)) {
 -                      acpi_handle_err(device->handle,
 -                                      "Unable to attach device data\n");
 -                      return -ENODEV;
 -              }
 +      status = acpi_attach_data(handle, acpi_scan_drop_device, adev);
 +      if (ACPI_FAILURE(status)) {
 +              acpi_handle_err(handle, "Unable to attach device data\n");
 +              return -ENODEV;
        }
  
 +      return 0;
 +}
 +
 +static int __acpi_device_add(struct acpi_device *device,
 +                           void (*release)(struct device *))
 +{
 +      struct acpi_device_bus_id *acpi_device_bus_id;
 +      int result;
 +
        /*
         * Linkage
         * -------
  
        result = acpi_device_setup_files(device);
        if (result)
 -              printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n",
 +              pr_err("Error creating sysfs interface for device %s\n",
                       dev_name(&device->dev));
  
        return 0;
@@@ -746,17 -752,6 +748,17 @@@ err_unlock
        return result;
  }
  
 +int acpi_device_add(struct acpi_device *adev, void (*release)(struct device *))
 +{
 +      int ret;
 +
 +      ret = acpi_tie_acpi_dev(adev);
 +      if (ret)
 +              return ret;
 +
 +      return __acpi_device_add(adev, release);
 +}
 +
  /* --------------------------------------------------------------------------
                                   Device Enumeration
     -------------------------------------------------------------------------- */
@@@ -1327,7 -1322,8 +1329,7 @@@ static void acpi_set_pnp_ids(acpi_handl
  
                acpi_get_object_info(handle, &info);
                if (!info) {
 -                      pr_err(PREFIX "%s: Error reading device info\n",
 -                                      __func__);
 +                      pr_err("%s: Error reading device info\n", __func__);
                        return;
                }
  
@@@ -1411,7 -1407,7 +1413,7 @@@ void acpi_free_pnp_ids(struct acpi_devi
   *
   * Return false if DMA is not supported. Otherwise, return true
   */
 -bool acpi_dma_supported(struct acpi_device *adev)
 +bool acpi_dma_supported(const struct acpi_device *adev)
  {
        if (!adev)
                return false;
@@@ -1526,6 -1522,78 +1528,78 @@@ int acpi_dma_get_range(struct device *d
        return ret >= 0 ? 0 : ret;
  }
  
+ #ifdef CONFIG_IOMMU_API
+ int acpi_iommu_fwspec_init(struct device *dev, u32 id,
+                          struct fwnode_handle *fwnode,
+                          const struct iommu_ops *ops)
+ {
+       int ret = iommu_fwspec_init(dev, fwnode, ops);
+       if (!ret)
+               ret = iommu_fwspec_add_ids(dev, &id, 1);
+       return ret;
+ }
+ static inline const struct iommu_ops *acpi_iommu_fwspec_ops(struct device *dev)
+ {
+       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
+       return fwspec ? fwspec->ops : NULL;
+ }
+ static const struct iommu_ops *acpi_iommu_configure_id(struct device *dev,
+                                                      const u32 *id_in)
+ {
+       int err;
+       const struct iommu_ops *ops;
+       /*
+        * If we already translated the fwspec there is nothing left to do,
+        * return the iommu_ops.
+        */
+       ops = acpi_iommu_fwspec_ops(dev);
+       if (ops)
+               return ops;
+       err = iort_iommu_configure_id(dev, id_in);
+       if (err && err != -EPROBE_DEFER)
+               err = viot_iommu_configure(dev);
+       /*
+        * If we have reason to believe the IOMMU driver missed the initial
+        * iommu_probe_device() call for dev, replay it to get things in order.
+        */
+       if (!err && dev->bus && !device_iommu_mapped(dev))
+               err = iommu_probe_device(dev);
+       /* Ignore all other errors apart from EPROBE_DEFER */
+       if (err == -EPROBE_DEFER) {
+               return ERR_PTR(err);
+       } else if (err) {
+               dev_dbg(dev, "Adding to IOMMU failed: %d\n", err);
+               return NULL;
+       }
+       return acpi_iommu_fwspec_ops(dev);
+ }
+ #else /* !CONFIG_IOMMU_API */
+ int acpi_iommu_fwspec_init(struct device *dev, u32 id,
+                          struct fwnode_handle *fwnode,
+                          const struct iommu_ops *ops)
+ {
+       return -ENODEV;
+ }
+ static const struct iommu_ops *acpi_iommu_configure_id(struct device *dev,
+                                                      const u32 *id_in)
+ {
+       return NULL;
+ }
+ #endif /* !CONFIG_IOMMU_API */
  /**
   * acpi_dma_configure_id - Set-up DMA configuration for the device.
   * @dev: The pointer to the device
@@@ -1543,9 -1611,9 +1617,9 @@@ int acpi_dma_configure_id(struct devic
                return 0;
        }
  
-       iort_dma_setup(dev, &dma_addr, &size);
+       acpi_arch_dma_setup(dev, &dma_addr, &size);
  
-       iommu = iort_iommu_configure_id(dev, input_id);
+       iommu = acpi_iommu_configure_id(dev, input_id);
        if (PTR_ERR(iommu) == -EPROBE_DEFER)
                return -EPROBE_DEFER;
  
@@@ -1677,16 -1745,8 +1751,16 @@@ void acpi_init_device_object(struct acp
        device_initialize(&device->dev);
        dev_set_uevent_suppress(&device->dev, true);
        acpi_init_coherency(device);
 -      /* Assume there are unmet deps to start with. */
 -      device->dep_unmet = 1;
 +}
 +
 +static void acpi_scan_dep_init(struct acpi_device *adev)
 +{
 +      struct acpi_dep_data *dep;
 +
 +      list_for_each_entry(dep, &acpi_dep_list, node) {
 +              if (dep->consumer == adev->handle)
 +                      adev->dep_unmet++;
 +      }
  }
  
  void acpi_device_add_finalize(struct acpi_device *device)
@@@ -1702,10 -1762,9 +1776,10 @@@ static void acpi_scan_init_status(struc
  }
  
  static int acpi_add_single_object(struct acpi_device **child,
 -                                acpi_handle handle, int type)
 +                                acpi_handle handle, int type, bool dep_init)
  {
        struct acpi_device *device;
 +      bool release_dep_lock = false;
        int result;
  
        device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL);
         * acpi_bus_get_status() and use its quirk handling.  Note that
         * this must be done before the get power-/wakeup_dev-flags calls.
         */
 -      if (type == ACPI_BUS_TYPE_DEVICE || type == ACPI_BUS_TYPE_PROCESSOR)
 +      if (type == ACPI_BUS_TYPE_DEVICE || type == ACPI_BUS_TYPE_PROCESSOR) {
 +              if (dep_init) {
 +                      mutex_lock(&acpi_dep_list_lock);
 +                      /*
 +                       * Hold the lock until the acpi_tie_acpi_dev() call
 +                       * below to prevent concurrent acpi_scan_clear_dep()
 +                       * from deleting a dependency list entry without
 +                       * updating dep_unmet for the device.
 +                       */
 +                      release_dep_lock = true;
 +                      acpi_scan_dep_init(device);
 +              }
                acpi_scan_init_status(device);
 +      }
  
        acpi_bus_get_power_flags(device);
        acpi_bus_get_wakeup_device_flags(device);
  
 -      result = acpi_device_add(device, acpi_device_release);
 +      result = acpi_tie_acpi_dev(device);
 +
 +      if (release_dep_lock)
 +              mutex_unlock(&acpi_dep_list_lock);
 +
 +      if (!result)
 +              result = __acpi_device_add(device, acpi_device_release);
 +
        if (result) {
                acpi_device_release(&device->dev);
                return result;
@@@ -1920,6 -1960,22 +1994,6 @@@ static u32 acpi_scan_check_dep(acpi_han
        return count;
  }
  
 -static void acpi_scan_dep_init(struct acpi_device *adev)
 -{
 -      struct acpi_dep_data *dep;
 -
 -      adev->dep_unmet = 0;
 -
 -      mutex_lock(&acpi_dep_list_lock);
 -
 -      list_for_each_entry(dep, &acpi_dep_list, node) {
 -              if (dep->consumer == adev->handle)
 -                      adev->dep_unmet++;
 -      }
 -
 -      mutex_unlock(&acpi_dep_list_lock);
 -}
 -
  static bool acpi_bus_scan_second_pass;
  
  static acpi_status acpi_bus_check_add(acpi_handle handle, bool check_dep,
                return AE_OK;
        }
  
 -      acpi_add_single_object(&device, handle, type);
 -      if (!device)
 -              return AE_CTRL_DEPTH;
 -
 -      acpi_scan_init_hotplug(device);
        /*
         * If check_dep is true at this point, the device has no dependencies,
         * or the creation of the device object would have been postponed above.
         */
 -      if (check_dep)
 -              device->dep_unmet = 0;
 -      else
 -              acpi_scan_dep_init(device);
 +      acpi_add_single_object(&device, handle, type, !check_dep);
 +      if (!device)
 +              return AE_CTRL_DEPTH;
 +
 +      acpi_scan_init_hotplug(device);
  
  out:
        if (!*adev_p)
@@@ -2125,141 -2185,29 +2199,141 @@@ static void acpi_bus_attach(struct acpi
                device->handler->hotplug.notify_online(device);
  }
  
 -void acpi_walk_dep_device_list(acpi_handle handle)
 +static int acpi_dev_get_first_consumer_dev_cb(struct acpi_dep_data *dep, void *data)
  {
 -      struct acpi_dep_data *dep, *tmp;
        struct acpi_device *adev;
  
 +      adev = acpi_bus_get_acpi_device(dep->consumer);
 +      if (adev) {
 +              *(struct acpi_device **)data = adev;
 +              return 1;
 +      }
 +      /* Continue parsing if the device object is not present. */
 +      return 0;
 +}
 +
 +struct acpi_scan_clear_dep_work {
 +      struct work_struct work;
 +      struct acpi_device *adev;
 +};
 +
 +static void acpi_scan_clear_dep_fn(struct work_struct *work)
 +{
 +      struct acpi_scan_clear_dep_work *cdw;
 +
 +      cdw = container_of(work, struct acpi_scan_clear_dep_work, work);
 +
 +      acpi_scan_lock_acquire();
 +      acpi_bus_attach(cdw->adev, true);
 +      acpi_scan_lock_release();
 +
 +      acpi_dev_put(cdw->adev);
 +      kfree(cdw);
 +}
 +
 +static bool acpi_scan_clear_dep_queue(struct acpi_device *adev)
 +{
 +      struct acpi_scan_clear_dep_work *cdw;
 +
 +      if (adev->dep_unmet)
 +              return false;
 +
 +      cdw = kmalloc(sizeof(*cdw), GFP_KERNEL);
 +      if (!cdw)
 +              return false;
 +
 +      cdw->adev = adev;
 +      INIT_WORK(&cdw->work, acpi_scan_clear_dep_fn);
 +      /*
 +       * Since the work function may block on the lock until the entire
 +       * initial enumeration of devices is complete, put it into the unbound
 +       * workqueue.
 +       */
 +      queue_work(system_unbound_wq, &cdw->work);
 +
 +      return true;
 +}
 +
 +static int acpi_scan_clear_dep(struct acpi_dep_data *dep, void *data)
 +{
 +      struct acpi_device *adev = acpi_bus_get_acpi_device(dep->consumer);
 +
 +      if (adev) {
 +              adev->dep_unmet--;
 +              if (!acpi_scan_clear_dep_queue(adev))
 +                      acpi_dev_put(adev);
 +      }
 +
 +      list_del(&dep->node);
 +      kfree(dep);
 +
 +      return 0;
 +}
 +
 +/**
 + * acpi_walk_dep_device_list - Apply a callback to every entry in acpi_dep_list
 + * @handle:   The ACPI handle of the supplier device
 + * @callback: Pointer to the callback function to apply
 + * @data:     Pointer to some data to pass to the callback
 + *
 + * The return value of the callback determines this function's behaviour. If 0
 + * is returned we continue to iterate over acpi_dep_list. If a positive value
 + * is returned then the loop is broken but this function returns 0. If a
 + * negative value is returned by the callback then the loop is broken and that
 + * value is returned as the final error.
 + */
 +static int acpi_walk_dep_device_list(acpi_handle handle,
 +                              int (*callback)(struct acpi_dep_data *, void *),
 +                              void *data)
 +{
 +      struct acpi_dep_data *dep, *tmp;
 +      int ret = 0;
 +
        mutex_lock(&acpi_dep_list_lock);
        list_for_each_entry_safe(dep, tmp, &acpi_dep_list, node) {
                if (dep->supplier == handle) {
 -                      acpi_bus_get_device(dep->consumer, &adev);
 -
 -                      if (adev) {
 -                              adev->dep_unmet--;
 -                              if (!adev->dep_unmet)
 -                                      acpi_bus_attach(adev, true);
 -                      }
 -
 -                      list_del(&dep->node);
 -                      kfree(dep);
 +                      ret = callback(dep, data);
 +                      if (ret)
 +                              break;
                }
        }
        mutex_unlock(&acpi_dep_list_lock);
 +
 +      return ret > 0 ? 0 : ret;
 +}
 +
 +/**
 + * acpi_dev_clear_dependencies - Inform consumers that the device is now active
 + * @supplier: Pointer to the supplier &struct acpi_device
 + *
 + * Clear dependencies on the given device.
 + */
 +void acpi_dev_clear_dependencies(struct acpi_device *supplier)
 +{
 +      acpi_walk_dep_device_list(supplier->handle, acpi_scan_clear_dep, NULL);
 +}
 +EXPORT_SYMBOL_GPL(acpi_dev_clear_dependencies);
 +
 +/**
 + * acpi_dev_get_first_consumer_dev - Return ACPI device dependent on @supplier
 + * @supplier: Pointer to the dependee device
 + *
 + * Returns the first &struct acpi_device which declares itself dependent on
 + * @supplier via the _DEP buffer, parsed from the acpi_dep_list.
 + *
 + * The caller is responsible for putting the reference to adev when it is no
 + * longer needed.
 + */
 +struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier)
 +{
 +      struct acpi_device *adev = NULL;
 +
 +      acpi_walk_dep_device_list(supplier->handle,
 +                                acpi_dev_get_first_consumer_dev_cb, &adev);
 +
 +      return adev;
  }
 -EXPORT_SYMBOL_GPL(acpi_walk_dep_device_list);
 +EXPORT_SYMBOL_GPL(acpi_dev_get_first_consumer_dev);
  
  /**
   * acpi_bus_scan - Add ACPI device node objects in a given namespace scope.
@@@ -2349,7 -2297,7 +2423,7 @@@ int acpi_bus_register_early_device(int 
        struct acpi_device *device = NULL;
        int result;
  
 -      result = acpi_add_single_object(&device, NULL, type);
 +      result = acpi_add_single_object(&device, NULL, type, false);
        if (result)
                return result;
  
@@@ -2369,7 -2317,7 +2443,7 @@@ static int acpi_bus_scan_fixed(void
                struct acpi_device *device = NULL;
  
                result = acpi_add_single_object(&device, NULL,
 -                                              ACPI_BUS_TYPE_POWER_BUTTON);
 +                                              ACPI_BUS_TYPE_POWER_BUTTON, false);
                if (result)
                        return result;
  
                struct acpi_device *device = NULL;
  
                result = acpi_add_single_object(&device, NULL,
 -                                              ACPI_BUS_TYPE_SLEEP_BUTTON);
 +                                              ACPI_BUS_TYPE_SLEEP_BUTTON, false);
                if (result)
                        return result;
  
@@@ -2404,7 -2352,7 +2478,7 @@@ static void __init acpi_get_spcr_uart_a
        status = acpi_get_table(ACPI_SIG_SPCR, 0,
                                (struct acpi_table_header **)&spcr_ptr);
        if (ACPI_FAILURE(status)) {
 -              pr_warn(PREFIX "STAO table present, but SPCR is missing\n");
 +              pr_warn("STAO table present, but SPCR is missing\n");
                return;
        }
  
@@@ -2445,7 -2393,7 +2519,7 @@@ int __init acpi_scan_init(void
                                (struct acpi_table_header **)&stao_ptr);
        if (ACPI_SUCCESS(status)) {
                if (stao_ptr->header.length > sizeof(struct acpi_table_stao))
 -                      pr_info(PREFIX "STAO Name List not yet supported.\n");
 +                      pr_info("STAO Name List not yet supported.\n");
  
                if (stao_ptr->ignore_uart)
                        acpi_get_spcr_uart_addr();
                }
        }
  
 -      acpi_turn_off_unused_power_resources(true);
 +      acpi_turn_off_unused_power_resources();
  
        acpi_scan_initialized = true;
  
@@@ -2534,28 -2482,46 +2608,28 @@@ int __init __acpi_probe_device_table(st
        return count;
  }
  
 -struct acpi_table_events_work {
 -      struct work_struct work;
 -      void *table;
 -      u32 event;
 -};
 -
  static void acpi_table_events_fn(struct work_struct *work)
  {
 -      struct acpi_table_events_work *tew;
 +      acpi_scan_lock_acquire();
 +      acpi_bus_scan(ACPI_ROOT_OBJECT);
 +      acpi_scan_lock_release();
  
 -      tew = container_of(work, struct acpi_table_events_work, work);
 -
 -      if (tew->event == ACPI_TABLE_EVENT_LOAD) {
 -              acpi_scan_lock_acquire();
 -              acpi_bus_scan(ACPI_ROOT_OBJECT);
 -              acpi_scan_lock_release();
 -      }
 -
 -      kfree(tew);
 +      kfree(work);
  }
  
 -void acpi_scan_table_handler(u32 event, void *table, void *context)
 +void acpi_scan_table_notify(void)
  {
 -      struct acpi_table_events_work *tew;
 +      struct work_struct *work;
  
        if (!acpi_scan_initialized)
                return;
  
 -      if (event != ACPI_TABLE_EVENT_LOAD)
 -              return;
 -
 -      tew = kmalloc(sizeof(*tew), GFP_KERNEL);
 -      if (!tew)
 +      work = kmalloc(sizeof(*work), GFP_KERNEL);
 +      if (!work)
                return;
  
 -      INIT_WORK(&tew->work, acpi_table_events_fn);
 -      tew->table = table;
 -      tew->event = event;
 -
 -      schedule_work(&tew->work);
 +      INIT_WORK(work, acpi_table_events_fn);
 +      schedule_work(work);
  }
  
  int acpi_reconfig_notifier_register(struct notifier_block *nb)
index 61fc645c1325da9ba86daf449c1a7122b32bdb16,7771d40176deac6beb3ba83afadc2e9765d68ffc..9b9d13ec5a88460ac471c8b883d950987c6501ec
@@@ -3,6 -3,7 +3,7 @@@
   * Copyright (c) 2019, The Linux Foundation. All rights reserved.
   */
  
+ #include <linux/acpi.h>
  #include <linux/adreno-smmu-priv.h>
  #include <linux/of_device.h>
  #include <linux/qcom_scm.h>
@@@ -13,7 -14,6 +14,7 @@@ struct qcom_smmu 
        struct arm_smmu_device smmu;
        bool bypass_quirk;
        u8 bypass_cbndx;
 +      u32 stall_enabled;
  };
  
  static struct qcom_smmu *to_qcom_smmu(struct arm_smmu_device *smmu)
  static void qcom_adreno_smmu_write_sctlr(struct arm_smmu_device *smmu, int idx,
                u32 reg)
  {
 +      struct qcom_smmu *qsmmu = to_qcom_smmu(smmu);
 +
        /*
         * On the GPU device we want to process subsequent transactions after a
         * fault to keep the GPU from hanging
         */
        reg |= ARM_SMMU_SCTLR_HUPCF;
  
 +      if (qsmmu->stall_enabled & BIT(idx))
 +              reg |= ARM_SMMU_SCTLR_CFCFG;
 +
        arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_SCTLR, reg);
  }
  
 +static void qcom_adreno_smmu_get_fault_info(const void *cookie,
 +              struct adreno_smmu_fault_info *info)
 +{
 +      struct arm_smmu_domain *smmu_domain = (void *)cookie;
 +      struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
 +      struct arm_smmu_device *smmu = smmu_domain->smmu;
 +
 +      info->fsr = arm_smmu_cb_read(smmu, cfg->cbndx, ARM_SMMU_CB_FSR);
 +      info->fsynr0 = arm_smmu_cb_read(smmu, cfg->cbndx, ARM_SMMU_CB_FSYNR0);
 +      info->fsynr1 = arm_smmu_cb_read(smmu, cfg->cbndx, ARM_SMMU_CB_FSYNR1);
 +      info->far = arm_smmu_cb_readq(smmu, cfg->cbndx, ARM_SMMU_CB_FAR);
 +      info->cbfrsynra = arm_smmu_gr1_read(smmu, ARM_SMMU_GR1_CBFRSYNRA(cfg->cbndx));
 +      info->ttbr0 = arm_smmu_cb_read(smmu, cfg->cbndx, ARM_SMMU_CB_TTBR0);
 +      info->contextidr = arm_smmu_cb_read(smmu, cfg->cbndx, ARM_SMMU_CB_CONTEXTIDR);
 +}
 +
 +static void qcom_adreno_smmu_set_stall(const void *cookie, bool enabled)
 +{
 +      struct arm_smmu_domain *smmu_domain = (void *)cookie;
 +      struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
 +      struct qcom_smmu *qsmmu = to_qcom_smmu(smmu_domain->smmu);
 +
 +      if (enabled)
 +              qsmmu->stall_enabled |= BIT(cfg->cbndx);
 +      else
 +              qsmmu->stall_enabled &= ~BIT(cfg->cbndx);
 +}
 +
 +static void qcom_adreno_smmu_resume_translation(const void *cookie, bool terminate)
 +{
 +      struct arm_smmu_domain *smmu_domain = (void *)cookie;
 +      struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
 +      struct arm_smmu_device *smmu = smmu_domain->smmu;
 +      u32 reg = 0;
 +
 +      if (terminate)
 +              reg |= ARM_SMMU_RESUME_TERMINATE;
 +
 +      arm_smmu_cb_write(smmu, cfg->cbndx, ARM_SMMU_CB_RESUME, reg);
 +}
 +
  #define QCOM_ADRENO_SMMU_GPU_SID 0
  
  static bool qcom_adreno_smmu_is_gpu_device(struct device *dev)
@@@ -177,6 -131,16 +178,16 @@@ static int qcom_adreno_smmu_alloc_conte
        return __arm_smmu_alloc_bitmap(smmu->context_map, start, count);
  }
  
+ static bool qcom_adreno_can_do_ttbr1(struct arm_smmu_device *smmu)
+ {
+       const struct device_node *np = smmu->dev->of_node;
+       if (of_device_is_compatible(np, "qcom,msm8996-smmu-v2"))
+               return false;
+       return true;
+ }
  static int qcom_adreno_smmu_init_context(struct arm_smmu_domain *smmu_domain,
                struct io_pgtable_cfg *pgtbl_cfg, struct device *dev)
  {
         * be AARCH64 stage 1 but double check because the arm-smmu code assumes
         * that is the case when the TTBR1 quirk is enabled
         */
-       if ((smmu_domain->stage == ARM_SMMU_DOMAIN_S1) &&
+       if (qcom_adreno_can_do_ttbr1(smmu_domain->smmu) &&
+           (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) &&
            (smmu_domain->cfg.fmt == ARM_SMMU_CTX_FMT_AARCH64))
                pgtbl_cfg->quirks |= IO_PGTABLE_QUIRK_ARM_TTBR1;
  
        priv->cookie = smmu_domain;
        priv->get_ttbr1_cfg = qcom_adreno_smmu_get_ttbr1_cfg;
        priv->set_ttbr0_cfg = qcom_adreno_smmu_set_ttbr0_cfg;
 +      priv->get_fault_info = qcom_adreno_smmu_get_fault_info;
 +      priv->set_stall = qcom_adreno_smmu_set_stall;
 +      priv->resume_translation = qcom_adreno_smmu_resume_translation;
  
        return 0;
  }
@@@ -216,6 -178,7 +228,7 @@@ static const struct of_device_id qcom_s
        { .compatible = "qcom,mdss" },
        { .compatible = "qcom,sc7180-mdss" },
        { .compatible = "qcom,sc7180-mss-pil" },
+       { .compatible = "qcom,sc7280-mdss" },
        { .compatible = "qcom,sc8180x-mdss" },
        { .compatible = "qcom,sdm845-mdss" },
        { .compatible = "qcom,sdm845-mss-pil" },
@@@ -380,24 -343,48 +393,48 @@@ static struct arm_smmu_device *qcom_smm
  static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
        { .compatible = "qcom,msm8998-smmu-v2" },
        { .compatible = "qcom,sc7180-smmu-500" },
+       { .compatible = "qcom,sc7280-smmu-500" },
        { .compatible = "qcom,sc8180x-smmu-500" },
        { .compatible = "qcom,sdm630-smmu-v2" },
        { .compatible = "qcom,sdm845-smmu-500" },
+       { .compatible = "qcom,sm6125-smmu-500" },
        { .compatible = "qcom,sm8150-smmu-500" },
        { .compatible = "qcom,sm8250-smmu-500" },
        { .compatible = "qcom,sm8350-smmu-500" },
        { }
  };
  
+ #ifdef CONFIG_ACPI
+ static struct acpi_platform_list qcom_acpi_platlist[] = {
+       { "LENOVO", "CB-01   ", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },
+       { "QCOM  ", "QCOMEDK2", 0x8180, ACPI_SIG_IORT, equal, "QCOM SMMU" },
+       { }
+ };
+ #endif
  struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
  {
        const struct device_node *np = smmu->dev->of_node;
  
-       if (of_match_node(qcom_smmu_impl_of_match, np))
-               return qcom_smmu_create(smmu, &qcom_smmu_impl);
+ #ifdef CONFIG_ACPI
+       if (np == NULL) {
+               /* Match platform for ACPI boot */
+               if (acpi_match_platform_list(qcom_acpi_platlist) >= 0)
+                       return qcom_smmu_create(smmu, &qcom_smmu_impl);
+       }
+ #endif
  
+       /*
+        * Do not change this order of implementation, i.e., first adreno
+        * smmu impl and then apss smmu since we can have both implementing
+        * arm,mmu-500 in which case we will miss setting adreno smmu specific
+        * features if the order is changed.
+        */
        if (of_device_is_compatible(np, "qcom,adreno-smmu"))
                return qcom_smmu_create(smmu, &qcom_adreno_smmu_impl);
  
+       if (of_match_node(qcom_smmu_impl_of_match, np))
+               return qcom_smmu_create(smmu, &qcom_smmu_impl);
        return smmu;
  }
index b4b32d31fc069c3521b09e43fdb12d79dcceea98,58c703f253ef73f7ed35aa75f601e1a60a129ac7..f22dbeb1e51058db0e31a9fc1c98bc78a01a27d2
@@@ -31,7 -31,6 +31,6 @@@
  #include <linux/of.h>
  #include <linux/of_address.h>
  #include <linux/of_device.h>
- #include <linux/of_iommu.h>
  #include <linux/pci.h>
  #include <linux/platform_device.h>
  #include <linux/pm_runtime.h>
@@@ -74,7 -73,7 +73,7 @@@ static bool using_legacy_binding, using
  static inline int arm_smmu_rpm_get(struct arm_smmu_device *smmu)
  {
        if (pm_runtime_enabled(smmu->dev))
-               return pm_runtime_get_sync(smmu->dev);
+               return pm_runtime_resume_and_get(smmu->dev);
  
        return 0;
  }
@@@ -408,7 -407,6 +407,7 @@@ static irqreturn_t arm_smmu_context_fau
        struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
        struct arm_smmu_device *smmu = smmu_domain->smmu;
        int idx = smmu_domain->cfg.cbndx;
 +      int ret;
  
        fsr = arm_smmu_cb_read(smmu, idx, ARM_SMMU_CB_FSR);
        if (!(fsr & ARM_SMMU_FSR_FAULT))
        iova = arm_smmu_cb_readq(smmu, idx, ARM_SMMU_CB_FAR);
        cbfrsynra = arm_smmu_gr1_read(smmu, ARM_SMMU_GR1_CBFRSYNRA(idx));
  
 -      dev_err_ratelimited(smmu->dev,
 -      "Unhandled context fault: fsr=0x%x, iova=0x%08lx, fsynr=0x%x, cbfrsynra=0x%x, cb=%d\n",
 +      ret = report_iommu_fault(domain, NULL, iova,
 +              fsynr & ARM_SMMU_FSYNR0_WNR ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ);
 +
 +      if (ret == -ENOSYS)
 +              dev_err_ratelimited(smmu->dev,
 +              "Unhandled context fault: fsr=0x%x, iova=0x%08lx, fsynr=0x%x, cbfrsynra=0x%x, cb=%d\n",
                            fsr, iova, fsynr, cbfrsynra, idx);
  
        arm_smmu_cb_write(smmu, idx, ARM_SMMU_CB_FSR, fsr);
@@@ -1276,6 -1270,7 +1275,7 @@@ static phys_addr_t arm_smmu_iova_to_phy
        u64 phys;
        unsigned long va, flags;
        int ret, idx = cfg->cbndx;
+       phys_addr_t addr = 0;
  
        ret = arm_smmu_rpm_get(smmu);
        if (ret < 0)
                dev_err(dev,
                        "iova to phys timed out on %pad. Falling back to software table walk.\n",
                        &iova);
+               arm_smmu_rpm_put(smmu);
                return ops->iova_to_phys(ops, iova);
        }
  
        if (phys & ARM_SMMU_CB_PAR_F) {
                dev_err(dev, "translation fault!\n");
                dev_err(dev, "PAR = 0x%llx\n", phys);
-               return 0;
+               goto out;
        }
  
+       addr = (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
+ out:
        arm_smmu_rpm_put(smmu);
  
-       return (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
+       return addr;
  }
  
  static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain,
@@@ -1455,6 -1453,18 +1458,18 @@@ static void arm_smmu_release_device(str
        iommu_fwspec_free(dev);
  }
  
+ static void arm_smmu_probe_finalize(struct device *dev)
+ {
+       struct arm_smmu_master_cfg *cfg;
+       struct arm_smmu_device *smmu;
+       cfg = dev_iommu_priv_get(dev);
+       smmu = cfg->smmu;
+       if (smmu->impl && smmu->impl->probe_finalize)
+               smmu->impl->probe_finalize(smmu, dev);
+ }
  static struct iommu_group *arm_smmu_device_group(struct device *dev)
  {
        struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
@@@ -1574,6 -1584,7 +1589,7 @@@ static struct iommu_ops arm_smmu_ops = 
        .iova_to_phys           = arm_smmu_iova_to_phys,
        .probe_device           = arm_smmu_probe_device,
        .release_device         = arm_smmu_release_device,
+       .probe_finalize         = arm_smmu_probe_finalize,
        .device_group           = arm_smmu_device_group,
        .enable_nesting         = arm_smmu_enable_nesting,
        .set_pgtable_quirks     = arm_smmu_set_pgtable_quirks,
@@@ -2169,7 -2180,7 +2185,7 @@@ static int arm_smmu_device_probe(struc
        err = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
        if (err) {
                dev_err(dev, "Failed to register iommu\n");
-               return err;
+               goto err_sysfs_remove;
        }
  
        platform_set_drvdata(pdev, smmu);
         * any device which might need it, so we want the bus ops in place
         * ready to handle default domain setup as soon as any SMMU exists.
         */
-       if (!using_legacy_binding)
-               return arm_smmu_bus_init(&arm_smmu_ops);
+       if (!using_legacy_binding) {
+               err = arm_smmu_bus_init(&arm_smmu_ops);
+               if (err)
+                       goto err_unregister_device;
+       }
  
        return 0;
+ err_unregister_device:
+       iommu_device_unregister(&smmu->iommu);
+ err_sysfs_remove:
+       iommu_device_sysfs_remove(&smmu->iommu);
+       return err;
  }
  
  static int arm_smmu_device_remove(struct platform_device *pdev)
index 84c21c4b0691d2f24eeb2e4b79b4241b70e51474,147c95e7c59cc6279da027a8a6757d59e16c7dfd..a5027159596075aa92a8ac26f779f81113cd3054
@@@ -224,8 -224,6 +224,8 @@@ enum arm_smmu_cbar_type 
  #define ARM_SMMU_CB_FSYNR0            0x68
  #define ARM_SMMU_FSYNR0_WNR           BIT(4)
  
 +#define ARM_SMMU_CB_FSYNR1            0x6c
 +
  #define ARM_SMMU_CB_S1_TLBIVA         0x600
  #define ARM_SMMU_CB_S1_TLBIASID               0x610
  #define ARM_SMMU_CB_S1_TLBIVAL                0x620
@@@ -441,6 -439,7 +441,7 @@@ struct arm_smmu_impl 
                                  struct device *dev, int start);
        void (*write_s2cr)(struct arm_smmu_device *smmu, int idx);
        void (*write_sctlr)(struct arm_smmu_device *smmu, int idx, u32 reg);
+       void (*probe_finalize)(struct arm_smmu_device *smmu, struct device *dev);
  };
  
  #define INVALID_SMENDX                        -1
diff --combined include/acpi/acpi_bus.h
index c6bd4f9a80ba48ffa976b069b4c46fcb74b86b8e,41f092a269f6cee3e98af164d4c1bf2cb09fee13..1ae993fee4a5d479a2d659c29bbe1dad85a1e2a1
@@@ -280,12 -280,6 +280,12 @@@ struct acpi_device_power 
        struct acpi_device_power_state states[ACPI_D_STATE_COUNT];      /* Power states (D0-D3Cold) */
  };
  
 +struct acpi_dep_data {
 +      struct list_head node;
 +      acpi_handle supplier;
 +      acpi_handle consumer;
 +};
 +
  /* Performance Management */
  
  struct acpi_device_perf_flags {
@@@ -504,6 -498,8 +504,6 @@@ extern int unregister_acpi_notifier(str
   */
  
  int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
 -struct acpi_device *acpi_bus_get_acpi_device(acpi_handle handle);
 -void acpi_bus_put_acpi_device(struct acpi_device *adev);
  acpi_status acpi_bus_get_status_handle(acpi_handle handle,
                                       unsigned long long *sta);
  int acpi_bus_get_status(struct acpi_device *device);
@@@ -590,8 -586,11 +590,11 @@@ struct acpi_pci_root 
  
  /* helper */
  
 -bool acpi_dma_supported(struct acpi_device *adev);
 +bool acpi_dma_supported(const struct acpi_device *adev);
  enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev);
+ int acpi_iommu_fwspec_init(struct device *dev, u32 id,
+                          struct fwnode_handle *fwnode,
+                          const struct iommu_ops *ops);
  int acpi_dma_get_range(struct device *dev, u64 *dma_addr, u64 *offset,
                       u64 *size);
  int acpi_dma_configure_id(struct device *dev, enum dev_dma_attr attr,
@@@ -689,8 -688,6 +692,8 @@@ static inline bool acpi_device_can_powe
  
  bool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const char *uid2);
  
 +void acpi_dev_clear_dependencies(struct acpi_device *supplier);
 +struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier);
  struct acpi_device *
  acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const char *uid, s64 hrv);
  struct acpi_device *
@@@ -724,13 -721,6 +727,13 @@@ static inline void acpi_dev_put(struct 
  {
        put_device(&adev->dev);
  }
 +
 +struct acpi_device *acpi_bus_get_acpi_device(acpi_handle handle);
 +
 +static inline void acpi_bus_put_acpi_device(struct acpi_device *adev)
 +{
 +      acpi_dev_put(adev);
 +}
  #else /* CONFIG_ACPI */
  
  static inline int register_acpi_bus_type(void *bus) { return 0; }
diff --combined include/linux/acpi.h
index b338613fb536565fd2fe309f9a30355f060ce460,7aaa9559cc193e3614e4b874b2394ead96fc2edc..6bb36fd6ba31a6eb035ec263b71c330304eea4ee
@@@ -132,7 -132,6 +132,7 @@@ enum acpi_address_range_id 
  union acpi_subtable_headers {
        struct acpi_subtable_header common;
        struct acpi_hmat_structure hmat;
 +      struct acpi_prmt_module_header prmt;
  };
  
  typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);
@@@ -260,9 -259,12 +260,12 @@@ void acpi_numa_x2apic_affinity_init(str
  
  #ifdef CONFIG_ARM64
  void acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa);
+ void acpi_arch_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size);
  #else
  static inline void
  acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa) { }
+ static inline void
+ acpi_arch_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size) { }
  #endif
  
  int acpi_numa_memory_affinity_init (struct acpi_srat_mem_affinity *ma);
@@@ -551,7 -553,6 +554,7 @@@ acpi_status acpi_run_osc(acpi_handle ha
  #define OSC_SB_OSLPI_SUPPORT                  0x00000100
  #define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT               0x00001000
  #define OSC_SB_GENERIC_INITIATOR_SUPPORT      0x00002000
 +#define OSC_SB_PRM_SUPPORT                    0x00020000
  #define OSC_SB_NATIVE_USB4_SUPPORT            0x00040000
  
  extern bool osc_sb_apei_support_acked;
@@@ -668,6 -669,7 +671,6 @@@ extern bool acpi_driver_match_device(st
                                     const struct device_driver *drv);
  int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
  int acpi_device_modalias(struct device *, char *, int);
 -void acpi_walk_dep_device_list(acpi_handle handle);
  
  struct platform_device *acpi_create_platform_device(struct acpi_device *,
                                                    struct property_entry *);
@@@ -711,8 -713,6 +714,8 @@@ static inline u64 acpi_arch_get_root_po
  }
  #endif
  
 +int acpi_get_local_address(acpi_handle handle, u32 *addr);
 +
  #else /* !CONFIG_ACPI */
  
  #define acpi_disabled 1
@@@ -768,7 -768,7 +771,7 @@@ static inline bool is_acpi_device_node(
        return false;
  }
  
 -static inline struct acpi_device *to_acpi_device_node(struct fwnode_handle *fwnode)
 +static inline struct acpi_device *to_acpi_device_node(const struct fwnode_handle *fwnode)
  {
        return NULL;
  }
@@@ -778,12 -778,12 +781,12 @@@ static inline bool is_acpi_data_node(co
        return false;
  }
  
 -static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwnode)
 +static inline struct acpi_data_node *to_acpi_data_node(const struct fwnode_handle *fwnode)
  {
        return NULL;
  }
  
 -static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
 +static inline bool acpi_data_node_match(const struct fwnode_handle *fwnode,
                                        const char *name)
  {
        return false;
@@@ -914,7 -914,7 +917,7 @@@ acpi_create_platform_device(struct acpi
        return NULL;
  }
  
 -static inline bool acpi_dma_supported(struct acpi_device *adev)
 +static inline bool acpi_dma_supported(const struct acpi_device *adev)
  {
        return false;
  }
@@@ -968,11 -968,6 +971,11 @@@ static inline struct acpi_device *acpi_
        return NULL;
  }
  
 +static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)
 +{
 +      return -ENODEV;
 +}
 +
  #endif        /* !CONFIG_ACPI */
  
  #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
@@@ -1012,7 -1007,6 +1015,7 @@@ int acpi_dev_resume(struct device *dev)
  int acpi_subsys_runtime_suspend(struct device *dev);
  int acpi_subsys_runtime_resume(struct device *dev);
  int acpi_dev_pm_attach(struct device *dev, bool power_on);
 +bool acpi_storage_d3(struct device *dev);
  #else
  static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }
  static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }
@@@ -1020,10 -1014,6 +1023,10 @@@ static inline int acpi_dev_pm_attach(st
  {
        return 0;
  }
 +static inline bool acpi_storage_d3(struct device *dev)
 +{
 +      return false;
 +}
  #endif
  
  #if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
@@@ -1109,8 -1099,6 +1112,8 @@@ void __acpi_handle_debug(struct _ddebu
  #if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
  bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
                                struct acpi_resource_gpio **agpio);
 +bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
 +                             struct acpi_resource_gpio **agpio);
  int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index);
  #else
  static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
  {
        return false;
  }
 +static inline bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
 +                                           struct acpi_resource_gpio **agpio)
 +{
 +      return false;
 +}
  static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev,
                                           const char *name, int index)
  {
This page took 0.186898 seconds and 4 git commands to generate.