Merge tag 'drm-misc-next-2023-01-19' of git://anongit.freedesktop.org/drm/drm-misc...
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 24 Jan 2023 16:36:29 +0000 (17:36 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 24 Jan 2023 16:36:29 +0000 (17:36 +0100)
drm-misc-next for $kernel-version:

UAPI Changes:

Cross-subsystem Changes:

Core Changes:

 * Cleanup unneeded include statements wrt <linux/fb.h>, <drm/drm_fb_helper.h>
   and <drm/drm_crtc_helper.h>

 * Remove unused helper DRM_DEBUG_KMS_RATELIMITED()

 * fbdev: Remove obsolete aperture field from struct fb_device, plus
   driver cleanups; Remove unused flag FBINFO_MISC_FIRMWARE

 * MIPI-DSI: Fix brightness, plus rsp. driver updates

 * scheduler: Deprecate drm_sched_resubmit_jobs()

 * ttm: Fix MIPS build; Remove ttm_bo_wait(); Documentation fixes

Driver Changes:

 * Remove obsolete drivers for userspace modesetting i810, mga, r128,
   savage, sis, tdfx, via

 * bridge: Support CDNS DSI J721E, plus DT bindings; lt9611: Various
   fixes and improvements; sil902x: Various fixes; Fixes

 * nouveau: Removed support for legacy ioctls; Replace zero-size array;
   Cleanups

 * panel: Fixes

 * radeon: Use new DRM logging helpers

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/Y8kDk5YX7Yz3eRhM@linux-uq9g
21 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/video/fbdev/core/fbcon.c
drivers/video/fbdev/hyperv_fb.c
include/drm/drm_drv.h
samples/vfio-mdev/mdpy-fb.c

diff --combined MAINTAINERS
index 7fc9e31ab03fa70cab4fe0b8cad57861c770ac84,615b4569892368dd5312bd18b276a80786c8b8a3..1bd2a1d3f14f19ae0c2656c028e885bb15f7a1e3
@@@ -312,13 -312,6 +312,13 @@@ L:       linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/counter/104-quad-8.c
  
 +ACCES IDIO-16 GPIO LIBRARY
 +M:    William Breathitt Gray <william.gray@linaro.org>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/gpio/gpio-idio-16.c
 +F:    drivers/gpio/gpio-idio-16.h
 +
  ACCES PCI-IDIO-16 GPIO DRIVER
  M:    William Breathitt Gray <william.gray@linaro.org>
  L:    linux-gpio@vger.kernel.org
@@@ -782,24 -775,6 +782,24 @@@ T:       git git://linuxtv.org/media_tree.gi
  F:    Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml
  F:    drivers/media/platform/sunxi/sun4i-csi/
  
 +ALLWINNER A31 CSI DRIVER
 +M:    Yong Deng <yong.deng@magewell.com>
 +M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 +F:    drivers/media/platform/sunxi/sun6i-csi/
 +
 +ALLWINNER A31 ISP DRIVER
 +M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml
 +F:    drivers/staging/media/sunxi/sun6i-isp/
 +F:    drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h
 +
  ALLWINNER A31 MIPI CSI-2 BRIDGE DRIVER
  M:    Paul Kocialkowski <paul.kocialkowski@bootlin.com>
  L:    linux-media@vger.kernel.org
@@@ -1118,16 -1093,6 +1118,16 @@@ S:    Maintaine
  F:    Documentation/hid/amd-sfh*
  F:    drivers/hid/amd-sfh-hid/
  
 +AMLOGIC DDR PMU DRIVER
 +M:    Jiucheng Xu <jiucheng.xu@amlogic.com>
 +L:    linux-amlogic@lists.infradead.org
 +S:    Supported
 +W:    http://www.amlogic.com
 +F:    Documentation/admin-guide/perf/meson-ddr-pmu.rst
 +F:    Documentation/devicetree/bindings/perf/amlogic,g12-ddr-pmu.yaml
 +F:    drivers/perf/amlogic/
 +F:    include/soc/amlogic/
 +
  AMPHION VPU CODEC V4L2 DRIVER
  M:    Ming Qian <ming.qian@nxp.com>
  M:    Shijie Qin <shijie.qin@nxp.com>
@@@ -1152,15 -1117,6 +1152,15 @@@ T:    git git://git.kernel.org/pub/scm/lin
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
  F:    drivers/net/amt.c
  
 +ANALOG DEVICES INC AD4130 DRIVER
 +M:    Cosmin Tanislav <cosmin.tanislav@analog.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +W:    http://ez.analog.com/community/linux-device-drivers
 +F:    Documentation/ABI/testing/sysfs-bus-iio-adc-ad4130
 +F:    Documentation/devicetree/bindings/iio/adc/adi,ad4130.yaml
 +F:    drivers/iio/adc/ad4130.c
 +
  ANALOG DEVICES INC AD7192 DRIVER
  M:    Alexandru Tachici <alexandru.tachici@analog.com>
  L:    linux-iio@vger.kernel.org
@@@ -1210,14 -1166,6 +1210,14 @@@ W:    https://ez.analog.com/linux-software
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
  F:    drivers/iio/adc/ad7780.c
  
 +ANALOG DEVICES INC AD74115 DRIVER
 +M:    Cosmin Tanislav <cosmin.tanislav@analog.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +W:    http://ez.analog.com/community/linux-device-drivers
 +F:    Documentation/devicetree/bindings/iio/addac/adi,ad74115.yaml
 +F:    drivers/iio/addac/ad74115.c
 +
  ANALOG DEVICES INC AD74413R DRIVER
  M:    Cosmin Tanislav <cosmin.tanislav@analog.com>
  L:    linux-iio@vger.kernel.org
@@@ -1241,14 -1189,6 +1241,14 @@@ W:    https://ez.analog.com/linux-software
  F:    Documentation/devicetree/bindings/iio/amplifiers/adi,ada4250.yaml
  F:    drivers/iio/amplifiers/ada4250.c
  
 +ANALOG DEVICES INC ADF4377 DRIVER
 +M:    Antoniu Miclaus <antoniu.miclaus@analog.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/iio/frequency/adi,adf4377.yaml
 +F:    drivers/iio/frequency/adf4377.c
 +
  ANALOG DEVICES INC ADGS1408 DRIVER
  M:    Mircea Caprioru <mircea.caprioru@analog.com>
  S:    Supported
@@@ -1745,7 -1685,7 +1745,7 @@@ M:      Miquel Raynal <miquel.raynal@bootlin
  M:    Naga Sureshkumar Relli <nagasure@xilinx.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/memory-controllers/arm,pl353-smc.yaml
 +F:    Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
  F:    drivers/memory/pl353-smc.c
  
  ARM PRIMECELL CLCD PL110 DRIVER
@@@ -1957,14 -1897,12 +1957,14 @@@ T:   git https://github.com/AsahiLinux/li
  F:    Documentation/devicetree/bindings/arm/apple.yaml
  F:    Documentation/devicetree/bindings/arm/apple/*
  F:    Documentation/devicetree/bindings/clock/apple,nco.yaml
 +F:    Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml
  F:    Documentation/devicetree/bindings/dma/apple,admac.yaml
  F:    Documentation/devicetree/bindings/i2c/apple,i2c.yaml
  F:    Documentation/devicetree/bindings/interrupt-controller/apple,*
  F:    Documentation/devicetree/bindings/iommu/apple,dart.yaml
  F:    Documentation/devicetree/bindings/iommu/apple,sart.yaml
  F:    Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml
 +F:    Documentation/devicetree/bindings/net/bluetooth/brcm,bcm4377-bluetooth.yaml
  F:    Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml
  F:    Documentation/devicetree/bindings/nvmem/apple,efuses.yaml
  F:    Documentation/devicetree/bindings/pci/apple,pcie.yaml
@@@ -1972,9 -1910,7 +1972,9 @@@ F:      Documentation/devicetree/bindings/pi
  F:    Documentation/devicetree/bindings/power/apple*
  F:    Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
  F:    arch/arm64/boot/dts/apple/
 +F:    drivers/bluetooth/hci_bcm4377.c
  F:    drivers/clk/clk-apple-nco.c
 +F:    drivers/cpufreq/apple-soc-cpufreq.c
  F:    drivers/dma/apple-admac.c
  F:    drivers/i2c/busses/i2c-pasemi-core.c
  F:    drivers/i2c/busses/i2c-pasemi-platform.c
@@@ -2330,13 -2266,14 +2330,13 @@@ F:   Documentation/devicetree/bindings/bu
  F:    Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
  F:    Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
  F:    Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
 +F:    arch/arm/boot/dts/intel-ixp*
  F:    arch/arm/mach-ixp4xx/
  F:    drivers/bus/intel-ixp4xx-eb.c
  F:    drivers/clocksource/timer-ixp4xx.c
  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
 -F:    include/linux/platform_data/timer-ixp4xx.h
  
  ARM/INTEL KEEMBAY ARCHITECTURE
  M:    Paul J. Murphy <paul.j.murphy@intel.com>
@@@ -2404,8 -2341,6 +2404,8 @@@ M:      Gregory Clement <gregory.clement@boo
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt
 +F:    Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt
  F:    Documentation/devicetree/bindings/soc/dove/
  F:    arch/arm/boot/dts/dove*
  F:    arch/arm/boot/dts/orion5x*
@@@ -2422,7 -2357,6 +2422,7 @@@ M:      Sebastian Hesselbarth <sebastian.hes
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gclement/mvebu.git
 +F:    Documentation/devicetree/bindings/arm/marvell/
  F:    arch/arm/boot/dts/armada*
  F:    arch/arm/boot/dts/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
@@@ -2505,7 -2439,6 +2505,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Supported
  T:    git git://github.com/microchip-ung/linux-upstream.git
  F:    arch/arm64/boot/dts/microchip/
 +F:    drivers/net/ethernet/microchip/vcap/
  F:    drivers/pinctrl/pinctrl-microchip-sgpio.c
  N:    sparx5
  
@@@ -2687,7 -2620,7 +2687,7 @@@ W:      http://www.armlinux.org.uk
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <agross@kernel.org>
  M:    Bjorn Andersson <andersson@kernel.org>
 -R:    Konrad Dybcio <konrad.dybcio@somainline.org>
 +R:    Konrad Dybcio <konrad.dybcio@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@@ -2758,7 -2691,7 +2758,7 @@@ F:      arch/arm/boot/dts/rtd
  F:    arch/arm/mach-realtek/
  F:    arch/arm64/boot/dts/realtek/
  
 -ARM/RENESAS ARCHITECTURE
 +ARM/RISC-V/RENESAS ARCHITECTURE
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
  M:    Magnus Damm <magnus.damm@gmail.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -2766,6 -2699,7 +2766,6 @@@ S:      Supporte
  Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
  C:    irc://irc.libera.chat/renesas-soc
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-devel.git next
 -F:    Documentation/devicetree/bindings/arm/renesas.yaml
  F:    Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml
  F:    Documentation/devicetree/bindings/soc/renesas/
  F:    arch/arm/boot/dts/emev2*
@@@ -2779,7 -2713,6 +2779,7 @@@ F:      arch/arm/configs/shmobile_defconfi
  F:    arch/arm/include/debug/renesas-scif.S
  F:    arch/arm/mach-shmobile/
  F:    arch/arm64/boot/dts/renesas/
 +F:    arch/riscv/boot/dts/renesas/
  F:    drivers/soc/renesas/
  F:    include/linux/soc/renesas/
  
@@@ -5008,12 -4941,6 +5008,12 @@@ S:    Maintaine
  F:    drivers/platform/chrome/cros_usbpd_notify.c
  F:    include/linux/platform_data/cros_usbpd_notify.h
  
 +CHROMEOS HPS DRIVER
 +M:    Dan Callaghan <dcallagh@chromium.org>
 +R:    Sami Kyöstilä <skyostil@chromium.org>
 +S:    Maintained
 +F:    drivers/platform/chrome/cros_hps_i2c.c
 +
  CHRONTEL CH7322 CEC DRIVER
  M:    Joe Tessler <jrt@google.com>
  L:    linux-media@vger.kernel.org
@@@ -5372,7 -5299,7 +5372,7 @@@ M:      Johannes Weiner <hannes@cmpxchg.org
  M:    Michal Hocko <mhocko@kernel.org>
  M:    Roman Gushchin <roman.gushchin@linux.dev>
  M:    Shakeel Butt <shakeelb@google.com>
 -R:    Muchun Song <songmuchun@bytedance.com>
 +R:    Muchun Song <muchun.song@linux.dev>
  L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
@@@ -5575,6 -5502,14 +5575,6 @@@ M:     Jaya Kumar <jayakumar.alsa@gmail.com
  S:    Maintained
  F:    sound/pci/cs5535audio/
  
 -CSI DRIVERS FOR ALLWINNER V3s
 -M:    Yong Deng <yong.deng@magewell.com>
 -L:    linux-media@vger.kernel.org
 -S:    Maintained
 -T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml
 -F:    drivers/media/platform/sunxi/sun6i-csi/
 -
  CTU CAN FD DRIVER
  M:    Pavel Pisa <pisa@cmp.felk.cvut.cz>
  M:    Ondrej Ille <ondrej.ille@gmail.com>
@@@ -5650,6 -5585,8 +5650,6 @@@ F:      drivers/scsi/cxgbi/cxgb3
  
  CXGB4 CRYPTO DRIVER (chcr)
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
 -M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
 -M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5657,6 -5594,8 +5657,6 @@@ F:      drivers/crypto/chelsi
  
  CXGB4 INLINE CRYPTO DRIVER
  M:    Ayush Sawal <ayush.sawal@chelsio.com>
 -M:    Vinay Kumar Yadav <vinay.yadav@chelsio.com>
 -M:    Rohit Maheshwari <rohitm@chelsio.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.chelsio.com
@@@ -5919,13 -5858,6 +5919,13 @@@ L:    Dell.Client.Kernel@dell.co
  S:    Maintained
  F:    drivers/platform/x86/dell/dell-wmi-descriptor.c
  
 +DELL WMI DDV DRIVER
 +M:    Armin Wolf <W_Armin@gmx.de>
 +S:    Maintained
 +F:    Documentation/ABI/testing/debugfs-dell-wmi-ddv
 +F:    Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
 +F:    drivers/platform/x86/dell/dell-wmi-ddv.c
 +
  DELL WMI SYSMAN DRIVER
  M:    Divya Bharathi <divya.bharathi@dell.com>
  M:    Prasanth Ksr <prasanth.ksr@dell.com>
@@@ -6101,12 -6033,11 +6101,12 @@@ F:   include/net/devlink.
  F:    include/uapi/linux/devlink.h
  F:    net/core/devlink.c
  
 -DH ELECTRONICS IMX6 DHCOM BOARD SUPPORT
 +DH ELECTRONICS IMX6 DHCOM/DHCOR BOARD SUPPORT
  M:    Christoph Niedermaier <cniedermaier@dh-electronics.com>
  L:    kernel@dh-electronics.com
  S:    Maintained
  F:    arch/arm/boot/dts/imx6*-dhcom-*
 +F:    arch/arm/boot/dts/imx6*-dhcor-*
  
  DH ELECTRONICS STM32MP1 DHCOM/DHCOR BOARD SUPPORT
  M:    Marek Vasut <marex@denx.de>
@@@ -6398,7 -6329,6 +6398,7 @@@ F:      drivers/net/ethernet/freescale/dpaa2
  F:    drivers/net/ethernet/freescale/dpaa2/Makefile
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth*
  F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-mac*
 +F:    drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk*
  F:    drivers/net/ethernet/freescale/dpaa2/dpkg.h
  F:    drivers/net/ethernet/freescale/dpaa2/dpmac*
  F:    drivers/net/ethernet/freescale/dpaa2/dpni*
@@@ -6579,11 -6509,6 +6579,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
  F:    drivers/gpu/drm/tiny/ili9486.c
  
- DRM DRIVER FOR INTEL I810 VIDEO CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/i810/
- F:    include/uapi/drm/i810_drm.h
  DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
  M:    Jagan Teki <jagan@edgeble.ai>
  S:    Maintained
@@@ -6612,11 -6537,6 +6607,6 @@@ S:     Maintaine
  F:    Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml
  F:    drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c
  
- DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/mga/
- F:    include/uapi/drm/mga_drm.h
  DRM DRIVER FOR MGA G200 GRAPHICS CHIPS
  M:    Dave Airlie <airlied@redhat.com>
  R:    Thomas Zimmermann <tzimmermann@suse.de>
@@@ -6735,11 -6655,6 +6725,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    drivers/gpu/drm/qxl/
  F:    include/uapi/drm/qxl_drm.h
  
- DRM DRIVER FOR RAGE 128 VIDEO CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/r128/
- F:    include/uapi/drm/r128_drm.h
  DRM DRIVER FOR RAYDIUM RM67191 PANELS
  M:    Robert Chiras <robert.chiras@nxp.com>
  S:    Maintained
@@@ -6767,11 -6682,6 +6752,6 @@@ S:     Maintaine
  F:    Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
  F:    drivers/gpu/drm/panel/panel-sitronix-st7703.c
  
- DRM DRIVER FOR SAVAGE VIDEO CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/savage/
- F:    include/uapi/drm/savage_drm.h
  DRM DRIVER FOR FIRMWARE FRAMEBUFFERS
  M:    Thomas Zimmermann <tzimmermann@suse.de>
  M:    Javier Martinez Canillas <javierm@redhat.com>
@@@ -6787,11 -6697,6 +6767,6 @@@ F:     include/drm/drm_aperture.
  F:    include/linux/aperture.h
  F:    include/video/nomodeset.h
  
- DRM DRIVER FOR SIS VIDEO CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/sis/
- F:    include/uapi/drm/sis_drm.h
  DRM DRIVER FOR SITRONIX ST7586 PANELS
  M:    David Lechner <david@lechnology.com>
  S:    Maintained
@@@ -6819,10 -6724,6 +6794,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ste,mcde.yaml
  F:    drivers/gpu/drm/mcde/
  
- DRM DRIVER FOR TDFX VIDEO CARDS
- S:    Orphan / Obsolete
- F:    drivers/gpu/drm/tdfx/
  DRM DRIVER FOR TI DLPC3433 MIPI DSI TO DMD BRIDGE
  M:    Jagan Teki <jagan@amarulasolutions.com>
  S:    Maintained
@@@ -6914,15 -6815,6 +6885,15 @@@ F:    include/drm/drm
  F:    include/linux/vga*
  F:    include/uapi/drm/drm*
  
 +DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
 +M:    Oded Gabbay <ogabbay@kernel.org>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Maintained
 +C:    irc://irc.oftc.net/dri-devel
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
 +F:    Documentation/accel/
 +F:    drivers/accel/
 +
  DRM DRIVERS FOR ALLWINNER A10
  M:    Maxime Ripard <mripard@kernel.org>
  M:    Chen-Yu Tsai <wens@csie.org>
@@@ -7458,9 -7350,9 +7429,9 @@@ F:      drivers/edac/thunderx_edac
  
  EDAC-CORE
  M:    Borislav Petkov <bp@alien8.de>
 -M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  M:    Tony Luck <tony.luck@intel.com>
  R:    James Morse <james.morse@arm.com>
 +R:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Robert Richter <rric@kernel.org>
  L:    linux-edac@vger.kernel.org
  S:    Supported
@@@ -7577,7 -7469,8 +7548,7 @@@ S:      Maintaine
  F:    drivers/edac/pnd2_edac.[ch]
  
  EDAC-QCOM
 -M:    Channagoud Kadabi <ckadabi@codeaurora.org>
 -M:    Venkata Narendra Kumar Gutta <vnkgutta@codeaurora.org>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-msm@vger.kernel.org
  L:    linux-edac@vger.kernel.org
  S:    Maintained
@@@ -7778,7 -7671,6 +7749,7 @@@ ETAS ES58X CAN/USB DRIVE
  M:    Vincent Mailhol <mailhol.vincent@wanadoo.fr>
  L:    linux-can@vger.kernel.org
  S:    Maintained
 +F:    Documentation/networking/devlink/etas_es58x.rst
  F:    drivers/net/can/usb/etas_es58x/
  
  ETHERNET BRIDGE
@@@ -7884,6 -7776,7 +7855,6 @@@ F:      Documentation/admin-guide/efi-stub.r
  F:    arch/*/include/asm/efi.h
  F:    arch/*/kernel/efi.c
  F:    arch/arm/boot/compressed/efi-header.S
 -F:    arch/arm64/kernel/efi-entry.S
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
@@@ -7929,7 -7822,6 +7900,7 @@@ M:      Chao Yu <chao@kernel.org
  L:    linux-f2fs-devel@lists.sourceforge.net
  S:    Maintained
  W:    https://f2fs.wiki.kernel.org/
 +B:    https://bugzilla.kernel.org/enter_bug.cgi?product=File%20System&component=f2fs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
  F:    Documentation/ABI/testing/sysfs-fs-f2fs
  F:    Documentation/filesystems/f2fs.rst
@@@ -7968,12 -7860,6 +7939,12 @@@ F:    fs/notify/fanotify
  F:    include/linux/fanotify.h
  F:    include/uapi/linux/fanotify.h
  
 +FARADAY FOTG210 USB2 DUAL-ROLE CONTROLLER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/fotg210/
 +
  FARSYNC SYNCHRONOUS DRIVER
  M:    Kevin Curtis <kevin.curtis@farsite.co.uk>
  S:    Supported
@@@ -8152,8 -8038,6 +8123,8 @@@ S:      Supporte
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
  F:    include/linux/fortify-string.h
  F:    lib/fortify_kunit.c
 +F:    lib/memcpy_kunit.c
 +F:    lib/strscpy_kunit.c
  F:    lib/test_fortify/*
  F:    scripts/test_fortify.sh
  K:    \b__NO_FORTIFY\b
@@@ -8290,10 -8174,7 +8261,10 @@@ S:    Maintaine
  F:    drivers/i2c/busses/i2c-cpm.c
  
  FREESCALE IMX / MXC FEC DRIVER
 -M:    Joakim Zhang <qiangqing.zhang@nxp.com>
 +M:    Wei Fang <wei.fang@nxp.com>
 +R:    Shenwei Wang <shenwei.wang@nxp.com>
 +R:    Clark Wang <xiaoning.wang@nxp.com>
 +R:    NXP Linux Team <linux-imx@nxp.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/fsl,fec.yaml
@@@ -8567,9 -8448,6 +8538,9 @@@ FUNCTION HOOKS (FTRACE
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
  R:    Mark Rutland <mark.rutland@arm.com>
 +L:    linux-kernel@vger.kernel.org
 +L:    linux-trace-kernel@vger.kernel.org
 +Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/ftrace*
@@@ -8855,7 -8733,6 +8826,7 @@@ GPIO IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/gpio-ir-tx.yaml
  F:    drivers/media/rc/gpio-ir-tx.c
  
  GPIO MOCKUP DRIVER
@@@ -9279,13 -9156,6 +9250,13 @@@ W:    http://www.highpoint-tech.co
  F:    Documentation/scsi/hptiop.rst
  F:    drivers/scsi/hptiop.c
  
 +HIMAX HX83112B TOUCHSCREEN SUPPORT
 +M:    Job Noorman <job@noorman.info>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml
 +F:    drivers/input/touchscreen/himax_hx83112b.c
 +
  HIPPI
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-hippi@sunsite.dk
@@@ -9315,7 -9185,6 +9286,7 @@@ HISILICON GPIO DRIVE
  M:    Jay Fang <f.fangjian@huawei.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/gpio/hisilicon,ascend910-gpio.yaml
  F:    drivers/gpio/gpio-hisi.c
  
  HISILICON HIGH PERFORMANCE RSA ENGINE DRIVER (HPRE)
@@@ -9332,7 -9201,6 +9303,7 @@@ M:      Yicong Yang <yangyicong@hisilicon.co
  L:    linux-i2c@vger.kernel.org
  S:    Maintained
  W:    https://www.hisilicon.com
 +F:    Documentation/devicetree/bindings/i2c/hisilicon,ascend910-i2c.yaml
  F:    drivers/i2c/busses/i2c-hisi.c
  
  HISILICON LPC BUS DRIVER
@@@ -9367,7 -9235,7 +9338,7 @@@ F:      drivers/misc/hisi_hikey_usb.
  
  HISILICON PMU DRIVER
  M:    Shaokun Zhang <zhangshaokun@hisilicon.com>
 -M:    Qi Liu <liuqi115@huawei.com>
 +M:    Jonathan Cameron <jonathan.cameron@huawei.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/admin-guide/perf/hisi-pcie-pmu.rst
@@@ -9416,7 -9284,7 +9387,7 @@@ F:      Documentation/devicetree/bindings/in
  F:    drivers/infiniband/hw/hns/
  
  HISILICON SAS Controller
 -M:    John Garry <john.garry@huawei.com>
 +M:    Xiang Chen <chenxiang66@hisilicon.com>
  S:    Supported
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/scsi/hisilicon-sas.txt
@@@ -9485,7 -9353,7 +9456,7 @@@ F:      drivers/net/wireless/intersil/hostap
  HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
  L:    platform-driver-x86@vger.kernel.org
  S:    Orphan
 -F:    drivers/platform/x86/tc1100-wmi.c
 +F:    drivers/platform/x86/hp/tc1100-wmi.c
  
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
@@@ -9555,15 -9423,14 +9526,15 @@@ F:   Documentation/devicetree/bindings/ii
  F:    drivers/iio/humidity/hts221*
  
  HUAWEI ETHERNET DRIVER
 +M:    Cai Huoqing <cai.huoqing@linux.dev>
  L:    netdev@vger.kernel.org
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/networking/device_drivers/ethernet/huawei/hinic.rst
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB SUBSYSTEM
  M:    Mike Kravetz <mike.kravetz@oracle.com>
 -M:    Muchun Song <songmuchun@bytedance.com>
 +M:    Muchun Song <muchun.song@linux.dev>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-kernel-mm-hugepages
@@@ -9660,7 -9527,6 +9631,7 @@@ F:      include/asm-generic/hyperv-tlfs.
  F:    include/asm-generic/mshyperv.h
  F:    include/clocksource/hyperv_timer.h
  F:    include/linux/hyperv.h
 +F:    include/net/mana
  F:    include/uapi/linux/hyperv.h
  F:    net/vmw_vsock/hyperv_transport.c
  F:    tools/hv/
@@@ -9824,7 -9690,8 +9795,7 @@@ F:      Documentation/devicetree/bindings/i3
  F:    drivers/i3c/master/i3c-master-cdns.c
  
  I3C DRIVER FOR SYNOPSYS DESIGNWARE
 -M:    Vitor Soares <vitor.soares@synopsys.com>
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
  F:    drivers/i3c/master/dw*
  
@@@ -10146,11 -10013,6 +10117,11 @@@ F: Documentation/hwmon/ina2xx.rs
  F:    drivers/hwmon/ina2xx.c
  F:    include/linux/platform_data/ina2xx.h
  
 +INDEX OF FURTHER KERNEL DOCUMENTATION
 +M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +S:    Maintained
 +F:    Documentation/process/kernel-docs.rst
 +
  INDUSTRY PACK SUBSYSTEM (IPACK)
  M:    Samuel Iglesias Gonsalvez <siglesias@igalia.com>
  M:    Jens Taprogge <jens.taprogge@taprogge.org>
@@@ -10180,7 -10042,6 +10151,7 @@@ F:   drivers/infiniband
  F:    include/rdma/
  F:    include/trace/events/ib_mad.h
  F:    include/trace/events/ib_umad.h
 +F:    include/trace/misc/rdma.h
  F:    include/uapi/linux/if_infiniband.h
  F:    include/uapi/rdma/
  F:    samples/bpf/ibumad_kern.c
@@@ -10414,7 -10275,7 +10385,7 @@@ T:   git https://github.com/intel/gvt-lin
  F:    drivers/gpu/drm/i915/gvt/
  
  INTEL HID EVENT DRIVER
 -M:    Alex Hung <alex.hung@canonical.com>
 +M:    Alex Hung <alexhung@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    drivers/platform/x86/intel/hid.c
@@@ -10468,6 -10329,11 +10439,6 @@@ T:  git git://git.kernel.org/pub/scm/lin
  F:    drivers/iommu/intel/
  F:    include/linux/intel-svm.h
  
 -INTEL IOP-ADMA DMA DRIVER
 -R:    Dan Williams <dan.j.williams@intel.com>
 -S:    Odd fixes
 -F:    drivers/dma/iop-adma.c
 -
  INTEL IPU3 CSI-2 CIO2 DRIVER
  M:    Yong Zhi <yong.zhi@intel.com>
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
@@@ -10841,18 -10707,6 +10812,18 @@@ F: drivers/iommu/dma-iommu.
  F:    drivers/iommu/iova.c
  F:    include/linux/iova.h
  
 +IOMMUFD
 +M:    Jason Gunthorpe <jgg@nvidia.com>
 +M:    Kevin Tian <kevin.tian@intel.com>
 +L:    iommu@lists.linux.dev
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
 +F:    Documentation/userspace-api/iommufd.rst
 +F:    drivers/iommu/iommufd/
 +F:    include/linux/iommufd.h
 +F:    include/uapi/linux/iommufd.h
 +F:    tools/testing/selftests/iommu/
 +
  IOMMU SUBSYSTEM
  M:    Joerg Roedel <joro@8bytes.org>
  M:    Will Deacon <will@kernel.org>
@@@ -10885,7 -10739,6 +10856,7 @@@ T:   git git://git.kernel.dk/liburin
  F:    io_uring/
  F:    include/linux/io_uring.h
  F:    include/linux/io_uring_types.h
 +F:    include/trace/events/io_uring.h
  F:    include/uapi/linux/io_uring.h
  F:    tools/io_uring/
  
@@@ -11033,13 -10886,6 +11004,13 @@@ F: drivers/isdn/Makefil
  F:    drivers/isdn/hardware/
  F:    drivers/isdn/mISDN/
  
 +ISOFS FILESYSTEM
 +M:    Jan Kara <jack@suse.cz>
 +L:    linux-fsdevel@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/filesystems/isofs.rst
 +F:    fs/isofs/
 +
  IT87 HARDWARE MONITORING DRIVER
  M:    Jean Delvare <jdelvare@suse.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -11101,9 -10947,9 +11072,9 @@@ F:   drivers/hwmon/jc42.
  JFS FILESYSTEM
  M:    Dave Kleikamp <shaggy@kernel.org>
  L:    jfs-discussion@lists.sourceforge.net
 -S:    Maintained
 +S:    Odd Fixes
  W:    http://jfs.sourceforge.net/
 -T:    git git://github.com/kleikamp/linux-shaggy.git
 +T:    git https://github.com/kleikamp/linux-shaggy.git
  F:    Documentation/admin-guide/jfs.rst
  F:    fs/jfs/
  
@@@ -11258,8 -11104,6 +11229,8 @@@ M:   Kees Cook <keescook@chromium.org
  L:    linux-hardening@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
 +F:    Documentation/ABI/testing/sysfs-kernel-oops_count
 +F:    Documentation/ABI/testing/sysfs-kernel-warn_count
  F:    include/linux/overflow.h
  F:    include/linux/randomize_kstack.h
  F:    mm/usercopy.c
@@@ -11278,18 -11122,11 +11249,18 @@@ L:        linux-nfs@vger.kernel.or
  S:    Supported
  W:    http://nfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
 +F:    fs/exportfs/
  F:    fs/lockd/
  F:    fs/nfs_common/
  F:    fs/nfsd/
  F:    include/linux/lockd/
  F:    include/linux/sunrpc/
 +F:    include/trace/events/rpcgss.h
 +F:    include/trace/events/rpcrdma.h
 +F:    include/trace/events/sunrpc.h
 +F:    include/trace/misc/fs.h
 +F:    include/trace/misc/nfs.h
 +F:    include/trace/misc/sunrpc.h
  F:    include/uapi/linux/nfsd/
  F:    include/uapi/linux/sunrpc/
  F:    net/sunrpc/
@@@ -11475,17 -11312,7 +11446,17 @@@ F: arch/x86/kvm/hyperv.
  F:    arch/x86/kvm/kvm_onhyperv.*
  F:    arch/x86/kvm/svm/hyperv.*
  F:    arch/x86/kvm/svm/svm_onhyperv.*
 -F:    arch/x86/kvm/vmx/evmcs.*
 +F:    arch/x86/kvm/vmx/hyperv.*
 +
 +KVM X86 Xen (KVM/Xen)
 +M:    David Woodhouse <dwmw2@infradead.org>
 +M:    Paul Durrant <paul@xen.org>
 +M:    Sean Christopherson <seanjc@google.com>
 +M:    Paolo Bonzini <pbonzini@redhat.com>
 +L:    kvm@vger.kernel.org
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
 +F:    arch/x86/kvm/xen.*
  
  KERNFS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
@@@ -11607,12 -11434,6 +11578,12 @@@ F: drivers/mfd/khadas-mcu.
  F:    include/linux/mfd/khadas-mcu.h
  F:    drivers/thermal/khadas_mcu_fan.c
  
 +KIONIX/ROHM KX022A ACCELEROMETER
 +M:    Matti Vaittinen <mazziesaccount@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +F:    drivers/iio/accel/kionix-kx022a*
 +
  KMEMLEAK
  M:    Catalin Marinas <catalin.marinas@arm.com>
  S:    Maintained
@@@ -11650,9 -11471,6 +11621,9 @@@ M:   Naveen N. Rao <naveen.n.rao@linux.ib
  M:    Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
 +L:    linux-kernel@vger.kernel.org
 +L:    linux-trace-kernel@vger.kernel.org
 +Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/kprobes.rst
@@@ -11736,13 -11554,11 +11707,13 @@@ F:        scripts/leaking_addresses.p
  
  LED SUBSYSTEM
  M:    Pavel Machek <pavel@ucw.cz>
 +M:    Lee Jones <lee@kernel.org>
  L:    linux-leds@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git
  F:    Documentation/devicetree/bindings/leds/
  F:    drivers/leds/
 +F:    include/dt-bindings/leds/
  F:    include/linux/leds.h
  
  LEGACY EEPROM DRIVER
@@@ -12032,7 -11848,7 +12003,7 @@@ M:   Eric Piel <eric.piel@tremplin-utc.ne
  S:    Maintained
  F:    Documentation/misc-devices/lis3lv02d.rst
  F:    drivers/misc/lis3lv02d/
 -F:    drivers/platform/x86/hp_accel.c
 +F:    drivers/platform/x86/hp/hp_accel.c
  
  LIST KUNIT TEST
  M:    David Gow <davidgow@google.com>
@@@ -12187,21 -12003,6 +12158,21 @@@ F: drivers/*/*loongarch
  F:    Documentation/loongarch/
  F:    Documentation/translations/zh_CN/loongarch/
  
 +LOONGSON-2 SOC SERIES GUTS DRIVER
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    loongarch@lists.linux.dev
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml
 +F:    drivers/soc/loongson/loongson2_guts.c
 +
 +LOONGSON-2 SOC SERIES PINCTRL DRIVER
 +M:    zhanghongchen <zhanghongchen@loongson.cn>
 +M:    Yinbo Zhu <zhuyinbo@loongson.cn>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
 +F:    drivers/pinctrl/pinctrl-loongson2.c
 +
  LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
  M:    Sathya Prakash <sathya.prakash@broadcom.com>
  M:    Sreekanth Reddy <sreekanth.reddy@broadcom.com>
@@@ -12279,7 -12080,7 +12250,7 @@@ M:   Alexey Kodanev <alexey.kodanev@oracl
  L:    ltp@lists.linux.it (subscribers-only)
  S:    Maintained
  W:    http://linux-test-project.github.io/
 -T:    git git://github.com/linux-test-project/ltp.git
 +T:    git https://github.com/linux-test-project/ltp.git
  
  LYNX 28G SERDES PHY DRIVER
  M:    Ioana Ciornei <ioana.ciornei@nxp.com>
@@@ -12504,7 -12305,7 +12475,7 @@@ M:   Marcin Wojtas <mw@semihalf.com
  M:    Russell King <linux@armlinux.org.uk>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/marvell-pp2.txt
 +F:    Documentation/devicetree/bindings/net/marvell,pp2.yaml
  F:    drivers/net/ethernet/marvell/mvpp2/
  
  MARVELL MWIFIEX WIRELESS DRIVER
@@@ -12552,7 -12353,7 +12523,7 @@@ F:   Documentation/networking/device_driv
  F:    drivers/net/ethernet/marvell/octeontx2/af/
  
  MARVELL PRESTERA ETHERNET SWITCH DRIVER
 -M:    Taras Chornyi <tchornyi@marvell.com>
 +M:    Taras Chornyi <taras.chornyi@plvision.eu>
  S:    Supported
  W:    https://github.com/Marvell-switching/switchdev-prestera
  F:    drivers/net/ethernet/marvell/prestera/
@@@ -12694,12 -12495,6 +12665,12 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/regulator/maxim,max20086.yaml
  F:    drivers/regulator/max20086-regulator.c
  
 +MAXIM MAX30208 TEMPERATURE SENSOR DRIVER
 +M:    Rajat Khandelwal <rajat.khandelwal@linux.intel.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/temperature/max30208.c
 +
  MAXIM MAX77650 PMIC MFD DRIVER
  M:    Bartosz Golaszewski <brgl@bgdev.pl>
  L:    linux-kernel@vger.kernel.org
@@@ -12920,7 -12715,7 +12891,7 @@@ F:   Documentation/admin-guide/media/imx7
  F:    Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml
  F:    Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml
  F:    drivers/media/platform/nxp/imx-mipi-csis.c
 -F:    drivers/staging/media/imx/imx7-media-csi.c
 +F:    drivers/media/platform/nxp/imx7-media-csi.c
  
  MEDIA DRIVERS FOR HELENE
  M:    Abylay Ospan <aospan@netup.ru>
@@@ -13117,7 -12912,6 +13088,7 @@@ M:   Felix Fietkau <nbd@nbd.name
  M:    John Crispin <john@phrozen.org>
  M:    Sean Wang <sean.wang@mediatek.com>
  M:    Mark Lee <Mark-MC.Lee@mediatek.com>
 +M:    Lorenzo Bianconi <lorenzo@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/mediatek/
@@@ -13489,20 -13283,10 +13460,20 @@@ F:        include/linux/memory_hotplug.
  F:    include/linux/mm.h
  F:    include/linux/mmzone.h
  F:    include/linux/pagewalk.h
 -F:    include/linux/vmalloc.h
  F:    mm/
  F:    tools/testing/selftests/vm/
  
 +VMALLOC
 +M:    Andrew Morton <akpm@linux-foundation.org>
 +R:    Uladzislau Rezki <urezki@gmail.com>
 +R:    Christoph Hellwig <hch@infradead.org>
 +L:    linux-mm@kvack.org
 +S:    Maintained
 +W:    http://www.linux-mm.org
 +T:    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
 +F:    include/linux/vmalloc.h
 +F:    mm/vmalloc.c
 +
  MEMORY HOT(UN)PLUG
  M:    David Hildenbrand <david@redhat.com>
  M:    Oscar Salvador <osalvador@suse.de>
@@@ -13590,7 -13374,7 +13561,7 @@@ MESON NAND CONTROLLER DRIVER FOR AMLOGI
  M:    Liang Yang <liang.yang@amlogic.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.txt
 +F:    Documentation/devicetree/bindings/mtd/amlogic,meson-nand.yaml
  F:    drivers/mtd/nand/raw/meson_*
  
  MESON VIDEO DECODER DRIVER FOR AMLOGIC SOCS
@@@ -13609,6 -13393,7 +13580,6 @@@ F:   arch/arm64/boot/dts/marvell/armada-3
  
  MHI BUS
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 -R:    Hemant Kumar <quic_hemantk@quicinc.com>
  L:    mhi@lists.linux.dev
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -13633,6 -13418,7 +13604,6 @@@ L:   dmaengine@vger.kernel.or
  S:    Supported
  F:    Documentation/devicetree/bindings/dma/atmel-dma.txt
  F:    drivers/dma/at_hdmac.c
 -F:    drivers/dma/at_hdmac_regs.h
  F:    drivers/dma/at_xdmac.c
  F:    include/dt-bindings/dma/at91.h
  
@@@ -13669,7 -13455,7 +13640,7 @@@ M:   Eugen Hristev <eugen.hristev@microch
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
 -F:    drivers/media/platform/atmel/microchip-csi2dc.c
 +F:    drivers/media/platform/microchip/microchip-csi2dc.c
  
  MICROCHIP ECC DRIVER
  M:    Tudor Ambarus <tudor.ambarus@microchip.com>
@@@ -13696,10 -13482,8 +13667,10 @@@ L: linux-media@vger.kernel.or
  S:    Supported
  F:    Documentation/devicetree/bindings/media/atmel,isc.yaml
  F:    Documentation/devicetree/bindings/media/microchip,xisc.yaml
 -F:    drivers/media/platform/atmel/atmel-isc*
 -F:    drivers/media/platform/atmel/atmel-sama*-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-isc*
 +F:    drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
 +F:    drivers/media/platform/microchip/microchip-isc*
 +F:    drivers/media/platform/microchip/microchip-sama*-isc*
  F:    include/linux/atmel-isc-media.h
  
  MICROCHIP ISI DRIVER
@@@ -13842,7 -13626,7 +13813,7 @@@ MICROCHIP USB251XB DRIVE
  M:    Richard Leitner <richard.leitner@skidata.com>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/usb/usb251xb.txt
 +F:    Documentation/devicetree/bindings/usb/usb251xb.yaml
  F:    drivers/usb/misc/usb251xb.c
  
  MICROCHIP USBA UDC DRIVER
@@@ -13882,15 -13666,6 +13853,15 @@@ F: drivers/scsi/smartpqi/smartpqi*.[ch
  F:    include/linux/cciss*.h
  F:    include/uapi/linux/cciss*.h
  
 +MICROSOFT MANA RDMA DRIVER
 +M:    Long Li <longli@microsoft.com>
 +M:    Ajay Sharma <sharmaajay@microsoft.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Supported
 +F:    drivers/infiniband/hw/mana/
 +F:    include/net/mana
 +F:    include/uapi/rdma/mana-abi.h
 +
  MICROSOFT SURFACE AGGREGATOR TABLET-MODE SWITCH
  M:    Maximilian Luz <luzmaximilian@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -14166,7 -13941,6 +14137,7 @@@ F:   include/uapi/linux/meye.
  
  MOTORCOMM PHY DRIVER
  M:    Peter Geis <pgwipeout@gmail.com>
 +M:    Frank <Frank.Sae@motor-comm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/phy/motorcomm.c
@@@ -14784,9 -14558,10 +14755,9 @@@ T:  git git://git.kernel.org/pub/scm/lin
  F:    arch/nios2/
  
  NITRO ENCLAVES (NE)
 -M:    Andra Paraschiv <andraprs@amazon.com>
 -M:    Alexandru Vasile <lexnv@amazon.com>
  M:    Alexandru Ciobotaru <alcioa@amazon.com>
  L:    linux-kernel@vger.kernel.org
 +L:    The AWS Nitro Enclaves Team <aws-nitro-enclaves-devel@amazon.com>
  S:    Supported
  W:    https://aws.amazon.com/ec2/nitro/nitro-enclaves/
  F:    Documentation/virt/ne_overview.rst
@@@ -14923,7 -14698,6 +14894,7 @@@ L:   linux-nvme@lists.infradead.or
  S:    Supported
  W:    http://git.infradead.org/nvme.git
  T:    git://git.infradead.org/nvme.git
 +F:    Documentation/nvme/
  F:    drivers/nvme/host/
  F:    drivers/nvme/common/
  F:    include/linux/nvme*
@@@ -15345,7 -15119,6 +15316,7 @@@ F:   drivers/mfd/menelaus.
  F:    drivers/mfd/palmas.c
  F:    drivers/mfd/tps65217.c
  F:    drivers/mfd/tps65218.c
 +F:    drivers/mfd/tps65219.c
  F:    drivers/mfd/tps65910.c
  F:    drivers/mfd/twl-core.[ch]
  F:    drivers/mfd/twl4030*.c
@@@ -15402,13 -15175,6 +15373,13 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov08d10.c
  
 +OMNIVISION OV08X40 SENSOR DRIVER
 +M:    Jason Chen <jason.z.chen@intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    drivers/media/i2c/ov08x40.c
 +
  OMNIVISION OV13858 SENSOR DRIVER
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -15447,14 -15213,6 +15418,14 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov2740.c
  
 +OMNIVISION OV4689 SENSOR DRIVER
 +M:    Mikhail Rudenko <mike.rudenko@gmail.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml
 +F:    drivers/media/i2c/ov5647.c
 +
  OMNIVISION OV5640 SENSOR DRIVER
  M:    Steve Longerbeam <slongerbeam@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -15579,12 -15337,6 +15550,12 @@@ S: Maintaine
  F:    drivers/mtd/nand/onenand/
  F:    include/linux/mtd/onenand*.h
  
 +ONEXPLAYER FAN DRIVER
 +M:    Joaquín Ignacio Aramendía <samsagax@gmail.com>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hwmon/oxp-sensors.c
 +
  ONION OMEGA2+ BOARD
  M:    Harvey Hunt <harveyhuntnexus@gmail.com>
  L:    linux-mips@vger.kernel.org
@@@ -16188,7 -15940,6 +16159,7 @@@ Q:   https://patchwork.kernel.org/project
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +F:    Documentation/devicetree/bindings/pci/
  F:    drivers/pci/controller/
  F:    drivers/pci/pci-bridge-emul.c
  F:    drivers/pci/pci-bridge-emul.h
@@@ -16295,7 -16046,7 +16266,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/*microchip*
  
  PCIE DRIVER FOR QUALCOMM MSM
 -M:    Stanimir Varbanov <svarbanov@mm-sol.com>
 +M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -16385,8 -16136,7 +16356,8 @@@ F:   include/linux/peci-cpu.
  F:    include/linux/peci.h
  
  PENSANDO ETHERNET DRIVERS
 -M:    Shannon Nelson <snelson@pensando.io>
 +M:    Shannon Nelson <shannon.nelson@amd.com>
 +M:    Brett Creeley <brett.creeley@amd.com>
  M:    drivers@pensando.io
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -16438,7 -16188,7 +16409,7 @@@ F:   tools/lib/perf
  F:    tools/perf/
  
  PERFORMANCE EVENTS TOOLING ARM64
 -R:    John Garry <john.garry@huawei.com>
 +R:    John Garry <john.g.garry@oracle.com>
  R:    Will Deacon <will@kernel.org>
  R:    James Clark <james.clark@arm.com>
  R:    Mike Leach <mike.leach@linaro.org>
@@@ -16544,7 -16294,7 +16515,7 @@@ M:   Sean Wang <sean.wang@kernel.org
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt65xx-pinctrl.yaml
 -F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6797-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt6779-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml
  F:    Documentation/devicetree/bindings/pinctrl/mediatek,mt8183-pinctrl.yaml
  F:    drivers/pinctrl/mediatek/
@@@ -16617,6 -16367,13 +16588,6 @@@ S:  Supporte
  F:    Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml
  F:    drivers/input/keyboard/pinephone-keyboard.c
  
 -PKTCDVD DRIVER
 -M:    linux-block@vger.kernel.org
 -S:    Orphan
 -F:    drivers/block/pktcdvd.c
 -F:    include/linux/pktcdvd.h
 -F:    include/uapi/linux/pktcdvd.h
 -
  PLANTOWER PMS7003 AIR POLLUTION SENSOR DRIVER
  M:    Tomasz Duszynski <tduszyns@gmail.com>
  S:    Maintained
@@@ -16894,10 -16651,10 +16865,10 @@@ F:        net/psampl
  
  PSTORE FILESYSTEM
  M:    Kees Cook <keescook@chromium.org>
 -M:    Anton Vorontsov <anton@enomsg.org>
 -M:    Colin Cross <ccross@android.com>
 -M:    Tony Luck <tony.luck@intel.com>
 -S:    Maintained
 +R:    Tony Luck <tony.luck@intel.com>
 +R:    Guilherme G. Piccoli <gpiccoli@igalia.com>
 +L:    linux-hardening@vger.kernel.org
 +S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
  F:    Documentation/admin-guide/ramoops.rst
  F:    Documentation/admin-guide/pstore-blk.rst
@@@ -16944,6 -16701,7 +16915,6 @@@ M:   Hans Verkuil <hverkuil@xs4all.nl
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/admin-guide/media/pulse8-cec.rst
  F:    drivers/media/cec/usb/pulse8/
  
  PURELIFI PLFXLC DRIVER
@@@ -16974,7 -16732,6 +16945,7 @@@ PWM IR Transmitte
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +F:    Documentation/devicetree/bindings/leds/irled/pwm-ir-tx.yaml
  F:    drivers/media/rc/pwm-ir-tx.c
  
  PWM SUBSYSTEM
@@@ -17039,7 -16796,7 +17010,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <bgoswami@quicinc.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
 -F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
 +F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
  F:    Documentation/devicetree/bindings/sound/qcom,*
  F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
@@@ -17397,8 -17154,7 +17368,8 @@@ F:   Documentation/devicetree/bindings/th
  F:    drivers/thermal/qcom/
  
  QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
 -M:    Stanimir Varbanov <stanimir.varbanov@linaro.org>
 +M:    Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
 +M:    Vikash Garodia <quic_vgarodia@quicinc.com>
  L:    linux-media@vger.kernel.org
  L:    linux-arm-msm@vger.kernel.org
  S:    Maintained
@@@ -17716,8 -17472,10 +17687,8 @@@ S:  Maintaine
  F:    drivers/net/wireless/realtek/rtw89/
  
  REDPINE WIRELESS DRIVER
 -M:    Amitkumar Karwar <amitkarwar@gmail.com>
 -M:    Siva Rebbagondla <siva8118@gmail.com>
  L:    linux-wireless@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/net/wireless/rsi/
  
  REGISTER MAP ABSTRACTION
@@@ -18015,13 -17773,6 +17986,13 @@@ F: Documentation/ABI/*/sysfs-driver-hid
  F:    drivers/hid/hid-roccat*
  F:    include/linux/hid-roccat*
  
 +ROCKCHIP CRYPTO DRIVERS
 +M:    Corentin Labbe <clabbe@baylibre.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
 +F:    drivers/crypto/rockchip/
 +
  ROCKCHIP I2S TDM DRIVER
  M:    Nicolas Frattaroli <frattaroli.nicolas@gmail.com>
  L:    linux-rockchip@lists.infradead.org
@@@ -18247,7 -17998,7 +18218,7 @@@ L:   linux-fbdev@vger.kernel.or
  S:    Maintained
  F:    drivers/video/fbdev/savage/
  
 -S390
 +S390 ARCHITECTURE
  M:    Heiko Carstens <hca@linux.ibm.com>
  M:    Vasily Gorbik <gor@linux.ibm.com>
  M:    Alexander Gordeev <agordeev@linux.ibm.com>
@@@ -18302,15 -18053,6 +18273,15 @@@ L: netdev@vger.kernel.or
  S:    Supported
  F:    drivers/s390/net/
  
 +S390 MM
 +M:    Alexander Gordeev <agordeev@linux.ibm.com>
 +M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +S:    Supported
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
 +F:    arch/s390/include/asm/pgtable.h
 +F:    arch/s390/mm
 +
  S390 PCI SUBSYSTEM
  M:    Niklas Schnelle <schnelle@linux.ibm.com>
  M:    Gerald Schaefer <gerald.schaefer@linux.ibm.com>
@@@ -18738,7 -18480,6 +18709,7 @@@ K:   \bsecure_computin
  K:    \bTIF_SECCOMP\b
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
 +M:    Kamal Dasu <kdasu.kdev@gmail.com>
  M:    Al Cooper <alcooperx@gmail.com>
  R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mmc@vger.kernel.org
@@@ -18749,7 -18490,6 +18720,7 @@@ SECURE DIGITAL HOST CONTROLLER INTERFAC
  M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mmc@vger.kernel.org
  S:    Supported
 +F:    Documentation/devicetree/bindings/mmc/sdhci-common.yaml
  F:    drivers/mmc/host/sdhci*
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) MICROCHIP DRIVER
@@@ -19135,7 -18875,7 +19106,7 @@@ M:   Jason A. Donenfeld <Jason@zx2c4.com
  S:    Maintained
  F:    include/linux/siphash.h
  F:    lib/siphash.c
 -F:    lib/test_siphash.c
 +F:    lib/siphash_kunit.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
@@@ -19159,7 -18899,7 +19130,7 @@@ F:   drivers/video/fbdev/sis
  F:    include/video/sisfb.h
  
  SIS I2C TOUCHSCREEN DRIVER
 -M:    Mika Penttilä <mika.penttila@nextfour.com>
 +M:    Mika Penttilä <mpenttil@redhat.com>
  L:    linux-input@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/input/touchscreen/sis_i2c.txt
@@@ -19302,7 -19042,7 +19273,7 @@@ M:   Jassi Brar <jaswinder.singh@linaro.o
  M:    Ilias Apalodimas <ilias.apalodimas@linaro.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/socionext-netsec.txt
 +F:    Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml
  F:    drivers/net/ethernet/socionext/netsec.c
  
  SOCIONEXT (SNI) Synquacer SPI DRIVER
@@@ -19310,7 -19050,7 +19281,7 @@@ M:   Masahisa Kojima <masahisa.kojima@lin
  M:    Jassi Brar <jaswinder.singh@linaro.org>
  L:    linux-spi@vger.kernel.org
  S:    Maintained
 -F:    Documentation/devicetree/bindings/spi/spi-synquacer.txt
 +F:    Documentation/devicetree/bindings/spi/socionext,synquacer-spi.yaml
  F:    drivers/spi/spi-synquacer.c
  
  SOCIONEXT SYNQUACER I2C DRIVER
@@@ -19457,7 -19197,7 +19428,7 @@@ M:   Manivannan Sadhasivam <manivannan.sa
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/imx290.txt
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml
  F:    drivers/media/i2c/imx290.c
  
  SONY IMX319 SENSOR DRIVER
@@@ -19606,11 -19346,6 +19577,11 @@@ W: https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  F:    drivers/media/dvb-frontends/sp2*
  
 +SPANISH DOCUMENTATION
 +M:    Carlos Bilbao <carlos.bilbao@amd.com>
 +S:    Maintained
 +F:    Documentation/translations/sp_SP/
 +
  SPARC + UltraSPARC (sparc/sparc64)
  M:    "David S. Miller" <davem@davemloft.net>
  L:    sparclinux@vger.kernel.org
@@@ -19754,7 -19489,7 +19725,7 @@@ M:   Sylvain Petinot <sylvain.petinot@fos
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.txt
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml
  F:    drivers/media/i2c/st-mipid02.c
  
  ST STM32 I2C/SMBUS DRIVER
@@@ -19777,16 -19512,6 +19748,16 @@@ S: Maintaine
  F:    Documentation/hwmon/stpddc60.rst
  F:    drivers/hwmon/pmbus/stpddc60.c
  
 +ST VGXY61 DRIVER
 +M:    Benjamin Mugnier <benjamin.mugnier@foss.st.com>
 +M:    Sylvain Petinot <sylvain.petinot@foss.st.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml
 +F:    Documentation/userspace-api/media/drivers/st-vgxy61.rst
 +F:    drivers/media/i2c/st-vgxy61.c
 +
  ST VL53L0X ToF RANGER(I2C) IIO DRIVER
  M:    Song Qiang <songqiang1304521@gmail.com>
  L:    linux-iio@vger.kernel.org
@@@ -19802,7 -19527,6 +19773,7 @@@ S:   Supporte
  F:    Documentation/process/stable-kernel-rules.rst
  
  STAGING - ATOMISP DRIVER
 +M:    Hans de Goede <hdegoede@redhat.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
  R:    Sakari Ailus <sakari.ailus@linux.intel.com>
  L:    linux-media@vger.kernel.org
@@@ -20012,13 -19736,6 +19983,13 @@@ W: https://sunplus.atlassian.net/wiki/s
  F:    Documentation/devicetree/bindings/net/sunplus,sp7021-emac.yaml
  F:    drivers/net/ethernet/sunplus/
  
 +SUNPLUS MMC DRIVER
 +M:    Tony Huang <tonyhuang.sunplus@gmail.com>
 +M:    Li-hao Kuo <lhjeff911@gmail.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mmc/sunplus,mmc.yaml
 +F:    drivers/mmc/host/sunplus-mmc.c
 +
  SUNPLUS OCOTP DRIVER
  M:    Vincent Shih <vincent.sunplus@gmail.com>
  S:    Maintained
@@@ -20270,7 -19987,6 +20241,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
 +F:    drivers/powercap/arm_scmi_powercap.c
  F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
@@@ -20605,7 -20321,7 +20576,7 @@@ M:   Chris Zankel <chris@zankel.net
  M:    Max Filippov <jcmvbkbc@gmail.com>
  L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
 -T:    git git://github.com/czankel/xtensa-linux.git
 +T:    git https://github.com/jcmvbkbc/linux-xtensa.git
  F:    arch/xtensa/
  F:    drivers/irqchip/irq-xtensa-*
  
@@@ -20955,6 -20671,7 +20926,6 @@@ W:   https://wireless.wiki.kernel.org/en/
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
  F:    drivers/net/wireless/ti/
 -F:    include/linux/wl12xx.h
  
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <jstultz@google.com>
@@@ -21133,9 -20850,6 +21104,9 @@@ F:   drivers/hwmon/pmbus/tps546d24.
  TRACING
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Masami Hiramatsu <mhiramat@kernel.org>
 +L:    linux-kernel@vger.kernel.org
 +L:    linux-trace-kernel@vger.kernel.org
 +Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/trace/*
@@@ -21839,7 -21553,7 +21810,7 @@@ M:   Alex Williamson <alex.williamson@red
  R:    Cornelia Huck <cohuck@redhat.com>
  L:    kvm@vger.kernel.org
  S:    Maintained
 -T:    git git://github.com/awilliam/linux-vfio.git
 +T:    git https://github.com/awilliam/linux-vfio.git
  F:    Documentation/ABI/testing/sysfs-devices-vfio-dev
  F:    Documentation/driver-api/vfio.rst
  F:    drivers/vfio/
@@@ -22021,12 -21735,6 +21992,12 @@@ F: include/linux/virtio*.
  F:    include/uapi/linux/virtio_*.h
  F:    tools/virtio/
  
 +VISL VIRTUAL STATELESS DECODER DRIVER
 +M:    Daniel Almeida <daniel.almeida@collabora.com>
 +L:    linux-media@vger.kernel.org
 +S:    Supported
 +F:    drivers/media/test-drivers/visl
 +
  IFCVF VIRTIO DATA PATH ACCELERATOR
  R:    Zhu Lingshan <lingshan.zhu@intel.com>
  F:    drivers/vdpa/ifcvf/
@@@ -23060,7 -22768,8 +23031,7 @@@ F:   drivers/media/pci/zoran
  
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <minchan@kernel.org>
 -M:    Nitin Gupta <ngupta@vflare.org>
 -R:    Sergey Senozhatsky <senozhatsky@chromium.org>
 +M:    Sergey Senozhatsky <senozhatsky@chromium.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/admin-guide/blockdev/zram.rst
@@@ -23073,7 -22782,8 +23044,7 @@@ F:   drivers/tty/serial/zs.
  
  ZSMALLOC COMPRESSED SLAB MEMORY ALLOCATOR
  M:    Minchan Kim <minchan@kernel.org>
 -M:    Nitin Gupta <ngupta@vflare.org>
 -R:    Sergey Senozhatsky <senozhatsky@chromium.org>
 +M:    Sergey Senozhatsky <senozhatsky@chromium.org>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    Documentation/mm/zsmalloc.rst
  M:    Nick Terrell <terrelln@fb.com>
  S:    Maintained
  B:    https://github.com/facebook/zstd/issues
 -T:    git git://github.com/terrelln/linux.git
 +T:    git https://github.com/terrelln/linux.git
  F:    include/linux/zstd*
  F:    lib/zstd/
  F:    lib/decompress_unzstd.c
diff --combined drivers/gpu/drm/Makefile
index 496fa5a6147af9cc6f6aa8d4ee70ea48c93a9351,513dc8cb5346deaa894ec78928509ccbbb2793c9..ab4460fcd63f6b181e8d4e296dcc1527cd336245
@@@ -70,7 -70,6 +70,7 @@@ drm-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) +
  drm-$(CONFIG_DRM_PRIVACY_SCREEN) += \
        drm_privacy_screen.o \
        drm_privacy_screen_x86.o
 +drm-$(CONFIG_DRM_ACCEL) += ../../accel/drm_accel.o
  obj-$(CONFIG_DRM)     += drm.o
  
  obj-$(CONFIG_DRM_PANEL_ORIENTATION_QUIRKS) += drm_panel_orientation_quirks.o
@@@ -134,21 -133,14 +134,14 @@@ obj-y                   += arm
  obj-y                 += display/
  obj-$(CONFIG_DRM_TTM) += ttm/
  obj-$(CONFIG_DRM_SCHED)       += scheduler/
- obj-$(CONFIG_DRM_TDFX)        += tdfx/
- obj-$(CONFIG_DRM_R128)        += r128/
  obj-$(CONFIG_DRM_RADEON)+= radeon/
  obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
- obj-$(CONFIG_DRM_MGA) += mga/
- obj-$(CONFIG_DRM_I810)        += i810/
  obj-$(CONFIG_DRM_I915)        += i915/
  obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
  obj-$(CONFIG_DRM_MGAG200) += mgag200/
  obj-$(CONFIG_DRM_V3D)  += v3d/
  obj-$(CONFIG_DRM_VC4)  += vc4/
- obj-$(CONFIG_DRM_SIS)   += sis/
- obj-$(CONFIG_DRM_SAVAGE)+= savage/
  obj-$(CONFIG_DRM_VMWGFX)+= vmwgfx/
- obj-$(CONFIG_DRM_VIA) +=via/
  obj-$(CONFIG_DRM_VGEM)        += vgem/
  obj-$(CONFIG_DRM_VKMS)        += vkms/
  obj-$(CONFIG_DRM_NOUVEAU) +=nouveau/
index d2abd334b1b5ea2318bc91e910c5813e8e428df1,e4b99ba903a09b3565f129342a35ad3017b06873..6be30dcb029d579dd28995c10c0a8a27c762b81f
@@@ -25,7 -25,9 +25,9 @@@
   */
  
  #include <drm/display/drm_dp_helper.h>
+ #include <drm/drm_crtc_helper.h>
  #include <drm/drm_edid.h>
+ #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_probe_helper.h>
  #include <drm/amdgpu_drm.h>
  #include "amdgpu.h"
@@@ -327,6 -329,7 +329,6 @@@ static void amdgpu_connector_free_edid(
  
        kfree(amdgpu_connector->edid);
        amdgpu_connector->edid = NULL;
 -      drm_connector_update_edid_property(connector, NULL);
  }
  
  static int amdgpu_connector_ddc_get_modes(struct drm_connector *connector)
@@@ -996,33 -999,13 +998,33 @@@ amdgpu_connector_dvi_detect(struct drm_
                }
        }
  
 +      if (amdgpu_connector->detected_hpd_without_ddc) {
 +              force = true;
 +              amdgpu_connector->detected_hpd_without_ddc = false;
 +      }
 +
        if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) {
                ret = connector->status;
                goto exit;
        }
  
 -      if (amdgpu_connector->ddc_bus)
 +      if (amdgpu_connector->ddc_bus) {
                dret = amdgpu_display_ddc_probe(amdgpu_connector, false);
 +
 +              /* Sometimes the pins required for the DDC probe on DVI
 +               * connectors don't make contact at the same time that the ones
 +               * for HPD do. If the DDC probe fails even though we had an HPD
 +               * signal, try again later
 +               */
 +              if (!dret && !force &&
 +                  amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
 +                      DRM_DEBUG_KMS("hpd detected without ddc, retrying in 1 second\n");
 +                      amdgpu_connector->detected_hpd_without_ddc = true;
 +                      schedule_delayed_work(&adev->hotplug_work,
 +                                            msecs_to_jiffies(1000));
 +                      goto exit;
 +              }
 +      }
        if (dret) {
                amdgpu_connector->detected_by_load = false;
                amdgpu_connector_free_edid(connector);
index 4f38c55e767e1bf313c228fa409c1ce923a55f26,09042486e66e29dac845b73c95681c53cd978cd7..76a2b4a4de10e57091627439ff315e2d468b5aca
@@@ -36,8 -36,8 +36,9 @@@
  #include <generated/utsrelease.h>
  #include <linux/pci-p2pdma.h>
  
 +#include <drm/drm_aperture.h>
  #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_crtc_helper.h>
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_probe_helper.h>
  #include <drm/amdgpu_drm.h>
@@@ -91,8 -91,6 +92,8 @@@ MODULE_FIRMWARE("amdgpu/navi12_gpu_info
  #define AMDGPU_MAX_RETRY_LIMIT                2
  #define AMDGPU_RETRY_SRIOV_RESET(r) ((r) == -EBUSY || (r) == -ETIMEDOUT || (r) == -EINVAL)
  
 +static const struct drm_driver amdgpu_kms_driver;
 +
  const char *amdgpu_asic_name[] = {
        "TAHITI",
        "PITCAIRN",
@@@ -927,33 -925,32 +928,33 @@@ static int amdgpu_device_asic_init(stru
  }
  
  /**
 - * amdgpu_device_vram_scratch_init - allocate the VRAM scratch page
 + * amdgpu_device_mem_scratch_init - allocate the VRAM scratch page
   *
   * @adev: amdgpu_device pointer
   *
   * Allocates a scratch page of VRAM for use by various things in the
   * driver.
   */
 -static int amdgpu_device_vram_scratch_init(struct amdgpu_device *adev)
 +static int amdgpu_device_mem_scratch_init(struct amdgpu_device *adev)
  {
 -      return amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_SIZE,
 -                                     PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
 -                                     &adev->vram_scratch.robj,
 -                                     &adev->vram_scratch.gpu_addr,
 -                                     (void **)&adev->vram_scratch.ptr);
 +      return amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_SIZE, PAGE_SIZE,
 +                                     AMDGPU_GEM_DOMAIN_VRAM |
 +                                     AMDGPU_GEM_DOMAIN_GTT,
 +                                     &adev->mem_scratch.robj,
 +                                     &adev->mem_scratch.gpu_addr,
 +                                     (void **)&adev->mem_scratch.ptr);
  }
  
  /**
 - * amdgpu_device_vram_scratch_fini - Free the VRAM scratch page
 + * amdgpu_device_mem_scratch_fini - Free the VRAM scratch page
   *
   * @adev: amdgpu_device pointer
   *
   * Frees the VRAM scratch page.
   */
 -static void amdgpu_device_vram_scratch_fini(struct amdgpu_device *adev)
 +static void amdgpu_device_mem_scratch_fini(struct amdgpu_device *adev)
  {
 -      amdgpu_bo_free_kernel(&adev->vram_scratch.robj, NULL, NULL);
 +      amdgpu_bo_free_kernel(&adev->mem_scratch.robj, NULL, NULL);
  }
  
  /**
@@@ -1985,10 -1982,17 +1986,10 @@@ static int amdgpu_device_parse_gpu_info
        }
  
        snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
 -      err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev);
 -      if (err) {
 -              dev_err(adev->dev,
 -                      "Failed to load gpu_info firmware \"%s\"\n",
 -                      fw_name);
 -              goto out;
 -      }
 -      err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw);
 +      err = amdgpu_ucode_request(adev, &adev->firmware.gpu_info_fw, fw_name);
        if (err) {
                dev_err(adev->dev,
 -                      "Failed to validate gpu_info firmware \"%s\"\n",
 +                      "Failed to get gpu_info firmware \"%s\"\n",
                        fw_name);
                goto out;
        }
@@@ -2387,9 -2391,9 +2388,9 @@@ static int amdgpu_device_ip_init(struc
                        if (amdgpu_sriov_vf(adev))
                                amdgpu_virt_exchange_data(adev);
  
 -                      r = amdgpu_device_vram_scratch_init(adev);
 +                      r = amdgpu_device_mem_scratch_init(adev);
                        if (r) {
 -                              DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r);
 +                              DRM_ERROR("amdgpu_mem_scratch_init failed %d\n", r);
                                goto init_failed;
                        }
                        r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev);
                        /* right after GMC hw init, we create CSA */
                        if (amdgpu_mcbp) {
                                r = amdgpu_allocate_static_csa(adev, &adev->virt.csa_obj,
 -                                                              AMDGPU_GEM_DOMAIN_VRAM,
 -                                                              AMDGPU_CSA_SIZE);
 +                                                             AMDGPU_GEM_DOMAIN_VRAM |
 +                                                             AMDGPU_GEM_DOMAIN_GTT,
 +                                                             AMDGPU_CSA_SIZE);
                                if (r) {
                                        DRM_ERROR("allocate CSA failed %d\n", r);
                                        goto init_failed;
                        if (!amdgpu_sriov_vf(adev)) {
                                struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev);
  
 +                              if (WARN_ON(!hive)) {
 +                                      r = -ENOENT;
 +                                      goto init_failed;
 +                              }
 +
                                if (!hive->reset_domain ||
                                    !amdgpu_reset_get_reset_domain(hive->reset_domain)) {
                                        r = -ENOENT;
@@@ -2579,10 -2577,9 +2580,10 @@@ int amdgpu_device_set_cg_state(struct a
                i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
                if (!adev->ip_blocks[i].status.late_initialized)
                        continue;
 -              /* skip CG for GFX on S0ix */
 +              /* skip CG for GFX, SDMA on S0ix */
                if (adev->in_s0ix &&
 -                  adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX)
 +                  (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
 +                   adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))
                        continue;
                /* skip CG for VCE/UVD, it's handled specially */
                if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
@@@ -2616,10 -2613,9 +2617,10 @@@ int amdgpu_device_set_pg_state(struct a
                i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
                if (!adev->ip_blocks[i].status.late_initialized)
                        continue;
 -              /* skip PG for GFX on S0ix */
 +              /* skip PG for GFX, SDMA on S0ix */
                if (adev->in_s0ix &&
 -                  adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX)
 +                  (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
 +                   adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))
                        continue;
                /* skip CG for VCE/UVD, it's handled specially */
                if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD &&
@@@ -2871,7 -2867,7 +2872,7 @@@ static int amdgpu_device_ip_fini(struc
                        amdgpu_ucode_free_bo(adev);
                        amdgpu_free_static_csa(&adev->virt.csa_obj);
                        amdgpu_device_wb_fini(adev);
 -                      amdgpu_device_vram_scratch_fini(adev);
 +                      amdgpu_device_mem_scratch_fini(adev);
                        amdgpu_ib_pool_fini(adev);
                }
  
@@@ -3016,21 -3012,14 +3017,21 @@@ static int amdgpu_device_ip_suspend_pha
                        continue;
                }
  
 -              /* skip suspend of gfx and psp for S0ix
 +              /* skip suspend of gfx/mes and psp for S0ix
                 * gfx is in gfxoff state, so on resume it will exit gfxoff just
                 * like at runtime. PSP is also part of the always on hardware
                 * so no need to suspend it.
                 */
                if (adev->in_s0ix &&
                    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP ||
 -                   adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX))
 +                   adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
 +                   adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_MES))
 +                      continue;
 +
 +              /* SDMA 5.x+ is part of GFX power domain so it's covered by GFXOFF */
 +              if (adev->in_s0ix &&
 +                  (adev->ip_versions[SDMA0_HWIP][0] >= IP_VERSION(5, 0, 0)) &&
 +                  (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SDMA))
                        continue;
  
                /* XXX handle errors */
@@@ -3233,6 -3222,15 +3234,6 @@@ static int amdgpu_device_ip_resume_phas
                        return r;
                }
                adev->ip_blocks[i].status.hw = true;
 -
 -              if (adev->in_s0ix && adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
 -                      /* disable gfxoff for IP resume. The gfxoff will be re-enabled in
 -                       * amdgpu_device_resume() after IP resume.
 -                       */
 -                      amdgpu_gfx_off_ctrl(adev, false);
 -                      DRM_DEBUG("will disable gfxoff for re-initializing other blocks\n");
 -              }
 -
        }
  
        return 0;
@@@ -3684,11 -3682,6 +3685,11 @@@ int amdgpu_device_init(struct amdgpu_de
        if (r)
                return r;
  
 +      /* Get rid of things like offb */
 +      r = drm_aperture_remove_conflicting_pci_framebuffers(adev->pdev, &amdgpu_kms_driver);
 +      if (r)
 +              return r;
 +
        /* Enable TMZ based on IP_VERSION */
        amdgpu_gmc_tmz_set(adev);
  
@@@ -4024,7 -4017,8 +4025,7 @@@ void amdgpu_device_fini_sw(struct amdgp
  
        amdgpu_fence_driver_sw_fini(adev);
        amdgpu_device_ip_fini(adev);
 -      release_firmware(adev->firmware.gpu_info_fw);
 -      adev->firmware.gpu_info_fw = NULL;
 +      amdgpu_ucode_release(&adev->firmware.gpu_info_fw);
        adev->accel_working = false;
        dma_fence_put(rcu_dereference_protected(adev->gang_submit, true));
  
@@@ -4112,11 -4106,6 +4113,11 @@@ int amdgpu_device_suspend(struct drm_de
  
        adev->in_suspend = true;
  
 +      /* Evict the majority of BOs before grabbing the full access */
 +      r = amdgpu_device_evict_resources(adev);
 +      if (r)
 +              return r;
 +
        if (amdgpu_sriov_vf(adev)) {
                amdgpu_virt_fini_data_exchange(adev);
                r = amdgpu_virt_request_full_gpu(adev, false);
@@@ -4191,15 -4180,21 +4192,15 @@@ int amdgpu_device_resume(struct drm_dev
  
        r = amdgpu_device_ip_resume(adev);
  
 -      /* no matter what r is, always need to properly release full GPU */
 -      if (amdgpu_sriov_vf(adev)) {
 -              amdgpu_virt_init_data_exchange(adev);
 -              amdgpu_virt_release_full_gpu(adev, true);
 -      }
 -
        if (r) {
                dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);
 -              return r;
 +              goto exit;
        }
        amdgpu_fence_driver_hw_init(adev);
  
        r = amdgpu_device_ip_late_init(adev);
        if (r)
 -              return r;
 +              goto exit;
  
        queue_delayed_work(system_wq, &adev->delayed_init_work,
                           msecs_to_jiffies(AMDGPU_RESUME_MS));
        if (!adev->in_s0ix) {
                r = amdgpu_amdkfd_resume(adev, adev->in_runpm);
                if (r)
 -                      return r;
 +                      goto exit;
 +      }
 +
 +exit:
 +      if (amdgpu_sriov_vf(adev)) {
 +              amdgpu_virt_init_data_exchange(adev);
 +              amdgpu_virt_release_full_gpu(adev, true);
        }
  
 +      if (r)
 +              return r;
 +
        /* Make sure IB tests flushed */
 -      if (amdgpu_sriov_vf(adev))
 -              amdgpu_irq_gpu_reset_resume_helper(adev);
        flush_delayed_work(&adev->delayed_init_work);
  
 -      if (adev->in_s0ix) {
 -              /* re-enable gfxoff after IP resume. This re-enables gfxoff after
 -               * it was disabled for IP resume in amdgpu_device_ip_resume_phase2().
 -               */
 -              amdgpu_gfx_off_ctrl(adev, true);
 -              DRM_DEBUG("will enable gfxoff for the mission mode\n");
 -      }
        if (fbcon)
                drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, false);
  
@@@ -4602,6 -4597,11 +4603,6 @@@ bool amdgpu_device_should_recover_gpu(s
        if (!amdgpu_ras_is_poison_mode_supported(adev))
                return true;
  
 -      if (!amdgpu_device_ip_check_soft_reset(adev)) {
 -              dev_info(adev->dev,"Timeout, but no hardware hang detected.\n");
 -              return false;
 -      }
 -
        if (amdgpu_sriov_vf(adev))
                return true;
  
@@@ -4726,8 -4726,7 +4727,8 @@@ int amdgpu_device_pre_asic_reset(struc
                if (!need_full_reset)
                        need_full_reset = amdgpu_device_ip_need_full_reset(adev);
  
 -              if (!need_full_reset && amdgpu_gpu_recovery) {
 +              if (!need_full_reset && amdgpu_gpu_recovery &&
 +                  amdgpu_device_ip_check_soft_reset(adev)) {
                        amdgpu_device_ip_pre_soft_reset(adev);
                        r = amdgpu_device_ip_soft_reset(adev);
                        amdgpu_device_ip_post_soft_reset(adev);
@@@ -5045,8 -5044,6 +5046,8 @@@ static void amdgpu_device_resume_displa
                pm_runtime_enable(&(p->dev));
                pm_runtime_resume(&(p->dev));
        }
 +
 +      pci_dev_put(p);
  }
  
  static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev)
  
                if (expires < ktime_get_mono_fast_ns()) {
                        dev_warn(adev->dev, "failed to suspend display audio\n");
 +                      pci_dev_put(p);
                        /* TODO: abort the succeeding gpu reset? */
                        return -ETIMEDOUT;
                }
  
        pm_runtime_disable(&(p->dev));
  
 +      pci_dev_put(p);
        return 0;
  }
  
index a876648e3d7a612fe4079223292772b90e8d5697,c5b98e9a69e91782d284ad8c321ad5f9fda6cdce..503f89a766c3774e4626b70f7ea49cacd7e31b2f
@@@ -42,6 -42,7 +42,7 @@@
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_gem_framebuffer_helper.h>
  #include <drm/drm_fourcc.h>
+ #include <drm/drm_modeset_helper.h>
  #include <drm/drm_vblank.h>
  
  /**
@@@ -63,7 -64,7 +64,7 @@@
  void amdgpu_display_hotplug_work_func(struct work_struct *work)
  {
        struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
 -                                                hotplug_work);
 +                                                hotplug_work.work);
        struct drm_device *dev = adev_to_drm(adev);
        struct drm_mode_config *mode_config = &dev->mode_config;
        struct drm_connector *connector;
index 82b9f85f922b679be04ecd2012c8a0a22adf3fe3,181b6302e8869fe4347b14f5a8223f3633c8f7e7..e3fed38a0d901593e4b82681e0941d62a560c561
@@@ -23,6 -23,7 +23,6 @@@
   */
  
  #include <drm/amdgpu_drm.h>
 -#include <drm/drm_aperture.h>
  #include <drm/drm_drv.h>
  #include <drm/drm_fbdev_generic.h>
  #include <drm/drm_gem.h>
@@@ -38,7 -39,6 +38,6 @@@
  #include <linux/mmu_notifier.h>
  #include <linux/suspend.h>
  #include <linux/cc_platform.h>
- #include <linux/fb.h>
  #include <linux/dynamic_debug.h>
  
  #include "amdgpu.h"
   * - 3.46.0 - To enable hot plug amdgpu tests in libdrm
   * - 3.47.0 - Add AMDGPU_GEM_CREATE_DISCARDABLE and AMDGPU_VM_NOALLOC flags
   * - 3.48.0 - Add IP discovery version info to HW INFO
 - *   3.49.0 - Add gang submit into CS IOCTL
 + * - 3.49.0 - Add gang submit into CS IOCTL
 + * - 3.50.0 - Update AMDGPU_INFO_DEV_INFO IOCTL for minimum engine and memory clock
 + *            Update AMDGPU_INFO_SENSOR IOCTL for PEAK_PSTATE engine and memory clock
   */
  #define KMS_DRIVER_MAJOR      3
 -#define KMS_DRIVER_MINOR      49
 +#define KMS_DRIVER_MINOR      50
  #define KMS_DRIVER_PATCHLEVEL 0
  
 -int amdgpu_vram_limit;
 +unsigned int amdgpu_vram_limit = UINT_MAX;
  int amdgpu_vis_vram_limit;
  int amdgpu_gart_size = -1; /* auto */
  int amdgpu_gtt_size = -1; /* auto */
@@@ -182,7 -180,6 +181,7 @@@ int amdgpu_mes_kiq
  int amdgpu_noretry = -1;
  int amdgpu_force_asic_type = -1;
  int amdgpu_tmz = -1; /* auto */
 +uint amdgpu_freesync_vid_mode;
  int amdgpu_reset_method = -1; /* auto */
  int amdgpu_num_kcq = -1;
  int amdgpu_smartshift_bias;
@@@ -233,18 -230,17 +232,18 @@@ module_param_named(vis_vramlimit, amdgp
  
  /**
   * DOC: gartsize (uint)
 - * Restrict the size of GART in Mib (32, 64, etc.) for testing. The default is -1 (The size depends on asic).
 + * Restrict the size of GART (for kernel use) in Mib (32, 64, etc.) for testing.
 + * The default is -1 (The size depends on asic).
   */
 -MODULE_PARM_DESC(gartsize, "Size of GART to setup in megabytes (32, 64, etc., -1=auto)");
 +MODULE_PARM_DESC(gartsize, "Size of kernel GART to setup in megabytes (32, 64, etc., -1=auto)");
  module_param_named(gartsize, amdgpu_gart_size, uint, 0600);
  
  /**
   * DOC: gttsize (int)
 - * Restrict the size of GTT domain in MiB for testing. The default is -1 (It's VRAM size if 3GB < VRAM < 3/4 RAM,
 - * otherwise 3/4 RAM size).
 + * Restrict the size of GTT domain (for userspace use) in MiB for testing.
 + * The default is -1 (Use 1/2 RAM, minimum value is 3GB).
   */
 -MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)");
 +MODULE_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");
  module_param_named(gttsize, amdgpu_gtt_size, int, 0600);
  
  /**
@@@ -881,32 -877,6 +880,32 @@@ module_param_named(backlight, amdgpu_ba
  MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
  module_param_named(tmz, amdgpu_tmz, int, 0444);
  
 +/**
 + * DOC: freesync_video (uint)
 + * 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(
 +      freesync_video,
 +      "Enable freesync modesetting optimization feature (0 = off (default), 1 = on)");
 +module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444);
 +
  /**
   * DOC: reset_method (int)
   * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
@@@ -2067,15 -2037,6 +2066,15 @@@ static int amdgpu_pci_probe(struct pci_
                         "See modparam exp_hw_support\n");
                return -ENODEV;
        }
 +      /* differentiate between P10 and P11 asics with the same DID */
 +      if (pdev->device == 0x67FF &&
 +          (pdev->revision == 0xE3 ||
 +           pdev->revision == 0xE7 ||
 +           pdev->revision == 0xF3 ||
 +           pdev->revision == 0xF7)) {
 +              flags &= ~AMD_ASIC_MASK;
 +              flags |= CHIP_POLARIS10;
 +      }
  
        /* Due to hardware bugs, S/G Display on raven requires a 1:1 IOMMU mapping,
         * however, SME requires an indirect IOMMU mapping because the encryption
        }
  #endif
  
 -      /* Get rid of things like offb */
 -      ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &amdgpu_kms_driver);
 -      if (ret)
 -              return ret;
 -
        adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev);
        if (IS_ERR(adev))
                return PTR_ERR(adev);
  
        pci_set_drvdata(pdev, ddev);
  
 -      ret = amdgpu_driver_load_kms(adev, ent->driver_data);
 +      ret = amdgpu_driver_load_kms(adev, flags);
        if (ret)
                goto err_pci;
  
  retry_init:
 -      ret = drm_dev_register(ddev, ent->driver_data);
 +      ret = drm_dev_register(ddev, flags);
        if (ret == -EAGAIN && ++retry <= 3) {
                DRM_INFO("retry init %d\n", retry);
                /* Don't request EX mode too frequently which is attacking */
@@@ -2603,8 -2569,6 +2602,8 @@@ static int amdgpu_pmops_runtime_suspend
                amdgpu_device_baco_enter(drm_dev);
        }
  
 +      dev_dbg(&pdev->dev, "asic/device is runtime suspended\n");
 +
        return 0;
  }
  
index 93c73faa5714abdfb9ae95a80e77989c2d819003,cf4b6e8d7d1efc31d252b8963bb0117e8784ae9b..44c57f4a84c45c81e17eb1514f1afb9b0deeaa84
@@@ -35,7 -35,6 +35,6 @@@
  #include <drm/drm_edid.h>
  #include <drm/drm_encoder.h>
  #include <drm/drm_fixed.h>
- #include <drm/drm_crtc_helper.h>
  #include <drm/drm_framebuffer.h>
  #include <drm/drm_probe_helper.h>
  #include <linux/i2c.h>
@@@ -534,7 -533,6 +533,7 @@@ struct amdgpu_connector 
        void *con_priv;
        bool dac_load_detect;
        bool detected_by_load; /* if the connection status was determined by load */
 +      bool detected_hpd_without_ddc; /* if an HPD signal was detected on DVI, but ddc probing failed */
        uint16_t connector_object_id;
        struct amdgpu_hpd hpd;
        struct amdgpu_router router;
index e85e57933cc45f4d1d22041de559b9122f8ada21,01d1e2a631be4755fb76793695f0c59a025368c1..9a24ed463abdf431c96ef3eae97216f716471d0a
@@@ -21,8 -21,9 +21,9 @@@
   *
   */
  
- #include <drm/drm_fb_helper.h>
  #include <drm/drm_fourcc.h>
+ #include <drm/drm_modeset_helper.h>
+ #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_vblank.h>
  
  #include "amdgpu.h"
@@@ -2837,7 -2838,7 +2838,7 @@@ static int dce_v10_0_sw_init(void *hand
        if (r)
                return r;
  
 -      INIT_WORK(&adev->hotplug_work,
 +      INIT_DELAYED_WORK(&adev->hotplug_work,
                  amdgpu_display_hotplug_work_func);
  
        drm_kms_helper_poll_init(adev_to_drm(adev));
@@@ -2902,7 -2903,7 +2903,7 @@@ static int dce_v10_0_hw_fini(void *hand
  
        dce_v10_0_pageflip_interrupt_fini(adev);
  
 -      flush_work(&adev->hotplug_work);
 +      flush_delayed_work(&adev->hotplug_work);
  
        return 0;
  }
@@@ -3302,7 -3303,7 +3303,7 @@@ static int dce_v10_0_hpd_irq(struct amd
  
        if (disp_int & mask) {
                dce_v10_0_hpd_int_ack(adev, hpd);
 -              schedule_work(&adev->hotplug_work);
 +              schedule_delayed_work(&adev->hotplug_work, 0);
                DRM_DEBUG("IH: HPD%d\n", hpd + 1);
        }
  
index 6b406bb7f3f366ef8f963603ce5893ce6f4030ee,973abe989ebe16502bcacef014190d83fac97c74..c14b70350a51aeb12f476d66ed6cde6701e89c19
@@@ -21,8 -21,9 +21,9 @@@
   *
   */
  
- #include <drm/drm_fb_helper.h>
  #include <drm/drm_fourcc.h>
+ #include <drm/drm_modeset_helper.h>
+ #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_vblank.h>
  
  #include "amdgpu.h"
@@@ -2956,7 -2957,7 +2957,7 @@@ static int dce_v11_0_sw_init(void *hand
        if (r)
                return r;
  
 -      INIT_WORK(&adev->hotplug_work,
 +      INIT_DELAYED_WORK(&adev->hotplug_work,
                  amdgpu_display_hotplug_work_func);
  
        drm_kms_helper_poll_init(adev_to_drm(adev));
@@@ -3032,7 -3033,7 +3033,7 @@@ static int dce_v11_0_hw_fini(void *hand
  
        dce_v11_0_pageflip_interrupt_fini(adev);
  
 -      flush_work(&adev->hotplug_work);
 +      flush_delayed_work(&adev->hotplug_work);
  
        return 0;
  }
@@@ -3426,7 -3427,7 +3427,7 @@@ static int dce_v11_0_hpd_irq(struct amd
  
        if (disp_int & mask) {
                dce_v11_0_hpd_int_ack(adev, hpd);
 -              schedule_work(&adev->hotplug_work);
 +              schedule_delayed_work(&adev->hotplug_work, 0);
                DRM_DEBUG("IH: HPD%d\n", hpd + 1);
        }
  
index 2aa21eec0e063a91ff6585d83551eeb602a8f51b,86e95b1c9d0e79aa8617890695e2d5b73a602a50..7f85ba5b726f6860e2ae80506b231145b196e5c0
@@@ -23,8 -23,9 +23,9 @@@
  
  #include <linux/pci.h>
  
- #include <drm/drm_fb_helper.h>
  #include <drm/drm_fourcc.h>
+ #include <drm/drm_modeset_helper.h>
+ #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_vblank.h>
  
  #include "amdgpu.h"
@@@ -2715,7 -2716,7 +2716,7 @@@ static int dce_v6_0_sw_init(void *handl
                return r;
  
        /* Pre-DCE11 */
 -      INIT_WORK(&adev->hotplug_work,
 +      INIT_DELAYED_WORK(&adev->hotplug_work,
                  amdgpu_display_hotplug_work_func);
  
        drm_kms_helper_poll_init(adev_to_drm(adev));
@@@ -2776,7 -2777,7 +2777,7 @@@ static int dce_v6_0_hw_fini(void *handl
  
        dce_v6_0_pageflip_interrupt_fini(adev);
  
 -      flush_work(&adev->hotplug_work);
 +      flush_delayed_work(&adev->hotplug_work);
  
        return 0;
  }
@@@ -3103,7 -3104,7 +3104,7 @@@ static int dce_v6_0_hpd_irq(struct amdg
                tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
                tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
                WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
 -              schedule_work(&adev->hotplug_work);
 +              schedule_delayed_work(&adev->hotplug_work, 0);
                DRM_DEBUG("IH: HPD%d\n", hpd + 1);
        }
  
index 9da338889d363df7bc67cc1bf47f43e991738dbd,f81f1d5d3e8aec574340ee1638c9169c2fbb0414..d421a268c9ffeb8bf2e7105ba8e8d9a2b4ebc064
@@@ -21,8 -21,9 +21,9 @@@
   *
   */
  
- #include <drm/drm_fb_helper.h>
  #include <drm/drm_fourcc.h>
+ #include <drm/drm_modeset_helper.h>
+ #include <drm/drm_modeset_helper_vtables.h>
  #include <drm/drm_vblank.h>
  
  #include "amdgpu.h"
@@@ -2739,7 -2740,7 +2740,7 @@@ static int dce_v8_0_sw_init(void *handl
                return r;
  
        /* Pre-DCE11 */
 -      INIT_WORK(&adev->hotplug_work,
 +      INIT_DELAYED_WORK(&adev->hotplug_work,
                  amdgpu_display_hotplug_work_func);
  
        drm_kms_helper_poll_init(adev_to_drm(adev));
@@@ -2802,7 -2803,7 +2803,7 @@@ static int dce_v8_0_hw_fini(void *handl
  
        dce_v8_0_pageflip_interrupt_fini(adev);
  
 -      flush_work(&adev->hotplug_work);
 +      flush_delayed_work(&adev->hotplug_work);
  
        return 0;
  }
@@@ -3195,7 -3196,7 +3196,7 @@@ static int dce_v8_0_hpd_irq(struct amdg
                tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
                tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
                WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
 -              schedule_work(&adev->hotplug_work);
 +              schedule_delayed_work(&adev->hotplug_work, 0);
                DRM_DEBUG("IH: HPD%d\n", hpd + 1);
        }
  
index 4300ce98ce8d88c57c0eb21d0ab66d767c23defd,2527833bb4641b1fd1689ec3f2aecb99c46e83ce..2db449fed3003c352e692c3bba344cfa320e952c
@@@ -67,6 -67,7 +67,7 @@@
  #include "ivsrcid/ivsrcid_vislands30.h"
  
  #include "i2caux_interface.h"
+ #include <linux/backlight.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/types.h>
@@@ -146,6 -147,14 +147,6 @@@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU)
  /* Number of bytes in PSP footer for firmware. */
  #define PSP_FOOTER_BYTES 0x100
  
 -/*
 - * DMUB Async to Sync Mechanism Status
 - */
 -#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
 -#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
 -#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
 -#define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
 -
  /**
   * DOC: overview
   *
@@@ -210,7 -219,7 +211,7 @@@ static void amdgpu_dm_destroy_drm_devic
  
  static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
                                    struct amdgpu_dm_connector *amdgpu_dm_connector,
 -                                  uint32_t link_index,
 +                                  u32 link_index,
                                    struct amdgpu_encoder *amdgpu_encoder);
  static int amdgpu_dm_encoder_init(struct drm_device *dev,
                                  struct amdgpu_encoder *aencoder,
@@@ -262,7 -271,7 +263,7 @@@ static u32 dm_vblank_get_counter(struc
  static int dm_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
                                  u32 *vbl, u32 *position)
  {
 -      uint32_t v_blank_start, v_blank_end, h_position, v_position;
 +      u32 v_blank_start, v_blank_end, h_position, v_position;
  
        if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc))
                return -EINVAL;
@@@ -361,7 -370,7 +362,7 @@@ static void dm_pflip_high_irq(void *int
        struct amdgpu_device *adev = irq_params->adev;
        unsigned long flags;
        struct drm_pending_vblank_event *e;
 -      uint32_t vpos, hpos, v_blank_start, v_blank_end;
 +      u32 vpos, hpos, v_blank_start, v_blank_end;
        bool vrr_active;
  
        amdgpu_crtc = get_crtc_by_otg_inst(adev, irq_params->irq_src - IRQ_TYPE_PFLIP);
@@@ -648,7 -657,7 +649,7 @@@ static void dmub_hpd_callback(struct am
        struct drm_connector *connector;
        struct drm_connector_list_iter iter;
        struct dc_link *link;
 -      uint8_t link_index = 0;
 +      u8 link_index = 0;
        struct drm_device *dev;
  
        if (adev == NULL)
@@@ -749,7 -758,7 +750,7 @@@ static void dm_dmub_outbox1_low_irq(voi
        struct amdgpu_device *adev = irq_params->adev;
        struct amdgpu_display_manager *dm = &adev->dm;
        struct dmcub_trace_buf_entry entry = { 0 };
 -      uint32_t count = 0;
 +      u32 count = 0;
        struct dmub_hpd_work *dmub_hpd_wrk;
        struct dc_link *plink = NULL;
  
@@@ -1015,7 -1024,7 +1016,7 @@@ static int dm_dmub_hw_init(struct amdgp
        struct dmub_srv_hw_params hw_params;
        enum dmub_status status;
        const unsigned char *fw_inst_const, *fw_bss_data;
 -      uint32_t i, fw_inst_const_size, fw_bss_data_size;
 +      u32 i, fw_inst_const_size, fw_bss_data_size;
        bool has_hw_support;
  
        if (!dmub_srv)
        /* Initialize hardware. */
        memset(&hw_params, 0, sizeof(hw_params));
        hw_params.fb_base = adev->gmc.fb_start;
 -      hw_params.fb_offset = adev->gmc.aper_base;
 +      hw_params.fb_offset = adev->vm_manager.vram_base_offset;
  
        /* backdoor load firmware and trigger dmub running */
        if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
@@@ -1176,10 -1185,10 +1177,10 @@@ static void dm_dmub_hw_resume(struct am
  
  static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_addr_space_config *pa_config)
  {
 -      uint64_t pt_base;
 -      uint32_t logical_addr_low;
 -      uint32_t logical_addr_high;
 -      uint32_t agp_base, agp_bot, agp_top;
 +      u64 pt_base;
 +      u32 logical_addr_low;
 +      u32 logical_addr_high;
 +      u32 agp_base, agp_bot, agp_top;
        PHYSICAL_ADDRESS_LOC page_table_start, page_table_end, page_table_base;
  
        memset(pa_config, 0, sizeof(*pa_config));
        pa_config->system_aperture.agp_top = (uint64_t)agp_top << 24;
  
        pa_config->system_aperture.fb_base = adev->gmc.fb_start;
 -      pa_config->system_aperture.fb_offset = adev->gmc.aper_base;
 +      pa_config->system_aperture.fb_offset = adev->vm_manager.vram_base_offset;
        pa_config->system_aperture.fb_top = adev->gmc.fb_end;
  
        pa_config->gart_config.page_table_start_addr = page_table_start.quad_part << 12;
@@@ -1363,44 -1372,7 +1364,44 @@@ static const struct dmi_system_id hpd_d
                        DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3460"),
                },
        },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Tower Plus 7010"),
 +              },
 +      },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Tower 7010"),
 +              },
 +      },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex SFF Plus 7010"),
 +              },
 +      },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex SFF 7010"),
 +              },
 +      },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Micro Plus 7010"),
 +              },
 +      },
 +      {
 +              .matches = {
 +                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 +                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Micro 7010"),
 +              },
 +      },
        {}
 +      /* TODO: refactor this from a fixed table to a dynamic option */
  };
  
  static void retrieve_dmi_info(struct amdgpu_display_manager *dm)
@@@ -1433,7 -1405,6 +1434,7 @@@ static int amdgpu_dm_init(struct amdgpu
        memset(&init_params, 0, sizeof(init_params));
  #endif
  
 +      mutex_init(&adev->dm.dpia_aux_lock);
        mutex_init(&adev->dm.dc_lock);
        mutex_init(&adev->dm.audio_lock);
  
                case IP_VERSION(3, 0, 1):
                case IP_VERSION(3, 1, 2):
                case IP_VERSION(3, 1, 3):
 +              case IP_VERSION(3, 1, 4):
                case IP_VERSION(3, 1, 5):
                case IP_VERSION(3, 1, 6):
                        init_data.flags.gpu_vm_support = true;
        }
  #endif
  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
 -      adev->dm.crc_rd_wrk = amdgpu_dm_crtc_secure_display_create_work();
 +      adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev);
 +      if (!adev->dm.secure_display_ctxs) {
 +              DRM_ERROR("amdgpu: failed to initialize secure_display_ctxs.\n");
 +      }
  #endif
        if (dc_is_dmub_outbox_supported(adev->dm.dc)) {
                init_completion(&adev->dm.dmub_aux_transfer_done);
@@@ -1740,15 -1707,10 +1741,15 @@@ static void amdgpu_dm_fini(struct amdgp
        amdgpu_dm_destroy_drm_device(&adev->dm);
  
  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
 -      if (adev->dm.crc_rd_wrk) {
 -              flush_work(&adev->dm.crc_rd_wrk->notify_ta_work);
 -              kfree(adev->dm.crc_rd_wrk);
 -              adev->dm.crc_rd_wrk = NULL;
 +      if (adev->dm.secure_display_ctxs) {
 +              for (i = 0; i < adev->dm.dc->caps.max_links; i++) {
 +                      if (adev->dm.secure_display_ctxs[i].crtc) {
 +                              flush_work(&adev->dm.secure_display_ctxs[i].notify_ta_work);
 +                              flush_work(&adev->dm.secure_display_ctxs[i].forward_roi_work);
 +                      }
 +              }
 +              kfree(adev->dm.secure_display_ctxs);
 +              adev->dm.secure_display_ctxs = NULL;
        }
  #endif
  #ifdef CONFIG_DRM_AMD_DC_HDCP
  
        mutex_destroy(&adev->dm.audio_lock);
        mutex_destroy(&adev->dm.dc_lock);
 +      mutex_destroy(&adev->dm.dpia_aux_lock);
  
        return;
  }
@@@ -1883,17 -1844,25 +1884,17 @@@ static int load_dmcu_fw(struct amdgpu_d
                return 0;
        }
  
 -      r = request_firmware_direct(&adev->dm.fw_dmcu, fw_name_dmcu, adev->dev);
 -      if (r == -ENOENT) {
 +      r = amdgpu_ucode_request(adev, &adev->dm.fw_dmcu, fw_name_dmcu);
 +      if (r == -ENODEV) {
                /* DMCU firmware is not necessary, so don't raise a fuss if it's missing */
                DRM_DEBUG_KMS("dm: DMCU firmware not found\n");
                adev->dm.fw_dmcu = NULL;
                return 0;
        }
 -      if (r) {
 -              dev_err(adev->dev, "amdgpu_dm: Can't load firmware \"%s\"\n",
 -                      fw_name_dmcu);
 -              return r;
 -      }
 -
 -      r = amdgpu_ucode_validate(adev->dm.fw_dmcu);
        if (r) {
                dev_err(adev->dev, "amdgpu_dm: Can't validate firmware \"%s\"\n",
                        fw_name_dmcu);
 -              release_firmware(adev->dm.fw_dmcu);
 -              adev->dm.fw_dmcu = NULL;
 +              amdgpu_ucode_release(&adev->dm.fw_dmcu);
                return r;
        }
  
@@@ -1939,6 -1908,7 +1940,6 @@@ static int dm_dmub_sw_init(struct amdgp
        struct dmub_srv_fb_info *fb_info;
        struct dmub_srv *dmub_srv;
        const struct dmcub_firmware_header_v1_0 *hdr;
 -      const char *fw_name_dmub;
        enum dmub_asic dmub_asic;
        enum dmub_status status;
        int r;
        switch (adev->ip_versions[DCE_HWIP][0]) {
        case IP_VERSION(2, 1, 0):
                dmub_asic = DMUB_ASIC_DCN21;
 -              fw_name_dmub = FIRMWARE_RENOIR_DMUB;
 -              if (ASICREV_IS_GREEN_SARDINE(adev->external_rev_id))
 -                      fw_name_dmub = FIRMWARE_GREEN_SARDINE_DMUB;
                break;
        case IP_VERSION(3, 0, 0):
 -              if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) {
 +              if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0))
                        dmub_asic = DMUB_ASIC_DCN30;
 -                      fw_name_dmub = FIRMWARE_SIENNA_CICHLID_DMUB;
 -              } else {
 +              else
                        dmub_asic = DMUB_ASIC_DCN30;
 -                      fw_name_dmub = FIRMWARE_NAVY_FLOUNDER_DMUB;
 -              }
                break;
        case IP_VERSION(3, 0, 1):
                dmub_asic = DMUB_ASIC_DCN301;
 -              fw_name_dmub = FIRMWARE_VANGOGH_DMUB;
                break;
        case IP_VERSION(3, 0, 2):
                dmub_asic = DMUB_ASIC_DCN302;
 -              fw_name_dmub = FIRMWARE_DIMGREY_CAVEFISH_DMUB;
                break;
        case IP_VERSION(3, 0, 3):
                dmub_asic = DMUB_ASIC_DCN303;
 -              fw_name_dmub = FIRMWARE_BEIGE_GOBY_DMUB;
                break;
        case IP_VERSION(3, 1, 2):
        case IP_VERSION(3, 1, 3):
                dmub_asic = (adev->external_rev_id == YELLOW_CARP_B0) ? DMUB_ASIC_DCN31B : DMUB_ASIC_DCN31;
 -              fw_name_dmub = FIRMWARE_YELLOW_CARP_DMUB;
                break;
        case IP_VERSION(3, 1, 4):
                dmub_asic = DMUB_ASIC_DCN314;
 -              fw_name_dmub = FIRMWARE_DCN_314_DMUB;
                break;
        case IP_VERSION(3, 1, 5):
                dmub_asic = DMUB_ASIC_DCN315;
 -              fw_name_dmub = FIRMWARE_DCN_315_DMUB;
                break;
        case IP_VERSION(3, 1, 6):
                dmub_asic = DMUB_ASIC_DCN316;
 -              fw_name_dmub = FIRMWARE_DCN316_DMUB;
                break;
        case IP_VERSION(3, 2, 0):
                dmub_asic = DMUB_ASIC_DCN32;
 -              fw_name_dmub = FIRMWARE_DCN_V3_2_0_DMCUB;
                break;
        case IP_VERSION(3, 2, 1):
                dmub_asic = DMUB_ASIC_DCN321;
 -              fw_name_dmub = FIRMWARE_DCN_V3_2_1_DMCUB;
                break;
        default:
                /* ASIC doesn't support DMUB. */
                return 0;
        }
  
 -      r = request_firmware_direct(&adev->dm.dmub_fw, fw_name_dmub, adev->dev);
 -      if (r) {
 -              DRM_ERROR("DMUB firmware loading failed: %d\n", r);
 -              return 0;
 -      }
 -
 -      r = amdgpu_ucode_validate(adev->dm.dmub_fw);
 -      if (r) {
 -              DRM_ERROR("Couldn't validate DMUB firmware: %d\n", r);
 -              return 0;
 -      }
 -
        hdr = (const struct dmcub_firmware_header_v1_0 *)adev->dm.dmub_fw->data;
        adev->dm.dmcub_fw_version = le32_to_cpu(hdr->header.ucode_version);
  
         * TODO: Move this into GART.
         */
        r = amdgpu_bo_create_kernel(adev, region_info.fb_size, PAGE_SIZE,
 -                                  AMDGPU_GEM_DOMAIN_VRAM, &adev->dm.dmub_bo,
 +                                  AMDGPU_GEM_DOMAIN_VRAM |
 +                                  AMDGPU_GEM_DOMAIN_GTT,
 +                                  &adev->dm.dmub_bo,
                                    &adev->dm.dmub_bo_gpu_addr,
                                    &adev->dm.dmub_bo_cpu_addr);
        if (r)
@@@ -2109,8 -2104,11 +2110,8 @@@ static int dm_sw_fini(void *handle
                adev->dm.dmub_srv = NULL;
        }
  
 -      release_firmware(adev->dm.dmub_fw);
 -      adev->dm.dmub_fw = NULL;
 -
 -      release_firmware(adev->dm.fw_dmcu);
 -      adev->dm.fw_dmcu = NULL;
 +      amdgpu_ucode_release(&adev->dm.dmub_fw);
 +      amdgpu_ucode_release(&adev->dm.fw_dmcu);
  
        return 0;
  }
@@@ -2136,8 -2134,6 +2137,8 @@@ static int detect_mst_link_for_all_conn
                                DRM_ERROR("DM_MST: Failed to start MST\n");
                                aconnector->dc_link->type =
                                        dc_connection_single;
 +                              ret = dm_helpers_dp_mst_stop_top_mgr(aconnector->dc_link->ctx,
 +                                                                   aconnector->dc_link);
                                break;
                        }
                }
@@@ -2459,7 -2455,7 +2460,7 @@@ struct amdgpu_dm_connector 
  amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_state *state,
                                             struct drm_crtc *crtc)
  {
 -      uint32_t i;
 +      u32 i;
        struct drm_connector_state *new_con_state;
        struct drm_connector *connector;
        struct drm_crtc *crtc_from_state;
@@@ -2707,14 -2703,12 +2708,14 @@@ static int dm_resume(void *handle
        drm_for_each_connector_iter(connector, &iter) {
                aconnector = to_amdgpu_dm_connector(connector);
  
 +              if (!aconnector->dc_link)
 +                      continue;
 +
                /*
                 * this is the case when traversing through already created
                 * MST connectors, should be skipped
                 */
 -              if (aconnector->dc_link &&
 -                  aconnector->dc_link->type == dc_connection_mst_branch)
 +              if (aconnector->dc_link->type == dc_connection_mst_branch)
                        continue;
  
                mutex_lock(&aconnector->hpd_lock);
@@@ -3092,8 -3086,8 +3093,8 @@@ static void handle_hpd_irq(void *param
  
  static void dm_handle_mst_sideband_msg(struct amdgpu_dm_connector *aconnector)
  {
 -      uint8_t esi[DP_PSR_ERROR_STATUS - DP_SINK_COUNT_ESI] = { 0 };
 -      uint8_t dret;
 +      u8 esi[DP_PSR_ERROR_STATUS - DP_SINK_COUNT_ESI] = { 0 };
 +      u8 dret;
        bool new_irq_handled = false;
        int dpcd_addr;
        int dpcd_bytes_to_read;
  
        while (dret == dpcd_bytes_to_read &&
                process_count < max_process_count) {
 -              uint8_t retry;
 +              u8 retry;
                dret = 0;
  
                process_count++;
                                dpcd_bytes_to_read - 1;
  
                        for (retry = 0; retry < 3; retry++) {
 -                              uint8_t wret;
 +                              u8 wret;
  
                                wret = drm_dp_dpcd_write(
                                        &aconnector->dm_dp_aux.aux,
@@@ -4154,12 -4148,12 +4155,12 @@@ static void amdgpu_set_panel_orientatio
  static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
  {
        struct amdgpu_display_manager *dm = &adev->dm;
 -      int32_t i;
 +      s32 i;
        struct amdgpu_dm_connector *aconnector = NULL;
        struct amdgpu_encoder *aencoder = NULL;
        struct amdgpu_mode_info *mode_info = &adev->mode_info;
 -      uint32_t link_cnt;
 -      int32_t primary_planes;
 +      u32 link_cnt;
 +      s32 primary_planes;
        enum dc_connection_type new_connection_type = dc_connection_none;
        const struct dc_plane_cap *plane;
        bool psr_feature_enabled = false;
                amdgpu_set_panel_orientation(&aconnector->base);
        }
  
 +      /* If we didn't find a panel, notify the acpi video detection */
 +      if (dm->adev->flags & AMD_IS_APU && dm->num_of_edps == 0)
 +              acpi_video_report_nolcd();
 +
        /* Software is initialized. Now we can register interrupt handlers. */
        switch (adev->asic_type) {
  #if defined(CONFIG_DRM_AMD_DC_SI)
@@@ -4479,61 -4469,6 +4480,61 @@@ DEVICE_ATTR_WO(s3_debug)
  
  #endif
  
 +static int dm_init_microcode(struct amdgpu_device *adev)
 +{
 +      char *fw_name_dmub;
 +      int r;
 +
 +      switch (adev->ip_versions[DCE_HWIP][0]) {
 +      case IP_VERSION(2, 1, 0):
 +              fw_name_dmub = FIRMWARE_RENOIR_DMUB;
 +              if (ASICREV_IS_GREEN_SARDINE(adev->external_rev_id))
 +                      fw_name_dmub = FIRMWARE_GREEN_SARDINE_DMUB;
 +              break;
 +      case IP_VERSION(3, 0, 0):
 +              if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0))
 +                      fw_name_dmub = FIRMWARE_SIENNA_CICHLID_DMUB;
 +              else
 +                      fw_name_dmub = FIRMWARE_NAVY_FLOUNDER_DMUB;
 +              break;
 +      case IP_VERSION(3, 0, 1):
 +              fw_name_dmub = FIRMWARE_VANGOGH_DMUB;
 +              break;
 +      case IP_VERSION(3, 0, 2):
 +              fw_name_dmub = FIRMWARE_DIMGREY_CAVEFISH_DMUB;
 +              break;
 +      case IP_VERSION(3, 0, 3):
 +              fw_name_dmub = FIRMWARE_BEIGE_GOBY_DMUB;
 +              break;
 +      case IP_VERSION(3, 1, 2):
 +      case IP_VERSION(3, 1, 3):
 +              fw_name_dmub = FIRMWARE_YELLOW_CARP_DMUB;
 +              break;
 +      case IP_VERSION(3, 1, 4):
 +              fw_name_dmub = FIRMWARE_DCN_314_DMUB;
 +              break;
 +      case IP_VERSION(3, 1, 5):
 +              fw_name_dmub = FIRMWARE_DCN_315_DMUB;
 +              break;
 +      case IP_VERSION(3, 1, 6):
 +              fw_name_dmub = FIRMWARE_DCN316_DMUB;
 +              break;
 +      case IP_VERSION(3, 2, 0):
 +              fw_name_dmub = FIRMWARE_DCN_V3_2_0_DMCUB;
 +              break;
 +      case IP_VERSION(3, 2, 1):
 +              fw_name_dmub = FIRMWARE_DCN_V3_2_1_DMCUB;
 +              break;
 +      default:
 +              /* ASIC doesn't support DMUB. */
 +              return 0;
 +      }
 +      r = amdgpu_ucode_request(adev, &adev->dm.dmub_fw, fw_name_dmub);
 +      if (r)
 +              DRM_ERROR("DMUB firmware loading failed: %d\n", r);
 +      return r;
 +}
 +
  static int dm_early_init(void *handle)
  {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  #endif
        adev->dc_enabled = true;
  
 -      return 0;
 +      return dm_init_microcode(adev);
  }
  
  static bool modereset_required(struct drm_crtc_state *crtc_state)
@@@ -4731,7 -4666,7 +4732,7 @@@ fill_plane_color_attributes(const struc
  static int
  fill_dc_plane_info_and_addr(struct amdgpu_device *adev,
                            const struct drm_plane_state *plane_state,
 -                          const uint64_t tiling_flags,
 +                          const u64 tiling_flags,
                            struct dc_plane_info *plane_info,
                            struct dc_plane_address *address,
                            bool tmz_surface,
@@@ -4904,35 -4839,6 +4905,35 @@@ static int fill_dc_plane_attributes(str
        return 0;
  }
  
 +static inline void fill_dc_dirty_rect(struct drm_plane *plane,
 +                                    struct rect *dirty_rect, int32_t x,
 +                                    s32 y, s32 width, s32 height,
 +                                    int *i, bool ffu)
 +{
 +      if (*i > DC_MAX_DIRTY_RECTS)
 +              return;
 +
 +      if (*i == DC_MAX_DIRTY_RECTS)
 +              goto out;
 +
 +      dirty_rect->x = x;
 +      dirty_rect->y = y;
 +      dirty_rect->width = width;
 +      dirty_rect->height = height;
 +
 +      if (ffu)
 +              drm_dbg(plane->dev,
 +                      "[PLANE:%d] PSR FFU dirty rect size (%d, %d)\n",
 +                      plane->base.id, width, height);
 +      else
 +              drm_dbg(plane->dev,
 +                      "[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)",
 +                      plane->base.id, x, y, width, height);
 +
 +out:
 +      (*i)++;
 +}
 +
  /**
   * fill_dc_dirty_rects() - Fill DC dirty regions for PSR selective updates
   *
   * addition, certain use cases - such as cursor and multi-plane overlay (MPO) -
   * implicitly provide damage clips without any client support via the plane
   * bounds.
 - *
 - * Today, amdgpu_dm only supports the MPO and cursor usecase.
 - *
 - * TODO: Also enable for FB_DAMAGE_CLIPS
   */
  static void fill_dc_dirty_rects(struct drm_plane *plane,
                                struct drm_plane_state *old_plane_state,
  {
        struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(crtc_state);
        struct rect *dirty_rects = flip_addrs->dirty_rects;
 -      uint32_t num_clips;
 +      u32 num_clips;
 +      struct drm_mode_rect *clips;
        bool bb_changed;
        bool fb_changed;
 -      uint32_t i = 0;
 -
 -      flip_addrs->dirty_rect_count = 0;
 +      u32 i = 0;
  
        /*
         * Cursor plane has it's own dirty rect update interface. See
        if (plane->type == DRM_PLANE_TYPE_CURSOR)
                return;
  
 -      /*
 -       * Today, we only consider MPO use-case for PSR SU. If MPO not
 -       * requested, and there is a plane update, do FFU.
 -       */
 +      num_clips = drm_plane_get_damage_clips_count(new_plane_state);
 +      clips = drm_plane_get_damage_clips(new_plane_state);
 +
        if (!dm_crtc_state->mpo_requested) {
 -              dirty_rects[0].x = 0;
 -              dirty_rects[0].y = 0;
 -              dirty_rects[0].width = dm_crtc_state->base.mode.crtc_hdisplay;
 -              dirty_rects[0].height = dm_crtc_state->base.mode.crtc_vdisplay;
 -              flip_addrs->dirty_rect_count = 1;
 -              DRM_DEBUG_DRIVER("[PLANE:%d] PSR FFU dirty rect size (%d, %d)\n",
 -                               new_plane_state->plane->base.id,
 -                               dm_crtc_state->base.mode.crtc_hdisplay,
 -                               dm_crtc_state->base.mode.crtc_vdisplay);
 +              if (!num_clips || num_clips > DC_MAX_DIRTY_RECTS)
 +                      goto ffu;
 +
 +              for (; flip_addrs->dirty_rect_count < num_clips; clips++)
 +                      fill_dc_dirty_rect(new_plane_state->plane,
 +                                         &dirty_rects[i], clips->x1,
 +                                         clips->y1, clips->x2 - clips->x1,
 +                                         clips->y2 - clips->y1,
 +                                         &flip_addrs->dirty_rect_count,
 +                                         false);
                return;
        }
  
         * If plane is moved or resized, also add old bounding box to dirty
         * rects.
         */
 -      num_clips = drm_plane_get_damage_clips_count(new_plane_state);
        fb_changed = old_plane_state->fb->base.id !=
                     new_plane_state->fb->base.id;
        bb_changed = (old_plane_state->crtc_x != new_plane_state->crtc_x ||
                      old_plane_state->crtc_w != new_plane_state->crtc_w ||
                      old_plane_state->crtc_h != new_plane_state->crtc_h);
  
 -      DRM_DEBUG_DRIVER("[PLANE:%d] PSR bb_changed:%d fb_changed:%d num_clips:%d\n",
 -                       new_plane_state->plane->base.id,
 -                       bb_changed, fb_changed, num_clips);
 -
 -      if (num_clips || fb_changed || bb_changed) {
 -              dirty_rects[i].x = new_plane_state->crtc_x;
 -              dirty_rects[i].y = new_plane_state->crtc_y;
 -              dirty_rects[i].width = new_plane_state->crtc_w;
 -              dirty_rects[i].height = new_plane_state->crtc_h;
 -              DRM_DEBUG_DRIVER("[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)\n",
 -                               new_plane_state->plane->base.id,
 -                               dirty_rects[i].x, dirty_rects[i].y,
 -                               dirty_rects[i].width, dirty_rects[i].height);
 -              i += 1;
 -      }
 +      drm_dbg(plane->dev,
 +              "[PLANE:%d] PSR bb_changed:%d fb_changed:%d num_clips:%d\n",
 +              new_plane_state->plane->base.id,
 +              bb_changed, fb_changed, num_clips);
  
 -      /* Add old plane bounding-box if plane is moved or resized */
        if (bb_changed) {
 -              dirty_rects[i].x = old_plane_state->crtc_x;
 -              dirty_rects[i].y = old_plane_state->crtc_y;
 -              dirty_rects[i].width = old_plane_state->crtc_w;
 -              dirty_rects[i].height = old_plane_state->crtc_h;
 -              DRM_DEBUG_DRIVER("[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)\n",
 -                              old_plane_state->plane->base.id,
 -                              dirty_rects[i].x, dirty_rects[i].y,
 -                              dirty_rects[i].width, dirty_rects[i].height);
 -              i += 1;
 -      }
 +              fill_dc_dirty_rect(new_plane_state->plane, &dirty_rects[i],
 +                                 new_plane_state->crtc_x,
 +                                 new_plane_state->crtc_y,
 +                                 new_plane_state->crtc_w,
 +                                 new_plane_state->crtc_h, &i, false);
 +
 +              /* Add old plane bounding-box if plane is moved or resized */
 +              fill_dc_dirty_rect(new_plane_state->plane, &dirty_rects[i],
 +                                 old_plane_state->crtc_x,
 +                                 old_plane_state->crtc_y,
 +                                 old_plane_state->crtc_w,
 +                                 old_plane_state->crtc_h, &i, false);
 +      }
 +
 +      if (num_clips) {
 +              for (; i < num_clips; clips++)
 +                      fill_dc_dirty_rect(new_plane_state->plane,
 +                                         &dirty_rects[i], clips->x1,
 +                                         clips->y1, clips->x2 - clips->x1,
 +                                         clips->y2 - clips->y1, &i, false);
 +      } else if (fb_changed && !bb_changed) {
 +              fill_dc_dirty_rect(new_plane_state->plane, &dirty_rects[i],
 +                                 new_plane_state->crtc_x,
 +                                 new_plane_state->crtc_y,
 +                                 new_plane_state->crtc_w,
 +                                 new_plane_state->crtc_h, &i, false);
 +      }
 +
 +      if (i > DC_MAX_DIRTY_RECTS)
 +              goto ffu;
  
        flip_addrs->dirty_rect_count = i;
 +      return;
 +
 +ffu:
 +      fill_dc_dirty_rect(new_plane_state->plane, &dirty_rects[0], 0, 0,
 +                         dm_crtc_state->base.mode.crtc_hdisplay,
 +                         dm_crtc_state->base.mode.crtc_vdisplay,
 +                         &flip_addrs->dirty_rect_count, true);
  }
  
  static void update_stream_scaling_settings(const struct drm_display_mode *mode,
@@@ -5112,7 -5009,7 +5113,7 @@@ static enum dc_color_dept
  convert_color_depth_from_display_info(const struct drm_connector *connector,
                                      bool is_y420, int requested_bpc)
  {
 -      uint8_t bpc;
 +      u8 bpc;
  
        if (is_y420) {
                bpc = 8;
@@@ -5656,8 -5553,8 +5657,8 @@@ static void apply_dsc_policy_for_edp(st
                                    uint32_t max_dsc_target_bpp_limit_override)
  {
        const struct dc_link_settings *verified_link_cap = NULL;
 -      uint32_t link_bw_in_kbps;
 -      uint32_t edp_min_bpp_x16, edp_max_bpp_x16;
 +      u32 link_bw_in_kbps;
 +      u32 edp_min_bpp_x16, edp_max_bpp_x16;
        struct dc *dc = sink->ctx->dc;
        struct dc_dsc_bw_range bw_range = {0};
        struct dc_dsc_config dsc_cfg = {0};
@@@ -5714,11 -5611,11 +5715,11 @@@ static void apply_dsc_policy_for_stream
                                        struct dsc_dec_dpcd_caps *dsc_caps)
  {
        struct drm_connector *drm_connector = &aconnector->base;
 -      uint32_t link_bandwidth_kbps;
 +      u32 link_bandwidth_kbps;
        struct dc *dc = sink->ctx->dc;
 -      uint32_t max_supported_bw_in_kbps, timing_bw_in_kbps;
 -      uint32_t dsc_max_supported_bw_in_kbps;
 -      uint32_t max_dsc_target_bpp_limit_override =
 +      u32 max_supported_bw_in_kbps, timing_bw_in_kbps;
 +      u32 dsc_max_supported_bw_in_kbps;
 +      u32 max_dsc_target_bpp_limit_override =
                drm_connector->display_info.max_dsc_bpp;
  
        link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
@@@ -5865,8 -5762,7 +5866,8 @@@ create_stream_for_sink(struct amdgpu_dm
                 */
                DRM_DEBUG_DRIVER("No preferred mode found\n");
        } else {
 -              recalculate_timing = is_freesync_video_mode(&mode, aconnector);
 +              recalculate_timing = amdgpu_freesync_vid_mode &&
 +                               is_freesync_video_mode(&mode, aconnector);
                if (recalculate_timing) {
                        freesync_mode = get_highest_refresh_rate_mode(aconnector, false);
                        drm_mode_copy(&saved_mode, &mode);
@@@ -6940,7 -6836,7 +6941,7 @@@ static uint add_fs_modes(struct amdgpu_
        const struct drm_display_mode *m;
        struct drm_display_mode *new_mode;
        uint i;
 -      uint32_t new_modes_count = 0;
 +      u32 new_modes_count = 0;
  
        /* Standard FPS values
         *
         * 60           - Commonly used
         * 48,72,96,120 - Multiples of 24
         */
 -      static const uint32_t common_rates[] = {
 +      static const u32 common_rates[] = {
                23976, 24000, 25000, 29970, 30000,
                48000, 50000, 60000, 72000, 96000, 120000
        };
                return 0;
  
        for (i = 0; i < ARRAY_SIZE(common_rates); i++) {
 -              uint64_t target_vtotal, target_vtotal_diff;
 -              uint64_t num, den;
 +              u64 target_vtotal, target_vtotal_diff;
 +              u64 num, den;
  
                if (drm_mode_vrefresh(m) * 1000 < common_rates[i])
                        continue;
@@@ -7017,7 -6913,7 +7018,7 @@@ static void amdgpu_dm_connector_add_fre
        struct amdgpu_dm_connector *amdgpu_dm_connector =
                to_amdgpu_dm_connector(connector);
  
 -      if (!edid)
 +      if (!(amdgpu_freesync_vid_mode && edid))
                return;
  
        if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
@@@ -7213,7 -7109,7 +7214,7 @@@ create_i2c(struct ddc_service *ddc_serv
   */
  static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
                                    struct amdgpu_dm_connector *aconnector,
 -                                  uint32_t link_index,
 +                                  u32 link_index,
                                    struct amdgpu_encoder *aencoder)
  {
        int res = 0;
@@@ -7398,55 -7294,27 +7399,55 @@@ is_scaling_state_different(const struc
  }
  
  #ifdef CONFIG_DRM_AMD_DC_HDCP
 -static bool is_content_protection_different(struct drm_connector_state *state,
 -                                          const struct drm_connector_state *old_state,
 -                                          const struct drm_connector *connector, struct hdcp_workqueue *hdcp_w)
 +static bool is_content_protection_different(struct drm_crtc_state *new_crtc_state,
 +                                          struct drm_crtc_state *old_crtc_state,
 +                                          struct drm_connector_state *new_conn_state,
 +                                          struct drm_connector_state *old_conn_state,
 +                                          const struct drm_connector *connector,
 +                                          struct hdcp_workqueue *hdcp_w)
  {
        struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
        struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
  
 -      /* Handle: Type0/1 change */
 -      if (old_state->hdcp_content_type != state->hdcp_content_type &&
 -          state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
 -              state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 +      pr_debug("[HDCP_DM] connector->index: %x connect_status: %x dpms: %x\n",
 +              connector->index, connector->status, connector->dpms);
 +      pr_debug("[HDCP_DM] state protection old: %x new: %x\n",
 +              old_conn_state->content_protection, new_conn_state->content_protection);
 +
 +      if (old_crtc_state)
 +              pr_debug("[HDCP_DM] old crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n",
 +              old_crtc_state->enable,
 +              old_crtc_state->active,
 +              old_crtc_state->mode_changed,
 +              old_crtc_state->active_changed,
 +              old_crtc_state->connectors_changed);
 +
 +      if (new_crtc_state)
 +              pr_debug("[HDCP_DM] NEW crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n",
 +              new_crtc_state->enable,
 +              new_crtc_state->active,
 +              new_crtc_state->mode_changed,
 +              new_crtc_state->active_changed,
 +              new_crtc_state->connectors_changed);
 +
 +      /* hdcp content type change */
 +      if (old_conn_state->hdcp_content_type != new_conn_state->hdcp_content_type &&
 +          new_conn_state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
 +              new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 +              pr_debug("[HDCP_DM] Type0/1 change %s :true\n", __func__);
                return true;
        }
  
 -      /* CP is being re enabled, ignore this
 -       *
 -       * Handles:     ENABLED -> DESIRED
 -       */
 -      if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED &&
 -          state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) {
 -              state->content_protection = DRM_MODE_CONTENT_PROTECTION_ENABLED;
 +      /* CP is being re enabled, ignore this */
 +      if (old_conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED &&
 +          new_conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) {
 +              if (new_crtc_state && new_crtc_state->mode_changed) {
 +                      new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 +                      pr_debug("[HDCP_DM] ENABLED->DESIRED & mode_changed %s :true\n", __func__);
 +                      return true;
 +              }
 +              new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_ENABLED;
 +              pr_debug("[HDCP_DM] ENABLED -> DESIRED %s :false\n", __func__);
                return false;
        }
  
         *
         * Handles:     UNDESIRED -> ENABLED
         */
 -      if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
 -          state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
 -              state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 +      if (old_conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
 +          new_conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
 +              new_conn_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
  
        /* Stream removed and re-enabled
         *
         *
         * Handles:     DESIRED -> DESIRED (Special case)
         */
 -      if (!(old_state->crtc && old_state->crtc->enabled) &&
 -              state->crtc && state->crtc->enabled &&
 +      if (!(old_conn_state->crtc && old_conn_state->crtc->enabled) &&
 +              new_conn_state->crtc && new_conn_state->crtc->enabled &&
                connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) {
                dm_con_state->update_hdcp = false;
 +              pr_debug("[HDCP_DM] DESIRED->DESIRED (Stream removed and re-enabled) %s :true\n",
 +                      __func__);
                return true;
        }
  
         *
         * Handles:     DESIRED -> DESIRED (Special case)
         */
 -      if (dm_con_state->update_hdcp && state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
 -          connector->dpms == DRM_MODE_DPMS_ON && aconnector->dc_sink != NULL) {
 +      if (dm_con_state->update_hdcp &&
 +      new_conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
 +      connector->dpms == DRM_MODE_DPMS_ON && aconnector->dc_sink != NULL) {
                dm_con_state->update_hdcp = false;
 +              pr_debug("[HDCP_DM] DESIRED->DESIRED (Hot-plug, headless s3, dpms) %s :true\n",
 +                      __func__);
                return true;
        }
  
 -      /*
 -       * Handles:     UNDESIRED -> UNDESIRED
 -       *              DESIRED -> DESIRED
 -       *              ENABLED -> ENABLED
 -       */
 -      if (old_state->content_protection == state->content_protection)
 +      if (old_conn_state->content_protection == new_conn_state->content_protection) {
 +              if (new_conn_state->content_protection >= DRM_MODE_CONTENT_PROTECTION_DESIRED) {
 +                      if (new_crtc_state && new_crtc_state->mode_changed) {
 +                              pr_debug("[HDCP_DM] DESIRED->DESIRED or ENABLE->ENABLE mode_change %s :true\n",
 +                                      __func__);
 +                              return true;
 +                      }
 +                      pr_debug("[HDCP_DM] DESIRED->DESIRED & ENABLE->ENABLE %s :false\n",
 +                              __func__);
 +                      return false;
 +              }
 +
 +              pr_debug("[HDCP_DM] UNDESIRED->UNDESIRED %s :false\n", __func__);
                return false;
 +      }
  
 -      /*
 -       * Handles:     UNDESIRED -> DESIRED
 -       *              DESIRED -> UNDESIRED
 -       *              ENABLED -> UNDESIRED
 -       */
 -      if (state->content_protection != DRM_MODE_CONTENT_PROTECTION_ENABLED)
 +      if (new_conn_state->content_protection != DRM_MODE_CONTENT_PROTECTION_ENABLED) {
 +              pr_debug("[HDCP_DM] UNDESIRED->DESIRED or DESIRED->UNDESIRED or ENABLED->UNDESIRED %s :true\n",
 +                      __func__);
                return true;
 +      }
  
 -      /*
 -       * Handles:     DESIRED -> ENABLED
 -       */
 +      pr_debug("[HDCP_DM] DESIRED->ENABLED %s :false\n", __func__);
        return false;
  }
 -
  #endif
 +
  static void remove_stream(struct amdgpu_device *adev,
                          struct amdgpu_crtc *acrtc,
                          struct dc_stream_state *stream)
@@@ -7734,8 -7593,8 +7735,8 @@@ static void amdgpu_dm_commit_planes(str
                                    struct drm_crtc *pcrtc,
                                    bool wait_for_vblank)
  {
 -      uint32_t i;
 -      uint64_t timestamp_ns;
 +      u32 i;
 +      u64 timestamp_ns;
        struct drm_plane *plane;
        struct drm_plane_state *old_plane_state, *new_plane_state;
        struct amdgpu_crtc *acrtc_attach = to_amdgpu_crtc(pcrtc);
                        to_dm_crtc_state(drm_atomic_get_old_crtc_state(state, pcrtc));
        int planes_count = 0, vpos, hpos;
        unsigned long flags;
 -      uint32_t target_vblank, last_flip_vblank;
 +      u32 target_vblank, last_flip_vblank;
        bool vrr_active = amdgpu_dm_vrr_active(acrtc_state);
        bool cursor_update = false;
        bool pflip_present = false;
@@@ -8184,7 -8043,7 +8185,7 @@@ static void amdgpu_dm_atomic_commit_tai
        struct amdgpu_display_manager *dm = &adev->dm;
        struct dm_atomic_state *dm_state;
        struct dc_state *dc_state = NULL, *dc_state_temp = NULL;
 -      uint32_t i, j;
 +      u32 i, j;
        struct drm_crtc *crtc;
        struct drm_crtc_state *old_crtc_state, *new_crtc_state;
        unsigned long flags;
                }
        }
  #ifdef CONFIG_DRM_AMD_DC_HDCP
 +      for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
 +              struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
 +              struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
 +              struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
 +
 +              pr_debug("[HDCP_DM] -------------- i : %x ----------\n", i);
 +
 +              if (!connector)
 +                      continue;
 +
 +              pr_debug("[HDCP_DM] connector->index: %x connect_status: %x dpms: %x\n",
 +                      connector->index, connector->status, connector->dpms);
 +              pr_debug("[HDCP_DM] state protection old: %x new: %x\n",
 +                      old_con_state->content_protection, new_con_state->content_protection);
 +
 +              if (aconnector->dc_sink) {
 +                      if (aconnector->dc_sink->sink_signal != SIGNAL_TYPE_VIRTUAL &&
 +                              aconnector->dc_sink->sink_signal != SIGNAL_TYPE_NONE) {
 +                              pr_debug("[HDCP_DM] pipe_ctx dispname=%s\n",
 +                              aconnector->dc_sink->edid_caps.display_name);
 +                      }
 +              }
 +
 +              new_crtc_state = NULL;
 +              old_crtc_state = NULL;
 +
 +              if (acrtc) {
 +                      new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base);
 +                      old_crtc_state = drm_atomic_get_old_crtc_state(state, &acrtc->base);
 +              }
 +
 +              if (old_crtc_state)
 +                      pr_debug("old crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n",
 +                      old_crtc_state->enable,
 +                      old_crtc_state->active,
 +                      old_crtc_state->mode_changed,
 +                      old_crtc_state->active_changed,
 +                      old_crtc_state->connectors_changed);
 +
 +              if (new_crtc_state)
 +                      pr_debug("NEW crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n",
 +                      new_crtc_state->enable,
 +                      new_crtc_state->active,
 +                      new_crtc_state->mode_changed,
 +                      new_crtc_state->active_changed,
 +                      new_crtc_state->connectors_changed);
 +      }
 +
        for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
                struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
                struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
  
                new_crtc_state = NULL;
 +              old_crtc_state = NULL;
  
 -              if (acrtc)
 +              if (acrtc) {
                        new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base);
 +                      old_crtc_state = drm_atomic_get_old_crtc_state(state, &acrtc->base);
 +              }
  
                dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
  
                        continue;
                }
  
 -              if (is_content_protection_different(new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue))
 +              if (is_content_protection_different(new_crtc_state, old_crtc_state, new_con_state,
 +                                                                                      old_con_state, connector, adev->dm.hdcp_workqueue)) {
 +                      /* when display is unplugged from mst hub, connctor will
 +                       * be destroyed within dm_dp_mst_connector_destroy. connector
 +                       * hdcp perperties, like type, undesired, desired, enabled,
 +                       * will be lost. So, save hdcp properties into hdcp_work within
 +                       * amdgpu_dm_atomic_commit_tail. if the same display is
 +                       * plugged back with same display index, its hdcp properties
 +                       * will be retrieved from hdcp_work within dm_dp_mst_get_modes
 +                       */
 +
 +                      bool enable_encryption = false;
 +
 +                      if (new_con_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED)
 +                              enable_encryption = true;
 +
 +                      if (aconnector->dc_link && aconnector->dc_sink &&
 +                              aconnector->dc_link->type == dc_connection_mst_branch) {
 +                              struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue;
 +                              struct hdcp_workqueue *hdcp_w =
 +                                      &hdcp_work[aconnector->dc_link->link_index];
 +
 +                              hdcp_w->hdcp_content_type[connector->index] =
 +                                      new_con_state->hdcp_content_type;
 +                              hdcp_w->content_protection[connector->index] =
 +                                      new_con_state->content_protection;
 +                      }
 +
 +                      if (new_crtc_state && new_crtc_state->mode_changed &&
 +                              new_con_state->content_protection >= DRM_MODE_CONTENT_PROTECTION_DESIRED)
 +                              enable_encryption = true;
 +
 +                      DRM_INFO("[HDCP_DM] hdcp_update_display enable_encryption = %x\n", enable_encryption);
 +
                        hdcp_update_display(
                                adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector,
 -                              new_con_state->hdcp_content_type,
 -                              new_con_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED);
 +                              new_con_state->hdcp_content_type, enable_encryption);
 +              }
        }
  #endif
  
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
  #ifdef CONFIG_DEBUG_FS
                enum amdgpu_dm_pipe_crc_source cur_crc_src;
 -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
 -              struct crc_rd_work *crc_rd_wrk;
 -#endif
  #endif
                /* Count number of newly disabled CRTCs for dropping PM refs later. */
                if (old_crtc_state->active && !new_crtc_state->active)
                update_stream_irq_parameters(dm, dm_new_crtc_state);
  
  #ifdef CONFIG_DEBUG_FS
 -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
 -              crc_rd_wrk = dm->crc_rd_wrk;
 -#endif
                spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags);
                cur_crc_src = acrtc->dm_irq_params.crc_src;
                spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
                                if (amdgpu_dm_crc_window_is_activated(crtc)) {
                                        spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags);
                                        acrtc->dm_irq_params.window_param.update_win = true;
 +
 +                                      /**
 +                                       * It takes 2 frames for HW to stably generate CRC when
 +                                       * resuming from suspend, so we set skip_frame_cnt 2.
 +                                       */
                                        acrtc->dm_irq_params.window_param.skip_frame_cnt = 2;
 -                                      spin_lock_irq(&crc_rd_wrk->crc_rd_work_lock);
 -                                      crc_rd_wrk->crtc = crtc;
 -                                      spin_unlock_irq(&crc_rd_wrk->crc_rd_work_lock);
                                        spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
                                }
  #endif
@@@ -8827,22 -8606,15 +8828,22 @@@ static void get_freesync_config_for_crt
        struct drm_display_mode *mode = &new_crtc_state->base.mode;
        int vrefresh = drm_mode_vrefresh(mode);
        bool fs_vid_mode = false;
 +      bool drr_active = false;
  
        new_crtc_state->vrr_supported = new_con_state->freesync_capable &&
                                        vrefresh >= aconnector->min_vfreq &&
                                        vrefresh <= aconnector->max_vfreq;
  
 -      if (new_crtc_state->vrr_supported) {
 +      drr_active = new_crtc_state->vrr_supported &&
 +              new_crtc_state->freesync_config.state != VRR_STATE_DISABLED &&
 +              new_crtc_state->freesync_config.state != VRR_STATE_INACTIVE &&
 +              new_crtc_state->freesync_config.state != VRR_STATE_UNSUPPORTED;
 +
 +      if (drr_active)
                new_crtc_state->stream->ignore_msa_timing_param = true;
 -              fs_vid_mode = new_crtc_state->freesync_config.state == VRR_STATE_ACTIVE_FIXED;
  
 +      if (new_crtc_state->vrr_supported) {
 +              fs_vid_mode = new_crtc_state->freesync_config.state == VRR_STATE_ACTIVE_FIXED;
                config.min_refresh_in_uhz = aconnector->min_vfreq * 1000000;
                config.max_refresh_in_uhz = aconnector->max_vfreq * 1000000;
                config.vsif_supported = true;
@@@ -8902,7 -8674,7 +8903,7 @@@ is_timing_unchanged_for_freesync(struc
  }
  
  static void set_freesync_fixed_config(struct dm_crtc_state *dm_new_crtc_state) {
 -      uint64_t num, den, res;
 +      u64 num, den, res;
        struct drm_crtc_state *new_crtc_state = &dm_new_crtc_state->base;
  
        dm_new_crtc_state->freesync_config.state = VRR_STATE_ACTIVE_FIXED;
@@@ -9005,8 -8777,7 +9006,8 @@@ static int dm_update_crtc_state(struct 
                 * TODO: Refactor this function to allow this check to work
                 * in all conditions.
                 */
 -              if (dm_new_crtc_state->stream &&
 +              if (amdgpu_freesync_vid_mode &&
 +                  dm_new_crtc_state->stream &&
                    is_timing_unchanged_for_freesync(new_crtc_state, old_crtc_state))
                        goto skip_modeset;
  
                if (!dm_old_crtc_state->stream)
                        goto skip_modeset;
  
 -              if (dm_new_crtc_state->stream &&
 +              if (amdgpu_freesync_vid_mode && dm_new_crtc_state->stream &&
                    is_timing_unchanged_for_freesync(new_crtc_state,
                                                     old_crtc_state)) {
                        new_crtc_state->mode_changed = false;
                        set_freesync_fixed_config(dm_new_crtc_state);
  
                        goto skip_modeset;
 -              } else if (aconnector &&
 +              } else if (amdgpu_freesync_vid_mode && aconnector &&
                           is_freesync_video_mode(&new_crtc_state->mode,
                                                  aconnector)) {
                        struct drm_display_mode *high_mode;
@@@ -10039,7 -9810,7 +10040,7 @@@ fail
  static bool is_dp_capable_without_timing_msa(struct dc *dc,
                                             struct amdgpu_dm_connector *amdgpu_dm_connector)
  {
 -      uint8_t dpcd_data;
 +      u8 dpcd_data;
        bool capable = false;
  
        if (amdgpu_dm_connector->dc_link &&
  static bool dm_edid_parser_send_cea(struct amdgpu_display_manager *dm,
                unsigned int offset,
                unsigned int total_length,
 -              uint8_t *data,
 +              u8 *data,
                unsigned int length,
                struct amdgpu_hdmi_vsdb_info *vsdb)
  {
  }
  
  static bool parse_edid_cea_dmcu(struct amdgpu_display_manager *dm,
 -              uint8_t *edid_ext, int len,
 +              u8 *edid_ext, int len,
                struct amdgpu_hdmi_vsdb_info *vsdb_info)
  {
        int i;
  }
  
  static bool parse_edid_cea_dmub(struct amdgpu_display_manager *dm,
 -              uint8_t *edid_ext, int len,
 +              u8 *edid_ext, int len,
                struct amdgpu_hdmi_vsdb_info *vsdb_info)
  {
        int i;
  }
  
  static bool parse_edid_cea(struct amdgpu_dm_connector *aconnector,
 -              uint8_t *edid_ext, int len,
 +              u8 *edid_ext, int len,
                struct amdgpu_hdmi_vsdb_info *vsdb_info)
  {
        struct amdgpu_device *adev = drm_to_adev(aconnector->base.dev);
  static int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector,
                struct edid *edid, struct amdgpu_hdmi_vsdb_info *vsdb_info)
  {
 -      uint8_t *edid_ext = NULL;
 +      u8 *edid_ext = NULL;
        int i;
        bool valid_vsdb_found = false;
  
@@@ -10360,7 -10131,7 +10361,7 @@@ void amdgpu_dm_trigger_timing_sync(stru
  }
  
  void dm_write_reg_func(const struct dc_context *ctx, uint32_t address,
 -                     uint32_t value, const char *func_name)
 +                     u32 value, const char *func_name)
  {
  #ifdef DM_CHECK_ADDR_0
        if (address == 0) {
  uint32_t dm_read_reg_func(const struct dc_context *ctx, uint32_t address,
                          const char *func_name)
  {
 -      uint32_t value;
 +      u32 value;
  #ifdef DM_CHECK_ADDR_0
        if (address == 0) {
                DC_ERR("invalid register read; address = 0\n");
        return value;
  }
  
 -static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux,
 -                                              struct dc_context *ctx,
 -                                              uint8_t status_type,
 -                                              uint32_t *operation_result)
 +int amdgpu_dm_process_dmub_aux_transfer_sync(
 +              struct dc_context *ctx,
 +              unsigned int link_index,
 +              struct aux_payload *payload,
 +              enum aux_return_code_type *operation_result)
  {
        struct amdgpu_device *adev = ctx->driver_context;
 -      int return_status = -1;
        struct dmub_notification *p_notify = adev->dm.dmub_notify;
 +      int ret = -1;
  
 -      if (is_cmd_aux) {
 -              if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS) {
 -                      return_status = p_notify->aux_reply.length;
 -                      *operation_result = p_notify->result;
 -              } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT) {
 -                      *operation_result = AUX_RET_ERROR_TIMEOUT;
 -              } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) {
 -                      *operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
 -              } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) {
 -                      *operation_result = AUX_RET_ERROR_INVALID_REPLY;
 -              } else {
 -                      *operation_result = AUX_RET_ERROR_UNKNOWN;
 +      mutex_lock(&adev->dm.dpia_aux_lock);
 +      if (!dc_process_dmub_aux_transfer_async(ctx->dc, link_index, payload)) {
 +              *operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
 +              goto out;
 +      }
 +
 +      if (!wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ)) {
 +              DRM_ERROR("wait_for_completion_timeout timeout!");
 +              *operation_result = AUX_RET_ERROR_TIMEOUT;
 +              goto out;
 +      }
 +
 +      if (p_notify->result != AUX_RET_SUCCESS) {
 +              /*
 +               * Transient states before tunneling is enabled could
 +               * lead to this error. We can ignore this for now.
 +               */
 +              if (p_notify->result != AUX_RET_ERROR_PROTOCOL_ERROR) {
 +                      DRM_WARN("DPIA AUX failed on 0x%x(%d), error %d\n",
 +                                      payload->address, payload->length,
 +                                      p_notify->result);
                }
 -      } else {
 -              if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS) {
 -                      return_status = 0;
 -                      *operation_result = p_notify->sc_status;
 -              } else {
 -                      *operation_result = SET_CONFIG_UNKNOWN_ERROR;
 +              *operation_result = AUX_RET_ERROR_INVALID_REPLY;
 +              goto out;
 +      }
 +
 +
 +      payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
 +      if (!payload->write && p_notify->aux_reply.length &&
 +                      (payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK)) {
 +
 +              if (payload->length != p_notify->aux_reply.length) {
 +                      DRM_WARN("invalid read length %d from DPIA AUX 0x%x(%d)!\n",
 +                              p_notify->aux_reply.length,
 +                                      payload->address, payload->length);
 +                      *operation_result = AUX_RET_ERROR_INVALID_REPLY;
 +                      goto out;
                }
 +
 +              memcpy(payload->data, p_notify->aux_reply.data,
 +                              p_notify->aux_reply.length);
        }
  
 -      return return_status;
 +      /* success */
 +      ret = p_notify->aux_reply.length;
 +      *operation_result = p_notify->result;
 +out:
 +      mutex_unlock(&adev->dm.dpia_aux_lock);
 +      return ret;
  }
  
 -int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context *ctx,
 -      unsigned int link_index, void *cmd_payload, void *operation_result)
 +int amdgpu_dm_process_dmub_set_config_sync(
 +              struct dc_context *ctx,
 +              unsigned int link_index,
 +              struct set_config_cmd_payload *payload,
 +              enum set_config_status *operation_result)
  {
        struct amdgpu_device *adev = ctx->driver_context;
 -      int ret = 0;
 +      bool is_cmd_complete;
 +      int ret;
  
 -      if (is_cmd_aux) {
 -              dc_process_dmub_aux_transfer_async(ctx->dc,
 -                      link_index, (struct aux_payload *)cmd_payload);
 -      } else if (dc_process_dmub_set_config_async(ctx->dc, link_index,
 -                                      (struct set_config_cmd_payload *)cmd_payload,
 -                                      adev->dm.dmub_notify)) {
 -              return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux,
 -                                      ctx, DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS,
 -                                      (uint32_t *)operation_result);
 -      }
 +      mutex_lock(&adev->dm.dpia_aux_lock);
 +      is_cmd_complete = dc_process_dmub_set_config_async(ctx->dc,
 +                      link_index, payload, adev->dm.dmub_notify);
  
 -      ret = wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ);
 -      if (ret == 0) {
 +      if (is_cmd_complete || wait_for_completion_timeout(&adev->dm.dmub_aux_transfer_done, 10 * HZ)) {
 +              ret = 0;
 +              *operation_result = adev->dm.dmub_notify->sc_status;
 +      } else {
                DRM_ERROR("wait_for_completion_timeout timeout!");
 -              return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux,
 -                              ctx, DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT,
 -                              (uint32_t *)operation_result);
 -      }
 -
 -      if (is_cmd_aux) {
 -              if (adev->dm.dmub_notify->result == AUX_RET_SUCCESS) {
 -                      struct aux_payload *payload = (struct aux_payload *)cmd_payload;
 -
 -                      payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
 -                      if (!payload->write && adev->dm.dmub_notify->aux_reply.length &&
 -                          payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) {
 -
 -                              if (payload->length != adev->dm.dmub_notify->aux_reply.length) {
 -                                      DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n",
 -                                                      payload->address, payload->length,
 -                                                      adev->dm.dmub_notify->aux_reply.length);
 -                                      return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx,
 -                                                      DMUB_ASYNC_TO_SYNC_ACCESS_INVALID,
 -                                                      (uint32_t *)operation_result);
 -                              }
 -
 -                              memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data,
 -                                     adev->dm.dmub_notify->aux_reply.length);
 -                      }
 -              }
 +              ret = -1;
 +              *operation_result = SET_CONFIG_UNKNOWN_ERROR;
        }
  
 -      return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux,
 -                      ctx, DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS,
 -                      (uint32_t *)operation_result);
 +      mutex_unlock(&adev->dm.dpia_aux_lock);
 +      return ret;
  }
  
  /*
index 6dd33a2cd987085fb3273c195a955c3cfbc768ff,d6edd83f67c6a4a8f3d5f036def0de76a74d3062..a2e1f6ed525f12566e7643c39fe51540115cd64b
@@@ -22,7 -22,6 +22,6 @@@
   */
  #include "pp_debug.h"
  #include <linux/delay.h>
- #include <linux/fb.h>
  #include <linux/module.h>
  #include <linux/pci.h>
  #include <linux/slab.h>
@@@ -1501,65 -1500,6 +1500,65 @@@ static int smu7_populate_edc_leakage_re
        return ret;
  }
  
 +static void smu7_populate_umdpstate_clocks(struct pp_hwmgr *hwmgr)
 +{
 +      struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
 +      struct smu7_dpm_table *golden_dpm_table = &data->golden_dpm_table;
 +      struct phm_clock_voltage_dependency_table *vddc_dependency_on_sclk =
 +                      hwmgr->dyn_state.vddc_dependency_on_sclk;
 +      struct phm_ppt_v1_information *table_info =
 +                      (struct phm_ppt_v1_information *)(hwmgr->pptable);
 +      struct phm_ppt_v1_clock_voltage_dependency_table *vdd_dep_on_sclk =
 +                      table_info->vdd_dep_on_sclk;
 +      int32_t tmp_sclk, count, percentage;
 +
 +      if (golden_dpm_table->mclk_table.count == 1) {
 +              percentage = 70;
 +              hwmgr->pstate_mclk = golden_dpm_table->mclk_table.dpm_levels[0].value;
 +      } else {
 +              percentage = 100 * golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 1].value /
 +                              golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count - 1].value;
 +              hwmgr->pstate_mclk = golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count - 2].value;
 +      }
 +
 +      tmp_sclk = hwmgr->pstate_mclk * percentage / 100;
 +
 +      if (hwmgr->pp_table_version == PP_TABLE_V0) {
 +              for (count = vddc_dependency_on_sclk->count - 1; count >= 0; count--) {
 +                      if (tmp_sclk >= vddc_dependency_on_sclk->entries[count].clk) {
 +                              hwmgr->pstate_sclk = vddc_dependency_on_sclk->entries[count].clk;
 +                              break;
 +                      }
 +              }
 +              if (count < 0)
 +                      hwmgr->pstate_sclk = vddc_dependency_on_sclk->entries[0].clk;
 +
 +              hwmgr->pstate_sclk_peak =
 +                      vddc_dependency_on_sclk->entries[vddc_dependency_on_sclk->count - 1].clk;
 +      } else if (hwmgr->pp_table_version == PP_TABLE_V1) {
 +              for (count = vdd_dep_on_sclk->count - 1; count >= 0; count--) {
 +                      if (tmp_sclk >= vdd_dep_on_sclk->entries[count].clk) {
 +                              hwmgr->pstate_sclk = vdd_dep_on_sclk->entries[count].clk;
 +                              break;
 +                      }
 +              }
 +              if (count < 0)
 +                      hwmgr->pstate_sclk = vdd_dep_on_sclk->entries[0].clk;
 +
 +              hwmgr->pstate_sclk_peak =
 +                      vdd_dep_on_sclk->entries[vdd_dep_on_sclk->count - 1].clk;
 +      }
 +
 +      hwmgr->pstate_mclk_peak =
 +              golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count - 1].value;
 +
 +      /* make sure the output is in Mhz */
 +      hwmgr->pstate_sclk /= 100;
 +      hwmgr->pstate_mclk /= 100;
 +      hwmgr->pstate_sclk_peak /= 100;
 +      hwmgr->pstate_mclk_peak /= 100;
 +}
 +
  static int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
  {
        int tmp_result = 0;
        PP_ASSERT_WITH_CODE((0 == tmp_result),
                        "pcie performance request failed!", result = tmp_result);
  
 +      smu7_populate_umdpstate_clocks(hwmgr);
 +
        return 0;
  }
  
@@@ -3204,12 -3142,15 +3203,12 @@@ static int smu7_get_profiling_clk(struc
                for (count = hwmgr->dyn_state.vddc_dependency_on_sclk->count-1;
                        count >= 0; count--) {
                        if (tmp_sclk >= hwmgr->dyn_state.vddc_dependency_on_sclk->entries[count].clk) {
 -                              tmp_sclk = hwmgr->dyn_state.vddc_dependency_on_sclk->entries[count].clk;
                                *sclk_mask = count;
                                break;
                        }
                }
 -              if (count < 0 || level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
 +              if (count < 0 || level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK)
                        *sclk_mask = 0;
 -                      tmp_sclk = hwmgr->dyn_state.vddc_dependency_on_sclk->entries[0].clk;
 -              }
  
                if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
                        *sclk_mask = hwmgr->dyn_state.vddc_dependency_on_sclk->count-1;
  
                for (count = table_info->vdd_dep_on_sclk->count-1; count >= 0; count--) {
                        if (tmp_sclk >= table_info->vdd_dep_on_sclk->entries[count].clk) {
 -                              tmp_sclk = table_info->vdd_dep_on_sclk->entries[count].clk;
                                *sclk_mask = count;
                                break;
                        }
                }
 -              if (count < 0 || level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
 +              if (count < 0 || level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK)
                        *sclk_mask = 0;
 -                      tmp_sclk =  table_info->vdd_dep_on_sclk->entries[0].clk;
 -              }
  
                if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
                        *sclk_mask = table_info->vdd_dep_on_sclk->count - 1;
                *mclk_mask = golden_dpm_table->mclk_table.count - 1;
  
        *pcie_mask = data->dpm_table.pcie_speed_table.count - 1;
 -      hwmgr->pstate_sclk = tmp_sclk;
 -      hwmgr->pstate_mclk = tmp_mclk;
  
        return 0;
  }
@@@ -3248,6 -3194,9 +3247,6 @@@ static int smu7_force_dpm_level(struct 
        uint32_t mclk_mask = 0;
        uint32_t pcie_mask = 0;
  
 -      if (hwmgr->pstate_sclk == 0)
 -              smu7_get_profiling_clk(hwmgr, level, &sclk_mask, &mclk_mask, &pcie_mask);
 -
        switch (level) {
        case AMD_DPM_FORCED_LEVEL_HIGH:
                ret = smu7_force_dpm_highest(hwmgr);
index 6f5161738bf83e5084cc571c83476489266c7b65,733cac4600ff042e42bc1311ccf9cbd83c9a310e..99cd2e63afdd4369594eef59a334766817875a2d
@@@ -22,7 -22,6 +22,6 @@@
   */
  
  #include <linux/delay.h>
- #include <linux/fb.h>
  #include <linux/module.h>
  #include <linux/pci.h>
  #include <linux/slab.h>
@@@ -3008,30 -3007,6 +3007,30 @@@ static int vega10_enable_disable_PCC_li
        return 0;
  }
  
 +static void vega10_populate_umdpstate_clocks(struct pp_hwmgr *hwmgr)
 +{
 +      struct phm_ppt_v2_information *table_info =
 +                      (struct phm_ppt_v2_information *)(hwmgr->pptable);
 +
 +      if (table_info->vdd_dep_on_sclk->count > VEGA10_UMD_PSTATE_GFXCLK_LEVEL &&
 +          table_info->vdd_dep_on_mclk->count > VEGA10_UMD_PSTATE_MCLK_LEVEL) {
 +              hwmgr->pstate_sclk = table_info->vdd_dep_on_sclk->entries[VEGA10_UMD_PSTATE_GFXCLK_LEVEL].clk;
 +              hwmgr->pstate_mclk = table_info->vdd_dep_on_mclk->entries[VEGA10_UMD_PSTATE_MCLK_LEVEL].clk;
 +      } else {
 +              hwmgr->pstate_sclk = table_info->vdd_dep_on_sclk->entries[0].clk;
 +              hwmgr->pstate_mclk = table_info->vdd_dep_on_mclk->entries[0].clk;
 +      }
 +
 +      hwmgr->pstate_sclk_peak = table_info->vdd_dep_on_sclk->entries[table_info->vdd_dep_on_sclk->count - 1].clk;
 +      hwmgr->pstate_mclk_peak = table_info->vdd_dep_on_mclk->entries[table_info->vdd_dep_on_mclk->count - 1].clk;
 +
 +      /* make sure the output is in Mhz */
 +      hwmgr->pstate_sclk /= 100;
 +      hwmgr->pstate_mclk /= 100;
 +      hwmgr->pstate_sclk_peak /= 100;
 +      hwmgr->pstate_mclk_peak /= 100;
 +}
 +
  static int vega10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
  {
        struct vega10_hwmgr *data = hwmgr->backend;
                                    result = tmp_result);
        }
  
 +      vega10_populate_umdpstate_clocks(hwmgr);
 +
        return result;
  }
  
@@@ -4195,6 -4168,8 +4194,6 @@@ static int vega10_get_profiling_clk_mas
                *sclk_mask = VEGA10_UMD_PSTATE_GFXCLK_LEVEL;
                *soc_mask = VEGA10_UMD_PSTATE_SOCCLK_LEVEL;
                *mclk_mask = VEGA10_UMD_PSTATE_MCLK_LEVEL;
 -              hwmgr->pstate_sclk = table_info->vdd_dep_on_sclk->entries[VEGA10_UMD_PSTATE_GFXCLK_LEVEL].clk;
 -              hwmgr->pstate_mclk = table_info->vdd_dep_on_mclk->entries[VEGA10_UMD_PSTATE_MCLK_LEVEL].clk;
        }
  
        if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) {
@@@ -4305,6 -4280,9 +4304,6 @@@ static int vega10_dpm_force_dpm_level(s
        uint32_t mclk_mask = 0;
        uint32_t soc_mask = 0;
  
 -      if (hwmgr->pstate_sclk == 0)
 -              vega10_get_profiling_clk_mask(hwmgr, level, &sclk_mask, &mclk_mask, &soc_mask);
 -
        switch (level) {
        case AMD_DPM_FORCED_LEVEL_HIGH:
                ret = vega10_force_dpm_highest(hwmgr);
index 33f31461ea6c62ee16cd071fd17d3a80d656603c,c73693dc4c09751fead5d9fa4dffaef61d8dcc5d..e9db137cd1c6cb79abb6894c03077ddd4f5a2fb9
@@@ -22,7 -22,6 +22,6 @@@
   */
  
  #include <linux/delay.h>
- #include <linux/fb.h>
  #include <linux/module.h>
  #include <linux/slab.h>
  
@@@ -1026,25 -1025,6 +1025,25 @@@ static int vega12_get_all_clock_ranges(
        return 0;
  }
  
 +static void vega12_populate_umdpstate_clocks(struct pp_hwmgr *hwmgr)
 +{
 +      struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend);
 +      struct vega12_single_dpm_table *gfx_dpm_table = &(data->dpm_table.gfx_table);
 +      struct vega12_single_dpm_table *mem_dpm_table = &(data->dpm_table.mem_table);
 +
 +      if (gfx_dpm_table->count > VEGA12_UMD_PSTATE_GFXCLK_LEVEL &&
 +          mem_dpm_table->count > VEGA12_UMD_PSTATE_MCLK_LEVEL) {
 +              hwmgr->pstate_sclk = gfx_dpm_table->dpm_levels[VEGA12_UMD_PSTATE_GFXCLK_LEVEL].value;
 +              hwmgr->pstate_mclk = mem_dpm_table->dpm_levels[VEGA12_UMD_PSTATE_MCLK_LEVEL].value;
 +      } else {
 +              hwmgr->pstate_sclk = gfx_dpm_table->dpm_levels[0].value;
 +              hwmgr->pstate_mclk = mem_dpm_table->dpm_levels[0].value;
 +      }
 +
 +      hwmgr->pstate_sclk_peak = gfx_dpm_table->dpm_levels[gfx_dpm_table->count].value;
 +      hwmgr->pstate_mclk_peak = mem_dpm_table->dpm_levels[mem_dpm_table->count].value;
 +}
 +
  static int vega12_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
  {
        int tmp_result, result = 0;
        PP_ASSERT_WITH_CODE(!result,
                        "Failed to setup default DPM tables!",
                        return result);
 +
 +      vega12_populate_umdpstate_clocks(hwmgr);
 +
        return result;
  }
  
index 2a5abac81b4a94c8500de31c89970bf16be563f5,33f3d97921812b5f389f90c16ea3d824cfcd0397..0d4d4811527c641a030ba3f0a6663dcbd1b35b95
@@@ -22,7 -22,6 +22,6 @@@
   */
  
  #include <linux/delay.h>
- #include <linux/fb.h>
  #include <linux/module.h>
  #include <linux/slab.h>
  
@@@ -1555,23 -1554,26 +1554,23 @@@ static int vega20_set_mclk_od
        return 0;
  }
  
 -static int vega20_populate_umdpstate_clocks(
 -              struct pp_hwmgr *hwmgr)
 +static void vega20_populate_umdpstate_clocks(struct pp_hwmgr *hwmgr)
  {
        struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
        struct vega20_single_dpm_table *gfx_table = &(data->dpm_table.gfx_table);
        struct vega20_single_dpm_table *mem_table = &(data->dpm_table.mem_table);
  
 -      hwmgr->pstate_sclk = gfx_table->dpm_levels[0].value;
 -      hwmgr->pstate_mclk = mem_table->dpm_levels[0].value;
 -
        if (gfx_table->count > VEGA20_UMD_PSTATE_GFXCLK_LEVEL &&
            mem_table->count > VEGA20_UMD_PSTATE_MCLK_LEVEL) {
                hwmgr->pstate_sclk = gfx_table->dpm_levels[VEGA20_UMD_PSTATE_GFXCLK_LEVEL].value;
                hwmgr->pstate_mclk = mem_table->dpm_levels[VEGA20_UMD_PSTATE_MCLK_LEVEL].value;
 +      } else {
 +              hwmgr->pstate_sclk = gfx_table->dpm_levels[0].value;
 +              hwmgr->pstate_mclk = mem_table->dpm_levels[0].value;
        }
  
 -      hwmgr->pstate_sclk = hwmgr->pstate_sclk * 100;
 -      hwmgr->pstate_mclk = hwmgr->pstate_mclk * 100;
 -
 -      return 0;
 +      hwmgr->pstate_sclk_peak = gfx_table->dpm_levels[gfx_table->count - 1].value;
 +      hwmgr->pstate_mclk_peak = mem_table->dpm_levels[mem_table->count - 1].value;
  }
  
  static int vega20_get_max_sustainable_clock(struct pp_hwmgr *hwmgr,
@@@ -1750,7 -1752,10 +1749,7 @@@ static int vega20_enable_dpm_tasks(stru
                        "[EnableDPMTasks] Failed to initialize odn settings!",
                        return result);
  
 -      result = vega20_populate_umdpstate_clocks(hwmgr);
 -      PP_ASSERT_WITH_CODE(!result,
 -                      "[EnableDPMTasks] Failed to populate umdpstate clocks!",
 -                      return result);
 +      vega20_populate_umdpstate_clocks(hwmgr);
  
        result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetPptLimit,
                        POWER_SOURCE_AC << 16, &hwmgr->default_power_limit);
index 03ed4607a46d2181dded13e42398ddfffa38b944,0d19c61b786a061cb062dc3636b3ff3b3b46aabd..bbdb98d7c96e01ec45e004be48e3625fdb4459d5
@@@ -267,26 -267,19 +267,19 @@@ static int intelfb_create(struct drm_fb
  
        info->fbops = &intelfb_ops;
  
-       /* setup aperture base/size for vesafb takeover */
        obj = intel_fb_obj(&intel_fb->base);
        if (i915_gem_object_is_lmem(obj)) {
                struct intel_memory_region *mem = obj->mm.region;
  
-               info->apertures->ranges[0].base = mem->io_start;
-               info->apertures->ranges[0].size = mem->io_size;
                /* Use fbdev's framebuffer from lmem for discrete */
                info->fix.smem_start =
                        (unsigned long)(mem->io_start +
                                        i915_gem_object_get_dma_address(obj, 0));
                info->fix.smem_len = obj->base.size;
        } else {
-               info->apertures->ranges[0].base = ggtt->gmadr.start;
-               info->apertures->ranges[0].size = ggtt->mappable_end;
                /* Our framebuffer is the entirety of fbdev's system memory */
                info->fix.smem_start =
 -                      (unsigned long)(ggtt->gmadr.start + vma->node.start);
 +                      (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
                info->fix.smem_len = vma->size;
        }
  
index 14a7d404062c38e006933da5d42a729b8f9fbf07,d09903a41f31a018dcd9ca1ea9d1605c6de3f065..c411a91453e30b12b8cc43b506eb329773c23a91
@@@ -26,7 -26,7 +26,7 @@@
   *
   *  Hardware cursor support added by Emmanuel Marty (core@ggi-project.org)
   *  Smart redraw scrolling, arbitrary font width support, 512char font support
-  *  and software scrollback added by 
+  *  and software scrollback added by
   *                         Jakub Jelinek (jj@ultra.linux.cz)
   *
   *  Random hacking by Martin Mares <mj@ucw.cz>
@@@ -127,7 -127,7 +127,7 @@@ static int logo_shown = FBCON_LOGO_CANS
  /* console mappings */
  static unsigned int first_fb_vc;
  static unsigned int last_fb_vc = MAX_NR_CONSOLES - 1;
- static int fbcon_is_default = 1; 
+ static int fbcon_is_default = 1;
  static int primary_device = -1;
  static int fbcon_has_console_bind;
  
@@@ -415,12 -415,12 +415,12 @@@ static int __init fb_console_setup(cha
                        strscpy(fontname, options + 5, sizeof(fontname));
                        continue;
                }
-               
                if (!strncmp(options, "scrollback:", 11)) {
                        pr_warn("Ignoring scrollback size option\n");
                        continue;
                }
-               
                if (!strncmp(options, "map:", 4)) {
                        options += 4;
                        if (*options) {
                                last_fb_vc = simple_strtoul(options, &options, 10) - 1;
                        if (last_fb_vc < first_fb_vc || last_fb_vc >= MAX_NR_CONSOLES)
                                last_fb_vc = MAX_NR_CONSOLES - 1;
-                       fbcon_is_default = 0; 
+                       fbcon_is_default = 0;
                        continue;
                }
  
@@@ -577,7 -577,7 +577,7 @@@ static void fbcon_prepare_logo(struct v
                if (scr_readw(r) != vc->vc_video_erase_char)
                        break;
        if (r != q && new_rows >= rows + logo_lines) {
 -              save = kmalloc(array3_size(logo_lines, new_cols, 2),
 +              save = kzalloc(array3_size(logo_lines, new_cols, 2),
                               GFP_KERNEL);
                if (save) {
                        int i = min(cols, new_cols);
@@@ -940,7 -940,7 +940,7 @@@ static const char *fbcon_startup(void
        info = fbcon_registered_fb[info_idx];
        if (!info)
                return NULL;
-       
        if (fbcon_open(info))
                return NULL;
  
        set_blitting_type(vc, info);
  
        /* Setup default font */
-       if (!p->fontdata && !vc->vc_font.data) {
+       if (!p->fontdata) {
                if (!fontname[0] || !(font = find_font(fontname)))
                        font = get_default_font(info->var.xres,
                                                info->var.yres,
                vc->vc_font.height = font->height;
                vc->vc_font.data = (void *)(p->fontdata = font->data);
                vc->vc_font.charcount = font->charcount;
-       } else {
-               p->fontdata = vc->vc_font.data;
        }
  
        cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
@@@ -1135,9 -1133,9 +1133,9 @@@ static void fbcon_init(struct vc_data *
        ops->p = &fb_display[fg_console];
  }
  
- static void fbcon_free_font(struct fbcon_display *p, bool freefont)
+ static void fbcon_free_font(struct fbcon_display *p)
  {
-       if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
+       if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
                kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int));
        p->fontdata = NULL;
        p->userfont = 0;
@@@ -1172,8 -1170,8 +1170,8 @@@ static void fbcon_deinit(struct vc_dat
        struct fb_info *info;
        struct fbcon_ops *ops;
        int idx;
-       bool free_font = true;
  
+       fbcon_free_font(p);
        idx = con2fb_map[vc->vc_num];
  
        if (idx == -1)
        if (!info)
                goto finished;
  
-       if (info->flags & FBINFO_MISC_FIRMWARE)
-               free_font = false;
        ops = info->fbcon_par;
  
        if (!ops)
        ops->initialized = false;
  finished:
  
-       fbcon_free_font(p, free_font);
-       if (free_font)
-               vc->vc_font.data = NULL;
+       fbcon_free_font(p);
+       vc->vc_font.data = NULL;
  
        if (vc->vc_hi_font_mask && vc->vc_screenbuf)
                set_vc_hi_font(vc, false);
@@@ -1999,7 -1994,7 +1994,7 @@@ static void updatescrollmode(struct fbc
  #define PITCH(w) (((w) + 7) >> 3)
  #define CALC_FONTSZ(h, p, c) ((h) * (p) * (c)) /* size = height * pitch * charcount */
  
- static int fbcon_resize(struct vc_data *vc, unsigned int width, 
+ static int fbcon_resize(struct vc_data *vc, unsigned int width,
                        unsigned int height, unsigned int user)
  {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@@ -2174,7 -2169,7 +2169,7 @@@ static int fbcon_switch(struct vc_data 
            ops->update_start(info);
        }
  
-       fbcon_set_palette(vc, color_table);     
+       fbcon_set_palette(vc, color_table);
        fbcon_clear_margins(vc, 0);
  
        if (logo_shown == FBCON_LOGO_DRAW) {
@@@ -2343,7 -2338,7 +2338,7 @@@ static void set_vc_hi_font(struct vc_da
                        vc->vc_complement_mask >>= 1;
                        vc->vc_s_complement_mask >>= 1;
                }
-                       
                /* ++Edmund: reorder the attribute bits */
                if (vc->vc_can_do_color) {
                        unsigned short *cp =
                        vc->vc_complement_mask <<= 1;
                        vc->vc_s_complement_mask <<= 1;
                }
-                       
                /* ++Edmund: reorder the attribute bits */
                {
                        unsigned short *cp =
@@@ -2450,8 -2445,7 +2445,8 @@@ err_out
  
        if (userfont) {
                p->userfont = old_userfont;
 -              REFCOUNT(data)--;
 +              if (--REFCOUNT(data) == 0)
 +                      kfree(data - FONT_EXTRA_WORDS * sizeof(int));
        }
  
        vc->vc_font.width = old_width;
@@@ -2528,7 -2522,7 +2523,7 @@@ static int fbcon_set_font(struct vc_dat
        /* Check if the same font is on some other console already */
        for (i = first_fb_vc; i <= last_fb_vc; i++) {
                struct vc_data *tmp = vc_cons[i].d;
-               
                if (fb_display[i].userfont &&
                    fb_display[i].fontdata &&
                    FNTSUM(fb_display[i].fontdata) == csum &&
@@@ -3436,5 -3430,5 +3431,5 @@@ void __exit fb_console_exit(void
  
        do_unregister_con_driver(&fb_con);
        console_unlock();
- }     
+ }
  #endif
index fdbf02b42723c00a377e9ebcf9c11b7a359d4a63,1c7d6ff5a6c01b821e62252ad3ce5b6d8aeeeaee..4a6a3303b6b4e59efa0b3a6a756e00392a39e6d9
@@@ -779,18 -779,12 +779,18 @@@ static void hvfb_ondemand_refresh_throt
  static int hvfb_on_panic(struct notifier_block *nb,
                         unsigned long e, void *p)
  {
 +      struct hv_device *hdev;
        struct hvfb_par *par;
        struct fb_info *info;
  
        par = container_of(nb, struct hvfb_par, hvfb_panic_nb);
 -      par->synchronous_fb = true;
        info = par->info;
 +      hdev = device_to_hv_device(info->device);
 +
 +      if (hv_ringbuffer_spinlock_busy(hdev->channel))
 +              return NOTIFY_DONE;
 +
 +      par->synchronous_fb = true;
        if (par->need_docopy)
                hvfb_docopy(par, 0, dio_fb_size);
        synthvid_update(info, 0, 0, INT_MAX, INT_MAX);
@@@ -994,13 -988,10 +994,10 @@@ static int hvfb_getmem(struct hv_devic
        struct pci_dev *pdev  = NULL;
        void __iomem *fb_virt;
        int gen2vm = efi_enabled(EFI_BOOT);
+       resource_size_t base, size;
        phys_addr_t paddr;
        int ret;
  
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures)
-               return -ENOMEM;
        if (!gen2vm) {
                pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
                        PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
                        return -ENODEV;
                }
  
-               info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
-               info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
+               base = pci_resource_start(pdev, 0);
+               size = pci_resource_len(pdev, 0);
  
                /*
                 * For Gen 1 VM, we can directly use the contiguous memory
                }
                pr_info("Unable to allocate enough contiguous physical memory on Gen 1 VM. Using MMIO instead.\n");
        } else {
-               info->apertures->ranges[0].base = screen_info.lfb_base;
-               info->apertures->ranges[0].size = screen_info.lfb_size;
+               base = screen_info.lfb_base;
+               size = screen_info.lfb_size;
        }
  
        /*
        info->screen_size = dio_fb_size;
  
  getmem_done:
-       aperture_remove_conflicting_devices(info->apertures->ranges[0].base,
-                                           info->apertures->ranges[0].size,
-                                           false, KBUILD_MODNAME);
+       aperture_remove_conflicting_devices(base, size, false, KBUILD_MODNAME);
  
        if (gen2vm) {
                /* framebuffer is reallocated, clear screen_info to avoid misuse from kexec */
@@@ -1213,15 -1202,7 +1208,15 @@@ static int hvfb_probe(struct hv_device 
        par->fb_ready = true;
  
        par->synchronous_fb = false;
 +
 +      /*
 +       * We need to be sure this panic notifier runs _before_ the
 +       * vmbus disconnect, so order it by priority. It must execute
 +       * before the function hv_panic_vmbus_unload() [drivers/hv/vmbus_drv.c],
 +       * which is almost at the end of list, with priority = INT_MIN + 1.
 +       */
        par->hvfb_panic_nb.notifier_call = hvfb_on_panic;
 +      par->hvfb_panic_nb.priority = INT_MIN + 10,
        atomic_notifier_chain_register(&panic_notifier_list,
                                       &par->hvfb_panic_nb);
  
diff --combined include/drm/drm_drv.h
index d7c521e8860f07a532b932150a53e1360c4c514e,a3bce427891a14bb031e740a996546c1e9d93d67..1d76d0686b032e725014c6fdc95c6fd322f4799f
@@@ -96,14 -96,6 +96,14 @@@ enum drm_driver_feature 
         * synchronization of command submission.
         */
        DRIVER_SYNCOBJ_TIMELINE         = BIT(6),
 +      /**
 +       * @DRIVER_COMPUTE_ACCEL:
 +       *
 +       * Driver supports compute acceleration devices. This flag is mutually exclusive with
 +       * @DRIVER_RENDER and @DRIVER_MODESET. Devices that support both graphics and compute
 +       * acceleration should be handled by two drivers that are connected using auxiliary bus.
 +       */
 +      DRIVER_COMPUTE_ACCEL            = BIT(7),
  
        /* IMPORTANT: Below are all the legacy flags, add new ones above. */
  
         * Legacy irq support. Only for legacy drivers. Do not use.
         */
        DRIVER_HAVE_IRQ                 = BIT(30),
-       /**
-        * @DRIVER_KMS_LEGACY_CONTEXT:
-        *
-        * Used only by nouveau for backwards compatibility with existing
-        * userspace.  Do not use.
-        */
-       DRIVER_KMS_LEGACY_CONTEXT       = BIT(31),
  };
  
  /**
index 4eb7aa11cfbb23113c7607639249220714c32ef6,1de5801cd2e8da039c0f2b01db060b3e6dee52c6..3c8001b9e407ea58cfce1819060537cc42a21ccf
@@@ -109,7 -109,7 +109,7 @@@ static int mdpy_fb_probe(struct pci_de
  
        ret = pci_request_regions(pdev, "mdpy-fb");
        if (ret < 0)
 -              return ret;
 +              goto err_disable_dev;
  
        pci_read_config_dword(pdev, MDPY_FORMAT_OFFSET, &format);
        pci_read_config_dword(pdev, MDPY_WIDTH_OFFSET,  &width);
                goto err_release_fb;
        }
  
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto err_unmap;
-       }
-       info->apertures->ranges[0].base = info->fix.smem_start;
-       info->apertures->ranges[0].size = info->fix.smem_len;
        info->fbops = &mdpy_fb_ops;
        info->flags = FBINFO_DEFAULT;
        info->pseudo_palette = par->palette;
@@@ -191,9 -183,6 +183,9 @@@ err_release_fb
  err_release_regions:
        pci_release_regions(pdev);
  
 +err_disable_dev:
 +      pci_disable_device(pdev);
 +
        return ret;
  }
  
@@@ -202,10 -191,7 +194,10 @@@ static void mdpy_fb_remove(struct pci_d
        struct fb_info *info = pci_get_drvdata(pdev);
  
        unregister_framebuffer(info);
 +      iounmap(info->screen_base);
        framebuffer_release(info);
 +      pci_release_regions(pdev);
 +      pci_disable_device(pdev);
  }
  
  static struct pci_device_id mdpy_fb_pci_table[] = {