Merge tag 'drm-misc-next-2021-07-16' of git://anongit.freedesktop.org/drm/drm-misc...
authorDave Airlie <airlied@redhat.com>
Wed, 21 Jul 2021 01:58:26 +0000 (11:58 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 21 Jul 2021 01:58:28 +0000 (11:58 +1000)
drm-misc-next for v5.15:

UAPI Changes:

Cross-subsystem Changes:
- udmabuf: Add support for mapping hugepages
- Add dma-buf stats to sysfs.
- Assorted fixes to fbdev/omap2.
- dma-buf: Document DMA_BUF_IOCTL_SYNC
- Improve dma-buf non-dynamic exporter expectations better.
- Add module parameters for dma-buf size and list limit.
- Add HDMI codec support to vc4, to replace vc4's own codec.
- Document dma-buf implicit fencing rules.
- dma_resv_test_signaled test_all handling.

Core Changes:
- Extract i915's eDP backlight code into DRM helpers.
- Assorted docbook updates.
- Rework drm_dp_aux documentation.
- Add support for the DP aux bus.
- Shrink dma-fence-chain slightly.
- Add alloc/free helpers for dma-fence-chain.
- Assorted fixes to TTM., drm/of, bridge
- drm_gem_plane_helper_prepare/cleanup_fb is now the default for gem drivers.
- Small fix for scheduler completion.
- Remove use of drm_device.irq_enabled.
- Print the driver name to dmesg when registering framebuffer.
- Export drm/gem's shadow plane handling, and use it in vkms.
- Assorted small fixes.

Driver Changes:
- Add eDP backlight to nouveau.
- Assorted fixes and cleanups to nouveau, panfrost, vmwgfx, anx7625,
  amdgpu, gma500, radeon, mgag200, vgem, vc4, vkms, omapdrm.
- Add support for Samsung DB7430, Samsung ATNA33XC20, EDT ETMV570G2DHU,
  EDT ETM0350G0DH6, Innolux EJ030NA panels.
- Fix some simple pannels missing bus_format and connector types.
- Add mks-guest-stats instrumentation support to vmwgfx.
- Merge i915-ttm topic branch.
- Make s6e63m0 panel use Mipi-DBI helpers.
- Add detect() supoprt for AST.
- Use interrupts for hotplug on vc4.
- vmwgfx is now moved to drm-misc-next, as sroland is no longer a maintainer for now.
- vmwgfx now uses copies of vmware's internal device headers.
- Slowly convert ti-sn65dsi83 over to atomic.
- Rework amdgpu dma-resv handling.
- Fix virtio fencing for planes.
- Ensure amdgpu can always evict to SYSTEM.
- Many drivers fixed for implicit fencing rules.
- Set default prepare/cleanup fb for tiny, vram and simple helpers too.
- Rework panfrost gpu reset and related serialization.
- Update VKMS todo list.
- Make bochs a tiny gpu driver, and use vram helper.
- Use linux irq interfaces instead of drm_irq in some drivers.
- Add support for Raspberry Pi Pico to GUD.

Signed-off-by: Dave Airlie <airlied@redhat.com>
# gpg: Signature made Fri 16 Jul 2021 21:06:04 AEST
# gpg:                using RSA key B97BD6A80CAC4981091AE547FE558C72A67013C3
# gpg: Good signature from "Maarten Lankhorst <maarten.lankhorst@linux.intel.com>" [expired]
# gpg:                 aka "Maarten Lankhorst <maarten@debian.org>" [expired]
# gpg:                 aka "Maarten Lankhorst <maarten.lankhorst@canonical.com>" [expired]
# gpg: Note: This key has expired!
# Primary key fingerprint: B97B D6A8 0CAC 4981 091A  E547 FE55 8C72 A670 13C3
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/444811c3-cbec-e9d5-9a6b-9632eda7962a@linux.intel.com
27 files changed:
1  2 
MAINTAINERS
arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/gem/i915_gem_mman.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/meson/meson_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_fence.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/vc4/vc4_hdmi.c
drivers/gpu/drm/vc4/vc4_kms.c
include/drm/drm_dp_helper.h

diff --combined MAINTAINERS
@@@ -299,6 -299,7 +299,6 @@@ M: William Breathitt Gray <vilhelm.gray
  M:    Syed Nayyar Waris <syednwaris@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-bus-counter-104-quad-8
  F:    drivers/counter/104-quad-8.c
  
  ACCES PCI-IDIO-16 GPIO DRIVER
@@@ -430,14 -431,6 +430,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 <jean-philippe@linaro.org>
 +L:    linux-acpi@vger.kernel.org
 +L:    iommu@lists.linux-foundation.org
 +S:    Maintained
 +F:    drivers/acpi/viot.c
 +F:    include/linux/acpi_viot.h
 +
  ACPI WMI DRIVER
  L:    platform-driver-x86@vger.kernel.org
  S:    Orphan
@@@ -752,12 -745,6 +752,12 @@@ L:       linux-crypto@vger.kernel.or
  S:    Maintained
  F:    drivers/crypto/allwinner/
  
 +ALLWINNER HARDWARE SPINLOCK SUPPORT
 +M:    Wilken Gottwalt <wilken.gottwalt@posteo.net>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwlock/allwinner,sun6i-hwspinlock.yaml
 +F:    drivers/hwspinlock/sun6i_hwspinlock.c
 +
  ALLWINNER THERMAL DRIVER
  M:    Vasily Khoruzhick <anarsoul@gmail.com>
  M:    Yangtao Li <tiny.windzz@gmail.com>
@@@ -796,14 -783,6 +796,14 @@@ M:       Ley Foon Tan <ley.foon.tan@intel.com
  S:    Maintained
  F:    drivers/mailbox/mailbox-altera.c
  
 +ALTERA MSGDMA IP CORE DRIVER
 +M:    Olivier Dautricourt <olivier.dautricourt@orolia.com>
 +R:    Stefan Roese <sr@denx.de>
 +L:    dmaengine@vger.kernel.org
 +S:    Odd Fixes
 +F:    Documentation/devicetree/bindings/dma/altr,msgdma.yaml
 +F:    drivers/dma/altera-msgdma.c
 +
  ALTERA PIO DRIVER
  M:    Joyce Ooi <joyce.ooi@intel.com>
  L:    linux-gpio@vger.kernel.org
@@@ -933,7 -912,6 +933,7 @@@ F: drivers/video/fbdev/geode
  
  AMD IOMMU (AMD-VI)
  M:    Joerg Roedel <joro@8bytes.org>
 +R:    Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
  L:    iommu@lists.linux-foundation.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
@@@ -995,7 -973,7 +995,7 @@@ F: drivers/net/ethernet/amd/xgbe
  
  AMD SENSOR FUSION HUB DRIVER
  M:    Nehal Shah <nehal-bakulchandra.shah@amd.com>
 -M:    Sandeep Singh <sandeep.singh@amd.com>
 +M:    Basavaraj Natikar <basavaraj.natikar@amd.com>
  L:    linux-input@vger.kernel.org
  S:    Maintained
  F:    Documentation/hid/amd-sfh*
@@@ -1333,7 -1311,6 +1333,7 @@@ W:      http://www.aquantia.co
  F:    drivers/net/ethernet/aquantia/atlantic/aq_ptp*
  
  ARASAN NAND CONTROLLER DRIVER
 +M:    Miquel Raynal <miquel.raynal@bootlin.com>
  M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
@@@ -1475,22 -1452,6 +1475,22 @@@ S:    Odd Fixe
  F:    drivers/amba/
  F:    include/linux/amba/bus.h
  
 +ARM PRIMECELL PL35X NAND CONTROLLER DRIVER
 +M:    Miquel Raynal <miquel.raynal@bootlin.com@bootlin.com>
 +M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
 +L:    linux-mtd@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mtd/arm,pl353-nand-r2p1.yaml
 +F:    drivers/mtd/nand/raw/pl35x-nand-controller.c
 +
 +ARM PRIMECELL PL35X SMC DRIVER
 +M:    Miquel Raynal <miquel.raynal@bootlin.com@bootlin.com>
 +M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mtd/arm,pl353-smc.yaml
 +F:    drivers/memory/pl353-smc.c
 +
  ARM PRIMECELL CLCD PL110 DRIVER
  M:    Russell King <linux@armlinux.org.uk>
  S:    Odd Fixes
@@@ -1694,11 -1655,9 +1694,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 <jesper.nilsson@axis.com>
@@@ -1851,15 -1810,13 +1851,15 @@@ F:   Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt
  F:    Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
  F:    Documentation/devicetree/bindings/rtc/faraday,ftrtc010.txt
 +F:    arch/arm/boot/dts/gemini*
  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 <kabel@kernel.org>
 +M:    Marek Behún <kabel@kernel.org>
  S:    Maintained
  W:    https://www.turris.cz/
  F:    Documentation/ABI/testing/debugfs-moxtet
@@@ -2015,7 -1972,6 +2015,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
@@@ -2212,7 -2168,6 +2212,7 @@@ M:      Daniel Palmer <daniel@thingy.jp
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  W:    http://linux-chenxing.org/
 +T:    git git://github.com/linux-chenxing/linux.git
  F:    Documentation/devicetree/bindings/arm/mstar/*
  F:    Documentation/devicetree/bindings/clock/mstar,msc313-mpll.yaml
  F:    Documentation/devicetree/bindings/gpio/mstar,msc313-gpio.yaml
@@@ -2220,7 -2175,6 +2220,7 @@@ F:      arch/arm/boot/dts/mstar-
  F:    arch/arm/mach-mstar/
  F:    drivers/clk/mstar/
  F:    drivers/gpio/gpio-msc313.c
 +F:    drivers/watchdog/msc313e_wdt.c
  F:    include/dt-bindings/clock/mstar-*
  F:    include/dt-bindings/gpio/msc313-gpio.h
  
@@@ -2482,12 -2436,9 +2482,12 @@@ F:    drivers/*/*/*s3c24
  F:    drivers/*/*s3c24*
  F:    drivers/*/*s3c64xx*
  F:    drivers/*/*s5pv210*
 +F:    drivers/clocksource/samsung_pwm_timer.c
  F:    drivers/memory/samsung/
 +F:    drivers/pwm/pwm-samsung.c
  F:    drivers/soc/samsung/
  F:    drivers/tty/serial/samsung*
 +F:    include/clocksource/samsung_pwm.h
  F:    include/linux/platform_data/*s3c*
  F:    include/linux/serial_s3c.h
  F:    include/linux/soc/samsung/
@@@ -3782,19 -3733,11 +3782,19 @@@ S:   Supporte
  F:    Documentation/devicetree/bindings/gpio/brcm,kona-gpio.txt
  F:    drivers/gpio/gpio-bcm-kona.c
  
 +BROADCOM MPI3 STORAGE CONTROLLER DRIVER
 +M:    Sathya Prakash Veerichetty <sathya.prakash@broadcom.com>
 +M:    Kashyap Desai <kashyap.desai@broadcom.com>
 +M:    Sumit Saxena <sumit.saxena@broadcom.com>
 +M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
 +L:    mpi3mr-linuxdrv.pdl@broadcom.com
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +W:    https://www.broadcom.com/support/storage
 +F:    drivers/scsi/mpi3mr/
 +
  BROADCOM NETXTREME-E ROCE DRIVER
  M:    Selvin Xavier <selvin.xavier@broadcom.com>
 -M:    Devesh Sharma <devesh.sharma@broadcom.com>
 -M:    Somnath Kotur <somnath.kotur@broadcom.com>
 -M:    Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
  M:    Naresh Kumar PBS <nareshkumar.pbs@broadcom.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
@@@ -3934,7 -3877,6 +3934,7 @@@ L:      linux-btrfs@vger.kernel.or
  S:    Maintained
  W:    http://btrfs.wiki.kernel.org/
  Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 +C:    irc://irc.libera.chat/btrfs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
@@@ -4098,9 -4040,7 +4098,9 @@@ W:      https://github.com/linux-ca
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
  F:    Documentation/devicetree/bindings/net/can/
 +F:    Documentation/devicetree/bindings/phy/ti,tcan104x-can.yaml
  F:    drivers/net/can/
 +F:    drivers/phy/phy-can-transceiver.c
  F:    include/linux/can/bittiming.h
  F:    include/linux/can/dev.h
  F:    include/linux/can/led.h
@@@ -4198,14 -4138,6 +4198,14 @@@ S:    Odd Fixe
  F:    Documentation/devicetree/bindings/arm/cavium-thunder2.txt
  F:    arch/arm64/boot/dts/cavium/thunder2-99xx*
  
 +CBS/ETF/TAPRIO QDISCS
 +M:    Vinicius Costa Gomes <vinicius.gomes@intel.com>
 +S:    Maintained
 +L:    netdev@vger.kernel.org
 +F:    net/sched/sch_cbs.c
 +F:    net/sched/sch_etf.c
 +F:    net/sched/sch_taprio.c
 +
  CC2520 IEEE-802.15.4 RADIO DRIVER
  M:    Varka Bhadram <varkabhadram@gmail.com>
  L:    linux-wpan@vger.kernel.org
@@@ -4504,18 -4436,6 +4504,18 @@@ F:    include/linux/compiler-clang.
  F:    scripts/clang-tools/
  K:    \b(?i:clang|llvm)\b
  
 +CLANG CONTROL FLOW INTEGRITY SUPPORT
 +M:    Sami Tolvanen <samitolvanen@google.com>
 +M:    Kees Cook <keescook@chromium.org>
 +R:    Nathan Chancellor <nathan@kernel.org>
 +R:    Nick Desaulniers <ndesaulniers@google.com>
 +L:    clang-built-linux@googlegroups.com
 +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 <konrad.wilk@oracle.com>
  L:    linux-kernel@vger.kernel.org
@@@ -4681,12 -4601,6 +4681,12 @@@ S:    Supporte
  F:    drivers/video/console/
  F:    include/linux/console*
  
 +CONTEXT TRACKING
 +M:    Frederic Weisbecker <frederic@kernel.org>
 +S:    Maintained
 +F:    kernel/context_tracking.c
 +F:    include/linux/context_tracking*
 +
  CONTROL GROUP (CGROUP)
  M:    Tejun Heo <tj@kernel.org>
  M:    Zefan Li <lizefan.x@bytedance.com>
@@@ -4761,7 -4675,7 +4761,7 @@@ COUNTER SUBSYSTE
  M:    William Breathitt Gray <vilhelm.gray@gmail.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-bus-counter*
 +F:    Documentation/ABI/testing/sysfs-bus-counter
  F:    Documentation/driver-api/generic-counter.rst
  F:    drivers/counter/
  F:    include/linux/counter.h
@@@ -5084,10 -4998,11 +5084,10 @@@ S:   Maintaine
  F:    drivers/input/touchscreen/cy8ctma140.c
  
  CYTTSP TOUCHSCREEN DRIVER
 -M:    Ferruh Yigit <fery@cypress.com>
 +M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-input@vger.kernel.org
 -S:    Supported
 +S:    Maintained
  F:    drivers/input/touchscreen/cyttsp*
 -F:    include/linux/input/cyttsp.h
  
  D-LINK DIR-685 TOUCHKEYS DRIVER
  M:    Linus Walleij <linus.walleij@linaro.org>
@@@ -5255,14 -5170,7 +5255,14 @@@ DELL WMI NOTIFICATIONS DRIVE
  M:    Matthew Garrett <mjg59@srcf.ucam.org>
  M:    Pali Rohár <pali@kernel.org>
  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 <Perry.Yuan@dell.com>
 +L:    Dell.Client.Kernel@dell.com
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    drivers/platform/x86/dell/dell-wmi-privacy.c
  
  DELTA ST MEDIA DRIVER
  M:    Hugues Fruchet <hugues.fruchet@foss.st.com>
@@@ -5272,13 -5180,6 +5272,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 <robert.marko@sartura.hr>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/hwmon/dps920ab.rst
 +F:    drivers/hwmon/pmbus/dps920ab.c
 +
  DENALI NAND DRIVER
  L:    linux-mtd@lists.infradead.org
  S:    Orphan
@@@ -5668,6 -5569,7 +5668,6 @@@ F:      drivers/soc/fsl/dpi
  
  DPAA2 ETHERNET DRIVER
  M:    Ioana Ciornei <ioana.ciornei@nxp.com>
 -M:    Ioana Radulescu <ruxandra.radulescu@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/networking/device_drivers/ethernet/freescale/dpaa2/ethernet-driver.rst
@@@ -5770,7 -5672,7 +5770,7 @@@ M:      Gerd Hoffmann <kraxel@redhat.com
  L:    virtualization@lists.linux-foundation.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
- F:    drivers/gpu/drm/bochs/
+ F:    drivers/gpu/drm/tiny/bochs.c
  
  DRM DRIVER FOR BOE HIMAX8279D PANELS
  M:    Jerry Han <hanxu5@huaqin.corp-partner.google.com>
@@@ -5955,6 -5857,13 +5955,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml
  F:    drivers/gpu/drm/panel/panel-raydium-rm67191.c
  
+ DRM DRIVER FOR SAMSUNG DB7430 PANELS
+ M:    Linus Walleij <linus.walleij@linaro.org>
+ S:    Maintained
+ T:    git git://anongit.freedesktop.org/drm/drm-misc
+ F:    Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml
+ F:    drivers/gpu/drm/panel/panel-samsung-db7430.c
  DRM DRIVER FOR SITRONIX ST7703 PANELS
  M:    Guido Günther <agx@sigxcpu.org>
  R:    Purism Kernel Team <kernel@puri.sm>
@@@ -6053,11 -5962,10 +6060,10 @@@ F:   drivers/gpu/drm/vboxvideo
  
  DRM DRIVER FOR VMWARE VIRTUAL GPU
  M:    "VMware Graphics" <linux-graphics-maintainer@vmware.com>
- M:    Roland Scheidegger <sroland@vmware.com>
  M:    Zack Rusin <zackr@vmware.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
- T:    git git://people.freedesktop.org/~sroland/linux
+ T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/vmwgfx/
  F:    include/uapi/drm/vmwgfx_drm.h
  
@@@ -6550,11 -6458,10 +6556,11 @@@ F:   Documentation/filesystems/ecryptfs.r
  F:    fs/ecryptfs/
  
  EDAC-AMD64
 -M:    Borislav Petkov <bp@alien8.de>
 +M:    Yazen Ghannam <yazen.ghannam@amd.com>
  L:    linux-edac@vger.kernel.org
 -S:    Maintained
 +S:    Supported
  F:    drivers/edac/amd64_edac*
 +F:    drivers/edac/mce_amd*
  
  EDAC-ARMADA
  M:    Jan Luebbe <jlu@pengutronix.de>
@@@ -6835,6 -6742,7 +6841,6 @@@ F:      drivers/net/ethernet/emulex/benet
  
  EMULEX ONECONNECT ROCE DRIVER
  M:    Selvin Xavier <selvin.xavier@broadcom.com>
 -M:    Devesh Sharma <devesh.sharma@broadcom.com>
  L:    linux-rdma@vger.kernel.org
  S:    Odd Fixes
  W:    http://www.broadcom.com
@@@ -6849,15 -6757,6 +6855,15 @@@ S:    Supporte
  W:    http://www.broadcom.com
  F:    drivers/scsi/lpfc/
  
 +EMULEX/BROADCOM EFCT FC/FCOE SCSI TARGET DRIVER
 +M:    James Smart <james.smart@broadcom.com>
 +M:    Ram Vegesna <ram.vegesna@broadcom.com>
 +L:    linux-scsi@vger.kernel.org
 +L:    target-devel@vger.kernel.org
 +S:    Supported
 +W:    http://www.broadcom.com
 +F:    drivers/scsi/elx/
 +
  ENE CB710 FLASH CARD READER DRIVER
  M:    MichaÅ‚ MirosÅ‚aw <mirq-linux@rere.qmqm.pl>
  S:    Maintained
@@@ -6885,7 -6784,7 +6891,7 @@@ F:      include/video/s1d13xxxfb.
  
  EROFS FILE SYSTEM
  M:    Gao Xiang <xiang@kernel.org>
 -M:    Chao Yu <yuchao0@huawei.com>
 +M:    Chao Yu <chao@kernel.org>
  L:    linux-erofs@lists.ozlabs.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
@@@ -6926,8 -6825,6 +6932,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/
@@@ -7027,7 -6924,7 +7033,7 @@@ F:      drivers/iommu/exynos-iommu.
  
  F2FS FILE SYSTEM
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
 -M:    Chao Yu <yuchao0@huawei.com>
 +M:    Chao Yu <chao@kernel.org>
  L:    linux-f2fs-devel@lists.sourceforge.net
  S:    Maintained
  W:    https://f2fs.wiki.kernel.org/
@@@ -7062,7 -6959,6 +7068,7 @@@ F:      net/core/failover.
  FANOTIFY
  M:    Jan Kara <jack@suse.cz>
  R:    Amir Goldstein <amir73il@gmail.com>
 +R:    Matthew Bobrowski <repnop@google.com>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
  F:    fs/notify/fanotify/
@@@ -7194,13 -7090,6 +7200,13 @@@ F:    include/linux/firewire.
  F:    include/uapi/linux/firewire*.h
  F:    tools/firewire/
  
 +FIRMWARE FRAMEWORK FOR ARMV8-A
 +M:    Sudeep Holla <sudeep.holla@arm.com>
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    drivers/firmware/arm_ffa/
 +F:    include/linux/arm_ffa.h
 +
  FIRMWARE LOADER (request_firmware)
  M:    Luis Chamberlain <mcgrof@kernel.org>
  L:    linux-kernel@vger.kernel.org
@@@ -7219,6 -7108,7 +7225,6 @@@ FLEXTIMER FTM-QUADDEC DRIVE
  M:    Patrick Havelange <patrick.havelange@essensium.com>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-bus-counter-ftm-quaddec
  F:    Documentation/devicetree/bindings/counter/ftm-quaddec.txt
  F:    drivers/counter/ftm-quaddec.c
  
@@@ -7234,13 -7124,6 +7240,13 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/input/joystick/fsia6b.c
  
 +FOCUSRITE SCARLETT GEN 2/3 MIXER DRIVER
 +M:    Geoffrey D. Bennett <g@b4.vu>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
 +F:    sound/usb/mixer_scarlett_gen2.c
 +
  FORCEDETH GIGABIT ETHERNET DRIVER
  M:    Rain River <rain.1986.08.12@gmail.com>
  M:    Zhu Yanjun <zyjzyj2000@gmail.com>
@@@ -7295,7 -7178,7 +7301,7 @@@ F:      include/video
  
  FREESCALE CAAM (Cryptographic Acceleration and Assurance Module) DRIVER
  M:    Horia Geantă <horia.geanta@nxp.com>
 -M:    Aymen Sghaier <aymen.sghaier@nxp.com>
 +M:    Pankaj Gupta <pankaj.gupta@nxp.com>
  L:    linux-crypto@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/crypto/fsl-sec4.txt
@@@ -7483,6 -7366,7 +7489,6 @@@ F:      drivers/net/ethernet/freescale/fs_en
  F:    include/linux/fs_enet_pd.h
  
  FREESCALE SOC SOUND DRIVERS
 -M:    Timur Tabi <timur@kernel.org>
  M:    Nicolin Chen <nicoleotsuka@gmail.com>
  M:    Xiubo Li <Xiubo.Lee@gmail.com>
  R:    Fabio Estevam <festevam@gmail.com>
@@@ -7685,12 -7569,6 +7691,12 @@@ M:    Kieran Bingham <kbingham@kernel.org
  S:    Supported
  F:    scripts/gdb/
  
 +GEMINI CRYPTO DRIVER
 +M:    Corentin Labbe <clabbe@baylibre.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Maintained
 +F:    drivers/crypto/gemini/
 +
  GEMTEK FM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -7783,14 -7661,6 +7789,14 @@@ L:    linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/input/touchscreen/resistive-adc-touch.c
  
 +GENERIC STRING LIBRARY
 +R:    Andy Shevchenko <andy@kernel.org>
 +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" <mst@redhat.com>
  L:    kvm@vger.kernel.org
@@@ -8426,13 -8296,6 +8432,13 @@@ S:    Maintaine
  W:    http://www.hisilicon.com
  F:    drivers/spi/spi-hisi-kunpeng.c
  
 +HISILICON SPMI CONTROLLER DRIVER FOR HIKEY 970
 +M:    Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/spmi/hisilicon,hisi-spmi-controller.yaml
 +F:    drivers/spmi/hisi-spmi-controller.c
 +
  HISILICON STAGING DRIVERS FOR HIKEY 960/970
  M:    Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
  S:    Maintained
@@@ -8921,6 -8784,22 +8927,6 @@@ L:     linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/busses/i2c-icy.c
  
 -IDE SUBSYSTEM
 -M:    "David S. Miller" <davem@davemloft.net>
 -L:    linux-ide@vger.kernel.org
 -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:    linux-ide@vger.kernel.org
 -S:    Orphan
 -F:    Documentation/cdrom/ide-cd.rst
 -F:    drivers/ide/ide-cd*
 -
  IDEAPAD LAPTOP EXTRAS DRIVER
  M:    Ike Panhc <ike.pan@canonical.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -9000,7 -8879,7 +9006,7 @@@ IIO MULTIPLEXE
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/iio/multiplexer/io-channel-mux.txt
 +F:    Documentation/devicetree/bindings/iio/multiplexer/io-channel-mux.yaml
  F:    drivers/iio/multiplexer/iio-mux.c
  
  IIO SCMI BASED DRIVER
@@@ -9272,15 -9151,6 +9278,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 <mustafa.ismail@intel.com>
 +M:    Shiraz Saleem <shiraz.saleem@intel.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Supported
 +F:    drivers/infiniband/hw/irdma/
 +F:    include/uapi/rdma/irdma-abi.h
  
  INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
  M:    Maik Broemme <mbroemme@libmpq.org>
@@@ -9386,12 -9256,6 +9392,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 <clabbe@baylibre.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Maintained
 +F:    drivers/crypto/ixp4xx_crypto.c
 +
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
  M:    Krzysztof Halasa <khalasa@piap.pl>
  S:    Maintained
@@@ -9405,7 -9269,6 +9411,7 @@@ F:      include/linux/soc/ixp4xx/qmgr.
  INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
  M:    Deepak Saxena <dsaxena@plexity.net>
  S:    Maintained
 +F:    Documentation/devicetree/bindings/display/intel,ixp46x-rng.yaml
  F:    drivers/char/hw_random/ixp4xx-rng.c
  
  INTEL KEEM BAY DRM DRIVER
@@@ -9457,6 -9320,16 +9463,6 @@@ F:     drivers/hwmon/intel-m10-bmc-hwmon.
  F:    drivers/mfd/intel-m10-bmc.c
  F:    include/linux/mfd/intel-m10-bmc.h
  
 -INTEL MAX 10 BMC MFD DRIVER
 -M:    Xu Yilun <yilun.xu@intel.com>
 -R:    Tom Rix <trix@redhat.com>
 -S:    Maintained
 -F:    Documentation/ABI/testing/sysfs-driver-intel-m10-bmc
 -F:    Documentation/hwmon/intel-m10-bmc-hwmon.rst
 -F:    drivers/hwmon/intel-m10-bmc-hwmon.c
 -F:    drivers/mfd/intel-m10-bmc.c
 -F:    include/linux/mfd/intel-m10-bmc.h
 -
  INTEL MENLOW THERMAL DRIVER
  M:    Sujith Thomas <sujith.thomas@intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -9512,10 -9385,13 +9518,10 @@@ L:   linux-pm@vger.kernel.or
  S:    Supported
  F:    drivers/cpufreq/intel_pstate.c
  
 -INTEL RDMA RNIC DRIVER
 -M:    Faisal Latif <faisal.latif@intel.com>
 -M:    Shiraz Saleem <shiraz.saleem@intel.com>
 -L:    linux-rdma@vger.kernel.org
 -S:    Supported
 -F:    drivers/infiniband/hw/i40iw/
 -F:    include/uapi/rdma/i40iw-abi.h
 +INTEL QUADRATURE ENCODER PERIPHERAL DRIVER
 +M:    Jarkko Nikula <jarkko.nikula@linux.intel.com>
 +L:    linux-iio@vger.kernel.org
 +F:    drivers/counter/intel-qep.c
  
  INTEL SCU DRIVERS
  M:    Mika Westerberg <mika.westerberg@linux.intel.com>
@@@ -9523,11 -9399,6 +9529,11 @@@ S:    Maintaine
  F:    arch/x86/include/asm/intel_scu_ipc.h
  F:    drivers/platform/x86/intel_scu_*
  
 +INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER
 +M:    Daniel Scally <djrscally@gmail.com>
 +S:    Maintained
 +F:    drivers/platform/x86/intel/int3472/
 +
  INTEL SPEED SELECT TECHNOLOGY
  M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -9548,7 -9419,7 +9554,7 @@@ F:      include/linux/firmware/intel/stratix
  F:    include/linux/firmware/intel/stratix10-svc-client.h
  
  INTEL TELEMETRY DRIVER
 -M:    Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>
 +M:    Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
  M:    "David E. Box" <david.e.box@linux.intel.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
@@@ -9593,13 -9464,6 +9599,13 @@@ L:    Dell.Client.Kernel@dell.co
  S:    Maintained
  F:    drivers/platform/x86/intel-wmi-thunderbolt.c
  
 +INTEL WWAN IOSM DRIVER
 +M:    M Chetan Kumar <m.chetan.kumar@intel.com>
 +M:    Intel Corporation <linuxwwan@intel.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/wwan/iosm/
 +
  INTEL(R) TRACE HUB
  M:    Alexander Shishkin <alexander.shishkin@linux.intel.com>
  S:    Supported
@@@ -10151,8 -10015,6 +10157,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 <chenhuacai@kernel.org>
@@@ -11018,7 -10880,6 +11024,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
@@@ -11056,7 -10917,7 +11062,7 @@@ MARVELL ARMADA 3700 PHY DRIVER
  M:    Miquel Raynal <miquel.raynal@bootlin.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/phy/phy-mvebu-comphy.txt
 -F:    Documentation/devicetree/bindings/phy/phy-mvebu-utmi.txt
 +F:    Documentation/devicetree/bindings/phy/marvell,armada-3700-utmi-phy.yaml
  F:    drivers/phy/marvell/phy-mvebu-a3700-comphy.c
  F:    drivers/phy/marvell/phy-mvebu-a3700-utmi.c
  
@@@ -11105,7 -10966,7 +11111,7 @@@ F:   include/linux/mv643xx.
  
  MARVELL MV88X3310 PHY DRIVER
  M:    Russell King <linux@armlinux.org.uk>
 -M:    Marek Behun <marek.behun@nic.cz>
 +M:    Marek Behún <kabel@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/phy/marvell10g.c
@@@ -11451,7 -11312,6 +11457,7 @@@ F:   include/media/imx.
  
  MEDIA DRIVERS FOR FREESCALE IMX7
  M:    Rui Miguel Silva <rmfrfs@gmail.com>
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
@@@ -11561,7 -11421,6 +11567,7 @@@ L:   linux-renesas-soc@vger.kernel.or
  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/
  
@@@ -11966,7 -11825,6 +11972,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/memory-controllers/
  F:    drivers/memory/
  F:    include/dt-bindings/memory/
 +F:    include/memory/
  
  MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA
  M:    Dmitry Osipenko <digetx@gmail.com>
@@@ -11991,7 -11849,6 +11997,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 <miquel.raynal@bootlin.com>
@@@ -12153,13 -12010,11 +12159,13 @@@ MICROCHIP ISC DRIVE
  M:    Eugen Hristev <eugen.hristev@microchip.com>
  L:    linux-media@vger.kernel.org
  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
@@@ -12357,7 -12212,7 +12363,7 @@@ M:   Maximilian Luz <luzmaximilian@gmail.
  L:    platform-driver-x86@vger.kernel.org
  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
@@@ -12553,15 -12408,8 +12559,15 @@@ F: Documentation/userspace-api/media/dr
  F:    drivers/media/pci/meye/
  F:    include/uapi/linux/meye.h
  
 +MOTORCOMM PHY DRIVER
 +M:    Peter Geis <pgwipeout@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/phy/motorcomm.c
 +
  MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
 -S:    Orphan
 +M:    Jiri Slaby <jirislaby@kernel.org>
 +S:    Maintained
  F:    Documentation/driver-api/serial/moxa-smartio.rst
  F:    drivers/tty/mxser.*
  
@@@ -12774,7 -12622,7 +12780,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 <schmitzmic@gmail.com>
  L:    linux-scsi@vger.kernel.org
  S:    Maintained
@@@ -12831,7 -12679,6 +12837,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*
@@@ -12863,9 -12710,9 +12869,9 @@@ F:   drivers/rtc/rtc-ntxec.
  F:    include/linux/mfd/ntxec.h
  
  NETRONOME ETHERNET DRIVERS
 -M:    Simon Horman <simon.horman@netronome.com>
 +M:    Simon Horman <simon.horman@corigine.com>
  R:    Jakub Kicinski <kuba@kernel.org>
 -L:    oss-drivers@netronome.com
 +L:    oss-drivers@corigine.com
  S:    Maintained
  F:    drivers/net/ethernet/netronome/
  
@@@ -12892,6 -12739,7 +12898,6 @@@ M:   "David S. Miller" <davem@davemloft.n
  M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -W:    http://www.linuxfoundation.org/en/Net
  Q:    https://patchwork.kernel.org/project/netdevbpf/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
@@@ -12936,6 -12784,7 +12942,6 @@@ M:   "David S. Miller" <davem@davemloft.n
  M:    Jakub Kicinski <kuba@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -W:    http://www.linuxfoundation.org/en/Net
  Q:    https://patchwork.kernel.org/project/netdevbpf/list/
  B:    mailto:netdev@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
@@@ -13077,10 -12926,8 +13083,10 @@@ F: include/uapi/linux/nexthop.
  F:    net/ipv4/nexthop.c
  
  NFC SUBSYSTEM
 +M:    Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
 +L:    linux-nfc@lists.01.org (subscribers-only)
  L:    netdev@vger.kernel.org
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/
  F:    drivers/nfc/
  F:    include/linux/platform_data/nfcmrvl.h
@@@ -13091,7 -12938,7 +13097,7 @@@ F:   net/nfc
  NFC VIRTUAL NCI DEVICE DRIVER
  M:    Bongsu Jeon <bongsu.jeon@samsung.com>
  L:    netdev@vger.kernel.org
 -L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    drivers/nfc/virtual_ncidev.c
  F:    tools/testing/selftests/nci/
@@@ -13247,7 -13094,7 +13253,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:    linux-m68k@lists.linux-m68k.org
  S:    Maintained
  F:    arch/*/include/asm/nubus.h
@@@ -13369,7 -13216,6 +13375,7 @@@ M:   Vladimir Oltean <olteanv@gmail.com
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    drivers/net/dsa/sja1105
 +F:    drivers/net/pcs/pcs-xpcs-nxp.c
  
  NXP TDA998X DRM DRIVER
  M:    Russell King <linux@armlinux.org.uk>
@@@ -13388,16 -13234,10 +13394,16 @@@ S:        Maintaine
  F:    Documentation/devicetree/bindings/sound/tfa9879.txt
  F:    sound/soc/codecs/tfa9879*
  
 +NXP/Goodix TFA989X (TFA1) DRIVER
 +M:    Stephan Gerhold <stephan@gerhold.net>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
 +F:    sound/soc/codecs/tfa989x.c
 +
  NXP-NCI NFC DRIVER
 -M:    Clément Perrochaud <clement.perrochaud@effinnov.com>
  R:    Charles Gorand <charles.gorand@effinnov.com>
 -L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    drivers/nfc/nxp-nci
  
@@@ -13515,7 -13355,7 +13521,7 @@@ M:   Santosh Shilimkar <ssantosh@kernel.o
  M:    Kevin Hilman <khilman@kernel.org>
  L:    linux-omap@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/gpio/gpio-omap.txt
 +F:    Documentation/devicetree/bindings/gpio/ti,omap-gpio.yaml
  F:    drivers/gpio/gpio-omap.c
  
  OMAP HARDWARE SPINLOCK SUPPORT
@@@ -13536,6 -13376,12 +13542,6 @@@ L:  linux-omap@vger.kernel.or
  S:    Maintained
  F:    arch/arm/mach-omap2/omap_hwmod*data*
  
 -OMAP HWMOD DATA FOR OMAP4-BASED DEVICES
 -M:    Benoît Cousson <bcousson@baylibre.com>
 -L:    linux-omap@vger.kernel.org
 -S:    Maintained
 -F:    arch/arm/mach-omap2/omap_hwmod_44xx_data.c
 -
  OMAP HWMOD SUPPORT
  M:    Benoît Cousson <bcousson@baylibre.com>
  M:    Paul Walmsley <paul@pwsan.com>
@@@ -13548,7 -13394,7 +13554,7 @@@ M:   Vignesh R <vigneshr@ti.com
  L:    linux-omap@vger.kernel.org
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/i2c/i2c-omap.txt
 +F:    Documentation/devicetree/bindings/i2c/ti,omap4-i2c.yaml
  F:    drivers/i2c/busses/i2c-omap.c
  
  OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
@@@ -14126,7 -13972,8 +14132,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-aardvark.c
  
  PCI DRIVER FOR ALTERA PCIE IP
 -M:    Ley Foon Tan <ley.foon.tan@intel.com>
 -L:    rfi@lists.rocketboards.org (moderated for non-subscribers)
 +M:    Joyce Ooi <joyce.ooi@intel.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/pci/altera-pcie.txt
@@@ -14199,12 -14046,6 +14205,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml
  F:    drivers/pci/controller/dwc/pcie-fu740.c
  
 +PCI DRIVER FOR INTEL IXP4XX
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/intel,ixp4xx-pci.yaml
 +F:    drivers/pci/controller/pci-ixp4xx.c
 +
  PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
  M:    Jonathan Derrick <jonathan.derrick@intel.com>
  L:    linux-pci@vger.kernel.org
@@@ -14299,7 -14140,6 +14305,7 @@@ F:   drivers/pci/controller/pci-v3-semi.
  PCI ENDPOINT SUBSYSTEM
  M:    Kishon Vijay Abraham I <kishon@ti.com>
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 +R:    Krzysztof WilczyÅ„ski <kw@linux.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  F:    Documentation/PCI/endpoint/*
@@@ -14330,7 -14170,8 +14336,7 @@@ S:   Supporte
  F:    Documentation/PCI/pci-error-recovery.rst
  
  PCI MSI DRIVER FOR ALTERA MSI IP
 -M:    Ley Foon Tan <ley.foon.tan@intel.com>
 -L:    rfi@lists.rocketboards.org (moderated for non-subscribers)
 +M:    Joyce Ooi <joyce.ooi@intel.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/pci/altera-pcie-msi.txt
@@@ -14347,7 -14188,6 +14353,7 @@@ F:   drivers/pci/controller/pci-xgene-msi
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
  R:    Rob Herring <robh@kernel.org>
 +R:    Krzysztof WilczyÅ„ski <kw@linux.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
  Q:    http://patchwork.ozlabs.org/project/linux-pci/list/
@@@ -14507,12 -14347,10 +14513,12 @@@ PER-CPU MEMORY ALLOCATO
  M:    Dennis Zhou <dennis@kernel.org>
  M:    Tejun Heo <tj@kernel.org>
  M:    Christoph Lameter <cl@linux.com>
 +L:    linux-mm@kvack.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu.git
  F:    arch/*/include/asm/percpu.h
  F:    include/linux/percpu*.h
 +F:    lib/percpu*.c
  F:    mm/percpu*.c
  
  PER-TASK DELAY ACCOUNTING
@@@ -14851,7 -14689,6 +14857,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/ABI/testing/sysfs-class-power
  F:    Documentation/devicetree/bindings/power/supply/
  F:    drivers/power/supply/
 +F:    include/linux/power/
  F:    include/linux/power_supply.h
  
  POWERNV OPERATOR PANEL LCD DISPLAY DRIVER
@@@ -15010,13 -14847,6 +15016,13 @@@ F: drivers/net/phy/dp83640
  F:    drivers/ptp/*
  F:    include/linux/ptp_cl*
  
 +PTP VIRTUAL CLOCK SUPPORT
 +M:    Yangbo Lu <yangbo.lu@nxp.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/ptp/ptp_vclock.c
 +F:    net/ethtool/phc_vclocks.c
 +
  PTRACE SUPPORT
  M:    Oleg Nesterov <oleg@redhat.com>
  S:    Maintained
@@@ -15328,13 -15158,6 +15334,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 <thara.gopinath@linaro.org>
 +L:    linux-crypto@vger.kernel.org
 +L:    linux-arm-msm@vger.kernel.org
 +S:    Maintained
 +F:    drivers/crypto/qce/
 +
  QUALCOMM EMAC GIGABIT ETHERNET DRIVER
  M:    Timur Tabi <timur@kernel.org>
  L:    netdev@vger.kernel.org
@@@ -15771,13 -15594,6 +15777,13 @@@ F: include/linux/rpmsg
  F:    include/uapi/linux/rpmsg.h
  F:    samples/rpmsg/
  
 +REMOTE PROCESSOR MESSAGING (RPMSG) WWAN CONTROL DRIVER
 +M:    Stephan Gerhold <stephan@gerhold.net>
 +L:    netdev@vger.kernel.org
 +L:    linux-remoteproc@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/wwan/rpmsg_wwan_ctrl.c
 +
  RENESAS CLOCK DRIVERS
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -15788,9 -15604,8 +15794,9 @@@ F:   drivers/clk/renesas
  
  RENESAS EMEV2 I2C DRIVER
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
 +L:    linux-renesas-soc@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/i2c/renesas,iic-emev2.txt
 +F:    Documentation/devicetree/bindings/i2c/renesas,iic-emev2.yaml
  F:    drivers/i2c/busses/i2c-emev2.c
  
  RENESAS ETHERNET DRIVERS
@@@ -15810,10 -15625,9 +15816,10 @@@ F: drivers/iio/adc/rcar-gyroadc.
  
  RENESAS R-CAR I2C DRIVERS
  M:    Wolfram Sang <wsa+renesas@sang-engineering.com>
 +L:    linux-renesas-soc@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/i2c/renesas,i2c.txt
 -F:    Documentation/devicetree/bindings/i2c/renesas,iic.txt
 +F:    Documentation/devicetree/bindings/i2c/renesas,rcar-i2c.yaml
 +F:    Documentation/devicetree/bindings/i2c/renesas,rmobile-iic.yaml
  F:    drivers/i2c/busses/i2c-rcar.c
  F:    drivers/i2c/busses/i2c-sh_mobile.c
  
@@@ -15828,9 -15642,8 +15834,9 @@@ F:   drivers/thermal/rcar_thermal.
  
  RENESAS RIIC DRIVER
  M:    Chris Brandt <chris.brandt@renesas.com>
 +L:    linux-renesas-soc@vger.kernel.org
  S:    Supported
 -F:    Documentation/devicetree/bindings/i2c/renesas,riic.txt
 +F:    Documentation/devicetree/bindings/i2c/renesas,riic.yaml
  F:    drivers/i2c/busses/i2c-riic.c
  
  RENESAS USB PHY DRIVER
@@@ -15910,14 -15723,6 +15916,14 @@@ F: arch/riscv
  N:    riscv
  K:    riscv
  
 +RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
 +M:    Lewis Hanly <lewis.hanly@microchip.com>
 +L:    linux-riscv@lists.infradead.org
 +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 <haris.iqbal@ionos.com>
  M:    Jack Wang <jinpu.wang@ionos.com>
@@@ -16170,7 -15975,6 +16176,7 @@@ S390 IUCV NETWORK LAYE
  M:    Julian Wiedmann <jwi@linux.ibm.com>
  M:    Karsten Graul <kgraul@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
 +L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/*iucv*
@@@ -16181,7 -15985,6 +16187,7 @@@ S390 NETWORK DRIVER
  M:    Julian Wiedmann <jwi@linux.ibm.com>
  M:    Karsten Graul <kgraul@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
 +L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/
@@@ -16245,7 -16048,7 +16251,7 @@@ W:   http://www.ibm.com/developerworks/li
  F:    drivers/s390/scsi/zfcp_*
  
  S3C ADC BATTERY DRIVER
 -M:    Krzysztof Kozlowski <krzk@kernel.org>
 +M:    Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
  L:    linux-samsung-soc@vger.kernel.org
  S:    Odd Fixes
  F:    drivers/power/supply/s3c_adc_battery.c
@@@ -16360,7 -16163,7 +16366,7 @@@ F:   include/media/drv-intf/s3c_camif.
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
  M:    Krzysztof Opasiak <k.opasiak@samsung.com>
 -L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
  F:    drivers/nfc/s3fwrn5
@@@ -16711,8 -16514,6 +16717,8 @@@ M:   Tomasz Duszynski <tduszyns@gmail.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/iio/chemical/sensirion,sps30.yaml
  F:    drivers/iio/chemical/sps30.c
 +F:    drivers/iio/chemical/sps30_i2c.c
 +F:    drivers/iio/chemical/sps30_serial.c
  
  SERIAL DEVICE BUS
  M:    Rob Herring <robh@kernel.org>
@@@ -16775,7 -16576,6 +16781,7 @@@ F:   drivers/misc/sgi-xp
  
  SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
  M:    Karsten Graul <kgraul@linux.ibm.com>
 +M:    Guvenc Gulce <guvenc@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  S:    Supported
  W:    http://www.ibm.com/developerworks/linux/linux390/
@@@ -17221,13 -17021,6 +17227,13 @@@ S: Maintaine
  F:    drivers/ssb/
  F:    include/linux/ssb/
  
 +SONY IMX208 SENSOR DRIVER
 +M:    Sakari Ailus <sakari.ailus@linux.intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/imx208.c
 +
  SONY IMX214 SENSOR DRIVER
  M:    Ricardo Ribalda <ribalda@kernel.org>
  L:    linux-media@vger.kernel.org
@@@ -17541,12 -17334,6 +17547,12 @@@ L: linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/busses/i2c-stm32*
  
 +ST STM32 SPI DRIVER
 +M:    Alain Volmat <alain.volmat@foss.st.com>
 +L:    linux-spi@vger.kernel.org
 +S:    Maintained
 +F:    drivers/spi/spi-stm32.c
 +
  ST STPDDC60 DRIVER
  M:    Daniel Nilsson <daniel.nilsson@flex.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -17896,7 -17683,6 +17902,7 @@@ M:   Jose Abreu <Jose.Abreu@synopsys.com
  L:    netdev@vger.kernel.org
  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
@@@ -17906,6 -17692,7 +17912,6 @@@ R:   Mika Westerberg <mika.westerberg@lin
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  F:    drivers/i2c/busses/i2c-designware-*
 -F:    include/linux/platform_data/i2c-designware.h
  
  SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVER
  M:    Jaehoon Chung <jh80.chung@samsung.com>
@@@ -17939,7 -17726,7 +17945,7 @@@ M:   Sudeep Holla <sudeep.holla@arm.com
  R:    Cristian Marussi <cristian.marussi@arm.com>
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 +F:    Documentation/devicetree/bindings/firmware/arm,sc[mp]i.yaml
  F:    drivers/clk/clk-sc[mp]i.c
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
@@@ -18159,7 -17946,6 +18165,7 @@@ F:   include/media/i2c/tw9910.
  
  TEE SUBSYSTEM
  M:    Jens Wiklander <jens.wiklander@linaro.org>
 +R:    Sumit Garg <sumit.garg@linaro.org>
  L:    op-tee@lists.trustedfirmware.org
  S:    Maintained
  F:    Documentation/staging/tee.rst
@@@ -18313,11 -18099,11 +18319,11 @@@ L:        linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/keystone/ti,k3-sci-common.yaml
  F:    Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
 -F:    Documentation/devicetree/bindings/clock/ti,sci-clk.txt
 +F:    Documentation/devicetree/bindings/clock/ti,sci-clk.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml
 -F:    Documentation/devicetree/bindings/reset/ti,sci-reset.txt
 -F:    Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt
 +F:    Documentation/devicetree/bindings/reset/ti,sci-reset.yaml
 +F:    Documentation/devicetree/bindings/soc/ti/sci-pm-domain.yaml
  F:    drivers/clk/keystone/sci-clk.c
  F:    drivers/firmware/ti_sci*
  F:    drivers/irqchip/irq-ti-sci-inta.c
@@@ -18338,13 -18124,6 +18344,13 @@@ F: Documentation/devicetree/bindings/hw
  F:    Documentation/hwmon/tps23861.rst
  F:    drivers/hwmon/tps23861.c
  
 +TEXAS INSTRUMENTS' TMP117 TEMPERATURE SENSOR DRIVER
 +M:    Puranjay Mohan <puranjay12@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/iio/temperature/ti,tmp117.yaml
 +F:    drivers/iio/temperature/tmp117.c
 +
  THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -18407,13 -18186,6 +18413,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 <markpearson@lenovo.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-class-firmware-attributes
 +F:    drivers/platform/x86/think-lmi.?
 +
  THUNDERBOLT DMA TRAFFIC TEST DRIVER
  M:    Isaac Hazan <isaac.hazan@intel.com>
  L:    linux-usb@vger.kernel.org
@@@ -18508,7 -18280,7 +18514,7 @@@ TI DAVINCI SERIES GPIO DRIVE
  M:    Keerthy <j-keerthy@ti.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/gpio/gpio-davinci.txt
 +F:    Documentation/devicetree/bindings/gpio/gpio-davinci.yaml
  F:    drivers/gpio/gpio-davinci.c
  
  TI DAVINCI SERIES MEDIA DRIVER
@@@ -18576,19 -18348,11 +18582,19 @@@ F:        sound/soc/codecs/tas571x
  TI TRF7970A NFC DRIVER
  M:    Mark Greer <mgreer@animalcreek.com>
  L:    linux-wireless@vger.kernel.org
 -L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    Documentation/devicetree/bindings/net/nfc/trf7970a.txt
  F:    drivers/nfc/trf7970a.c
  
 +TI TSC2046 ADC DRIVER
 +M:    Oleksij Rempel <o.rempel@pengutronix.de>
 +R:    kernel@pengutronix.de
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml
 +F:    drivers/iio/adc/ti-tsc2046.c
 +
  TI TWL4030 SERIES SOC CODEC DRIVER
  M:    Peter Ujfalusi <peter.ujfalusi@gmail.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -18812,13 -18576,9 +18818,13 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/driver-api/serial/
  F:    drivers/tty/
  F:    drivers/tty/serial/serial_core.c
 +F:    include/linux/selection.h
  F:    include/linux/serial.h
  F:    include/linux/serial_core.h
 -F:    include/linux/tty.h
 +F:    include/linux/sysrq.h
 +F:    include/linux/tty*.h
 +F:    include/linux/vt.h
 +F:    include/linux/vt_*.h
  F:    include/uapi/linux/serial.h
  F:    include/uapi/linux/serial_core.h
  F:    include/uapi/linux/tty.h
@@@ -19109,7 -18869,7 +19115,7 @@@ L:   linux-usb@vger.kernel.or
  S:    Maintained
  F:    drivers/usb/roles/intel-xhci-usb-role-switch.c
  
 -USB IP DRIVER FOR HISILICON KIRIN
 +USB IP DRIVER FOR HISILICON KIRIN 960
  M:    Yu Chen <chenyu56@huawei.com>
  M:    Binghui Wang <wangbinghui@hisilicon.com>
  L:    linux-usb@vger.kernel.org
@@@ -19117,13 -18877,6 +19123,13 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/phy/hisilicon,hi3660-usb3.yaml
  F:    drivers/phy/hisilicon/phy-hi3660-usb3.c
  
 +USB IP DRIVER FOR HISILICON KIRIN 970
 +M:    Mauro Carvalho Chehab <mchehab@kernel.org>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/phy/hisilicon,hi3670-usb3.yaml
 +F:    drivers/phy/hisilicon/phy-kirin970-usb3.c
 +
  USB ISP116X DRIVER
  M:    Olav Kongas <ok@artecdesign.ee>
  L:    linux-usb@vger.kernel.org
@@@ -19131,13 -18884,6 +19137,13 @@@ S: Maintaine
  F:    drivers/usb/host/isp116x*
  F:    include/linux/usb/isp116x.h
  
 +USB ISP1760 DRIVER
 +M:    Rui Miguel Silva <rui.silva@linaro.org>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/isp1760/*
 +F:    Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
 +
  USB LAN78XX ETHERNET DRIVER
  M:    Woojung Huh <woojung.huh@microchip.com>
  M:    UNGLinuxDriver@microchip.com
@@@ -19835,10 -19581,6 +19841,10 @@@ F: include/dt-bindings/regulator
  F:    include/linux/regulator/
  K:    regulator_get_optional
  
 +VOLTAGE AND CURRENT REGULATOR IRQ HELPERS
 +R:    Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
 +F:    drivers/regulator/irq_helpers.c
 +
  VRF
  M:    David Ahern <dsahern@kernel.org>
  L:    netdev@vger.kernel.org
@@@ -19856,7 -19598,6 +19862,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
@@@ -20040,16 -19781,6 +20046,16 @@@ F: Documentation/core-api/workqueue.rs
  F:    include/linux/workqueue.h
  F:    kernel/workqueue.c
  
 +WWAN DRIVERS
 +M:    Loic Poulain <loic.poulain@linaro.org>
 +M:    Sergey Ryazanov <ryazanov.s.a@gmail.com>
 +R:    Johannes Berg <johannes@sipsolutions.net>
 +L:    netdev@vger.kernel.org
 +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 <hdegoede@redhat.com>
  S:    Maintained
@@@ -20297,7 -20028,6 +20303,7 @@@ F:   arch/x86/xen/*swiotlb
  F:    drivers/xen/*swiotlb*
  
  XFS FILESYSTEM
 +C:    irc://irc.oftc.net/xfs
  M:    Darrick J. Wong <djwong@kernel.org>
  M:    linux-xfs@vger.kernel.org
  L:    linux-xfs@vger.kernel.org
@@@ -20445,6 -20175,7 +20451,6 @@@ M:   Seth Jennings <sjenning@redhat.com
  M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
  S:    Maintained
 -F:    include/linux/zbud.h
  F:    mm/zbud.c
  
  ZD1211RW WIRELESS DRIVER
                        no-map;
                };
  
 -              camera_mem: memory@8ec00000 {
 -                      reg = <0x0 0x8ec00000 0x0 0x500000>;
 -                      no-map;
 -              };
 -
                venus_mem: memory@8f600000 {
                        reg = <0 0x8f600000 0 0x500000>;
                        no-map;
                #sound-dai-cells = <0>;
        };
  
-       panel: panel {
-               /* Compatible will be filled in per-board */
-               power-supply = <&pp3300_dx_edp>;
-               backlight = <&backlight>;
-               hpd-gpios = <&sn65dsi86_bridge 2 GPIO_ACTIVE_HIGH>;
-               ports {
-                       port {
-                               panel_in_edp: endpoint {
-                                       remote-endpoint = <&sn65dsi86_out>;
-                               };
-                       };
-               };
-       };
        pwmleds {
                compatible = "pwm-leds";
                keyboard_backlight: keyboard-backlight {
                compatible = "jedec,spi-nor";
                reg = <0>;
  
 -              /* TODO: Increase frequency after testing */
 -              spi-max-frequency = <25000000>;
 +              spi-max-frequency = <37500000>;
                spi-tx-bus-width = <2>;
                spi-rx-bus-width = <2>;
        };
                        #size-cells = <0>;
                };
  
 -              pdupdate {
 -                      compatible = "google,cros-ec-pd-update";
 -              };
 -
                typec {
                        compatible = "google,cros-ec-typec";
                        #address-cells = <1>;
@@@ -645,8 -640,6 +630,8 @@@ edp_brij_i2c: &i2c2 
                clocks = <&rpmhcc RPMH_LN_BB_CLK3>;
                clock-names = "refclk";
  
 +              no-hpd;
 +
                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
                                };
                        };
                };
+               aux-bus {
+                       panel: panel {
+                               /* Compatible will be filled in per-board */
+                               power-supply = <&pp3300_dx_edp>;
+                               backlight = <&backlight>;
+                               hpd-gpios = <&sn65dsi86_bridge 2 GPIO_ACTIVE_HIGH>;
+                               port {
+                                       panel_in_edp: endpoint {
+                                               remote-endpoint = <&sn65dsi86_out>;
+                                       };
+                               };
+                       };
+               };
        };
  };
  
@@@ -764,7 -772,7 +764,7 @@@ hp_i2c: &i2c9 
                qcom,capture-sd-lines = <0>;
        };
  
 -      mi2s@1 {
 +      secondary_mi2s: mi2s@1 {
                reg = <MI2S_SECONDARY>;
                qcom,playback-sd-lines = <0>;
        };
        };
  };
  
 -&pm6150_pwrkey {
 +&pm6150_pon {
        status = "disabled";
  };
  
@@@ -973,7 -981,6 +973,7 @@@ ap_spi_fp: &spi10 
  &qspi_clk {
        pinconf {
                pins = "gpio63";
 +              drive-strength = <8>;
                bias-disable;
        };
  };
                        drive-strength = <2>;
                };
        };
 +
 +      sdc1_on: sdc1-on {
 +              pinconf-clk {
 +                      pins = "sdc1_clk";
 +                      bias-disable;
 +                      drive-strength = <16>;
 +              };
 +
 +              pinconf-cmd {
 +                      pins = "sdc1_cmd";
 +                      bias-pull-up;
 +                      drive-strength = <10>;
 +              };
 +
 +              pinconf-data {
 +                      pins = "sdc1_data";
 +                      bias-pull-up;
 +                      drive-strength = <10>;
 +              };
 +
 +              pinconf-rclk {
 +                      pins = "sdc1_rclk";
 +                      bias-pull-down;
 +              };
 +      };
 +
 +      sdc1_off: sdc1-off {
 +              pinconf-clk {
 +                      pins = "sdc1_clk";
 +                      bias-disable;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-cmd {
 +                      pins = "sdc1_cmd";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-data {
 +                      pins = "sdc1_data";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-rclk {
 +                      pins = "sdc1_rclk";
 +                      bias-pull-down;
 +              };
 +      };
 +
 +      sdc2_on: sdc2-on {
 +              pinconf-clk {
 +                      pins = "sdc2_clk";
 +                      bias-disable;
 +                      drive-strength = <16>;
 +              };
 +
 +              pinconf-cmd {
 +                      pins = "sdc2_cmd";
 +                      bias-pull-up;
 +                      drive-strength = <10>;
 +              };
 +
 +              pinconf-data {
 +                      pins = "sdc2_data";
 +                      bias-pull-up;
 +                      drive-strength = <10>;
 +              };
 +
 +              pinconf-sd-cd {
 +                      pins = "gpio69";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +      };
 +
 +      sdc2_off: sdc2-off {
 +              pinconf-clk {
 +                      pins = "sdc2_clk";
 +                      bias-disable;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-cmd {
 +                      pins = "sdc2_cmd";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-data {
 +                      pins = "sdc2_data";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +
 +              pinconf-sd-cd {
 +                      pins = "gpio69";
 +                      bias-pull-up;
 +                      drive-strength = <2>;
 +              };
 +      };
  };
@@@ -572,6 -572,20 +572,20 @@@ static int amdgpu_cs_parser_bos(struct 
                goto out;
        }
  
+       amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+               struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);
+               e->bo_va = amdgpu_vm_bo_find(vm, bo);
+               if (bo->tbo.base.dma_buf && !amdgpu_bo_explicit_sync(bo)) {
+                       e->chain = dma_fence_chain_alloc();
+                       if (!e->chain) {
+                               r = -ENOMEM;
+                               goto error_validate;
+                       }
+               }
+       }
        amdgpu_cs_get_threshold_for_moves(p->adev, &p->bytes_moved_threshold,
                                          &p->bytes_moved_vis_threshold);
        p->bytes_moved = 0;
        gws = p->bo_list->gws_obj;
        oa = p->bo_list->oa_obj;
  
-       amdgpu_bo_list_for_each_entry(e, p->bo_list) {
-               struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);
-               /* Make sure we use the exclusive slot for shared BOs */
-               if (bo->prime_shared_count)
-                       e->tv.num_shared = 0;
-               e->bo_va = amdgpu_vm_bo_find(vm, bo);
-       }
        if (gds) {
                p->job->gds_base = amdgpu_bo_gpu_offset(gds) >> PAGE_SHIFT;
                p->job->gds_size = amdgpu_bo_size(gds) >> PAGE_SHIFT;
        }
  
  error_validate:
-       if (r)
+       if (r) {
+               amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+                       dma_fence_chain_free(e->chain);
+                       e->chain = NULL;
+               }
                ttm_eu_backoff_reservation(&p->ticket, &p->validated);
+       }
  out:
        return r;
  }
@@@ -670,9 -680,17 +680,17 @@@ static void amdgpu_cs_parser_fini(struc
  {
        unsigned i;
  
-       if (error && backoff)
+       if (error && backoff) {
+               struct amdgpu_bo_list_entry *e;
+               amdgpu_bo_list_for_each_entry(e, parser->bo_list) {
+                       dma_fence_chain_free(e->chain);
+                       e->chain = NULL;
+               }
                ttm_eu_backoff_reservation(&parser->ticket,
                                           &parser->validated);
+       }
  
        for (i = 0; i < parser->num_post_deps; i++) {
                drm_syncobj_put(parser->post_deps[i].syncobj);
@@@ -781,7 -799,7 +799,7 @@@ static int amdgpu_cs_vm_handling(struc
        if (r)
                return r;
  
 -      r = amdgpu_vm_bo_update(adev, fpriv->prt_va, false, NULL);
 +      r = amdgpu_vm_bo_update(adev, fpriv->prt_va, false);
        if (r)
                return r;
  
        if (amdgpu_mcbp || amdgpu_sriov_vf(adev)) {
                bo_va = fpriv->csa_va;
                BUG_ON(!bo_va);
 -              r = amdgpu_vm_bo_update(adev, bo_va, false, NULL);
 +              r = amdgpu_vm_bo_update(adev, bo_va, false);
                if (r)
                        return r;
  
                if (bo_va == NULL)
                        continue;
  
 -              r = amdgpu_vm_bo_update(adev, bo_va, false, NULL);
 +              r = amdgpu_vm_bo_update(adev, bo_va, false);
                if (r)
                        return r;
  
        if (r)
                return r;
  
 -      p->job->vm_pd_addr = amdgpu_gmc_pd_addr(vm->root.base.bo);
 +      p->job->vm_pd_addr = amdgpu_gmc_pd_addr(vm->root.bo);
  
        if (amdgpu_vm_debug) {
                /* Invalidate all BOs to test for userspace bugs */
@@@ -1109,7 -1127,7 +1127,7 @@@ static int amdgpu_cs_process_syncobj_ti
  
                dep->chain = NULL;
                if (syncobj_deps[i].point) {
-                       dep->chain = kmalloc(sizeof(*dep->chain), GFP_KERNEL);
+                       dep->chain = dma_fence_chain_alloc();
                        if (!dep->chain)
                                return -ENOMEM;
                }
                dep->syncobj = drm_syncobj_find(p->filp,
                                                syncobj_deps[i].handle);
                if (!dep->syncobj) {
-                       kfree(dep->chain);
+                       dma_fence_chain_free(dep->chain);
                        return -EINVAL;
                }
                dep->point = syncobj_deps[i].point;
@@@ -1245,6 -1263,28 +1263,28 @@@ static int amdgpu_cs_submit(struct amdg
  
        amdgpu_vm_move_to_lru_tail(p->adev, &fpriv->vm);
  
+       amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+               struct dma_resv *resv = e->tv.bo->base.resv;
+               struct dma_fence_chain *chain = e->chain;
+               if (!chain)
+                       continue;
+               /*
+                * Work around dma_resv shortcommings by wrapping up the
+                * submission in a dma_fence_chain and add it as exclusive
+                * fence, but first add the submission as shared fence to make
+                * sure that shared fences never signal before the exclusive
+                * one.
+                */
+               dma_fence_chain_init(chain, dma_resv_excl_fence(resv),
+                                    dma_fence_get(p->fence), 1);
+               dma_resv_add_shared_fence(resv, p->fence);
+               rcu_assign_pointer(resv->fence_excl, &chain->base);
+               e->chain = NULL;
+       }
        ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence);
        mutex_unlock(&p->adev->notifier_lock);
  
  #include <linux/pci-p2pdma.h>
  #include <linux/pm_runtime.h>
  
- static int
- __dma_resv_make_exclusive(struct dma_resv *obj)
- {
-       struct dma_fence **fences;
-       unsigned int count;
-       int r;
-       if (!dma_resv_shared_list(obj)) /* no shared fences to convert */
-               return 0;
-       r = dma_resv_get_fences(obj, NULL, &count, &fences);
-       if (r)
-               return r;
-       if (count == 0) {
-               /* Now that was unexpected. */
-       } else if (count == 1) {
-               dma_resv_add_excl_fence(obj, fences[0]);
-               dma_fence_put(fences[0]);
-               kfree(fences);
-       } else {
-               struct dma_fence_array *array;
-               array = dma_fence_array_create(count, fences,
-                                              dma_fence_context_alloc(1), 0,
-                                              false);
-               if (!array)
-                       goto err_fences_put;
-               dma_resv_add_excl_fence(obj, &array->base);
-               dma_fence_put(&array->base);
-       }
-       return 0;
- err_fences_put:
-       while (count--)
-               dma_fence_put(fences[count]);
-       kfree(fences);
-       return -ENOMEM;
- }
  /**
   * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation
   *
@@@ -110,24 -68,6 +68,6 @@@ static int amdgpu_dma_buf_attach(struc
        if (r < 0)
                goto out;
  
-       r = amdgpu_bo_reserve(bo, false);
-       if (unlikely(r != 0))
-               goto out;
-       /*
-        * We only create shared fences for internal use, but importers
-        * of the dmabuf rely on exclusive fences for implicitly
-        * tracking write hazards. As any of the current fences may
-        * correspond to a write, we need to convert all existing
-        * fences on the reservation object into a single exclusive
-        * fence.
-        */
-       r = __dma_resv_make_exclusive(bo->tbo.base.resv);
-       if (r)
-               goto out;
-       bo->prime_shared_count++;
-       amdgpu_bo_unreserve(bo);
        return 0;
  
  out:
@@@ -150,9 -90,6 +90,6 @@@ static void amdgpu_dma_buf_detach(struc
        struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
        struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
  
-       if (attach->dev->driver != adev->dev->driver && bo->prime_shared_count)
-               bo->prime_shared_count--;
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
  }
@@@ -168,21 -105,9 +105,21 @@@ static int amdgpu_dma_buf_pin(struct dm
  {
        struct drm_gem_object *obj = attach->dmabuf->priv;
        struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
 +      int r;
  
        /* pin buffer into GTT */
 -      return amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT);
 +      r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT);
 +      if (r)
 +              return r;
 +
 +      if (bo->tbo.moving) {
 +              r = dma_fence_wait(bo->tbo.moving, true);
 +              if (r) {
 +                      amdgpu_bo_unpin(bo);
 +                      return r;
 +              }
 +      }
 +      return 0;
  }
  
  /**
@@@ -418,8 -343,6 +355,6 @@@ amdgpu_dma_buf_create_obj(struct drm_de
        bo = gem_to_amdgpu_bo(gobj);
        bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
        bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
-       if (dma_buf->ops != &amdgpu_dmabuf_ops)
-               bo->prime_shared_count = 1;
  
        dma_resv_unlock(resv);
        return gobj;
@@@ -460,7 -383,7 +395,7 @@@ amdgpu_dma_buf_move_notify(struct dma_b
  
        for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) {
                struct amdgpu_vm *vm = bo_base->vm;
 -              struct dma_resv *resv = vm->root.base.bo->tbo.base.resv;
 +              struct dma_resv *resv = vm->root.bo->tbo.base.resv;
  
                if (ticket) {
                        /* When we get an error here it means that somebody
@@@ -160,7 -160,6 +160,7 @@@ int amdgpu_smu_pptable_id = -1
   *     highest. That helps saving some idle power.
   * DISABLE_FRACTIONAL_PWM (bit 2) disabled by default
   * PSR (bit 3) disabled by default
 + * EDP NO POWER SEQUENCING (bit 4) disabled by default
   */
  uint amdgpu_dc_feature_mask = 2;
  uint amdgpu_dc_debug_mask;
@@@ -838,23 -837,8 +838,23 @@@ module_param_named(tmz, amdgpu_tmz, int
  
  /**
   * DOC: freesync_video (uint)
 - * Enabled the optimization to adjust front porch timing to achieve seamless mode change experience
 - * when setting a freesync supported mode for which full modeset is not needed.
 + * Enable the optimization to adjust front porch timing to achieve seamless
 + * mode change experience when setting a freesync supported mode for which full
 + * modeset is not needed.
 + *
 + * The Display Core will add a set of modes derived from the base FreeSync
 + * video mode into the corresponding connector's mode list based on commonly
 + * used refresh rates and VRR range of the connected display, when users enable
 + * this feature. From the userspace perspective, they can see a seamless mode
 + * change experience when the change between different refresh rates under the
 + * same resolution. Additionally, userspace applications such as Video playback
 + * can read this modeset list and change the refresh rate based on the video
 + * frame rate. Finally, the userspace can also derive an appropriate mode for a
 + * particular refresh rate based on the FreeSync Mode and add it to the
 + * connector's mode list.
 + *
 + * Note: This is an experimental feature.
 + *
   * The default value: 0 (off).
   */
  MODULE_PARM_DESC(
@@@ -1168,7 -1152,6 +1168,7 @@@ static const struct pci_device_id pciid
        {0x1002, 0x734F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
  
        /* Renoir */
 +      {0x1002, 0x15E7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
        {0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
        {0x1002, 0x1638, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
        {0x1002, 0x164C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
        {0x1002, 0x73E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
        {0x1002, 0x73E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
        {0x1002, 0x73E2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
 +      {0x1002, 0x73E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
        {0x1002, 0x73FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},
  
        /* Aldebaran */
@@@ -1281,7 -1263,7 +1281,7 @@@ static int amdgpu_pci_probe(struct pci_
  #endif
  
        /* Get rid of things like offb */
-       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, "amdgpudrmfb");
+       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &amdgpu_kms_driver);
        if (ret)
                return ret;
  
@@@ -170,7 -170,7 +170,7 @@@ static int amdgpu_gem_object_open(struc
                return -EPERM;
  
        if (abo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID &&
 -          abo->tbo.base.resv != vm->root.base.bo->tbo.base.resv)
 +          abo->tbo.base.resv != vm->root.bo->tbo.base.resv)
                return -EPERM;
  
        r = amdgpu_bo_reserve(abo, false);
@@@ -320,11 -320,11 +320,11 @@@ int amdgpu_gem_create_ioctl(struct drm_
        }
  
        if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
 -              r = amdgpu_bo_reserve(vm->root.base.bo, false);
 +              r = amdgpu_bo_reserve(vm->root.bo, false);
                if (r)
                        return r;
  
 -              resv = vm->root.base.bo->tbo.base.resv;
 +              resv = vm->root.bo->tbo.base.resv;
        }
  
        initial_domain = (u32)(0xffffffff & args->in.domains);
@@@ -353,9 -353,9 +353,9 @@@ retry
                if (!r) {
                        struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
  
 -                      abo->parent = amdgpu_bo_ref(vm->root.base.bo);
 +                      abo->parent = amdgpu_bo_ref(vm->root.bo);
                }
 -              amdgpu_bo_unreserve(vm->root.base.bo);
 +              amdgpu_bo_unreserve(vm->root.bo);
        }
        if (r)
                return r;
@@@ -612,7 -612,7 +612,7 @@@ static void amdgpu_gem_va_update_vm(str
  
        if (operation == AMDGPU_VA_OP_MAP ||
            operation == AMDGPU_VA_OP_REPLACE) {
 -              r = amdgpu_vm_bo_update(adev, bo_va, false, NULL);
 +              r = amdgpu_vm_bo_update(adev, bo_va, false);
                if (r)
                        goto error;
        }
@@@ -829,7 -829,8 +829,8 @@@ int amdgpu_gem_op_ioctl(struct drm_devi
                break;
        }
        case AMDGPU_GEM_OP_SET_PLACEMENT:
-               if (robj->prime_shared_count && (args->value & AMDGPU_GEM_DOMAIN_VRAM)) {
+               if (robj->tbo.base.import_attach &&
+                   args->value & AMDGPU_GEM_DOMAIN_VRAM) {
                        r = -EINVAL;
                        amdgpu_bo_unreserve(robj);
                        break;
                }
                for (base = robj->vm_bo; base; base = base->next)
                        if (amdgpu_xgmi_same_hive(amdgpu_ttm_adev(robj->tbo.bdev),
 -                              amdgpu_ttm_adev(base->vm->root.base.bo->tbo.bdev))) {
 +                              amdgpu_ttm_adev(base->vm->root.bo->tbo.bdev))) {
                                r = -EINVAL;
                                amdgpu_bo_unreserve(robj);
                                goto out;
@@@ -278,21 -278,6 +278,21 @@@ static bool amdgpu_msi_ok(struct amdgpu
        return true;
  }
  
 +static void amdgpu_restore_msix(struct amdgpu_device *adev)
 +{
 +      u16 ctrl;
 +
 +      pci_read_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
 +      if (!(ctrl & PCI_MSIX_FLAGS_ENABLE))
 +              return;
 +
 +      /* VF FLR */
 +      ctrl &= ~PCI_MSIX_FLAGS_ENABLE;
 +      pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl);
 +      ctrl |= PCI_MSIX_FLAGS_ENABLE;
 +      pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl);
 +}
 +
  /**
   * amdgpu_irq_init - initialize interrupt handling
   *
@@@ -584,9 -569,6 +584,9 @@@ void amdgpu_irq_gpu_reset_resume_helper
  {
        int i, j, k;
  
 +      if (amdgpu_sriov_vf(adev))
 +              amdgpu_restore_msix(adev);
 +
        for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) {
                if (!adev->irq.client[i].sources)
                        continue;
  int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
                   unsigned type)
  {
-       if (!adev_to_drm(adev)->irq_enabled)
+       if (!adev->irq.installed)
                return -ENOENT;
  
        if (type >= src->num_types)
  int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
                   unsigned type)
  {
-       if (!adev_to_drm(adev)->irq_enabled)
+       if (!adev->irq.installed)
                return -ENOENT;
  
        if (type >= src->num_types)
  bool amdgpu_irq_enabled(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
                        unsigned type)
  {
-       if (!adev_to_drm(adev)->irq_enabled)
+       if (!adev->irq.installed)
                return false;
  
        if (type >= src->num_types)
  
  static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
        struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
 -      struct amdgpu_bo_user *ubo;
  
        amdgpu_bo_kunmap(bo);
  
        if (bo->tbo.base.import_attach)
                drm_prime_gem_destroy(&bo->tbo.base, bo->tbo.sg);
        drm_gem_object_release(&bo->tbo.base);
 +      amdgpu_bo_unref(&bo->parent);
 +      kvfree(bo);
 +}
 +
 +static void amdgpu_bo_user_destroy(struct ttm_buffer_object *tbo)
 +{
 +      struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
 +      struct amdgpu_bo_user *ubo;
 +
 +      ubo = to_amdgpu_bo_user(bo);
 +      kfree(ubo->metadata);
 +      amdgpu_bo_destroy(tbo);
 +}
 +
 +static void amdgpu_bo_vm_destroy(struct ttm_buffer_object *tbo)
 +{
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
 +      struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
 +      struct amdgpu_bo_vm *vmbo;
 +
 +      vmbo = to_amdgpu_bo_vm(bo);
        /* in case amdgpu_device_recover_vram got NULL of bo->parent */
 -      if (!list_empty(&bo->shadow_list)) {
 +      if (!list_empty(&vmbo->shadow_list)) {
                mutex_lock(&adev->shadow_list_lock);
 -              list_del_init(&bo->shadow_list);
 +              list_del_init(&vmbo->shadow_list);
                mutex_unlock(&adev->shadow_list_lock);
        }
 -      amdgpu_bo_unref(&bo->parent);
  
 -      if (bo->tbo.type != ttm_bo_type_kernel) {
 -              ubo = to_amdgpu_bo_user(bo);
 -              kfree(ubo->metadata);
 -      }
 -
 -      kvfree(bo);
 +      amdgpu_bo_destroy(tbo);
  }
  
  /**
   */
  bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)
  {
 -      if (bo->destroy == &amdgpu_bo_destroy)
 +      if (bo->destroy == &amdgpu_bo_destroy ||
 +          bo->destroy == &amdgpu_bo_user_destroy ||
 +          bo->destroy == &amdgpu_bo_vm_destroy)
                return true;
 +
        return false;
  }
  
@@@ -196,7 -180,7 +196,7 @@@ void amdgpu_bo_placement_from_domain(st
                c++;
        }
  
-       BUG_ON(c >= AMDGPU_BO_MAX_PLACEMENTS);
+       BUG_ON(c > AMDGPU_BO_MAX_PLACEMENTS);
  
        placement->num_placement = c;
        placement->placement = places;
@@@ -561,6 -545,7 +561,6 @@@ int amdgpu_bo_create(struct amdgpu_devi
        if (bo == NULL)
                return -ENOMEM;
        drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
 -      INIT_LIST_HEAD(&bo->shadow_list);
        bo->vm_bo = NULL;
        bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
                bp->domain;
        if (bp->type == ttm_bo_type_kernel)
                bo->tbo.priority = 1;
  
 +      if (!bp->destroy)
 +              bp->destroy = &amdgpu_bo_destroy;
 +
        r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
                                 &bo->placement, page_align, &ctx,  NULL,
 -                               bp->resv, &amdgpu_bo_destroy);
 +                               bp->resv, bp->destroy);
        if (unlikely(r != 0))
                return r;
  
@@@ -652,7 -634,6 +652,7 @@@ int amdgpu_bo_create_user(struct amdgpu
        int r;
  
        bp->bo_ptr_size = sizeof(struct amdgpu_bo_user);
 +      bp->destroy = &amdgpu_bo_user_destroy;
        r = amdgpu_bo_create(adev, bp, &bo_ptr);
        if (r)
                return r;
@@@ -684,13 -665,11 +684,13 @@@ int amdgpu_bo_create_vm(struct amdgpu_d
         * num of amdgpu_vm_pt entries.
         */
        BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo_vm));
 +      bp->destroy = &amdgpu_bo_vm_destroy;
        r = amdgpu_bo_create(adev, bp, &bo_ptr);
        if (r)
                return r;
  
        *vmbo_ptr = to_amdgpu_bo_vm(bo_ptr);
 +      INIT_LIST_HEAD(&(*vmbo_ptr)->shadow_list);
        return r;
  }
  
@@@ -735,12 -714,12 +735,12 @@@ retry
   *
   * Insert a BO to the shadow list.
   */
 -void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo *bo)
 +void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo)
  {
 -      struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
 +      struct amdgpu_device *adev = amdgpu_ttm_adev(vmbo->bo.tbo.bdev);
  
        mutex_lock(&adev->shadow_list_lock);
 -      list_add_tail(&bo->shadow_list, &adev->shadow_list);
 +      list_add_tail(&vmbo->shadow_list, &adev->shadow_list);
        mutex_unlock(&adev->shadow_list_lock);
  }
  
@@@ -913,7 -892,7 +913,7 @@@ int amdgpu_bo_pin_restricted(struct amd
                return -EINVAL;
  
        /* A shared bo cannot be migrated to VRAM */
-       if (bo->prime_shared_count || bo->tbo.base.import_attach) {
+       if (bo->tbo.base.import_attach) {
                if (domain & AMDGPU_GEM_DOMAIN_GTT)
                        domain = AMDGPU_GEM_DOMAIN_GTT;
                else
@@@ -55,8 -55,7 +55,8 @@@ struct amdgpu_bo_param 
        u64                             flags;
        enum ttm_bo_type                type;
        bool                            no_wait_gpu;
 -      struct dma_resv *resv;
 +      struct dma_resv                 *resv;
 +      void                            (*destroy)(struct ttm_buffer_object *bo);
  };
  
  /* bo virtual addresses in a vm */
@@@ -100,7 -99,6 +100,6 @@@ struct amdgpu_bo 
        struct ttm_buffer_object        tbo;
        struct ttm_bo_kmap_obj          kmap;
        u64                             flags;
-       unsigned                        prime_shared_count;
        /* per VM structure for page tables and with virtual addresses */
        struct amdgpu_vm_bo_base        *vm_bo;
        /* Constant after initialization */
  #ifdef CONFIG_MMU_NOTIFIER
        struct mmu_interval_notifier    notifier;
  #endif
 -
 -      struct list_head                shadow_list;
 -
        struct kgd_mem                  *kfd_bo;
  };
  
@@@ -124,8 -125,7 +123,8 @@@ struct amdgpu_bo_user 
  struct amdgpu_bo_vm {
        struct amdgpu_bo                bo;
        struct amdgpu_bo                *shadow;
 -      struct amdgpu_vm_pt             entries[];
 +      struct list_head                shadow_list;
 +      struct amdgpu_vm_bo_base        entries[];
  };
  
  static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
@@@ -331,7 -331,7 +330,7 @@@ u64 amdgpu_bo_gpu_offset_no_check(struc
  int amdgpu_bo_validate(struct amdgpu_bo *bo);
  void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem,
                                uint64_t *gtt_mem, uint64_t *cpu_mem);
 -void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo *bo);
 +void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo);
  int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow,
                             struct dma_fence **fence);
  uint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev,
@@@ -149,14 -149,16 +149,16 @@@ static void amdgpu_evict_flags(struct t
                         * BOs to be evicted from VRAM
                         */
                        amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
-                                                        AMDGPU_GEM_DOMAIN_GTT);
+                                                       AMDGPU_GEM_DOMAIN_GTT |
+                                                       AMDGPU_GEM_DOMAIN_CPU);
                        abo->placements[0].fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
                        abo->placements[0].lpfn = 0;
                        abo->placement.busy_placement = &abo->placements[1];
                        abo->placement.num_busy_placement = 1;
                } else {
                        /* Move to GTT memory */
-                       amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
+                       amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT |
+                                                       AMDGPU_GEM_DOMAIN_CPU);
                }
                break;
        case TTM_PL_TT:
@@@ -521,7 -523,7 +523,7 @@@ static int amdgpu_bo_move(struct ttm_bu
                        hop->fpfn = 0;
                        hop->lpfn = 0;
                        hop->mem_type = TTM_PL_TT;
-                       hop->flags = 0;
+                       hop->flags = TTM_PL_FLAG_TEMPORARY;
                        return -EMULTIHOP;
                }
  
@@@ -590,6 -592,10 +592,6 @@@ static int amdgpu_ttm_io_mem_reserve(st
  
                mem->bus.offset += adev->gmc.aper_base;
                mem->bus.is_iomem = true;
 -              if (adev->gmc.xgmi.connected_to_cpu)
 -                      mem->bus.caching = ttm_cached;
 -              else
 -                      mem->bus.caching = ttm_write_combined;
                break;
        default:
                return -EINVAL;
@@@ -677,23 -683,23 +679,23 @@@ int amdgpu_ttm_tt_get_user_pages(struc
                return -ESRCH;
  
        mmap_read_lock(mm);
 -      vma = find_vma(mm, start);
 -      mmap_read_unlock(mm);
 -      if (unlikely(!vma || start < vma->vm_start)) {
 +      vma = vma_lookup(mm, start);
 +      if (unlikely(!vma)) {
                r = -EFAULT;
 -              goto out_putmm;
 +              goto out_unlock;
        }
        if (unlikely((gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) &&
                vma->vm_file)) {
                r = -EPERM;
 -              goto out_putmm;
 +              goto out_unlock;
        }
  
        readonly = amdgpu_ttm_tt_is_readonly(ttm);
        r = amdgpu_hmm_range_get_pages(&bo->notifier, mm, pages, start,
                                       ttm->num_pages, &gtt->range, readonly,
 -                                     false);
 -out_putmm:
 +                                     true, NULL);
 +out_unlock:
 +      mmap_read_unlock(mm);
        mmput(mm);
  
        return r;
@@@ -837,7 -843,7 +839,7 @@@ static int amdgpu_ttm_gart_bind(struct 
                uint64_t page_idx = 1;
  
                r = amdgpu_gart_bind(adev, gtt->offset, page_idx,
 -                              ttm->pages, gtt->ttm.dma_address, flags);
 +                              gtt->ttm.dma_address, flags);
                if (r)
                        goto gart_bind_fail;
  
                r = amdgpu_gart_bind(adev,
                                gtt->offset + (page_idx << PAGE_SHIFT),
                                ttm->num_pages - page_idx,
 -                              &ttm->pages[page_idx],
                                &(gtt->ttm.dma_address[page_idx]), flags);
        } else {
                r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
 -                                   ttm->pages, gtt->ttm.dma_address, flags);
 +                                   gtt->ttm.dma_address, flags);
        }
  
  gart_bind_fail:
@@@ -919,8 -926,7 +921,8 @@@ static int amdgpu_ttm_backend_bind(stru
            bo_mem->mem_type == AMDGPU_PL_OA)
                return -EINVAL;
  
 -      if (!amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
 +      if (bo_mem->mem_type != TTM_PL_TT ||
 +          !amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
                gtt->offset = AMDGPU_BO_INVALID_OFFSET;
                return 0;
        }
        /* bind pages into GART page tables */
        gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
        r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
 -              ttm->pages, gtt->ttm.dma_address, flags);
 +              gtt->ttm.dma_address, flags);
  
        if (r)
                DRM_ERROR("failed to bind %u pages at 0x%08llX\n",
@@@ -1125,6 -1131,8 +1127,6 @@@ static int amdgpu_ttm_tt_populate(struc
                ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
                if (!ttm->sg)
                        return -ENOMEM;
 -
 -              ttm->page_flags |= TTM_PAGE_FLAG_SG;
                return 0;
        }
  
@@@ -1150,6 -1158,7 +1152,6 @@@ static void amdgpu_ttm_tt_unpopulate(st
                amdgpu_ttm_tt_set_user_pages(ttm, NULL);
                kfree(ttm->sg);
                ttm->sg = NULL;
 -              ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
                return;
        }
  
@@@ -1183,9 -1192,6 +1185,9 @@@ int amdgpu_ttm_tt_set_userptr(struct tt
                        return -ENOMEM;
        }
  
 +      /* Set TTM_PAGE_FLAG_SG before populate but after create. */
 +      bo->ttm->page_flags |= TTM_PAGE_FLAG_SG;
 +
        gtt = (void *)bo->ttm;
        gtt->userptr = addr;
        gtt->userflags = flags;
@@@ -1914,50 -1914,20 +1914,50 @@@ static void intel_dpt_unpin(struct i915
        i915_vma_put(dpt->vma);
  }
  
 +static bool
 +intel_reuse_initial_plane_obj(struct drm_i915_private *i915,
 +                            const struct intel_initial_plane_config *plane_config,
 +                            struct drm_framebuffer **fb,
 +                            struct i915_vma **vma)
 +{
 +      struct intel_crtc *crtc;
 +
 +      for_each_intel_crtc(&i915->drm, crtc) {
 +              struct intel_crtc_state *crtc_state =
 +                      to_intel_crtc_state(crtc->base.state);
 +              struct intel_plane *plane =
 +                      to_intel_plane(crtc->base.primary);
 +              struct intel_plane_state *plane_state =
 +                      to_intel_plane_state(plane->base.state);
 +
 +              if (!crtc_state->uapi.active)
 +                      continue;
 +
 +              if (!plane_state->ggtt_vma)
 +                      continue;
 +
 +              if (intel_plane_ggtt_offset(plane_state) == plane_config->base) {
 +                      *fb = plane_state->hw.fb;
 +                      *vma = plane_state->ggtt_vma;
 +                      return true;
 +              }
 +      }
 +
 +      return false;
 +}
 +
  static void
 -intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
 +intel_find_initial_plane_obj(struct intel_crtc *crtc,
                             struct intel_initial_plane_config *plane_config)
  {
 -      struct drm_device *dev = intel_crtc->base.dev;
 +      struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
 -      struct drm_crtc *c;
 -      struct drm_plane *primary = intel_crtc->base.primary;
 -      struct drm_plane_state *plane_state = primary->state;
 -      struct intel_plane *intel_plane = to_intel_plane(primary);
 -      struct intel_plane_state *intel_state =
 -              to_intel_plane_state(plane_state);
        struct intel_crtc_state *crtc_state =
 -              to_intel_crtc_state(intel_crtc->base.state);
 +              to_intel_crtc_state(crtc->base.state);
 +      struct intel_plane *plane =
 +              to_intel_plane(crtc->base.primary);
 +      struct intel_plane_state *plane_state =
 +              to_intel_plane_state(plane->base.state);
        struct drm_framebuffer *fb;
        struct i915_vma *vma;
  
        if (!plane_config->fb)
                return;
  
 -      if (intel_alloc_initial_plane_obj(intel_crtc, plane_config)) {
 +      if (intel_alloc_initial_plane_obj(crtc, plane_config)) {
                fb = &plane_config->fb->base;
                vma = plane_config->vma;
                goto valid_fb;
         * Failed to alloc the obj, check to see if we should share
         * an fb with another CRTC instead
         */
 -      for_each_crtc(dev, c) {
 -              struct intel_plane_state *state;
 -
 -              if (c == &intel_crtc->base)
 -                      continue;
 -
 -              if (!to_intel_crtc_state(c->state)->uapi.active)
 -                      continue;
 -
 -              state = to_intel_plane_state(c->primary->state);
 -              if (!state->ggtt_vma)
 -                      continue;
 -
 -              if (intel_plane_ggtt_offset(state) == plane_config->base) {
 -                      fb = state->hw.fb;
 -                      vma = state->ggtt_vma;
 -                      goto valid_fb;
 -              }
 -      }
 +      if (intel_reuse_initial_plane_obj(dev_priv, plane_config, &fb, &vma))
 +              goto valid_fb;
  
        /*
         * We've failed to reconstruct the BIOS FB.  Current display state
         * simplest solution is to just disable the primary plane now and
         * pretend the BIOS never had it enabled.
         */
 -      intel_plane_disable_noatomic(intel_crtc, intel_plane);
 +      intel_plane_disable_noatomic(crtc, plane);
        if (crtc_state->bigjoiner) {
                struct intel_crtc *slave =
                        crtc_state->bigjoiner_linked_crtc;
        return;
  
  valid_fb:
 -      plane_state->rotation = plane_config->rotation;
 -      intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->rotation,
 -                         &intel_state->view);
 +      plane_state->uapi.rotation = plane_config->rotation;
 +      intel_fb_fill_view(to_intel_framebuffer(fb),
 +                         plane_state->uapi.rotation, &plane_state->view);
  
        __i915_vma_pin(vma);
 -      intel_state->ggtt_vma = i915_vma_get(vma);
 -      if (intel_plane_uses_fence(intel_state) && i915_vma_pin_fence(vma) == 0)
 -              if (vma->fence)
 -                      intel_state->flags |= PLANE_HAS_FENCE;
 +      plane_state->ggtt_vma = i915_vma_get(vma);
 +      if (intel_plane_uses_fence(plane_state) &&
 +          i915_vma_pin_fence(vma) == 0 && vma->fence)
 +              plane_state->flags |= PLANE_HAS_FENCE;
  
 -      plane_state->src_x = 0;
 -      plane_state->src_y = 0;
 -      plane_state->src_w = fb->width << 16;
 -      plane_state->src_h = fb->height << 16;
 +      plane_state->uapi.src_x = 0;
 +      plane_state->uapi.src_y = 0;
 +      plane_state->uapi.src_w = fb->width << 16;
 +      plane_state->uapi.src_h = fb->height << 16;
  
 -      plane_state->crtc_x = 0;
 -      plane_state->crtc_y = 0;
 -      plane_state->crtc_w = fb->width;
 -      plane_state->crtc_h = fb->height;
 +      plane_state->uapi.crtc_x = 0;
 +      plane_state->uapi.crtc_y = 0;
 +      plane_state->uapi.crtc_w = fb->width;
 +      plane_state->uapi.crtc_h = fb->height;
  
        if (plane_config->tiling)
                dev_priv->preserve_bios_swizzle = true;
  
 -      plane_state->fb = fb;
 +      plane_state->uapi.fb = fb;
        drm_framebuffer_get(fb);
  
 -      plane_state->crtc = &intel_crtc->base;
 -      intel_plane_copy_uapi_to_hw_state(intel_state, intel_state,
 -                                        intel_crtc);
 +      plane_state->uapi.crtc = &crtc->base;
 +      intel_plane_copy_uapi_to_hw_state(plane_state, plane_state, crtc);
  
        intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB);
  
 -      atomic_or(to_intel_plane(primary)->frontbuffer_bit,
 -                &to_intel_frontbuffer(fb)->bits);
 +      atomic_or(plane->frontbuffer_bit, &to_intel_frontbuffer(fb)->bits);
  }
  
  unsigned int
@@@ -2717,10 -2706,10 +2717,10 @@@ void hsw_disable_ips(const struct intel
        intel_wait_for_vblank(dev_priv, crtc->pipe);
  }
  
 -static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc)
 +static void intel_crtc_dpms_overlay_disable(struct intel_crtc *crtc)
  {
 -      if (intel_crtc->overlay)
 -              (void) intel_overlay_switch_off(intel_crtc->overlay);
 +      if (crtc->overlay)
 +              (void) intel_overlay_switch_off(crtc->overlay);
  
        /* Let userspace switch the overlay on again. In most cases userspace
         * has to recompute where to put it anyway.
@@@ -6484,21 -6473,23 +6484,21 @@@ int intel_get_load_detect_pipe(struct d
                               struct intel_load_detect_pipe *old,
                               struct drm_modeset_acquire_ctx *ctx)
  {
 -      struct intel_crtc *intel_crtc;
 -      struct intel_encoder *intel_encoder =
 +      struct intel_encoder *encoder =
                intel_attached_encoder(to_intel_connector(connector));
 -      struct drm_crtc *possible_crtc;
 -      struct drm_encoder *encoder = &intel_encoder->base;
 -      struct drm_crtc *crtc = NULL;
 -      struct drm_device *dev = encoder->dev;
 +      struct intel_crtc *possible_crtc;
 +      struct intel_crtc *crtc = NULL;
 +      struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_mode_config *config = &dev->mode_config;
        struct drm_atomic_state *state = NULL, *restore_state = NULL;
        struct drm_connector_state *connector_state;
        struct intel_crtc_state *crtc_state;
 -      int ret, i = -1;
 +      int ret;
  
        drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
                    connector->base.id, connector->name,
 -                  encoder->base.id, encoder->name);
 +                  encoder->base.base.id, encoder->base.name);
  
        old->restore_state = NULL;
  
  
        /* See if we already have a CRTC for this connector */
        if (connector->state->crtc) {
 -              crtc = connector->state->crtc;
 +              crtc = to_intel_crtc(connector->state->crtc);
  
 -              ret = drm_modeset_lock(&crtc->mutex, ctx);
 +              ret = drm_modeset_lock(&crtc->base.mutex, ctx);
                if (ret)
                        goto fail;
  
        }
  
        /* Find an unused one (if possible) */
 -      for_each_crtc(dev, possible_crtc) {
 -              i++;
 -              if (!(encoder->possible_crtcs & (1 << i)))
 +      for_each_intel_crtc(dev, possible_crtc) {
 +              if (!(encoder->base.possible_crtcs &
 +                    drm_crtc_mask(&possible_crtc->base)))
                        continue;
  
 -              ret = drm_modeset_lock(&possible_crtc->mutex, ctx);
 +              ret = drm_modeset_lock(&possible_crtc->base.mutex, ctx);
                if (ret)
                        goto fail;
  
 -              if (possible_crtc->state->enable) {
 -                      drm_modeset_unlock(&possible_crtc->mutex);
 +              if (possible_crtc->base.state->enable) {
 +                      drm_modeset_unlock(&possible_crtc->base.mutex);
                        continue;
                }
  
        }
  
  found:
 -      intel_crtc = to_intel_crtc(crtc);
 -
        state = drm_atomic_state_alloc(dev);
        restore_state = drm_atomic_state_alloc(dev);
        if (!state || !restore_state) {
                goto fail;
        }
  
 -      ret = drm_atomic_set_crtc_for_connector(connector_state, crtc);
 +      ret = drm_atomic_set_crtc_for_connector(connector_state, &crtc->base);
        if (ret)
                goto fail;
  
 -      crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
 +      crtc_state = intel_atomic_get_crtc_state(state, crtc);
        if (IS_ERR(crtc_state)) {
                ret = PTR_ERR(crtc_state);
                goto fail;
        if (ret)
                goto fail;
  
 -      ret = intel_modeset_disable_planes(state, crtc);
 +      ret = intel_modeset_disable_planes(state, &crtc->base);
        if (ret)
                goto fail;
  
        ret = PTR_ERR_OR_ZERO(drm_atomic_get_connector_state(restore_state, connector));
        if (!ret)
 -              ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, crtc));
 +              ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, &crtc->base));
        if (!ret)
 -              ret = drm_atomic_add_affected_planes(restore_state, crtc);
 +              ret = drm_atomic_add_affected_planes(restore_state, &crtc->base);
        if (ret) {
                drm_dbg_kms(&dev_priv->drm,
                            "Failed to create a copy of old state to restore: %i\n",
        drm_atomic_state_put(state);
  
        /* let the connector get through one full cycle before testing */
 -      intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
 +      intel_wait_for_vblank(dev_priv, crtc->pipe);
        return true;
  
  fail:
@@@ -7288,13 -7281,12 +7288,13 @@@ static int intel_crtc_atomic_check(stru
        }
  
        if (dev_priv->display.compute_pipe_wm) {
 -              ret = dev_priv->display.compute_pipe_wm(crtc_state);
 +              ret = dev_priv->display.compute_pipe_wm(state, crtc);
                if (ret) {
                        drm_dbg_kms(&dev_priv->drm,
                                    "Target pipe watermarks are invalid\n");
                        return ret;
                }
 +
        }
  
        if (dev_priv->display.compute_intermediate_wm) {
                 * old state and the new state.  We can program these
                 * immediately.
                 */
 -              ret = dev_priv->display.compute_intermediate_wm(crtc_state);
 +              ret = dev_priv->display.compute_intermediate_wm(state, crtc);
                if (ret) {
                        drm_dbg_kms(&dev_priv->drm,
                                    "No valid intermediate pipe watermarks are possible\n");
@@@ -9626,6 -9618,7 +9626,6 @@@ static int intel_atomic_check_bigjoiner
                                        struct intel_crtc_state *old_crtc_state,
                                        struct intel_crtc_state *new_crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(state->base.dev);
        struct intel_crtc_state *slave_crtc_state, *master_crtc_state;
        struct intel_crtc *slave, *master;
  
        if (!new_crtc_state->bigjoiner)
                return 0;
  
 -      if (1 + crtc->pipe >= INTEL_NUM_PIPES(dev_priv)) {
 +      slave = intel_dsc_get_bigjoiner_secondary(crtc);
 +      if (!slave) {
                DRM_DEBUG_KMS("[CRTC:%d:%s] Big joiner configuration requires "
                              "CRTC + 1 to be used, doesn't exist\n",
                              crtc->base.base.id, crtc->base.name);
                return -EINVAL;
        }
  
 -      slave = new_crtc_state->bigjoiner_linked_crtc =
 -              intel_get_crtc_for_pipe(dev_priv, crtc->pipe + 1);
 +      new_crtc_state->bigjoiner_linked_crtc = slave;
        slave_crtc_state = intel_atomic_get_crtc_state(&state->base, slave);
        master = crtc;
        if (IS_ERR(slave_crtc_state))
@@@ -11778,7 -11771,7 +11778,7 @@@ intel_user_framebuffer_create(struct dr
  
        /* object is backed with LMEM for discrete */
        i915 = to_i915(obj->base.dev);
-       if (HAS_LMEM(i915) && !i915_gem_object_is_lmem(obj)) {
+       if (HAS_LMEM(i915) && !i915_gem_object_validates_to_lmem(obj)) {
                /* object is "remote", not in local memory */
                i915_gem_object_put(obj);
                return ERR_PTR(-EREMOTE);
@@@ -48,7 -48,6 +48,7 @@@
  
  struct drm_printer;
  struct __intel_global_objs_state;
 +struct intel_ddi_buf_trans;
  
  /*
   * Display related stuff
@@@ -264,9 -263,6 +264,9 @@@ struct intel_encoder 
         * Returns whether the port clock is enabled or not.
         */
        bool (*is_clock_enabled)(struct intel_encoder *encoder);
 +      const struct intel_ddi_buf_trans *(*get_buf_trans)(struct intel_encoder *encoder,
 +                                                         const struct intel_crtc_state *crtc_state,
 +                                                         int *n_entries);
        enum hpd_pin hpd_pin;
        enum intel_display_power_domain power_domain;
        /* for communication with audio component; protected by av_mutex */
@@@ -314,7 -310,7 +314,7 @@@ struct intel_panel 
                /* DPCD backlight */
                union {
                        struct {
-                               u8 pwmgen_bit_count;
+                               struct drm_edp_backlight_info info;
                        } vesa;
                        struct {
                                bool sdr_uses_aux;
@@@ -1044,9 -1040,7 +1044,9 @@@ struct intel_crtc_state 
        bool has_psr;
        bool has_psr2;
        bool enable_psr2_sel_fetch;
 +      bool req_psr2_sdp_prior_scanline;
        u32 dc3co_exitline;
 +      u16 su_y_granularity;
  
        /*
         * Frequence the dpll for the port should run at. Differs from the
@@@ -1499,14 -1493,12 +1499,14 @@@ struct intel_psr 
        bool colorimetry_support;
        bool psr2_enabled;
        bool psr2_sel_fetch_enabled;
 +      bool req_psr2_sdp_prior_scanline;
        u8 sink_sync_latency;
        ktime_t last_entry_attempt;
        ktime_t last_exit;
        bool sink_not_reliable;
        bool irq_aux_error;
 -      u16 su_x_granularity;
 +      u16 su_w_granularity;
 +      u16 su_y_granularity;
        u32 dc3co_exitline;
        u32 dc3co_exit_delay;
        struct delayed_work dc3co_work;
@@@ -1731,14 -1723,6 +1731,14 @@@ vlv_pipe_to_channel(enum pipe pipe
        }
  }
  
 +static inline bool intel_pipe_valid(struct drm_i915_private *i915, enum pipe pipe)
 +{
 +      return (pipe >= 0 &&
 +              pipe < ARRAY_SIZE(i915->pipe_to_crtc_mapping) &&
 +              INTEL_INFO(i915)->pipe_mask & BIT(pipe) &&
 +              i915->pipe_to_crtc_mapping[pipe]);
 +}
 +
  static inline struct intel_crtc *
  intel_get_first_crtc(struct drm_i915_private *dev_priv)
  {
@@@ -19,6 -19,7 +19,7 @@@
  #include "i915_gem_mman.h"
  #include "i915_trace.h"
  #include "i915_user_extensions.h"
+ #include "i915_gem_ttm.h"
  #include "i915_vma.h"
  
  static inline bool
@@@ -61,11 -62,10 +62,11 @@@ i915_gem_mmap_ioctl(struct drm_device *
        struct drm_i915_gem_object *obj;
        unsigned long addr;
  
 -      /* mmap ioctl is disallowed for all platforms after TGL-LP.  This also
 -       * covers all platforms with local memory.
 +      /*
 +       * mmap ioctl is disallowed for all discrete platforms,
 +       * and for all platforms with GRAPHICS_VER > 12.
         */
 -      if (GRAPHICS_VER(i915) >= 12 && !IS_TIGERLAKE(i915))
 +      if (IS_DGFX(i915) || GRAPHICS_VER(i915) > 12)
                return -EOPNOTSUPP;
  
        if (args->flags & ~(I915_MMAP_WC))
@@@ -624,6 -624,8 +625,8 @@@ mmap_offset_attach(struct drm_i915_gem_
        struct i915_mmap_offset *mmo;
        int err;
  
+       GEM_BUG_ON(obj->ops->mmap_offset || obj->ops->mmap_ops);
        mmo = lookup_mmo(obj, mmap_type);
        if (mmo)
                goto out;
@@@ -666,40 -668,47 +669,47 @@@ err
  }
  
  static int
- __assign_mmap_offset(struct drm_file *file,
-                    u32 handle,
+ __assign_mmap_offset(struct drm_i915_gem_object *obj,
                     enum i915_mmap_type mmap_type,
-                    u64 *offset)
+                    u64 *offset, struct drm_file *file)
  {
-       struct drm_i915_gem_object *obj;
        struct i915_mmap_offset *mmo;
-       int err;
  
-       obj = i915_gem_object_lookup(file, handle);
-       if (!obj)
-               return -ENOENT;
+       if (i915_gem_object_never_mmap(obj))
+               return -ENODEV;
  
-       if (i915_gem_object_never_mmap(obj)) {
-               err = -ENODEV;
-               goto out;
+       if (obj->ops->mmap_offset)  {
+               *offset = obj->ops->mmap_offset(obj);
+               return 0;
        }
  
        if (mmap_type != I915_MMAP_TYPE_GTT &&
            !i915_gem_object_has_struct_page(obj) &&
-           !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM)) {
-               err = -ENODEV;
-               goto out;
-       }
+           !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM))
+               return -ENODEV;
  
        mmo = mmap_offset_attach(obj, mmap_type, file);
-       if (IS_ERR(mmo)) {
-               err = PTR_ERR(mmo);
-               goto out;
-       }
+       if (IS_ERR(mmo))
+               return PTR_ERR(mmo);
  
        *offset = drm_vma_node_offset_addr(&mmo->vma_node);
-       err = 0;
- out:
+       return 0;
+ }
+ static int
+ __assign_mmap_offset_handle(struct drm_file *file,
+                           u32 handle,
+                           enum i915_mmap_type mmap_type,
+                           u64 *offset)
+ {
+       struct drm_i915_gem_object *obj;
+       int err;
+       obj = i915_gem_object_lookup(file, handle);
+       if (!obj)
+               return -ENOENT;
+       err = __assign_mmap_offset(obj, mmap_type, offset, file);
        i915_gem_object_put(obj);
        return err;
  }
@@@ -719,7 -728,7 +729,7 @@@ i915_gem_dumb_mmap_offset(struct drm_fi
        else
                mmap_type = I915_MMAP_TYPE_GTT;
  
-       return __assign_mmap_offset(file, handle, mmap_type, offset);
+       return __assign_mmap_offset_handle(file, handle, mmap_type, offset);
  }
  
  /**
@@@ -787,7 -796,7 +797,7 @@@ i915_gem_mmap_offset_ioctl(struct drm_d
                return -EINVAL;
        }
  
-       return __assign_mmap_offset(file, args->handle, type, &args->offset);
+       return __assign_mmap_offset_handle(file, args->handle, type, &args->offset);
  }
  
  static void vm_open(struct vm_area_struct *vma)
@@@ -891,8 -900,18 +901,18 @@@ int i915_gem_mmap(struct file *filp, st
                 * destroyed and will be invalid when the vma manager lock
                 * is released.
                 */
-               mmo = container_of(node, struct i915_mmap_offset, vma_node);
-               obj = i915_gem_object_get_rcu(mmo->obj);
+               if (!node->driver_private) {
+                       mmo = container_of(node, struct i915_mmap_offset, vma_node);
+                       obj = i915_gem_object_get_rcu(mmo->obj);
+                       GEM_BUG_ON(obj && obj->ops->mmap_ops);
+               } else {
+                       obj = i915_gem_object_get_rcu
+                               (container_of(node, struct drm_i915_gem_object,
+                                             base.vma_node));
+                       GEM_BUG_ON(obj && !obj->ops->mmap_ops);
+               }
        }
        drm_vma_offset_unlock_lookup(dev->vma_offset_manager);
        rcu_read_unlock();
        }
  
        vma->vm_flags |= VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
-       vma->vm_private_data = mmo;
+       if (i915_gem_object_has_iomem(obj))
+               vma->vm_flags |= VM_IO;
  
        /*
         * We keep the ref on mmo->obj, not vm_file, but we require
        /* Drop the initial creation reference, the vma is now holding one. */
        fput(anon);
  
+       if (obj->ops->mmap_ops) {
+               vma->vm_page_prot = pgprot_decrypted(vm_get_page_prot(vma->vm_flags));
+               vma->vm_ops = obj->ops->mmap_ops;
+               vma->vm_private_data = node->driver_private;
+               return 0;
+       }
+       vma->vm_private_data = mmo;
        switch (mmo->mmap_type) {
        case I915_MMAP_TYPE_WC:
                vma->vm_page_prot =
@@@ -578,16 -578,17 +578,17 @@@ static bool assert_mmap_offset(struct d
                               int expected)
  {
        struct drm_i915_gem_object *obj;
-       struct i915_mmap_offset *mmo;
+       u64 offset;
+       int ret;
  
        obj = i915_gem_object_create_internal(i915, size);
        if (IS_ERR(obj))
-               return false;
+               return expected && expected == PTR_ERR(obj);
  
-       mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL);
+       ret = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL);
        i915_gem_object_put(obj);
  
-       return PTR_ERR_OR_ZERO(mmo) == expected;
+       return ret == expected;
  }
  
  static void disable_retire_worker(struct drm_i915_private *i915)
@@@ -622,8 -623,8 +623,8 @@@ static int igt_mmap_offset_exhaustion(v
        struct drm_mm *mm = &i915->drm.vma_offset_manager->vm_addr_space_mm;
        struct drm_i915_gem_object *obj;
        struct drm_mm_node *hole, *next;
-       struct i915_mmap_offset *mmo;
        int loop, err = 0;
+       u64 offset;
  
        /* Disable background reaper */
        disable_retire_worker(i915);
        obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
        if (IS_ERR(obj)) {
                err = PTR_ERR(obj);
+               pr_err("Unable to create object for reclaimed hole\n");
                goto out;
        }
  
-       mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL);
-       if (IS_ERR(mmo)) {
+       err = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL);
+       if (err) {
                pr_err("Unable to insert object into reclaimed hole\n");
-               err = PTR_ERR(mmo);
                goto err_obj;
        }
  
@@@ -865,10 -866,10 +866,10 @@@ static int __igt_mmap(struct drm_i915_p
                      struct drm_i915_gem_object *obj,
                      enum i915_mmap_type type)
  {
-       struct i915_mmap_offset *mmo;
        struct vm_area_struct *area;
        unsigned long addr;
        int err, i;
+       u64 offset;
  
        if (!can_mmap(obj, type))
                return 0;
        if (err)
                return err;
  
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
  
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
  
        pr_debug("igt_mmap(%s, %d) @ %lx\n", obj->mm.region->name, type, addr);
  
 -      area = find_vma(current->mm, addr);
 +      area = vma_lookup(current->mm, addr);
        if (!area) {
                pr_err("%s: Did not create a vm_area_struct for the mmap\n",
                       obj->mm.region->name);
                goto out_unmap;
        }
  
-       if (area->vm_private_data != mmo) {
-               pr_err("%s: vm_area_struct did not point back to our mmap_offset object!\n",
-                      obj->mm.region->name);
-               err = -EINVAL;
-               goto out_unmap;
-       }
        for (i = 0; i < obj->base.size / sizeof(u32); i++) {
                u32 __user *ux = u64_to_user_ptr((u64)(addr + i * sizeof(*ux)));
                u32 x;
@@@ -961,7 -955,7 +955,7 @@@ static int igt_mmap(void *arg
                        struct drm_i915_gem_object *obj;
                        int err;
  
-                       obj = i915_gem_object_create_region(mr, sizes[i], 0);
+                       obj = i915_gem_object_create_region(mr, sizes[i], I915_BO_ALLOC_USER);
                        if (obj == ERR_PTR(-ENODEV))
                                continue;
  
@@@ -1004,12 -998,12 +998,12 @@@ static int __igt_mmap_access(struct drm
                             struct drm_i915_gem_object *obj,
                             enum i915_mmap_type type)
  {
-       struct i915_mmap_offset *mmo;
        unsigned long __user *ptr;
        unsigned long A, B;
        unsigned long x, y;
        unsigned long addr;
        int err;
+       u64 offset;
  
        memset(&A, 0xAA, sizeof(A));
        memset(&B, 0xBB, sizeof(B));
        if (!can_mmap(obj, type) || !can_access(obj))
                return 0;
  
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
  
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
        ptr = (unsigned long __user *)addr;
@@@ -1081,7 -1075,7 +1075,7 @@@ static int igt_mmap_access(void *arg
                struct drm_i915_gem_object *obj;
                int err;
  
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;
  
@@@ -1111,11 -1105,11 +1105,11 @@@ static int __igt_mmap_gpu(struct drm_i9
                          enum i915_mmap_type type)
  {
        struct intel_engine_cs *engine;
-       struct i915_mmap_offset *mmo;
        unsigned long addr;
        u32 __user *ux;
        u32 bbe;
        int err;
+       u64 offset;
  
        /*
         * Verify that the mmap access into the backing store aligns with
        if (err)
                return err;
  
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
  
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
  
@@@ -1226,7 -1220,7 +1220,7 @@@ static int igt_mmap_gpu(void *arg
                struct drm_i915_gem_object *obj;
                int err;
  
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;
  
@@@ -1303,18 -1297,18 +1297,18 @@@ static int __igt_mmap_revoke(struct drm
                             struct drm_i915_gem_object *obj,
                             enum i915_mmap_type type)
  {
-       struct i915_mmap_offset *mmo;
        unsigned long addr;
        int err;
+       u64 offset;
  
        if (!can_mmap(obj, type))
                return 0;
  
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
  
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
  
                }
        }
  
-       err = check_absent(addr, obj->base.size);
-       if (err) {
-               pr_err("%s: was not absent\n", obj->mm.region->name);
-               goto out_unmap;
+       if (!obj->ops->mmap_ops) {
+               err = check_absent(addr, obj->base.size);
+               if (err) {
+                       pr_err("%s: was not absent\n", obj->mm.region->name);
+                       goto out_unmap;
+               }
+       } else {
+               /* ttm allows access to evicted regions by design */
+               err = check_present(addr, obj->base.size);
+               if (err) {
+                       pr_err("%s: was not present\n", obj->mm.region->name);
+                       goto out_unmap;
+               }
        }
  
  out_unmap:
@@@ -1371,7 -1375,7 +1375,7 @@@ static int igt_mmap_revoke(void *arg
                struct drm_i915_gem_object *obj;
                int err;
  
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;
  
@@@ -42,6 -42,7 +42,6 @@@
  #include <drm/drm_aperture.h>
  #include <drm/drm_atomic_helper.h>
  #include <drm/drm_ioctl.h>
 -#include <drm/drm_irq.h>
  #include <drm/drm_managed.h>
  #include <drm/drm_probe_helper.h>
  
@@@ -561,7 -562,7 +561,7 @@@ static int i915_driver_hw_probe(struct 
        if (ret)
                goto err_perf;
  
-       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, "inteldrmfb");
+       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, dev_priv->drm.driver);
        if (ret)
                goto err_ggtt;
  
@@@ -270,10 -270,8 +270,10 @@@ struct drm_i915_display_funcs 
        int (*bw_calc_min_cdclk)(struct intel_atomic_state *state);
        int (*get_fifo_size)(struct drm_i915_private *dev_priv,
                             enum i9xx_plane_id i9xx_plane);
 -      int (*compute_pipe_wm)(struct intel_crtc_state *crtc_state);
 -      int (*compute_intermediate_wm)(struct intel_crtc_state *crtc_state);
 +      int (*compute_pipe_wm)(struct intel_atomic_state *state,
 +                             struct intel_crtc *crtc);
 +      int (*compute_intermediate_wm)(struct intel_atomic_state *state,
 +                                     struct intel_crtc *crtc);
        void (*initial_watermarks)(struct intel_atomic_state *state,
                                   struct intel_crtc *crtc);
        void (*atomic_update_watermarks)(struct intel_atomic_state *state,
@@@ -348,14 -346,13 +348,14 @@@ struct intel_fbc 
        /* This is always the inner lock when overlapping with struct_mutex and
         * it's the outer lock when overlapping with stolen_lock. */
        struct mutex lock;
 -      unsigned threshold;
        unsigned int possible_framebuffer_bits;
        unsigned int busy_bits;
        struct intel_crtc *crtc;
  
        struct drm_mm_node compressed_fb;
 -      struct drm_mm_node *compressed_llb;
 +      struct drm_mm_node compressed_llb;
 +
 +      u8 limit;
  
        bool false_color;
  
@@@ -470,7 -467,6 +470,7 @@@ struct i915_drrs 
  #define QUIRK_PIN_SWIZZLED_PAGES (1<<5)
  #define QUIRK_INCREASE_T12_DELAY (1<<6)
  #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7)
 +#define QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK (1<<8)
  
  struct intel_fbdev;
  struct intel_fbc_work;
@@@ -1138,6 -1134,8 +1138,8 @@@ struct drm_i915_private 
        /* For i915gm/i945gm vblank irq workaround */
        u8 vblank_enabled;
  
+       bool irq_enabled;
        /* perform PHY state sanity checks? */
        bool chv_phy_assert[2];
  
@@@ -1241,6 -1239,21 +1243,6 @@@ static inline struct drm_i915_private *
  
  #define INTEL_DEVID(dev_priv) (RUNTIME_INFO(dev_priv)->device_id)
  
 -/*
 - * Deprecated: this will be replaced by individual IP checks:
 - * GRAPHICS_VER(), MEDIA_VER() and DISPLAY_VER()
 - */
 -#define INTEL_GEN(dev_priv)           GRAPHICS_VER(dev_priv)
 -/*
 - * Deprecated: use IS_GRAPHICS_VER(), IS_MEDIA_VER() and IS_DISPLAY_VER() as
 - * appropriate.
 - */
 -#define IS_GEN_RANGE(dev_priv, s, e)  IS_GRAPHICS_VER(dev_priv, (s), (e))
 -/*
 - * Deprecated: use GRAPHICS_VER(), MEDIA_VER() and DISPLAY_VER() as appropriate.
 - */
 -#define IS_GEN(dev_priv, n)           (GRAPHICS_VER(dev_priv) == (n))
 -
  #define GRAPHICS_VER(i915)            (INTEL_INFO(i915)->graphics_ver)
  #define IS_GRAPHICS_VER(i915, from, until) \
        (GRAPHICS_VER(i915) >= (from) && GRAPHICS_VER(i915) <= (until))
@@@ -33,6 -33,7 +33,6 @@@
  #include <linux/sysrq.h>
  
  #include <drm/drm_drv.h>
 -#include <drm/drm_irq.h>
  
  #include "display/intel_de.h"
  #include "display/intel_display_types.h"
@@@ -2880,14 -2881,14 +2880,14 @@@ static bool gen11_dsi_configure_te(stru
        return true;
  }
  
 -int bdw_enable_vblank(struct drm_crtc *crtc)
 +int bdw_enable_vblank(struct drm_crtc *_crtc)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc->dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 -      enum pipe pipe = intel_crtc->pipe;
 +      struct intel_crtc *crtc = to_intel_crtc(_crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      enum pipe pipe = crtc->pipe;
        unsigned long irqflags;
  
 -      if (gen11_dsi_configure_te(intel_crtc, true))
 +      if (gen11_dsi_configure_te(crtc, true))
                return 0;
  
        spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
         * PSR is active as no frames are generated, so check only for PSR.
         */
        if (HAS_PSR(dev_priv))
 -              drm_crtc_vblank_restore(crtc);
 +              drm_crtc_vblank_restore(&crtc->base);
  
        return 0;
  }
@@@ -2952,14 -2953,14 +2952,14 @@@ void ilk_disable_vblank(struct drm_crt
        spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
  }
  
 -void bdw_disable_vblank(struct drm_crtc *crtc)
 +void bdw_disable_vblank(struct drm_crtc *_crtc)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc->dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 -      enum pipe pipe = intel_crtc->pipe;
 +      struct intel_crtc *crtc = to_intel_crtc(_crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      enum pipe pipe = crtc->pipe;
        unsigned long irqflags;
  
 -      if (gen11_dsi_configure_te(intel_crtc, false))
 +      if (gen11_dsi_configure_te(crtc, false))
                return;
  
        spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
@@@ -4487,14 -4488,14 +4487,14 @@@ int intel_irq_install(struct drm_i915_p
         */
        dev_priv->runtime_pm.irqs_enabled = true;
  
-       dev_priv->drm.irq_enabled = true;
+       dev_priv->irq_enabled = true;
  
        intel_irq_reset(dev_priv);
  
        ret = request_irq(irq, intel_irq_handler(dev_priv),
                          IRQF_SHARED, DRIVER_NAME, dev_priv);
        if (ret < 0) {
-               dev_priv->drm.irq_enabled = false;
+               dev_priv->irq_enabled = false;
                return ret;
        }
  
@@@ -4520,10 -4521,10 +4520,10 @@@ void intel_irq_uninstall(struct drm_i91
         * intel_modeset_driver_remove() calling us out of sequence.
         * Would be nice if it didn't do that...
         */
-       if (!dev_priv->drm.irq_enabled)
+       if (!dev_priv->irq_enabled)
                return;
  
-       dev_priv->drm.irq_enabled = false;
+       dev_priv->irq_enabled = false;
  
        intel_irq_reset(dev_priv);
  
@@@ -4563,6 -4564,10 +4563,6 @@@ void intel_runtime_pm_enable_interrupts
  
  bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
  {
 -      /*
 -       * We only use drm_irq_uninstall() at unload and VT switch, so
 -       * this is the only thing we need to check.
 -       */
        return dev_priv->runtime_pm.irqs_enabled;
  }
  
@@@ -4570,8 -4575,3 +4570,8 @@@ void intel_synchronize_irq(struct drm_i
  {
        synchronize_irq(to_pci_dev(i915->drm.dev)->irq);
  }
 +
 +void intel_synchronize_hardirq(struct drm_i915_private *i915)
 +{
 +      synchronize_hardirq(to_pci_dev(i915->drm.dev)->irq);
 +}
@@@ -21,7 -21,6 +21,6 @@@
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_gem_cma_helper.h>
  #include <drm/drm_gem_framebuffer_helper.h>
- #include <drm/drm_irq.h>
  #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_probe_helper.h>
  #include <drm/drm_vblank.h>
@@@ -94,9 -93,6 +93,6 @@@ DEFINE_DRM_GEM_CMA_FOPS(fops)
  static const struct drm_driver meson_driver = {
        .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
  
-       /* IRQ */
-       .irq_handler            = meson_irq,
        /* CMA Ops */
        DRM_GEM_CMA_DRIVER_OPS_WITH_DUMB_CREATE(meson_dumb_create),
  
@@@ -285,7 -281,7 +281,7 @@@ static int meson_drv_bind_master(struc
         * Remove early framebuffers (ie. simplefb). The framebuffer can be
         * located anywhere in RAM
         */
-       ret = drm_aperture_remove_framebuffers(false, "meson-drm-fb");
+       ret = drm_aperture_remove_framebuffers(false, &meson_driver);
        if (ret)
                goto free_drm;
  
        if (ret)
                goto free_drm;
  
-       ret = drm_irq_install(drm, priv->vsync_irq);
+       ret = request_irq(priv->vsync_irq, meson_irq, 0, drm->driver->name, drm);
        if (ret)
                goto free_drm;
  
        return 0;
  
  uninstall_irq:
-       drm_irq_uninstall(drm);
+       free_irq(priv->vsync_irq, drm);
  free_drm:
        drm_dev_put(drm);
  
@@@ -382,7 -378,7 +378,7 @@@ static void meson_drv_unbind(struct dev
        drm_kms_helper_poll_fini(drm);
        drm_atomic_helper_shutdown(drm);
        component_unbind_all(dev, drm);
-       drm_irq_uninstall(drm);
+       free_irq(priv->vsync_irq, drm);
        drm_dev_put(drm);
  
        if (priv->afbcd.ops) {
@@@ -474,12 -470,11 +470,12 @@@ static int meson_probe_remote(struct pl
  static void meson_drv_shutdown(struct platform_device *pdev)
  {
        struct meson_drm *priv = dev_get_drvdata(&pdev->dev);
 -      struct drm_device *drm = priv->drm;
  
 -      DRM_DEBUG_DRIVER("\n");
 -      drm_kms_helper_poll_fini(drm);
 -      drm_atomic_helper_shutdown(drm);
 +      if (!priv)
 +              return;
 +
 +      drm_kms_helper_poll_fini(priv->drm);
 +      drm_atomic_helper_shutdown(priv->drm);
  }
  
  static int meson_drv_probe(struct platform_device *pdev)
@@@ -211,13 -211,6 +211,13 @@@ void msm_gem_put_pages(struct drm_gem_o
        msm_gem_unlock(obj);
  }
  
 +static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
 +{
 +      if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
 +              return pgprot_writecombine(prot);
 +      return prot;
 +}
 +
  int msm_gem_mmap_obj(struct drm_gem_object *obj,
                struct vm_area_struct *vma)
  {
  
        vma->vm_flags &= ~VM_PFNMAP;
        vma->vm_flags |= VM_MIXEDMAP;
 -
 -      if (msm_obj->flags & MSM_BO_WC) {
 -              vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
 -      } else if (msm_obj->flags & MSM_BO_UNCACHED) {
 -              vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
 -      } else {
 -              /*
 -               * Shunt off cached objs to shmem file so they have their own
 -               * address_space (so unmap_mapping_range does what we want,
 -               * in particular in the case of mmap'd dmabufs)
 -               */
 -              vma->vm_pgoff = 0;
 -              vma_set_file(vma, obj->filp);
 -
 -              vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 -      }
 +      vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
  
        return 0;
  }
@@@ -364,7 -372,7 +364,7 @@@ static void del_vma(struct msm_gem_vma 
        kfree(vma);
  }
  
 -/**
 +/*
   * If close is true, this also closes the VMA (releasing the allocated
   * iova range) in addition to removing the iommu mapping.  In the eviction
   * case (!close), we keep the iova allocated, but only remove the iommu
@@@ -443,9 -451,6 +443,9 @@@ static int msm_gem_pin_iova(struct drm_
        if (msm_obj->flags & MSM_BO_MAP_PRIV)
                prot |= IOMMU_PRIV;
  
 +      if (msm_obj->flags & MSM_BO_CACHED_COHERENT)
 +              prot |= IOMMU_CACHE;
 +
        GEM_WARN_ON(!msm_gem_is_locked(obj));
  
        if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
@@@ -648,7 -653,7 +648,7 @@@ static void *get_vaddr(struct drm_gem_o
                        goto fail;
                }
                msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
 -                              VM_MAP, pgprot_writecombine(PAGE_KERNEL));
 +                              VM_MAP, msm_gem_pgprot(msm_obj, PAGE_KERNEL));
                if (msm_obj->vaddr == NULL) {
                        ret = -ENOMEM;
                        goto fail;
@@@ -768,7 -773,7 +768,7 @@@ void msm_gem_purge(struct drm_gem_objec
                        0, (loff_t)-1);
  }
  
 -/**
 +/*
   * Unpin the backing pages and make them available to be swapped out.
   */
  void msm_gem_evict(struct drm_gem_object *obj)
@@@ -812,17 -817,15 +812,15 @@@ int msm_gem_sync_object(struct drm_gem_
        struct dma_fence *fence;
        int i, ret;
  
-       fobj = dma_resv_shared_list(obj->resv);
-       if (!fobj || (fobj->shared_count == 0)) {
-               fence = dma_resv_excl_fence(obj->resv);
-               /* don't need to wait on our own fences, since ring is fifo */
-               if (fence && (fence->context != fctx->context)) {
-                       ret = dma_fence_wait(fence, true);
-                       if (ret)
-                               return ret;
-               }
+       fence = dma_resv_excl_fence(obj->resv);
+       /* don't need to wait on our own fences, since ring is fifo */
+       if (fence && (fence->context != fctx->context)) {
+               ret = dma_fence_wait(fence, true);
+               if (ret)
+                       return ret;
        }
  
+       fobj = dma_resv_shared_list(obj->resv);
        if (!exclusive || !fobj)
                return 0;
  
@@@ -1158,7 -1161,6 +1156,7 @@@ static int msm_gem_new_impl(struct drm_
                uint32_t size, uint32_t flags,
                struct drm_gem_object **obj)
  {
 +      struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_object *msm_obj;
  
        switch (flags & MSM_BO_CACHE_MASK) {
        case MSM_BO_CACHED:
        case MSM_BO_WC:
                break;
 +      case MSM_BO_CACHED_COHERENT:
 +              if (priv->has_cached_coherent)
 +                      break;
 +              fallthrough;
        default:
                DRM_DEV_ERROR(dev->dev, "invalid cache flag: %x\n",
                                (flags & MSM_BO_CACHE_MASK));
@@@ -1240,13 -1238,6 +1238,13 @@@ static struct drm_gem_object *_msm_gem_
  
                to_msm_bo(obj)->vram_node = &vma->node;
  
 +              /* Call chain get_pages() -> update_inactive() tries to
 +               * access msm_obj->mm_list, but it is not initialized yet.
 +               * To avoid NULL pointer dereference error, initialize
 +               * mm_list to be empty.
 +               */
 +              INIT_LIST_HEAD(&msm_obj->mm_list);
 +
                msm_gem_lock(obj);
                pages = get_pages(obj);
                msm_gem_unlock(obj);
@@@ -50,7 -50,6 +50,7 @@@ static struct msm_gem_submit *submit_cr
        submit->cmd = (void *)&submit->bos[nr_bos];
        submit->queue = queue;
        submit->ring = gpu->rb[queue->prio];
 +      submit->fault_dumped = false;
  
        /* initially, until copy_from_user() and bo lookup succeeds: */
        submit->nr_bos = 0;
@@@ -587,9 -586,7 +587,7 @@@ static struct msm_submit_post_dep *msm_
                                break;
                        }
  
-                       post_deps[i].chain =
-                               kmalloc(sizeof(*post_deps[i].chain),
-                                       GFP_KERNEL);
+                       post_deps[i].chain = dma_fence_chain_alloc();
                        if (!post_deps[i].chain) {
                                ret = -ENOMEM;
                                break;
  
        if (ret) {
                for (j = 0; j <= i; ++j) {
-                       kfree(post_deps[j].chain);
+                       dma_fence_chain_free(post_deps[j].chain);
                        if (post_deps[j].syncobj)
                                drm_syncobj_put(post_deps[j].syncobj);
                }
@@@ -149,6 -149,8 +149,8 @@@ nouveau_bo_del_ttm(struct ttm_buffer_ob
         */
        if (bo->base.dev)
                drm_gem_object_release(&bo->base);
+       else
+               dma_resv_fini(&bo->base._resv);
  
        kfree(nvbo);
  }
@@@ -330,6 -332,10 +332,10 @@@ nouveau_bo_new(struct nouveau_cli *cli
        if (IS_ERR(nvbo))
                return PTR_ERR(nvbo);
  
+       nvbo->bo.base.size = size;
+       dma_resv_init(&nvbo->bo.base._resv);
+       drm_vma_node_reset(&nvbo->bo.base.vma_node);
        ret = nouveau_bo_init(nvbo, size, align, domain, sg, robj);
        if (ret)
                return ret;
@@@ -439,7 -445,6 +445,7 @@@ nouveau_bo_pin(struct nouveau_bo *nvbo
                        break;
                case TTM_PL_TT:
                        error |= !(domain & NOUVEAU_GEM_DOMAIN_GART);
 +                      break;
                default:
                        break;
                }
@@@ -546,7 -551,7 +552,7 @@@ nouveau_bo_sync_for_device(struct nouve
        struct ttm_tt *ttm_dma = (struct ttm_tt *)nvbo->bo.ttm;
        int i, j;
  
 -      if (!ttm_dma)
 +      if (!ttm_dma || !ttm_dma->dma_address)
                return;
        if (!ttm_dma->pages) {
                NV_DEBUG(drm, "ttm_dma 0x%p: pages NULL\n", ttm_dma);
@@@ -582,7 -587,7 +588,7 @@@ nouveau_bo_sync_for_cpu(struct nouveau_
        struct ttm_tt *ttm_dma = (struct ttm_tt *)nvbo->bo.ttm;
        int i, j;
  
 -      if (!ttm_dma)
 +      if (!ttm_dma || !ttm_dma->dma_address)
                return;
        if (!ttm_dma->pages) {
                NV_DEBUG(drm, "ttm_dma 0x%p: pages NULL\n", ttm_dma);
@@@ -330,7 -330,7 +330,7 @@@ static int radeon_pci_probe(struct pci_
                return -EPROBE_DEFER;
  
        /* Get rid of things like offb */
-       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, "radeondrmfb");
+       ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &kms_driver);
        if (ret)
                return ret;
  
@@@ -374,13 -374,13 +374,13 @@@ radeon_pci_shutdown(struct pci_dev *pde
        if (radeon_device_is_virtual())
                radeon_pci_remove(pdev);
  
 -#ifdef CONFIG_PPC64
 +#if defined(CONFIG_PPC64) || defined(CONFIG_MACH_LOONGSON64)
        /*
         * Some adapters need to be suspended before a
         * shutdown occurs in order to prevent an error
 -       * during kexec.
 -       * Make this power specific becauase it breaks
 -       * some non-power boards.
 +       * during kexec, shutdown or reboot.
 +       * Make this power and Loongson specific because
 +       * it breaks some other boards.
         */
        radeon_suspend_kms(pci_get_drvdata(pdev), true, true, false);
  #endif
@@@ -288,7 -288,7 +288,7 @@@ static void radeon_fence_check_lockup(s
                return;
        }
  
-       if (fence_drv->delayed_irq && rdev->ddev->irq_enabled) {
+       if (fence_drv->delayed_irq && rdev->irq.installed) {
                unsigned long irqflags;
  
                fence_drv->delayed_irq = false;
@@@ -905,8 -905,9 +905,8 @@@ static void radeon_fence_driver_init_ri
   * Not all asics have all rings, so each asic will only
   * start the fence driver on the rings it has using
   * radeon_fence_driver_start_ring().
 - * Returns 0 for success.
   */
 -int radeon_fence_driver_init(struct radeon_device *rdev)
 +void radeon_fence_driver_init(struct radeon_device *rdev)
  {
        int ring;
  
        }
  
        radeon_debugfs_fence_init(rdev);
 -
 -      return 0;
  }
  
  /**
@@@ -485,6 -485,31 +485,31 @@@ void ttm_bo_unlock_delayed_workqueue(st
  }
  EXPORT_SYMBOL(ttm_bo_unlock_delayed_workqueue);
  
+ static int ttm_bo_bounce_temp_buffer(struct ttm_buffer_object *bo,
+                                    struct ttm_resource **mem,
+                                    struct ttm_operation_ctx *ctx,
+                                    struct ttm_place *hop)
+ {
+       struct ttm_placement hop_placement;
+       struct ttm_resource *hop_mem;
+       int ret;
+       hop_placement.num_placement = hop_placement.num_busy_placement = 1;
+       hop_placement.placement = hop_placement.busy_placement = hop;
+       /* find space in the bounce domain */
+       ret = ttm_bo_mem_space(bo, &hop_placement, &hop_mem, ctx);
+       if (ret)
+               return ret;
+       /* move to the bounce domain */
+       ret = ttm_bo_handle_move_mem(bo, hop_mem, false, ctx, NULL);
+       if (ret) {
+               ttm_resource_free(bo, &hop_mem);
+               return ret;
+       }
+       return 0;
+ }
  static int ttm_bo_evict(struct ttm_buffer_object *bo,
                        struct ttm_operation_ctx *ctx)
  {
                goto out;
        }
  
+ bounce:
        ret = ttm_bo_handle_move_mem(bo, evict_mem, true, ctx, &hop);
-       if (unlikely(ret)) {
-               WARN(ret == -EMULTIHOP, "Unexpected multihop in eviction - likely driver bug\n");
-               if (ret != -ERESTARTSYS)
+       if (ret == -EMULTIHOP) {
+               ret = ttm_bo_bounce_temp_buffer(bo, &evict_mem, ctx, &hop);
+               if (ret) {
                        pr_err("Buffer eviction failed\n");
-               ttm_resource_free(bo, &evict_mem);
+                       ttm_resource_free(bo, &evict_mem);
+                       goto out;
+               }
+               /* try and move to final place now. */
+               goto bounce;
        }
  out:
        return ret;
@@@ -844,31 -874,6 +874,6 @@@ error
  }
  EXPORT_SYMBOL(ttm_bo_mem_space);
  
- static int ttm_bo_bounce_temp_buffer(struct ttm_buffer_object *bo,
-                                    struct ttm_resource **mem,
-                                    struct ttm_operation_ctx *ctx,
-                                    struct ttm_place *hop)
- {
-       struct ttm_placement hop_placement;
-       struct ttm_resource *hop_mem;
-       int ret;
-       hop_placement.num_placement = hop_placement.num_busy_placement = 1;
-       hop_placement.placement = hop_placement.busy_placement = hop;
-       /* find space in the bounce domain */
-       ret = ttm_bo_mem_space(bo, &hop_placement, &hop_mem, ctx);
-       if (ret)
-               return ret;
-       /* move to the bounce domain */
-       ret = ttm_bo_handle_move_mem(bo, hop_mem, false, ctx, NULL);
-       if (ret) {
-               ttm_resource_free(bo, &hop_mem);
-               return ret;
-       }
-       return 0;
- }
  static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
                              struct ttm_placement *placement,
                              struct ttm_operation_ctx *ctx)
@@@ -913,6 -918,9 +918,9 @@@ static bool ttm_bo_places_compat(const 
  {
        unsigned i;
  
+       if (mem->placement & TTM_PL_FLAG_TEMPORARY)
+               return false;
        for (i = 0; i < num_placement; i++) {
                const struct ttm_place *heap = &places[i];
  
@@@ -1139,10 -1147,7 +1147,10 @@@ int ttm_bo_swapout(struct ttm_buffer_ob
        if (!ttm_bo_evict_swapout_allowable(bo, ctx, &place, &locked, NULL))
                return -EBUSY;
  
 -      if (!ttm_bo_get_unless_zero(bo)) {
 +      if (!bo->ttm || !ttm_tt_is_populated(bo->ttm) ||
 +          bo->ttm->page_flags & TTM_PAGE_FLAG_SG ||
 +          bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED ||
 +          !ttm_bo_get_unless_zero(bo)) {
                if (locked)
                        dma_resv_unlock(bo->base.resv);
                return -EBUSY;
@@@ -46,6 -46,7 +46,7 @@@
  #include <linux/rational.h>
  #include <linux/reset.h>
  #include <sound/dmaengine_pcm.h>
+ #include <sound/hdmi-codec.h>
  #include <sound/pcm_drm_eld.h>
  #include <sound/pcm_params.h>
  #include <sound/soc.h>
@@@ -166,8 -167,6 +167,8 @@@ vc4_hdmi_connector_detect(struct drm_co
        struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
        bool connected = false;
  
 +      WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev));
 +
        if (vc4_hdmi->hpd_gpio &&
            gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio)) {
                connected = true;
                        }
                }
  
 +              pm_runtime_put(&vc4_hdmi->pdev->dev);
                return connector_status_connected;
        }
  
        cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
 +      pm_runtime_put(&vc4_hdmi->pdev->dev);
        return connector_status_disconnected;
  }
  
@@@ -435,7 -432,7 +436,7 @@@ static void vc4_hdmi_set_avi_infoframe(
        struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
        struct drm_connector *connector = &vc4_hdmi->connector;
        struct drm_connector_state *cstate = connector->state;
-       struct drm_crtc *crtc = encoder->crtc;
+       struct drm_crtc *crtc = cstate->crtc;
        const struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        union hdmi_infoframe frame;
        int ret;
@@@ -477,15 -474,10 +478,10 @@@ static void vc4_hdmi_set_spd_infoframe(
  static void vc4_hdmi_set_audio_infoframe(struct drm_encoder *encoder)
  {
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
+       struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe;
        union hdmi_infoframe frame;
  
-       hdmi_audio_infoframe_init(&frame.audio);
-       frame.audio.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM;
-       frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM;
-       frame.audio.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM;
-       frame.audio.channels = vc4_hdmi->audio.channels;
+       memcpy(&frame.audio, audio, sizeof(*audio));
        vc4_hdmi_write_infoframe(encoder, &frame);
  }
  
@@@ -545,8 -537,11 +541,11 @@@ static bool vc4_hdmi_supports_scramblin
  
  static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
  {
-       struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
+       struct drm_connector *connector = &vc4_hdmi->connector;
+       struct drm_connector_state *cstate = connector->state;
+       struct drm_crtc *crtc = cstate->crtc;
+       struct drm_display_mode *mode = &crtc->state->adjusted_mode;
  
        if (!vc4_hdmi_supports_scrambling(encoder, mode))
                return;
  static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
  {
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
-       struct drm_crtc *crtc = encoder->crtc;
+       struct drm_connector *connector = &vc4_hdmi->connector;
+       struct drm_connector_state *cstate = connector->state;
  
        /*
-        * At boot, encoder->crtc will be NULL. Since we don't know the
+        * At boot, connector->state will be NULL. Since we don't know the
         * state of the scrambler and in order to avoid any
         * inconsistency, let's disable it all the time.
         */
-       if (crtc && !vc4_hdmi_supports_scrambling(encoder, &crtc->mode))
+       if (cstate && !vc4_hdmi_supports_scrambling(encoder, &cstate->crtc->mode))
                return;
  
-       if (crtc && !vc4_hdmi_mode_needs_scrambling(&crtc->mode))
+       if (cstate && !vc4_hdmi_mode_needs_scrambling(&cstate->crtc->mode))
                return;
  
        if (delayed_work_pending(&vc4_hdmi->scrambling_work))
@@@ -613,12 -609,12 +613,12 @@@ static void vc4_hdmi_encoder_post_crtc_
  
        HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
  
-       HDMI_WRITE(HDMI_VID_CTL, HDMI_READ(HDMI_VID_CTL) |
-                  VC4_HD_VID_CTL_CLRRGB | VC4_HD_VID_CTL_CLRSYNC);
+       HDMI_WRITE(HDMI_VID_CTL, HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_CLRRGB);
  
-       HDMI_WRITE(HDMI_VID_CTL,
-                  HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX);
+       mdelay(1);
  
+       HDMI_WRITE(HDMI_VID_CTL,
+                  HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_ENABLE);
        vc4_hdmi_disable_scrambling(encoder);
  }
  
@@@ -628,13 -624,14 +628,13 @@@ static void vc4_hdmi_encoder_post_crtc_
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
        int ret;
  
+       HDMI_WRITE(HDMI_VID_CTL,
+                  HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX);
        if (vc4_hdmi->variant->phy_disable)
                vc4_hdmi->variant->phy_disable(vc4_hdmi);
  
-       HDMI_WRITE(HDMI_VID_CTL,
-                  HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_ENABLE);
        clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock);
 -      clk_disable_unprepare(vc4_hdmi->hsm_clock);
        clk_disable_unprepare(vc4_hdmi->pixel_clock);
  
        ret = pm_runtime_put(&vc4_hdmi->pdev->dev);
@@@ -898,7 -895,9 +898,9 @@@ static void vc4_hdmi_encoder_pre_crtc_c
                vc4_hdmi_encoder_get_connector_state(encoder, state);
        struct vc4_hdmi_connector_state *vc4_conn_state =
                conn_state_to_vc4_hdmi_conn_state(conn_state);
-       struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
+       struct drm_crtc_state *crtc_state =
+               drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+       struct drm_display_mode *mode = &crtc_state->adjusted_mode;
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
        unsigned long bvb_rate, pixel_rate, hsm_rate;
        int ret;
                return;
        }
  
 -      ret = clk_prepare_enable(vc4_hdmi->hsm_clock);
 -      if (ret) {
 -              DRM_ERROR("Failed to turn on HSM clock: %d\n", ret);
 -              clk_disable_unprepare(vc4_hdmi->pixel_clock);
 -              return;
 -      }
 -
        vc4_hdmi_cec_update_clk_div(vc4_hdmi);
  
        if (pixel_rate > 297000000)
        ret = clk_set_min_rate(vc4_hdmi->pixel_bvb_clock, bvb_rate);
        if (ret) {
                DRM_ERROR("Failed to set pixel bvb clock rate: %d\n", ret);
 -              clk_disable_unprepare(vc4_hdmi->hsm_clock);
                clk_disable_unprepare(vc4_hdmi->pixel_clock);
                return;
        }
        ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
        if (ret) {
                DRM_ERROR("Failed to turn on pixel bvb clock: %d\n", ret);
 -              clk_disable_unprepare(vc4_hdmi->hsm_clock);
                clk_disable_unprepare(vc4_hdmi->pixel_clock);
                return;
        }
  static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
                                             struct drm_atomic_state *state)
  {
-       struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
+       struct drm_connector_state *conn_state =
+               vc4_hdmi_encoder_get_connector_state(encoder, state);
+       struct drm_crtc_state *crtc_state =
+               drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+       struct drm_display_mode *mode = &crtc_state->adjusted_mode;
        struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
  
  static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
                                              struct drm_atomic_state *state)
  {
-       struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
+       struct drm_connector_state *conn_state =
+               vc4_hdmi_encoder_get_connector_state(encoder, state);
+       struct drm_crtc_state *crtc_state =
+               drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+       struct drm_display_mode *mode = &crtc_state->adjusted_mode;
        struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
        struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
        bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
  
        HDMI_WRITE(HDMI_VID_CTL,
                   VC4_HD_VID_CTL_ENABLE |
+                  VC4_HD_VID_CTL_CLRRGB |
                   VC4_HD_VID_CTL_UNDERFLOW_ENABLE |
                   VC4_HD_VID_CTL_FRAME_COUNTER_RESET |
                   (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW) |
@@@ -1192,8 -1209,8 +1203,8 @@@ static void vc4_hdmi_audio_set_mai_cloc
  
  static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi)
  {
-       struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
-       struct drm_crtc *crtc = encoder->crtc;
+       struct drm_connector *connector = &vc4_hdmi->connector;
+       struct drm_crtc *crtc = connector->state->crtc;
        const struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        u32 samplerate = vc4_hdmi->audio.samplerate;
        u32 n, cts;
@@@ -1224,36 -1241,31 +1235,31 @@@ static inline struct vc4_hdmi *dai_to_h
        return snd_soc_card_get_drvdata(card);
  }
  
- static int vc4_hdmi_audio_startup(struct snd_pcm_substream *substream,
-                                 struct snd_soc_dai *dai)
+ static int vc4_hdmi_audio_startup(struct device *dev, void *data)
  {
-       struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
-       struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
+       struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
        struct drm_connector *connector = &vc4_hdmi->connector;
-       int ret;
-       if (vc4_hdmi->audio.substream && vc4_hdmi->audio.substream != substream)
-               return -EINVAL;
-       vc4_hdmi->audio.substream = substream;
  
        /*
         * If the HDMI encoder hasn't probed, or the encoder is
         * currently in DVI mode, treat the codec dai as missing.
         */
-       if (!encoder->crtc || !(HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
+       if (!connector->state || !(HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
                                VC4_HDMI_RAM_PACKET_ENABLE))
                return -ENODEV;
  
-       ret = snd_pcm_hw_constraint_eld(substream->runtime, connector->eld);
-       if (ret)
-               return ret;
+       vc4_hdmi->audio.streaming = true;
  
-       return 0;
- }
+       HDMI_WRITE(HDMI_MAI_CTL,
+                  VC4_HD_MAI_CTL_RESET |
+                  VC4_HD_MAI_CTL_FLUSH |
+                  VC4_HD_MAI_CTL_DLATE |
+                  VC4_HD_MAI_CTL_ERRORE |
+                  VC4_HD_MAI_CTL_ERRORF);
+       if (vc4_hdmi->variant->phy_rng_enable)
+               vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
  
- static int vc4_hdmi_audio_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
- {
        return 0;
  }
  
@@@ -1273,49 -1285,99 +1279,99 @@@ static void vc4_hdmi_audio_reset(struc
        HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_FLUSH);
  }
  
- static void vc4_hdmi_audio_shutdown(struct snd_pcm_substream *substream,
-                                   struct snd_soc_dai *dai)
+ static void vc4_hdmi_audio_shutdown(struct device *dev, void *data)
  {
-       struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
+       struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
  
-       if (substream != vc4_hdmi->audio.substream)
-               return;
+       HDMI_WRITE(HDMI_MAI_CTL,
+                  VC4_HD_MAI_CTL_DLATE |
+                  VC4_HD_MAI_CTL_ERRORE |
+                  VC4_HD_MAI_CTL_ERRORF);
+       if (vc4_hdmi->variant->phy_rng_disable)
+               vc4_hdmi->variant->phy_rng_disable(vc4_hdmi);
  
+       vc4_hdmi->audio.streaming = false;
        vc4_hdmi_audio_reset(vc4_hdmi);
+ }
  
-       vc4_hdmi->audio.substream = NULL;
+ static int sample_rate_to_mai_fmt(int samplerate)
+ {
+       switch (samplerate) {
+       case 8000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_8000;
+       case 11025:
+               return VC4_HDMI_MAI_SAMPLE_RATE_11025;
+       case 12000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_12000;
+       case 16000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_16000;
+       case 22050:
+               return VC4_HDMI_MAI_SAMPLE_RATE_22050;
+       case 24000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_24000;
+       case 32000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_32000;
+       case 44100:
+               return VC4_HDMI_MAI_SAMPLE_RATE_44100;
+       case 48000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_48000;
+       case 64000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_64000;
+       case 88200:
+               return VC4_HDMI_MAI_SAMPLE_RATE_88200;
+       case 96000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_96000;
+       case 128000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_128000;
+       case 176400:
+               return VC4_HDMI_MAI_SAMPLE_RATE_176400;
+       case 192000:
+               return VC4_HDMI_MAI_SAMPLE_RATE_192000;
+       default:
+               return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
+       }
  }
  
  /* HDMI audio codec callbacks */
- static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
-                                   struct snd_pcm_hw_params *params,
-                                   struct snd_soc_dai *dai)
+ static int vc4_hdmi_audio_prepare(struct device *dev, void *data,
+                                 struct hdmi_codec_daifmt *daifmt,
+                                 struct hdmi_codec_params *params)
  {
-       struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
+       struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
        struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
-       struct device *dev = &vc4_hdmi->pdev->dev;
        u32 audio_packet_config, channel_mask;
        u32 channel_map;
-       if (substream != vc4_hdmi->audio.substream)
-               return -EINVAL;
+       u32 mai_audio_format;
+       u32 mai_sample_rate;
  
        dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
-               params_rate(params), params_width(params),
-               params_channels(params));
+               params->sample_rate, params->sample_width,
+               params->channels);
  
-       vc4_hdmi->audio.channels = params_channels(params);
-       vc4_hdmi->audio.samplerate = params_rate(params);
+       vc4_hdmi->audio.channels = params->channels;
+       vc4_hdmi->audio.samplerate = params->sample_rate;
  
        HDMI_WRITE(HDMI_MAI_CTL,
-                  VC4_HD_MAI_CTL_RESET |
-                  VC4_HD_MAI_CTL_FLUSH |
-                  VC4_HD_MAI_CTL_DLATE |
-                  VC4_HD_MAI_CTL_ERRORE |
-                  VC4_HD_MAI_CTL_ERRORF);
+                  VC4_SET_FIELD(params->channels, VC4_HD_MAI_CTL_CHNUM) |
+                  VC4_HD_MAI_CTL_WHOLSMP |
+                  VC4_HD_MAI_CTL_CHALIGN |
+                  VC4_HD_MAI_CTL_ENABLE);
  
        vc4_hdmi_audio_set_mai_clock(vc4_hdmi);
  
+       mai_sample_rate = sample_rate_to_mai_fmt(vc4_hdmi->audio.samplerate);
+       if (params->iec.status[0] & IEC958_AES0_NONAUDIO &&
+           params->channels == 8)
+               mai_audio_format = VC4_HDMI_MAI_FORMAT_HBR;
+       else
+               mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
+       HDMI_WRITE(HDMI_MAI_FMT,
+                  VC4_SET_FIELD(mai_sample_rate,
+                                VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
+                  VC4_SET_FIELD(mai_audio_format,
+                                VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
        /* The B frame identifier should match the value used by alsa-lib (8) */
        audio_packet_config =
                VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
        audio_packet_config |= VC4_SET_FIELD(channel_mask,
                                             VC4_HDMI_AUDIO_PACKET_CEA_MASK);
  
-       /* Set the MAI threshold.  This logic mimics the firmware's. */
-       if (vc4_hdmi->audio.samplerate > 96000) {
-               HDMI_WRITE(HDMI_MAI_THR,
-                          VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQHIGH) |
-                          VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQLOW));
-       } else if (vc4_hdmi->audio.samplerate > 48000) {
-               HDMI_WRITE(HDMI_MAI_THR,
-                          VC4_SET_FIELD(0x14, VC4_HD_MAI_THR_DREQHIGH) |
-                          VC4_SET_FIELD(0x12, VC4_HD_MAI_THR_DREQLOW));
-       } else {
-               HDMI_WRITE(HDMI_MAI_THR,
-                          VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) |
-                          VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
-                          VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) |
-                          VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW));
-       }
+       /* Set the MAI threshold */
+       HDMI_WRITE(HDMI_MAI_THR,
+                  VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) |
+                  VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
+                  VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) |
+                  VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW));
  
        HDMI_WRITE(HDMI_MAI_CONFIG,
                   VC4_HDMI_MAI_CONFIG_BIT_REVERSE |
+                  VC4_HDMI_MAI_CONFIG_FORMAT_REVERSE |
                   VC4_SET_FIELD(channel_mask, VC4_HDMI_MAI_CHANNEL_MASK));
  
        channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask);
        HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config);
        vc4_hdmi_set_n_cts(vc4_hdmi);
  
+       memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));
        vc4_hdmi_set_audio_infoframe(encoder);
  
        return 0;
  }
  
- static int vc4_hdmi_audio_trigger(struct snd_pcm_substream *substream, int cmd,
-                                 struct snd_soc_dai *dai)
- {
-       struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-               vc4_hdmi->audio.streaming = true;
-               if (vc4_hdmi->variant->phy_rng_enable)
-                       vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
-               HDMI_WRITE(HDMI_MAI_CTL,
-                          VC4_SET_FIELD(vc4_hdmi->audio.channels,
-                                        VC4_HD_MAI_CTL_CHNUM) |
-                          VC4_HD_MAI_CTL_ENABLE);
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-               HDMI_WRITE(HDMI_MAI_CTL,
-                          VC4_HD_MAI_CTL_DLATE |
-                          VC4_HD_MAI_CTL_ERRORE |
-                          VC4_HD_MAI_CTL_ERRORF);
-               if (vc4_hdmi->variant->phy_rng_disable)
-                       vc4_hdmi->variant->phy_rng_disable(vc4_hdmi);
-               vc4_hdmi->audio.streaming = false;
-               break;
-       default:
-               break;
-       }
-       return 0;
- }
- static inline struct vc4_hdmi *
- snd_component_to_hdmi(struct snd_soc_component *component)
- {
-       struct snd_soc_card *card = snd_soc_component_get_drvdata(component);
-       return snd_soc_card_get_drvdata(card);
- }
- static int vc4_hdmi_audio_eld_ctl_info(struct snd_kcontrol *kcontrol,
-                                      struct snd_ctl_elem_info *uinfo)
- {
-       struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
-       struct vc4_hdmi *vc4_hdmi = snd_component_to_hdmi(component);
-       struct drm_connector *connector = &vc4_hdmi->connector;
-       uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
-       uinfo->count = sizeof(connector->eld);
-       return 0;
- }
- static int vc4_hdmi_audio_eld_ctl_get(struct snd_kcontrol *kcontrol,
-                                     struct snd_ctl_elem_value *ucontrol)
- {
-       struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
-       struct vc4_hdmi *vc4_hdmi = snd_component_to_hdmi(component);
-       struct drm_connector *connector = &vc4_hdmi->connector;
-       memcpy(ucontrol->value.bytes.data, connector->eld,
-              sizeof(connector->eld));
-       return 0;
- }
- static const struct snd_kcontrol_new vc4_hdmi_audio_controls[] = {
-       {
-               .access = SNDRV_CTL_ELEM_ACCESS_READ |
-                         SNDRV_CTL_ELEM_ACCESS_VOLATILE,
-               .iface = SNDRV_CTL_ELEM_IFACE_PCM,
-               .name = "ELD",
-               .info = vc4_hdmi_audio_eld_ctl_info,
-               .get = vc4_hdmi_audio_eld_ctl_get,
-       },
- };
  static const struct snd_soc_dapm_widget vc4_hdmi_audio_widgets[] = {
        SND_SOC_DAPM_OUTPUT("TX"),
  };
@@@ -1448,8 -1421,6 +1415,6 @@@ static const struct snd_soc_dapm_route 
  
  static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = {
        .name                   = "vc4-hdmi-codec-dai-component",
-       .controls               = vc4_hdmi_audio_controls,
-       .num_controls           = ARRAY_SIZE(vc4_hdmi_audio_controls),
        .dapm_widgets           = vc4_hdmi_audio_widgets,
        .num_dapm_widgets       = ARRAY_SIZE(vc4_hdmi_audio_widgets),
        .dapm_routes            = vc4_hdmi_audio_routes,
        .non_legacy_dai_naming  = 1,
  };
  
- static const struct snd_soc_dai_ops vc4_hdmi_audio_dai_ops = {
-       .startup = vc4_hdmi_audio_startup,
-       .shutdown = vc4_hdmi_audio_shutdown,
-       .hw_params = vc4_hdmi_audio_hw_params,
-       .set_fmt = vc4_hdmi_audio_set_fmt,
-       .trigger = vc4_hdmi_audio_trigger,
- };
- static struct snd_soc_dai_driver vc4_hdmi_audio_codec_dai_drv = {
-       .name = "vc4-hdmi-hifi",
-       .playback = {
-               .stream_name = "Playback",
-               .channels_min = 2,
-               .channels_max = 8,
-               .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
-                        SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
-                        SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
-                        SNDRV_PCM_RATE_192000,
-               .formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
-       },
- };
  static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = {
        .name = "vc4-hdmi-cpu-dai-component",
  };
@@@ -1508,7 -1457,6 +1451,6 @@@ static struct snd_soc_dai_driver vc4_hd
                         SNDRV_PCM_RATE_192000,
                .formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
        },
-       .ops = &vc4_hdmi_audio_dai_ops,
  };
  
  static const struct snd_dmaengine_pcm_config pcm_conf = {
        .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
  };
  
+ static int vc4_hdmi_audio_get_eld(struct device *dev, void *data,
+                                 uint8_t *buf, size_t len)
+ {
+       struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
+       struct drm_connector *connector = &vc4_hdmi->connector;
+       memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
+       return 0;
+ }
+ static const struct hdmi_codec_ops vc4_hdmi_codec_ops = {
+       .get_eld = vc4_hdmi_audio_get_eld,
+       .prepare = vc4_hdmi_audio_prepare,
+       .audio_shutdown = vc4_hdmi_audio_shutdown,
+       .audio_startup = vc4_hdmi_audio_startup,
+ };
+ struct hdmi_codec_pdata vc4_hdmi_codec_pdata = {
+       .ops = &vc4_hdmi_codec_ops,
+       .max_i2s_channels = 8,
+       .i2s = 1,
+ };
  static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
  {
        const struct vc4_hdmi_register *mai_data =
        struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link;
        struct snd_soc_card *card = &vc4_hdmi->audio.card;
        struct device *dev = &vc4_hdmi->pdev->dev;
+       struct platform_device *codec_pdev;
        const __be32 *addr;
        int index;
        int ret;
                return ret;
        }
  
-       /* register component and codec dai */
-       ret = devm_snd_soc_register_component(dev, &vc4_hdmi_audio_component_drv,
-                                    &vc4_hdmi_audio_codec_dai_drv, 1);
-       if (ret) {
-               dev_err(dev, "Could not register component: %d\n", ret);
-               return ret;
+       codec_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
+                                                  PLATFORM_DEVID_AUTO,
+                                                  &vc4_hdmi_codec_pdata,
+                                                  sizeof(vc4_hdmi_codec_pdata));
+       if (IS_ERR(codec_pdev)) {
+               dev_err(dev, "Couldn't register the HDMI codec: %ld\n", PTR_ERR(codec_pdev));
+               return PTR_ERR(codec_pdev);
        }
  
        dai_link->cpus          = &vc4_hdmi->audio.cpu;
  
        dai_link->name = "MAI";
        dai_link->stream_name = "MAI PCM";
-       dai_link->codecs->dai_name = vc4_hdmi_audio_codec_dai_drv.name;
+       dai_link->codecs->dai_name = "i2s-hifi";
        dai_link->cpus->dai_name = dev_name(dev);
-       dai_link->codecs->name = dev_name(dev);
+       dai_link->codecs->name = dev_name(&codec_pdev->dev);
        dai_link->platforms->name = dev_name(dev);
  
        card->dai_link = dai_link;
        snd_soc_card_set_drvdata(card, vc4_hdmi);
        ret = devm_snd_soc_register_card(dev, card);
        if (ret)
-               dev_err(dev, "Could not register sound card: %d\n", ret);
+               dev_err_probe(dev, ret, "Could not register sound card\n");
  
        return ret;
  
  }
  
+ static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
+ {
+       struct vc4_hdmi *vc4_hdmi = priv;
+       struct drm_device *dev = vc4_hdmi->connector.dev;
+       if (dev && dev->registered)
+               drm_kms_helper_hotplug_event(dev);
+       return IRQ_HANDLED;
+ }
+ static int vc4_hdmi_hotplug_init(struct vc4_hdmi *vc4_hdmi)
+ {
+       struct drm_connector *connector = &vc4_hdmi->connector;
+       struct platform_device *pdev = vc4_hdmi->pdev;
+       int ret;
+       if (vc4_hdmi->variant->external_irq_controller) {
+               unsigned int hpd_con = platform_get_irq_byname(pdev, "hpd-connected");
+               unsigned int hpd_rm = platform_get_irq_byname(pdev, "hpd-removed");
+               ret = request_threaded_irq(hpd_con,
+                                          NULL,
+                                          vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
+                                          "vc4 hdmi hpd connected", vc4_hdmi);
+               if (ret)
+                       return ret;
+               ret = request_threaded_irq(hpd_rm,
+                                          NULL,
+                                          vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
+                                          "vc4 hdmi hpd disconnected", vc4_hdmi);
+               if (ret) {
+                       free_irq(hpd_con, vc4_hdmi);
+                       return ret;
+               }
+               connector->polled = DRM_CONNECTOR_POLL_HPD;
+       }
+       return 0;
+ }
+ static void vc4_hdmi_hotplug_exit(struct vc4_hdmi *vc4_hdmi)
+ {
+       struct platform_device *pdev = vc4_hdmi->pdev;
+       if (vc4_hdmi->variant->external_irq_controller) {
+               free_irq(platform_get_irq_byname(pdev, "hpd-connected"), vc4_hdmi);
+               free_irq(platform_get_irq_byname(pdev, "hpd-removed"), vc4_hdmi);
+       }
+ }
  #ifdef CONFIG_DRM_VC4_HDMI_CEC
  static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv)
  {
@@@ -2090,29 -2117,6 +2111,29 @@@ static int vc5_hdmi_init_resources(stru
        return 0;
  }
  
 +#ifdef CONFIG_PM
 +static int vc4_hdmi_runtime_suspend(struct device *dev)
 +{
 +      struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
 +
 +      clk_disable_unprepare(vc4_hdmi->hsm_clock);
 +
 +      return 0;
 +}
 +
 +static int vc4_hdmi_runtime_resume(struct device *dev)
 +{
 +      struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
 +      int ret;
 +
 +      ret = clk_prepare_enable(vc4_hdmi->hsm_clock);
 +      if (ret)
 +              return ret;
 +
 +      return 0;
 +}
 +#endif
 +
  static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
  {
        const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev);
        if (ret)
                goto err_destroy_encoder;
  
-       ret = vc4_hdmi_cec_init(vc4_hdmi);
+       ret = vc4_hdmi_hotplug_init(vc4_hdmi);
        if (ret)
                goto err_destroy_conn;
  
+       ret = vc4_hdmi_cec_init(vc4_hdmi);
+       if (ret)
+               goto err_free_hotplug;
        ret = vc4_hdmi_audio_init(vc4_hdmi);
        if (ret)
                goto err_free_cec;
  
  err_free_cec:
        vc4_hdmi_cec_exit(vc4_hdmi);
+ err_free_hotplug:
+       vc4_hdmi_hotplug_exit(vc4_hdmi);
  err_destroy_conn:
        vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
  err_destroy_encoder:
@@@ -2253,6 -2263,7 +2280,7 @@@ static void vc4_hdmi_unbind(struct devi
        kfree(vc4_hdmi->hd_regset.regs);
  
        vc4_hdmi_cec_exit(vc4_hdmi);
+       vc4_hdmi_hotplug_exit(vc4_hdmi);
        vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
        drm_encoder_cleanup(&vc4_hdmi->encoder.base.base);
  
@@@ -2360,18 -2371,11 +2388,18 @@@ static const struct of_device_id vc4_hd
        {}
  };
  
 +static const struct dev_pm_ops vc4_hdmi_pm_ops = {
 +      SET_RUNTIME_PM_OPS(vc4_hdmi_runtime_suspend,
 +                         vc4_hdmi_runtime_resume,
 +                         NULL)
 +};
 +
  struct platform_driver vc4_hdmi_driver = {
        .probe = vc4_hdmi_dev_probe,
        .remove = vc4_hdmi_dev_remove,
        .driver = {
                .name = "vc4_hdmi",
                .of_match_table = vc4_hdmi_dt_match,
 +              .pm = &vc4_hdmi_pm_ops,
        },
  };
@@@ -372,7 -372,7 +372,7 @@@ static void vc4_atomic_commit_tail(stru
                if (!old_hvs_state->fifo_state[channel].in_use)
                        continue;
  
 -              ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[i].pending_commit);
 +              ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[channel].pending_commit);
                if (ret)
                        drm_err(dev, "Timed out waiting for commit\n");
        }
@@@ -880,7 -880,6 +880,6 @@@ int vc4_kms_load(struct drm_device *dev
        /* Set support for vblank irq fast disable, before drm_vblank_init() */
        dev->vblank_disable_immediate = true;
  
-       dev->irq_enabled = true;
        ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
        if (ret < 0) {
                dev_err(dev->dev, "failed to initialize vblank\n");
@@@ -30,6 -30,7 +30,7 @@@
  
  struct drm_device;
  struct drm_dp_aux;
+ struct drm_panel;
  
  /*
   * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that
@@@ -1377,27 -1378,10 +1378,27 @@@ enum drm_dp_phy 
  #define DP_SYMBOL_ERROR_COUNT_LANE1_PHY_REPEATER1         0xf0037 /* 1.3 */
  #define DP_SYMBOL_ERROR_COUNT_LANE2_PHY_REPEATER1         0xf0039 /* 1.3 */
  #define DP_SYMBOL_ERROR_COUNT_LANE3_PHY_REPEATER1         0xf003b /* 1.3 */
 +
 +#define __DP_FEC1_BASE                                            0xf0290 /* 1.4 */
 +#define __DP_FEC2_BASE                                            0xf0298 /* 1.4 */
 +#define DP_FEC_BASE(dp_phy) \
 +      (__DP_FEC1_BASE + ((__DP_FEC2_BASE - __DP_FEC1_BASE) * \
 +                         ((dp_phy) - DP_PHY_LTTPR1)))
 +
 +#define DP_FEC_REG(dp_phy, fec1_reg) \
 +      (DP_FEC_BASE(dp_phy) - DP_FEC_BASE(DP_PHY_LTTPR1) + fec1_reg)
 +
  #define DP_FEC_STATUS_PHY_REPEATER1                       0xf0290 /* 1.4 */
 +#define DP_FEC_STATUS_PHY_REPEATER(dp_phy) \
 +      DP_FEC_REG(dp_phy, DP_FEC_STATUS_PHY_REPEATER1)
 +
  #define DP_FEC_ERROR_COUNT_PHY_REPEATER1                    0xf0291 /* 1.4 */
  #define DP_FEC_CAPABILITY_PHY_REPEATER1                     0xf0294 /* 1.4a */
  
 +#define DP_LTTPR_MAX_ADD                                  0xf02ff /* 1.4 */
 +
 +#define DP_DPCD_MAX_ADD                                           0xfffff /* 1.4 */
 +
  /* Repeater modes */
  #define DP_PHY_REPEATER_MODE_TRANSPARENT                  0x55    /* 1.3 */
  #define DP_PHY_REPEATER_MODE_NON_TRANSPARENT              0xaa    /* 1.3 */
@@@ -1818,6 -1802,24 +1819,24 @@@ drm_dp_sink_can_do_video_without_timing
                DP_MSA_TIMING_PAR_IGNORED;
  }
  
+ /**
+  * drm_edp_backlight_supported() - Check an eDP DPCD for VESA backlight support
+  * @edp_dpcd: The DPCD to check
+  *
+  * Note that currently this function will return %false for panels which support various DPCD
+  * backlight features but which require the brightness be set through PWM, and don't support setting
+  * the brightness level via the DPCD. This is a TODO.
+  *
+  * Returns: %True if @edp_dpcd indicates that VESA backlight controls are supported, %false
+  * otherwise
+  */
+ static inline bool
+ drm_edp_backlight_supported(const u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE])
+ {
+       return (edp_dpcd[1] & DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP) &&
+               (edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP);
+ }
  /*
   * DisplayPort AUX channel
   */
@@@ -1858,35 -1860,6 +1877,6 @@@ struct drm_dp_aux_cec 
  
  /**
   * struct drm_dp_aux - DisplayPort AUX channel
-  * @name: user-visible name of this AUX channel and the I2C-over-AUX adapter
-  * @ddc: I2C adapter that can be used for I2C-over-AUX communication
-  * @dev: pointer to struct device that is the parent for this AUX channel
-  * @drm_dev: pointer to the &drm_device that owns this AUX channel. Beware, this
-  * may be %NULL before drm_dp_aux_register() has been called.
-  * @crtc: backpointer to the crtc that is currently using this AUX channel
-  * @hw_mutex: internal mutex used for locking transfers
-  * @crc_work: worker that captures CRCs for each frame
-  * @crc_count: counter of captured frame CRCs
-  * @transfer: transfers a message representing a single AUX transaction
-  *
-  * The @dev field should be set to a pointer to the device that implements the
-  * AUX channel. As well, the @drm_dev field should be set to the &drm_device
-  * that will be using this AUX channel as early as possible. For many graphics
-  * drivers this should happen before drm_dp_aux_init(), however it's perfectly
-  * fine to set this field later so long as it's assigned before calling
-  * drm_dp_aux_register().
-  *
-  * The @name field may be used to specify the name of the I2C adapter. If set to
-  * %NULL, dev_name() of @dev will be used.
-  *
-  * Drivers provide a hardware-specific implementation of how transactions are
-  * executed via the @transfer() function. A pointer to a &drm_dp_aux_msg
-  * structure describing the transaction is passed into this function. Upon
-  * success, the implementation should return the number of payload bytes that
-  * were transferred, or a negative error-code on failure. Helpers propagate
-  * errors from the @transfer() function, with the exception of the %-EBUSY
-  * error, which causes a transaction to be retried. On a short, helpers will
-  * return %-EPROTO to make it simpler to check for failure.
   *
   * An AUX channel can also be used to transport I2C messages to a sink. A
   * typical application of that is to access an EDID that's present in the sink
   * transfers by default; if a partial response is received, the adapter will
   * drop down to the size given by the partial response for this transaction
   * only.
-  *
-  * Note that the aux helper code assumes that the @transfer() function only
-  * modifies the reply field of the &drm_dp_aux_msg structure. The retry logic
-  * and i2c helpers assume this is the case.
   */
  struct drm_dp_aux {
+       /**
+        * @name: user-visible name of this AUX channel and the
+        * I2C-over-AUX adapter.
+        *
+        * It's also used to specify the name of the I2C adapter. If set
+        * to %NULL, dev_name() of @dev will be used.
+        */
        const char *name;
+       /**
+        * @ddc: I2C adapter that can be used for I2C-over-AUX
+        * communication
+        */
        struct i2c_adapter ddc;
+       /**
+        * @dev: pointer to struct device that is the parent for this
+        * AUX channel.
+        */
        struct device *dev;
+       /**
+        * @drm_dev: pointer to the &drm_device that owns this AUX channel.
+        * Beware, this may be %NULL before drm_dp_aux_register() has been
+        * called.
+        *
+        * It should be set to the &drm_device that will be using this AUX
+        * channel as early as possible. For many graphics drivers this should
+        * happen before drm_dp_aux_init(), however it's perfectly fine to set
+        * this field later so long as it's assigned before calling
+        * drm_dp_aux_register().
+        */
        struct drm_device *drm_dev;
+       /**
+        * @crtc: backpointer to the crtc that is currently using this
+        * AUX channel
+        */
        struct drm_crtc *crtc;
+       /**
+        * @hw_mutex: internal mutex used for locking transfers.
+        *
+        * Note that if the underlying hardware is shared among multiple
+        * channels, the driver needs to do additional locking to
+        * prevent concurrent access.
+        */
        struct mutex hw_mutex;
+       /**
+        * @crc_work: worker that captures CRCs for each frame
+        */
        struct work_struct crc_work;
+       /**
+        * @crc_count: counter of captured frame CRCs
+        */
        u8 crc_count;
+       /**
+        * @transfer: transfers a message representing a single AUX
+        * transaction.
+        *
+        * This is a hardware-specific implementation of how
+        * transactions are executed that the drivers must provide.
+        *
+        * A pointer to a &drm_dp_aux_msg structure describing the
+        * transaction is passed into this function. Upon success, the
+        * implementation should return the number of payload bytes that
+        * were transferred, or a negative error-code on failure.
+        *
+        * Helpers will propagate these errors, with the exception of
+        * the %-EBUSY error, which causes a transaction to be retried.
+        * On a short, helpers will return %-EPROTO to make it simpler
+        * to check for failure.
+        *
+        * The @transfer() function must only modify the reply field of
+        * the &drm_dp_aux_msg structure. The retry logic and i2c
+        * helpers assume this is the case.
+        *
+        * Also note that this callback can be called no matter the
+        * state @dev is in. Drivers that need that device to be powered
+        * to perform this operation will first need to make sure it's
+        * been properly enabled.
+        */
        ssize_t (*transfer)(struct drm_dp_aux *aux,
                            struct drm_dp_aux_msg *msg);
        /**
         * @i2c_nack_count: Counts I2C NACKs, used for DP validation.
         */
@@@ -2124,6 -2171,51 +2188,51 @@@ drm_dp_has_quirk(const struct drm_dp_de
        return desc->quirks & BIT(quirk);
  }
  
+ /**
+  * struct drm_edp_backlight_info - Probed eDP backlight info struct
+  * @pwmgen_bit_count: The pwmgen bit count
+  * @pwm_freq_pre_divider: The PWM frequency pre-divider value being used for this backlight, if any
+  * @max: The maximum backlight level that may be set
+  * @lsb_reg_used: Do we also write values to the DP_EDP_BACKLIGHT_BRIGHTNESS_LSB register?
+  * @aux_enable: Does the panel support the AUX enable cap?
+  *
+  * This structure contains various data about an eDP backlight, which can be populated by using
+  * drm_edp_backlight_init().
+  */
+ struct drm_edp_backlight_info {
+       u8 pwmgen_bit_count;
+       u8 pwm_freq_pre_divider;
+       u16 max;
+       bool lsb_reg_used : 1;
+       bool aux_enable : 1;
+ };
+ int
+ drm_edp_backlight_init(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl,
+                      u16 driver_pwm_freq_hz, const u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE],
+                      u16 *current_level, u8 *current_mode);
+ int drm_edp_backlight_set_level(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl,
+                               u16 level);
+ int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl,
+                            u16 level);
+ int drm_edp_backlight_disable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl);
+ #if IS_ENABLED(CONFIG_DRM_KMS_HELPER) && (IS_BUILTIN(CONFIG_BACKLIGHT_CLASS_DEVICE) || \
+       (IS_MODULE(CONFIG_DRM_KMS_HELPER) && IS_MODULE(CONFIG_BACKLIGHT_CLASS_DEVICE)))
+ int drm_panel_dp_aux_backlight(struct drm_panel *panel, struct drm_dp_aux *aux);
+ #else
+ static inline int drm_panel_dp_aux_backlight(struct drm_panel *panel,
+                                            struct drm_dp_aux *aux)
+ {
+       return 0;
+ }
+ #endif
  #ifdef CONFIG_DRM_DP_CEC
  void drm_dp_cec_irq(struct drm_dp_aux *aux);
  void drm_dp_cec_register_connector(struct drm_dp_aux *aux,